[pkg-java] r13286 - in trunk: . squirrel-sql squirrel-sql/debian squirrel-sql/debian/patches squirrel-sql/debian/source
vladimir kotov
rk13-guest at alioth.debian.org
Thu Feb 10 23:58:26 UTC 2011
Author: rk13-guest
Date: 2011-02-10 23:58:25 +0000 (Thu, 10 Feb 2011)
New Revision: 13286
Added:
trunk/squirrel-sql/
trunk/squirrel-sql/debian/
trunk/squirrel-sql/debian/TODO
trunk/squirrel-sql/debian/build.properties
trunk/squirrel-sql/debian/build.xml
trunk/squirrel-sql/debian/changelog
trunk/squirrel-sql/debian/compat
trunk/squirrel-sql/debian/control
trunk/squirrel-sql/debian/copyright
trunk/squirrel-sql/debian/libsquirrel-sql-fw-java-doc.doc-base.api
trunk/squirrel-sql/debian/libsquirrel-sql-fw-java-doc.install
trunk/squirrel-sql/debian/libsquirrel-sql-fw-java.poms
trunk/squirrel-sql/debian/maven.ignoreRules
trunk/squirrel-sql/debian/maven.rules
trunk/squirrel-sql/debian/menu
trunk/squirrel-sql/debian/orig-tar.exclude
trunk/squirrel-sql/debian/orig-tar.sh
trunk/squirrel-sql/debian/patches/
trunk/squirrel-sql/debian/patches/001-squirrelsql-jgoodies.patch
trunk/squirrel-sql/debian/patches/002-squirrelsql-version.patch
trunk/squirrel-sql/debian/patches/003-squirrelsql-plugins-parent-pom.patch
trunk/squirrel-sql/debian/patches/004-squirrelsql-plugins-assembly-descripton-pom.patch
trunk/squirrel-sql/debian/patches/005-squirrelsql-plugins-hibernate-HibernateUtil.patch
trunk/squirrel-sql/debian/patches/006-launch-script-debian.patch
trunk/squirrel-sql/debian/patches/007-squirrelsql-changelog.patch
trunk/squirrel-sql/debian/patches/008-native2ascii.patch
trunk/squirrel-sql/debian/patches/009-plugin-liclink.patch
trunk/squirrel-sql/debian/patches/disable_autoupdate.dpatch
trunk/squirrel-sql/debian/patches/series
trunk/squirrel-sql/debian/rules
trunk/squirrel-sql/debian/source/
trunk/squirrel-sql/debian/source/format
trunk/squirrel-sql/debian/squirrel-sql-doc.doc-base.api
trunk/squirrel-sql/debian/squirrel-sql-doc.install
trunk/squirrel-sql/debian/squirrel-sql-plugin-laf.links
trunk/squirrel-sql/debian/squirrel-sql-plugin-sqlval.links
trunk/squirrel-sql/debian/squirrel-sql.1
trunk/squirrel-sql/debian/squirrel-sql.install
trunk/squirrel-sql/debian/squirrel-sql.links
trunk/squirrel-sql/debian/squirrel-sql.manpages
trunk/squirrel-sql/debian/squirrel-sql.poms
trunk/squirrel-sql/debian/watch
Log:
Initial release (Closes: #559867)
Added: trunk/squirrel-sql/debian/TODO
===================================================================
--- trunk/squirrel-sql/debian/TODO (rev 0)
+++ trunk/squirrel-sql/debian/TODO 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1 @@
+Enable firebirdmanager, oracle, syntax plugins (missing dependencies)
\ No newline at end of file
Added: trunk/squirrel-sql/debian/build.properties
===================================================================
--- trunk/squirrel-sql/debian/build.properties (rev 0)
+++ trunk/squirrel-sql/debian/build.properties 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,8 @@
+classpath.compile=\
+ ${basedir}/fw/target/fw-${version}.jar:\
+ ${basedir}/app/target/squirrel-sql-${version}.jar:\
+ /usr/share/java/spring-beans.jar
+build.directory=target
+javadoc.dir=target/apidocs
+maven.test.skip=true
+build.javaVersion=1.6
Added: trunk/squirrel-sql/debian/build.xml
===================================================================
--- trunk/squirrel-sql/debian/build.xml (rev 0)
+++ trunk/squirrel-sql/debian/build.xml 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,120 @@
+<?xml version="1.0"?>
+
+<project name="pkg-java" default="package" basedir="..">
+
+ <property file="debian/build.properties"/>
+ <property name="maven.build" value="/usr/share/maven-ant-helper/maven-build.xml"/>
+ <property file="/usr/share/maven-ant-helper/maven-defaults.properties"/>
+
+ <macrodef name="cleanmodule">
+ <attribute name="dir"/>
+ <sequential>
+ <ant target="clean" antfile="${maven.build}" dir="@{dir}">
+ <property name="debian.dir" location="debian" />
+ <property name="project.dir" value="@{dir}" />
+ </ant>
+ </sequential>
+ </macrodef>
+
+ <macrodef name="packagemodule">
+ <attribute name="dir"/>
+ <sequential>
+ <ant target="package" antfile="${maven.build}" dir="@{dir}">
+ <property name="debian.dir" location="debian" />
+ <property name="project.dir" value="@{dir}" />
+ </ant>
+ </sequential>
+ </macrodef>
+
+ <macrodef name="javadocmodule">
+ <attribute name="dir"/>
+ <sequential>
+ <ant target="javadoc" antfile="${maven.build}" dir="@{dir}">
+ <property name="debian.dir" location="debian" />
+ <property name="project.dir" value="@{dir}" />
+ </ant>
+ </sequential>
+ </macrodef>
+
+ <target name="clean">
+ <cleanmodule dir=""/>
+ <cleanmodule dir="fw"/>
+ <cleanmodule dir="app"/>
+ <cleanmodule dir="installer/squirrelsql-java-version-checker"/>
+ <cleanmodule dir="plugins/codecompletion"/>
+ <cleanmodule dir="plugins/dataimport"/>
+ <cleanmodule dir="plugins/db2"/>
+ <cleanmodule dir="plugins/dbcopy"/>
+ <cleanmodule dir="plugins/dbdiff"/>
+ <cleanmodule dir="plugins/derby"/>
+ <cleanmodule dir="plugins/editextras"/>
+ <cleanmodule dir="plugins/example"/>
+ <cleanmodule dir="plugins/exportconfig"/>
+ <cleanmodule dir="plugins/favs"/>
+ <cleanmodule dir="plugins/graph"/>
+ <cleanmodule dir="plugins/h2"/>
+ <cleanmodule dir="plugins/hibernate"/>
+ <cleanmodule dir="plugins/i18n"/>
+ <cleanmodule dir="plugins/informix"/>
+ <cleanmodule dir="plugins/mssql"/>
+ <cleanmodule dir="plugins/mysql"/>
+ <cleanmodule dir="plugins/netezza"/>
+ <cleanmodule dir="plugins/postgres"/>
+ <cleanmodule dir="plugins/refactoring"/>
+ <cleanmodule dir="plugins/sessionscript"/>
+ <cleanmodule dir="plugins/smarttools"/>
+ <cleanmodule dir="plugins/sqlbookmark"/>
+ <cleanmodule dir="plugins/sqlparam"/>
+ <cleanmodule dir="plugins/sqlreplace"/>
+ <cleanmodule dir="plugins/sqlscript"/>
+ <cleanmodule dir="plugins/laf"/>
+ <cleanmodule dir="plugins/firebird"/>
+ <cleanmodule dir="plugins/sqlval"/>
+ <cleanmodule dir="plugins/sybase"/>
+ <cleanmodule dir="plugins/userscript"/>
+ </target>
+
+ <target name="package">
+ <packagemodule dir=""/>
+ <packagemodule dir="fw"/>
+ <packagemodule dir="app"/>
+ <packagemodule dir="installer/squirrelsql-java-version-checker"/>
+ <packagemodule dir="plugins/codecompletion"/>
+ <packagemodule dir="plugins/dataimport"/>
+ <packagemodule dir="plugins/db2"/>
+ <packagemodule dir="plugins/dbcopy"/>
+ <packagemodule dir="plugins/dbdiff"/>
+ <packagemodule dir="plugins/derby"/>
+ <packagemodule dir="plugins/editextras"/>
+ <packagemodule dir="plugins/example"/>
+ <packagemodule dir="plugins/exportconfig"/>
+ <packagemodule dir="plugins/favs"/>
+ <packagemodule dir="plugins/graph"/>
+ <packagemodule dir="plugins/h2"/>
+ <packagemodule dir="plugins/hibernate"/>
+ <packagemodule dir="plugins/i18n"/>
+ <packagemodule dir="plugins/informix"/>
+ <packagemodule dir="plugins/mssql"/>
+ <packagemodule dir="plugins/mysql"/>
+ <packagemodule dir="plugins/netezza"/>
+ <packagemodule dir="plugins/postgres"/>
+ <packagemodule dir="plugins/refactoring"/>
+ <packagemodule dir="plugins/sessionscript"/>
+ <packagemodule dir="plugins/smarttools"/>
+ <packagemodule dir="plugins/sqlbookmark"/>
+ <packagemodule dir="plugins/sqlparam"/>
+ <packagemodule dir="plugins/sqlreplace"/>
+ <packagemodule dir="plugins/sqlscript"/>
+ <packagemodule dir="plugins/laf"/>
+ <packagemodule dir="plugins/firebird"/>
+ <packagemodule dir="plugins/sqlval"/>
+ <packagemodule dir="plugins/sybase"/>
+ <packagemodule dir="plugins/userscript"/>
+ </target>
+
+ <target name="javadoc">
+ <javadocmodule dir="fw" />
+ <javadocmodule dir="app" />
+ </target>
+
+</project>
\ No newline at end of file
Added: trunk/squirrel-sql/debian/changelog
===================================================================
--- trunk/squirrel-sql/debian/changelog (rev 0)
+++ trunk/squirrel-sql/debian/changelog 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,62 @@
+squirrel-sql (3.2.0-1) UNRELEASED; urgency=low
+
+ * Initial release (Closes: #559867)
+ * New upstream release
+ * debian/control:
+ + Set Debian Java maintainers as Maintainer
+ + Add myself as Uploader
+ + Bump Standards-Version to 3.9.1.
+ + Rework dependencies and package names
+ + Add package descriptions
+ * Updated debian/copyright to conform to dep5 format-specification
+ * Switch to source format 3.0 (quilt)
+ * Rework debian/rules to cdbs, maven-ant-helper, maven-repo-helper
+ * Write new patches
+ * Add manpages
+ * Add watch files
+ * Add maven files
+
+ -- Vladimir Kotov <vladimir at kotov.lv> Wed, 09 Jan 2011 23:35:28 +0200
+
+squirrel-sql (3.0~ppa8) jaunty; urgency=low
+
+ * New upstream release 3.0
+ * Set javac encoding to UTF-8
+ * Added missing libcommons-httpclient-java dependency
+ * Added missing dpatch build dependency
+
+ -- Markus Heberling <markus at tisoft.de> Tue, 24 Feb 2009 12:22:40 +0100
+
+squirrel-sql (2.6.8-1~ppa8) jaunty; urgency=low
+
+ * Added java dependency
+
+ -- Markus Heberling <markus at tisoft.de> Tue, 03 Feb 2009 16:17:20 +0100
+
+squirrel-sql (2.6.8-1~ppa7) jaunty; urgency=low
+
+ * Cleanup of lintian warnings
+ * Added missing plugin subdirectorys and files
+
+ -- Markus Heberling <markus at tisoft.de> Tue, 03 Feb 2009 14:50:38 +0100
+
+squirrel-sql (2.6.8-1~ppa6) jaunty; urgency=low
+
+ * Added default plugins (except mac osx plugin)
+ * added squirrel-sql package that depends on squirrel-sql-gui and all default plugins
+
+ -- Markus Heberling <markus at tisoft.de> Tue, 03 Feb 2009 12:31:14 +0100
+
+squirrel-sql (2.6.8-1~ppa5) jaunty; urgency=low
+
+ * Changed Build Depends
+ * Added menu entry for squirrel-sql-gui
+ * Cleanup of lintian warnings
+
+ -- Markus Heberling <markus at tisoft.de> Tue, 27 Jan 2009 17:41:27 +0100
+
+squirrel-sql (2.6.8-1~ppa1) jaunty; urgency=low
+
+ * Initial release
+
+ -- Markus Heberling <markus at tisoft.de> Tue, 27 Jan 2009 10:43:25 +0100
Added: trunk/squirrel-sql/debian/compat
===================================================================
--- trunk/squirrel-sql/debian/compat (rev 0)
+++ trunk/squirrel-sql/debian/compat 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1 @@
+7
Added: trunk/squirrel-sql/debian/control
===================================================================
--- trunk/squirrel-sql/debian/control (rev 0)
+++ trunk/squirrel-sql/debian/control 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,476 @@
+Source: squirrel-sql
+Section: java
+Priority: optional
+Maintainer: Debian Java Maintainers <pkg-java-maintainers at lists.alioth.debian.org>
+Uploaders: Vladimir Kotov <vladimir at kotov.lv>
+Build-Depends: ant-optional,
+ cdbs,
+ debhelper (>= 7),
+ default-jdk,
+ maven-ant-helper (>> 4),
+ maven-repo-helper
+Build-Depends-Indep: default-jdk-doc,
+ libantlr-java,
+ libasm3-java,
+ libaxis-java,
+ libcglib-java,
+ libcommons-cli-java,
+ libcommons-codec-java,
+ libcommons-collections3-java,
+ libcommons-httpclient-java,
+ libcommons-logging-java,
+ libdom4j-java,
+ libhibernate-commons-annotations-java,
+ libhibernate3-java,
+ libjexcelapi-java,
+ libjgoodies-forms-java,
+ libjgoodies-looks-java,
+ liblog4j1.2-java,
+ libnanoxml2-java,
+ libslf4j-java,
+ libspring-beans-2.5-java,
+ libspring-context-2.5-java,
+ libspring-context-support-2.5-java,
+ libspring-core-2.5-java,
+ libstringtemplate-java
+Standards-Version: 3.9.1
+Vcs-Svn: svn://svn.debian.org/svn/pkg-java/trunk/squirrel-sql
+Vcs-Browser: http://svn.debian.org/wsvn/pkg-java/trunk/squirrel-sql
+Homepage: http://www.squirrelsql.org/
+
+Package: squirrel-sql
+Architecture: all
+Depends: libantlr-java,
+ libasm3-java,
+ libcglib-java,
+ libcommons-cli-java,
+ libcommons-codec-java,
+ libcommons-collections3-java,
+ libcommons-httpclient-java,
+ libcommons-logging-java,
+ libhibernate-commons-annotations-java,
+ libhibernate3-java,
+ libjexcelapi-java,
+ libjgoodies-forms-java,
+ liblog4j1.2-java,
+ libnanoxml2-java,
+ libslf4j-java,
+ libspring-beans-2.5-java,
+ libspring-context-2.5-java,
+ libspring-context-support-2.5-java,
+ libspring-core-2.5-java,
+ libsquirrel-sql-fw-java,
+ libstringtemplate-java,
+ ${misc:Depends}
+Recommends: squirrel-sql-plugins-standard
+Suggests: squirrel-sql-doc
+Description: Universal SQL Client
+ SQuirreL SQL Client is a graphical Java program that will allow you to view the
+ structure of a JDBC compliant database, browse the data in tables, issue SQL
+ commands etc.
+
+Package: libsquirrel-sql-fw-java
+Architecture: all
+Depends: libantlr-java,
+ libasm3-java,
+ libcglib-java,
+ libcommons-cli-java,
+ libcommons-codec-java,
+ libcommons-collections3-java,
+ libcommons-httpclient-java,
+ libcommons-logging-java,
+ libdom4j-java,
+ libhibernate-commons-annotations-java,
+ libhibernate3-java,
+ libjexcelapi-java,
+ libjgoodies-forms-java,
+ liblog4j1.2-java,
+ libnanoxml2-java,
+ libslf4j-java,
+ libspring-beans-2.5-java,
+ libspring-context-2.5-java,
+ libspring-context-support-2.5-java,
+ libspring-core-2.5-java,
+ libstringtemplate-java,
+ ${misc:Depends}
+Suggests: libsquirrel-sql-fw-java-doc
+Description: Java library for introspecting a database via JDBC
+ SQuirreL SQL Framework Library contains utility classes that are generic and
+ useful for building applications that introspect a database via JDBC. These
+ are not intended to be SQuirreL SQL-specific and could be used by other
+ projects JDBC front-end applications.
+
+Package: squirrel-sql-doc
+Architecture: all
+Section: doc
+Depends: default-jdk-doc, libsquirrel-sql-fw-java-doc, ${misc:Depends}
+Suggests: squirrel-sql
+Description: Universal SQL Client (documentation)
+ SQuirreL SQL Client is a graphical Java program that will allow you to view the
+ structure of a JDBC compliant database, browse the data in tables, issue SQL
+ commands etc.
+ .
+ This package contains the API documentation of squirrel-sql.
+
+Package: libsquirrel-sql-fw-java-doc
+Architecture: all
+Section: doc
+Depends: default-jdk-doc, ${misc:Depends}
+Suggests: libsquirrel-sql-fw-java
+Description: Java library for introspecting a database via JDBC (documentation)
+ SQuirreL SQL Framework Library contains utility classes that are generic and
+ useful for building applications that introspect a database via JDBC. These
+ are not intended to be SQuirreL SQL-specific and could be used by other
+ projects JDBC front-end applications.
+ .
+ This package contains the API documentation of libsquirrel-sql-fw-java.
+
+Package: squirrel-sql-plugin-codecompletion
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Codecompletion Plugin for SQuirreL SQL Client
+ The Codecompletion plugin provides completion of SQL code much the same way
+ modern IDEs do. Completion works on almost all SQL and DDL constructs:
+ * Key words
+ * Tables
+ * Columns
+ * Views
+ * Stored procedures
+ * Catalogs
+ * Schemas.
+ Beyond this the plugin offers so called completion functions that can be used
+ to generate SQL Joins.
+
+Package: squirrel-sql-plugin-dataimport
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Dataimport Plugin for SQuirreL SQL Client
+ The Dataimport plugin allows to import arbitrary files into existing tables in
+ the database. Currently the following types of files are supported:
+ * Microsoft Excel files
+ * Comma separated files (CSV).
+
+Package: squirrel-sql-plugin-db2
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Db2 Plugin for SQuirreL SQL Client
+ The DB2 plugin adds DB2-specific functionality to the SQuirreL SQL Client for
+ IBM DB2 hosted on LUW (Linux, Unix, Windows) and OS/400. The plugin adds the
+ following features:
+ * Stored Procedures, Triggers, Views and User-defined Functions (UDFs) are
+ shown in the object tree and have a "Source" tab which displays the source
+ of the selected object and a "Details" tab which gives DB2-specific
+ information about the object.
+ * Tables and Materialized Query Tables are shown in the object tree and have
+ a "Source" tab which displays the source of the selected object.
+ * Sequences and Indexes are also shown in the object tree and have a details
+ tab giving DB2-specific information about them.
+
+Package: squirrel-sql-plugin-dbcopy
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Dbcopy Plugin for SQuirreL SQL Client
+ The Dbcopy plugin provides the ability to copy database tables between
+ sessions. The plugin adds two new "Copy Table" and "Paste Table" menu items
+ available by right-clicking on certain database objects in the object tree.
+
+Package: squirrel-sql-plugin-dbdiff
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: SQuirreL SQL Dbdiff Plugin
+ The Dbdiff plugin adds the ability to compare tables between sessions.
+ The plugin adds new "DB Diff" menu items available by right-clicking
+ on certain database objects in the object tree.
+
+Package: squirrel-sql-plugin-derby
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Derby Plugin for SQuirreL SQL Client
+ The Derby plugin adds Derby-specific functionality to the SQuirreL SQL Client.
+ The plugin adds the following features:
+ * Triggers and Views are shown in the object tree and have a "Source" tab
+ which displays the source of the selected object.
+ * Triggers also have a "Details" tab which gives trigger-specific information
+ about the object.
+
+Package: squirrel-sql-plugin-editextras
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Editextras Plugin for SQuirreL SQL Client
+ The Editextras plugin provides auxiliary functions for the SQL Editor
+ accessible through the tools popup:
+ * Formating SQL code
+ * Adding / removing Java string delimiters
+ * Creating JDBC escape syntax for SQL date/time/timestamp.
+
+Package: squirrel-sql-plugin-example
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Example Plugin for SQuirreL SQL Client
+ The Example plugin shows how to add right mouse menu entries to the Object
+ Tree which allow to script Views and Stored Procedures. Since there is no
+ standard for accessing Views and Stored Procedures in a relational database
+ a plugin like this must be a database specific plugin.
+
+Package: squirrel-sql-plugin-exportconfig
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Exportconfig Plugin for SQuirreL SQL Client
+ The Exportconfig plugin allows you to export the Database Driver definitions,
+ the Database Alias definitions and the Application Settings to files on the
+ file system. The plugin adds new hierarchical menu "Export" to the "Plugins".
+
+Package: squirrel-sql-plugin-favs
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Favs Plugin for SQuirreL SQL Client
+ The SQL Favs Plugin allows you to save and organize your SQL
+ queries. The plugin adds new hierarchical menu "Queries" to
+ the "Plugins".
+
+Package: squirrel-sql-plugin-graph
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Graph Plugin for SQuirreL SQL Client
+ The Graph plugin allows to create charts of tables and foreign-key
+ relationships. To create a graph select the tables in the Object tree and
+ click the 'Add to graph' item in the right mouse menu. Right mouse click
+ tables, constraints as well as the background to find out what functions the
+ Graph provides.
+
+Package: squirrel-sql-plugin-h2
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: H2 Plugin for SQuirreL SQL Client
+ The H2 plugin adds H2-specific functionality to the SQuirreL SQL Client.
+ The plugin adds the following features:
+ * Indexes and Views are shown in the object tree and have a "Source" tab
+ which displays the source of the selected object and a "Details" tab which
+ gives H2-specific information about the object.
+ * Sequences and Indexes are also shown in the object tree and have a details
+ tab giving H2-specific information about them.
+
+Package: squirrel-sql-plugin-hibernate
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Hibernate Plugin for SQuirreL SQL Client
+ The Hibernate plugin allows to open Hibernate session inside SQuirreL SQL
+ Client and query mapped domain objects using HQL. Before using the Hibernate
+ Plugin you must create at least one Hibernate configuration in SQuirreL's
+ Global Preferences.
+
+Package: squirrel-sql-plugin-i18n
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: I18n Plugin for SQuirreL SQL Client
+ The I18n plugin is meant to help SQuirreL internationalization. The plugin
+ adds additional features in "I18n administration" tab in "Global Preferences"
+ menu for both translators and developers.
+
+Package: squirrel-sql-plugin-informix
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Informix Plugin for SQuirreL SQL Client
+ The Informix plugin adds Informix-specific functionality to the SQuirreL SQL
+ Client. The plugin adds the following features:
+ * Stored Procedures, Triggers and Views are shown in the object tree and have
+ a "Source" tab which displays the source of the selected object and
+ a "Details" tab which gives Informix-specific information about the object.
+ * Sequences and Indexes are also shown in the object tree and have a details
+ tab giving Informix-specific information about them.
+
+Package: squirrel-sql-plugin-mssql
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Mssql Plugin for SQuirreL SQL Client
+ The plugin is designed for SQL Server 2000 and performs MSSQL-specific commands
+ with a few clicks. It is ultimately designed to incorporate all functionality
+ from both SQL Enterprise Manager and Query Analyzer.
+
+Package: squirrel-sql-plugin-mysql
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Mysql Plugin for SQuirreL SQL Client
+ The MySQL plugin adds MySQL specific functionality to SQuirreL SQL Client. The
+ plugin adds the following features:
+ * The "MySQL Status" tab display status information about the MySQL server.
+ * The "MySQL Processes" tab shows the current processes attached to the
+ server.
+ * The "MySQL Variables" tab shows the values of some MySQL system variables.
+ * The "MySQL Logs" tab shows information about the current MySQL log files.
+ * The "MySQL Open Tables" tab. shows a list of the currently opened tables
+ in the catalog
+ * The "MySQL Table Status" tab shows status information for the tables in the
+ currently selected catalog.
+ * The Session menu (and the popup menu in the object tree) has a new
+ Hierarchical menu "MySQL" that contains MySQL specific actions.
+
+Package: squirrel-sql-plugin-netezza
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Netezza Plugin for SQuirreL SQL Client
+ The Netezza plugin adds Netezza-specific functionality to the SQuirreL SQL
+ Client. The plugin adds the following features:
+ * Synonyms, Sequences, Stored Procedures and Views are shown in the object
+ tree when using this plugin.
+ * Synonyms, Stored Procedures and Views have a "Source" tab which displays
+ the source of the selected object. Synonyms also have a "Details" tab
+ which gives synonym-specific information about the object.
+
+Package: squirrel-sql-plugin-postgres
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Postgres Plugin for SQuirreL SQL Client
+ The Postgres plugin adds Postgres-specific functionality to the SQuirreL SQL
+ Client. The plugin adds the following features:
+ * Stored Procedures, Triggers and Views are shown in the object tree and have
+ a "Source" tab which displays the source of the selected object and a
+ "Details" tab which gives PostgreSQL-specific information about the object.
+ * Sequences and Indexes are also shown in the object tree and have a details
+ tab giving Postgres-specific information about them.
+
+Package: squirrel-sql-plugin-refactoring
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Refactoring Plugin for SQuirreL SQL Client
+ The Refactoring plugin adds the ability to easily change the definition or
+ structure of tables / columns in a database. The following refactorings are
+ supported (if the database supports the refactoring directly with SQL):
+ * Structural Refactorings
+ * Referential Integrity Refactorings
+ * Data Quality Refactorings.
+
+Package: squirrel-sql-plugin-sessionscript
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Sessionscript Plugin for SQuirreL SQL Client
+ The Sessionscript plugin allows you to specify SQL statements to be executed
+ when you first connect to an alias. The plugin adds "Session Scripts" option
+ to the "Plugins" menu.
+
+Package: squirrel-sql-plugin-smarttools
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Smarttools Plugin for SQuirreL SQL Client
+ The Smarttools plugin adds the following routines to the session popup menu:
+ * Search null values in NOT NULL columns
+ * Change data
+ * Search missing indices and from here create index or primary key.
+
+Package: squirrel-sql-plugin-sqlbookmark
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Sqlbookmark Plugin for SQuirreL SQL Client
+ The Sqlbookmark plugin allows you to bookmark commonly used SQL code for easy
+ point and click reuse. Bookmarks can be administered through "Bookmarks" tab
+ of the Global Preferences dialog. Bookmarked SQL strings can have replaceable
+ parameters. At the time the bookmark is loaded, the user is asked to enter
+ values for any of the parameters.
+
+Package: squirrel-sql-plugin-sqlparam
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Sqlparam Plugin for SQuirreL SQL Client
+ The Sqlparam plugin allows you to put variables into your SQL statements. The
+ user needs to replace the variable parts of SQL statement with variables like
+ ':variable'. When the query is executed, the user is asked to provide a value
+ for the variable.
+
+Package: squirrel-sql-plugin-sqlreplace
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Sqlreplace Plugin for SQuirreL SQL Client
+ The Sqlreplace plugin replaces a set of variables before a statement is
+ executed. If there is a need to specify variables containing more regexPattern
+ then one can specify this in the preferences.
+
+Package: squirrel-sql-plugin-sqlscript
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Sqlscript Plugin for SQuirreL SQL Client
+ The Sqlscript plugin provides a wide range of scripting functions:
+ * Create DDL scripts for tables out of the Object tree or from Graph plugin
+ * Create Insert scripts out of the Object tree for all of a table's data
+ * Create an insert script from an SQL Select statement
+ * Store the result of an from an SQL Select statement in a temporary table
+ with the help of sql2table function from the popup menu.
+
+Package: squirrel-sql-plugin-laf
+Architecture: all
+Depends: kunststoff,
+ libjgoodies-looks-java,
+ libskinlf-java,
+ squirrel-sql,
+ substance,
+ tinylaf,
+ ${misc:Depends}
+Description: Look and Feel Plugin for SQuirreL SQL Client
+ This plugin allows you to select a Look and Feel other than the default Java
+ one and to specify the fonts for the different GUI controls. The plugin adds
+ the following features:
+ * The "L & F" tab in the "Global Preferences" Dialog allows to select the
+ Look and Feel.
+ * The "Fonts" tab in the "Global Preferences" Dialog allows to specify the
+ fonts used for various controls in SQuirreL.
+ The plugin ships with the following Look and Feel implementations:
+ * JGoodies Looks Look & Feel
+ * Kunststoff Look & Feel
+ * Substance Look & Feel
+ * Skin Look & Feel
+ * TinyLAF Look & Feel
+
+Package: squirrel-sql-plugin-firebird
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Firebird Plugin for SQuirreL SQL Client
+ The Firebird plugin adds functionality specific to the Firebird DBMS to
+ SQuirreL SQL Client. The plugin adds the following features:
+ * Stored Procedures, Triggers and Views are shown in the object tree and have
+ a "Source" tab which displays the source of the selected object and a
+ "Details" tab which gives Firebird-specific information about the object.
+ * Sequences and Indexes are also shown in the object tree and have a details
+ tab giving Firebird-specific information about them.
+
+Package: squirrel-sql-plugin-sqlval
+Architecture: all
+Depends: libaxis-java, squirrel-sql, ${misc:Depends}
+Description: Sqlval Plugin for SQuirreL SQL Client
+ The Sqlval plugin validates SQL against the ISO SQL standard. It does this
+ by using a Web Service provided by Mimer SQL. The SQL that is validated is
+ stored anonymously to be used by the ISO SQL Standards committee.
+
+Package: squirrel-sql-plugin-sybase
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Sybase Plugin for SQuirreL SQL Client
+ The Sybase plugin allows Sybase ASE users to script Procedures and Views
+ using the right click popup menu. The plugin was created using the example
+ plugin.
+
+Package: squirrel-sql-plugin-userscript
+Architecture: all
+Depends: squirrel-sql, ${misc:Depends}
+Description: Userscript Plugin for SQuirreL SQL Client
+ The Userscript plugin provides an easy way to extend Squirrel with little Java
+ programs called user scripts. The functions are accessible through right click
+ in the object tree.
+
+Package: squirrel-sql-plugins-standard
+Architecture: all
+Depends: squirrel-sql-plugin-codecompletion,
+ squirrel-sql-plugin-editextras,
+ squirrel-sql-plugin-graph,
+ squirrel-sql-plugin-laf,
+ squirrel-sql-plugin-sqlbookmark,
+ squirrel-sql-plugin-sqlscript,
+ ${misc:Depends}
+Description: Standard Plugins for SQuirreL SQL Client
+ This metapackage contains dependencies for a collection of standard SQuirreL
+ plugins:
+ * Code Completion - Offers code completion the same way as modern IDEs do
+ * Syntax - Syntax highlighting
+ * Edit Extras - Auxiliary functions to work with SQL code
+ * Graph - create a chart of tables and foreign-key relationships between them
+ * SQL Script - Generation of SQL and DDL scripts
+ * SQL Bookmarks - Managing SQL code templates
+ * Look and Feel - Switching the look and feel
Added: trunk/squirrel-sql/debian/copyright
===================================================================
--- trunk/squirrel-sql/debian/copyright (rev 0)
+++ trunk/squirrel-sql/debian/copyright 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,354 @@
+Format-Specification: http://dep.debian.net/deps/dep5/
+Name: SQuirreL SQL
+Maintainer: Gerd Wagner as Administrator, Developer
+ Rob Manning as Developer, Release Manager
+Source: http://www.squirrelsql.org/
+
+Files: *
+Copyright: 2001-2011,
+ Adin Aronson
+ Christian Sell
+ Colin Bell
+ Daniel Regli
+ David MacLean
+ Gerd Wagner
+ Glenn Griffin
+ Henner Zeller
+ Jason Height
+ Johan Compagner
+ Maury Hammel
+ Rob Manning
+ Ryan Walberg
+ Thorsten Mürell
+ Yannick Winiger
+License: Apache-2.0 or LGPL-2.1
+
+Files: plugins/*
+Copyright: 2001-2006, Colin Bell
+ 2001-2003, Jason Height
+ 2001, Johan Compagner
+ 2001, Stephen Ostermiller
+ 2002-2003, Colin Bell and Olof Edlund
+ 2003, Arun Kapilan.P
+ 2003-2010, Gerd Wagner
+ 2003, Joseph Mocker
+ 2003-2005, Robert Futrell
+ 2003, Stathis Alexopoulos
+ 2004, Ryan Walberg
+ 2005, Alexander Buloichik
+ 2005-2010, Rob Manning
+ 2007, Christoph Schmitz
+ 2007, Daniel Regli & Yannick Winiger
+ 2007, Thorsten Mürell
+ 2007, Yannick Winiger
+ 2008, Dieter Engelhardt
+ 2008, Lars Heller
+ 2008, Michael Romankiewicz
+ 2009, Glenn Hobbs
+ 2009, Jos David Moreno Jurez
+ 2010, Bogdan Cristian Paulon
+ Bruce Dunwiddie
+License: LGPL-2.1
+
+Files: debian/*
+Copyright: 2009, Markus Heberling <markus at tisoft.de>
+ 2011, Vladimir Kotov <vladimir at kotov.lv>
+License: GPL-2
+
+Files: fw/src/main/java/net/sourceforge/squirrel_sql/fw/completion/PopupManager.java
+Copyright: 1997-2000, Sun Microsystems, Inc.
+License: Sun Public License Version 1.0
+Comment: We have contacted the upstream authors Rob Manning and Gerd Wagner regarding the source
+ from which this derived work was created. The original file is PopupManager.java,
+ part of the NetBeans software (http://netbeans.org/). The file is no longer distributed under the SPL,
+ but instead under a GPL-like license.
+
+Files: app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/DefaultFormBuilder.java
+Copyright: 2005-2008, Karsten Lentzsch <karsten at dev.java.net>
+License: BSD
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ o Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ o Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ o Neither the name of JGoodies Karsten Lentzsch nor the names of
+ its contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Files: app/src/main/resources/net/sourceforge/squirrel_sql/client/resources/images/eclipse/*
+License: CPL-1.0
+
+Files: app/src/main/resources/net/sourceforge/squirrel_sql/client/resources/images/jb/*
+Copyright: 1998, Dean S. Jones
+
+Files: app/src/main/resources/net/sourceforge/squirrel_sql/client/resources/images/sun/*
+Copyright: 2000, Sun Microsystems
+License: other
+ Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
+ and redistribute this software graphics artwork, as individual graphics or
+ as a collection, as part of software code or programs that you develop,
+ provided that i) this copyright notice and license accompany the software
+ graphics artwork; and ii) you do not utilize the software graphics artwork
+ in a manner which is disparaging to Sun. Unless enforcement is prohibited by
+ applicable law, you may not modify the graphics, and must use them true to
+ color and unmodified in every way.
+
+ This software graphics artwork is provided "AS IS," without a warranty of
+ any kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL
+ NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING,
+ MODIFYING OR DISTRIBUTING THE SOFTWARE GRAPHICS ARTWORK.
+
+ IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT
+ OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
+ PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE GRAPHICS ARTWORK,
+ EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+ If any of the above provisions are held to be in violation of applicable
+ law, void, or unenforceable in any jurisdiction, then such provisions are
+ waived to the extent necessary for this Disclaimer to be otherwise
+ enforceable in such jurisdiction.
+
+License: Apache-2.0
+ On Debian GNU/Linux system you can find the complete text of the
+ Apache-2.0 license in '/usr/share/common-licenses/Apache-2.0'
+
+License: LGPL-2.1
+ On Debian GNU/Linux system you can find the complete text of the
+ LGPL-2.1 license in '/usr/share/common-licenses/LGPL-2.1'
+
+License: GPL-2
+ On Debian GNU/Linux system you can find the complete text of the
+ GPL-2 license in '/usr/share/common-licenses/GPL-2'
+
+License: CPL-1.0
+ THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC
+ LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
+ CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+ 1. DEFINITIONS
+
+ "Contribution" means:
+
+ a) in the case of the initial Contributor, the initial code and
+ documentation distributed under this Agreement, and
+
+ b) in the case of each subsequent Contributor:
+
+ i) changes to the Program, and
+
+ ii) additions to the Program;
+
+ where such changes and/or additions to the Program originate from and are
+ distributed by that particular Contributor. A Contribution 'originates' from a
+ Contributor if it was added to the Program by such Contributor itself or anyone
+ acting on such Contributor's behalf. Contributions do not include additions to
+ the Program which: (i) are separate modules of software distributed in
+ conjunction with the Program under their own license agreement, and (ii) are not
+ derivative works of the Program.
+
+ "Contributor" means any person or entity that distributes the Program.
+
+ "Licensed Patents " mean patent claims licensable by a Contributor which are
+ necessarily infringed by the use or sale of its Contribution alone or when
+ combined with the Program.
+
+ "Program" means the Contributions distributed in accordance with this Agreement.
+
+ "Recipient" means anyone who receives the Program under this Agreement,
+ including all Contributors.
+
+ 2. GRANT OF RIGHTS
+
+ a) Subject to the terms of this Agreement, each Contributor hereby grants
+ Recipient a non-exclusive, worldwide, royalty-free copyright license to
+ reproduce, prepare derivative works of, publicly display, publicly perform,
+ distribute and sublicense the Contribution of such Contributor, if any, and such
+ derivative works, in source code and object code form.
+
+ b) Subject to the terms of this Agreement, each Contributor hereby grants
+ Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed
+ Patents to make, use, sell, offer to sell, import and otherwise transfer the
+ Contribution of such Contributor, if any, in source code and object code form.
+ This patent license shall apply to the combination of the Contribution and the
+ Program if, at the time the Contribution is added by the Contributor, such
+ addition of the Contribution causes such combination to be covered by the
+ Licensed Patents. The patent license shall not apply to any other combinations
+ which include the Contribution. No hardware per se is licensed hereunder.
+
+ c) Recipient understands that although each Contributor grants the licenses
+ to its Contributions set forth herein, no assurances are provided by any
+ Contributor that the Program does not infringe the patent or other intellectual
+ property rights of any other entity. Each Contributor disclaims any liability to
+ Recipient for claims brought by any other entity based on infringement of
+ intellectual property rights or otherwise. As a condition to exercising the
+ rights and licenses granted hereunder, each Recipient hereby assumes sole
+ responsibility to secure any other intellectual property rights needed, if any.
+ For example, if a third party patent license is required to allow Recipient to
+ distribute the Program, it is Recipient's responsibility to acquire that license
+ before distributing the Program.
+
+ d) Each Contributor represents that to its knowledge it has sufficient
+ copyright rights in its Contribution, if any, to grant the copyright license set
+ forth in this Agreement.
+
+ 3. REQUIREMENTS
+
+ A Contributor may choose to distribute the Program in object code form under its
+ own license agreement, provided that:
+
+ a) it complies with the terms and conditions of this Agreement; and
+
+ b) its license agreement:
+
+ i) effectively disclaims on behalf of all Contributors all warranties and
+ conditions, express and implied, including warranties or conditions of title and
+ non-infringement, and implied warranties or conditions of merchantability and
+ fitness for a particular purpose;
+
+ ii) effectively excludes on behalf of all Contributors all liability for
+ damages, including direct, indirect, special, incidental and consequential
+ damages, such as lost profits;
+
+ iii) states that any provisions which differ from this Agreement are offered
+ by that Contributor alone and not by any other party; and
+
+ iv) states that source code for the Program is available from such
+ Contributor, and informs licensees how to obtain it in a reasonable manner on or
+ through a medium customarily used for software exchange.
+
+ When the Program is made available in source code form:
+
+ a) it must be made available under this Agreement; and
+
+ b) a copy of this Agreement must be included with each copy of the Program.
+
+ Contributors may not remove or alter any copyright notices contained within the
+ Program.
+
+ Each Contributor must identify itself as the originator of its Contribution, if
+ any, in a manner that reasonably allows subsequent Recipients to identify the
+ originator of the Contribution.
+
+ 4. COMMERCIAL DISTRIBUTION
+
+ Commercial distributors of software may accept certain responsibilities with
+ respect to end users, business partners and the like. While this license is
+ intended to facilitate the commercial use of the Program, the Contributor who
+ includes the Program in a commercial product offering should do so in a manner
+ which does not create potential liability for other Contributors. Therefore, if
+ a Contributor includes the Program in a commercial product offering, such
+ Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
+ every other Contributor ("Indemnified Contributor") against any losses, damages
+ and costs (collectively "Losses") arising from claims, lawsuits and other legal
+ actions brought by a third party against the Indemnified Contributor to the
+ extent caused by the acts or omissions of such Commercial Contributor in
+ connection with its distribution of the Program in a commercial product
+ offering. The obligations in this section do not apply to any claims or Losses
+ relating to any actual or alleged intellectual property infringement. In order
+ to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+ Contributor in writing of such claim, and b) allow the Commercial Contributor to
+ control, and cooperate with the Commercial Contributor in, the defense and any
+ related settlement negotiations. The Indemnified Contributor may participate in
+ any such claim at its own expense.
+
+ For example, a Contributor might include the Program in a commercial product
+ offering, Product X. That Contributor is then a Commercial Contributor. If that
+ Commercial Contributor then makes performance claims, or offers warranties
+ related to Product X, those performance claims and warranties are such
+ Commercial Contributor's responsibility alone. Under this section, the
+ Commercial Contributor would have to defend claims against the other
+ Contributors related to those performance claims and warranties, and if a court
+ requires any other Contributor to pay any damages as a result, the Commercial
+ Contributor must pay those damages.
+
+ 5. NO WARRANTY
+
+ EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
+ IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,
+ NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each
+ Recipient is solely responsible for determining the appropriateness of using and
+ distributing the Program and assumes all risks associated with its exercise of
+ rights under this Agreement, including but not limited to the risks and costs of
+ program errors, compliance with applicable laws, damage to or loss of data,
+ programs or equipment, and unavailability or interruption of operations.
+
+ 6. DISCLAIMER OF LIABILITY
+
+ EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
+ CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
+ PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS
+ GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+ 7. GENERAL
+
+ If any provision of this Agreement is invalid or unenforceable under applicable
+ law, it shall not affect the validity or enforceability of the remainder of the
+ terms of this Agreement, and without further action by the parties hereto, such
+ provision shall be reformed to the minimum extent necessary to make such
+ provision valid and enforceable.
+
+ If Recipient institutes patent litigation against a Contributor with respect to
+ a patent applicable to software (including a cross-claim or counterclaim in a
+ lawsuit), then any patent licenses granted by that Contributor to such Recipient
+ under this Agreement shall terminate as of the date such litigation is filed. In
+ addition, if Recipient institutes patent litigation against any entity
+ (including a cross-claim or counterclaim in a lawsuit) alleging that the Program
+ itself (excluding combinations of the Program with other software or hardware)
+ infringes such Recipient's patent(s), then such Recipient's rights granted under
+ Section 2(b) shall terminate as of the date such litigation is filed.
+
+ All Recipient's rights under this Agreement shall terminate if it fails to
+ comply with any of the material terms or conditions of this Agreement and does
+ not cure such failure in a reasonable period of time after becoming aware of
+ such noncompliance. If all Recipient's rights under this Agreement terminate,
+ Recipient agrees to cease use and distribution of the Program as soon as
+ reasonably practicable. However, Recipient's obligations under this Agreement
+ and any licenses granted by Recipient relating to the Program shall continue and
+ survive.
+
+ Everyone is permitted to copy and distribute copies of this Agreement, but in
+ order to avoid inconsistency the Agreement is copyrighted and may only be
+ modified in the following manner. The Agreement Steward reserves the right to
+ publish new versions (including revisions) of this Agreement from time to time.
+ No one other than the Agreement Steward has the right to modify this Agreement.
+ IBM is the initial Agreement Steward. IBM may assign the responsibility to serve
+ as the Agreement Steward to a suitable separate entity. Each new version of the
+ Agreement will be given a distinguishing version number. The Program (including
+ Contributions) may always be distributed subject to the version of the Agreement
+ under which it was received. In addition, after a new version of the Agreement
+ is published, Contributor may elect to distribute the Program (including its
+ Contributions) under the new version. Except as expressly stated in Sections
+ 2(a) and 2(b) above, Recipient receives no rights or licenses to the
+ intellectual property of any Contributor under this Agreement, whether
+ expressly, by implication, estoppel or otherwise. All rights in the Program not
+ expressly granted under this Agreement are reserved.
+
+ This Agreement is governed by the laws of the State of New York and the
+ intellectual property laws of the United States of America. No party to this
+ Agreement will bring a legal action under this Agreement more than one year
+ after the cause of action arose. Each party waives its rights to a jury trial in
+ any resulting litigation.
\ No newline at end of file
Added: trunk/squirrel-sql/debian/libsquirrel-sql-fw-java-doc.doc-base.api
===================================================================
--- trunk/squirrel-sql/debian/libsquirrel-sql-fw-java-doc.doc-base.api (rev 0)
+++ trunk/squirrel-sql/debian/libsquirrel-sql-fw-java-doc.doc-base.api 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,10 @@
+Document: libsquirrel-sql-fw-java
+Title: API Javadoc for SQuirreL SQL Framework Library
+Author: SQuirreL SQL developers
+Abstract: This is the API Javadoc provided for the
+ libsquirrel-sql-fw-java library.
+Section: Programming
+
+Format: HTML
+Index: /usr/share/doc/libsquirrel-sql-fw-java/api/index.html
+Files: /usr/share/doc/libsquirrel-sql-fw-java/api/*
Added: trunk/squirrel-sql/debian/libsquirrel-sql-fw-java-doc.install
===================================================================
--- trunk/squirrel-sql/debian/libsquirrel-sql-fw-java-doc.install (rev 0)
+++ trunk/squirrel-sql/debian/libsquirrel-sql-fw-java-doc.install 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,2 @@
+
+fw/target/apidocs/* usr/share/doc/libsquirrel-sql-fw-java/api
Added: trunk/squirrel-sql/debian/libsquirrel-sql-fw-java.poms
===================================================================
--- trunk/squirrel-sql/debian/libsquirrel-sql-fw-java.poms (rev 0)
+++ trunk/squirrel-sql/debian/libsquirrel-sql-fw-java.poms 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,2 @@
+pom.xml --no-parent
+fw/pom.xml
Added: trunk/squirrel-sql/debian/maven.ignoreRules
===================================================================
--- trunk/squirrel-sql/debian/maven.ignoreRules (rev 0)
+++ trunk/squirrel-sql/debian/maven.ignoreRules 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,19 @@
+asm asm-attrs * * * *
+gsbase gsbase * * * *
+junit junit * * * *
+org.easymock easymock * * * *
+org.easymock easymockclassextension * * * *
+org.mockito mockito-all * * * *
+org.springframework spring-test * * * *
+net.sf.squirrel-sql squirrelsql-version-plugin * * * *
+org.apache.maven.plugins maven-source-plugin * * * *
+org.apache.maven.plugins maven-scm-plugin * * * *
+org.apache.maven.plugins maven-surefire-plugin * * * *
+org.apache.maven.plugins maven-assembly-plugin * * * *
+org.apache.maven.plugins maven-dependency-plugin * * * *
+net.sf.squirrel-sql fw test-jar * * *
+net.sf.squirrel-sql squirrel-sql test-jar * * *
+net.sf.squirrel-sql.thirdparty-non-maven * * * * *
+net.sf.nimrod nimrod-laf * * * *
+net.sf.tinylaf tinylaf * * * *
+
Added: trunk/squirrel-sql/debian/maven.rules
===================================================================
--- trunk/squirrel-sql/debian/maven.rules (rev 0)
+++ trunk/squirrel-sql/debian/maven.rules 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,9 @@
+antlr antlr jar s/2\..*/2.x/ * *
+asm asm jar s/.*/3.x/ * *
+commons-collections commons-collections jar s/.*/3.x/ * *
+commons-httpclient commons-httpclient jar s/3\..*/3.x/ * *
+s/jgoodies/com.jgoodies/ forms * s/.*/debian/ * *
+log4j log4j jar s/1\.2\..*/1.2.x/ * *
+org.antlr stringtemplate jar s/3\..*/3.x/ * *
+org.springframework * * s/.*/2.x/ * *
+org.hibernate s/hibernate/hibernate-core/ jar s/.*/debian/ * *
Added: trunk/squirrel-sql/debian/menu
===================================================================
--- trunk/squirrel-sql/debian/menu (rev 0)
+++ trunk/squirrel-sql/debian/menu 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,4 @@
+?package(squirrel-sql):needs="X11" section="Applications/Data Management"\
+ title="SQuirreL SQL" command="/usr/bin/squirrel-sql" \
+ icon="/usr/share/squirrel-sql/icons/acorn.xpm"
+
Added: trunk/squirrel-sql/debian/orig-tar.exclude
===================================================================
--- trunk/squirrel-sql/debian/orig-tar.exclude (rev 0)
+++ trunk/squirrel-sql/debian/orig-tar.exclude 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,9 @@
+*.jar
+build/*
+design/*
+docsrc/*
+web-site/*
+test/*
+
+
+
Added: trunk/squirrel-sql/debian/orig-tar.sh
===================================================================
--- trunk/squirrel-sql/debian/orig-tar.sh (rev 0)
+++ trunk/squirrel-sql/debian/orig-tar.sh 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,18 @@
+#!/bin/sh -e
+
+VERSION=$2
+TAR=../squirrel-sql_$VERSION.orig.tar.gz
+DIR=squirrel-sql-$VERSION
+SVN=http://squirrel-sql.svn.sourceforge.net/svnroot/squirrel-sql/tags
+TAG=$(echo "squirrelsql-$VERSION" | sed -re's/~(alpha|beta)/-\1-/')
+
+# clean up the upstream tarball
+svn export $SVN/$TAG $DIR
+tar -c -z -f $TAR -X debian/orig-tar.exclude $DIR
+rm -rf $DIR $3
+
+# move to directory 'tarballs'
+if [ -r .svn/deb-layout ]; then
+ . .svn/deb-layout
+ mv $TAR $origDir && echo "moved $TAR to $origDir"
+fi
Property changes on: trunk/squirrel-sql/debian/orig-tar.sh
___________________________________________________________________
Added: svn:executable
+
Added: trunk/squirrel-sql/debian/patches/001-squirrelsql-jgoodies.patch
===================================================================
--- trunk/squirrel-sql/debian/patches/001-squirrelsql-jgoodies.patch (rev 0)
+++ trunk/squirrel-sql/debian/patches/001-squirrelsql-jgoodies.patch 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,1327 @@
+Description: Workaround for api compatibility problems with jgoodies-forms >= v 1.1.0 where some deprecated builder constructors were removed.
+ Code of DefaultFormBuilder from jgoodies upstream https://forms.dev.java.net/source/browse/*checkout*/forms/src/core/com/jgoodies/forms/builder/DefaultFormBuilder.java?rev=1.10 is used.
+Forwarded: https://sourceforge.net/tracker/?func=detail&aid=3168389&group_id=28383&atid=393416
+From: Debian Java Maintainers <pkg-java-maintainers at lists.alioth.debian.org>
+Last-Update: 2011-01-09
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/DefaultFormBuilder.java
++++ b/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/DefaultFormBuilder.java
+@@ -1,59 +1,100 @@
+ /*
+- * Copyright (c) 2003 JGoodies Karsten Lentzsch. All Rights Reserved.
++ * Copyright (c) 2002-2008 JGoodies Karsten Lentzsch. All Rights Reserved.
+ *
+- * Redistribution and use in source and binary forms, with or without
++ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+- *
+- * o Redistributions of source code must retain the above copyright notice,
+- * this list of conditions and the following disclaimer.
+- *
+- * o Redistributions in binary form must reproduce the above copyright notice,
+- * this list of conditions and the following disclaimer in the documentation
+- * and/or other materials provided with the distribution.
+- *
+- * o Neither the name of JGoodies Karsten Lentzsch nor the names of
+- * its contributors may be used to endorse or promote products derived
+- * from this software without specific prior written permission.
+- *
+- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+- * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+- */package net.sourceforge.squirrel_sql.client.gui.builders;
++ *
++ * o Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ *
++ * o Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ *
++ * o Neither the name of JGoodies Karsten Lentzsch nor the names of
++ * its contributors may be used to endorse or promote products derived
++ * from this software without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
++ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
++ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
++ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
++ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
++ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
++ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++package net.sourceforge.squirrel_sql.client.gui.builders;
++import com.jgoodies.forms.builder.I15dPanelBuilder;
++
+ import java.awt.Component;
+ import java.util.ResourceBundle;
+
+ import javax.swing.JComponent;
+ import javax.swing.JLabel;
+ import javax.swing.JPanel;
++
+ import com.jgoodies.forms.factories.FormFactory;
+ import com.jgoodies.forms.layout.ConstantSize;
+ import com.jgoodies.forms.layout.FormLayout;
+ import com.jgoodies.forms.layout.RowSpec;
+-/** * Provides a means to build consistent form-oriented panels quickly
++
++/**
++ * Provides a means to build form-oriented panels quickly and consistently
+ * using the {@link FormLayout}. This builder combines frequently used
+- * panel building steps: add a new row, add a label, proceed to the next
+- * data column, then add a component.
+- * <p>
++ * panel building steps: add a new row, add a label, proceed to the next
++ * data column, then add a component.<p>
++ *
++ * The extra value lies in the <code>#append</code> methods that
++ * append gap rows and component rows if necessary and then add
++ * the given components. They are built upon the superclass behavior
++ * <code>#appendRow</code> and the set of <code>#add</code> methods.
++ * A set of component appenders allows to add a textual label and
++ * associated component in a single step.<p>
++ *
+ * This builder can map resource keys to internationalized (i15d) texts
+ * when creating text labels, titles and titled separators. Therefore
+ * you must specify a <code>ResourceBundle</code> in the constructor.
+- * The builder methods throw an <code>IllegalStateException</code>
+- * if one of the mapping builder methods is invoked and no bundle has been set.
+- * <p>
+- * This class is not yet part of the binary Forms library;
+- * it comes with the Forms distributions as an extra.
+- * <b>The API is work in progress and may change without notice.</b>
+- * If you want to use this class, you may consider copying it into your codebase.
+- * <p>
+- * <b>Example:</b>
++ * The builder methods throw an <code>IllegalStateException</code> if one
++ * of the mapping builder methods is invoked and no bundle has been set.<p>
++ *
++ * You can configure the build process by setting a leading column,
++ * enabling the row grouping and by modifying the gaps between normal
++ * lines and between paragraphs. The leading column will be honored
++ * if the cursor proceeds to the next row. All appended components
++ * start in the specified lead column, except appended separators that
++ * span all columns.<p>
++ *
++ * It is temptive to use the DefaultFormBuilder all the time and
++ * to let it add rows automatically. Use a simpler style if it increases
++ * the code readability. Explicit row specifications and cell constraints
++ * make your layout easier to understand - but harder to maintain.
++ * See also the accompanying tutorial sources and the Tips & Tricks
++ * that are part of the Forms documentation.<p>
++ *
++ * Sometimes a form consists of many standardized rows but has a few
++ * rows that require a customization. The DefaultFormBuilder can do everything
++ * that the superclasses {@link com.jgoodies.forms.builder.AbstractFormBuilder}
++ * and {@link com.jgoodies.forms.builder.PanelBuilder} can do;
++ * among other things: appending new rows and moving the cursor.
++ * Again, ask yourself if the DefaultFormBuilder is the appropriate builder.
++ * As a rule of thumb you should have more components than builder commands.
++ * There are different ways to add custom rows. Find below example code
++ * that presents and compares the pros and cons of three approaches.<p>
++ *
++ * The texts used in methods <code>#append(String, ...)</code> and
++ * <code>#appendTitle(String)</code> as well as the localized texts used in
++ * methods <code>#appendI15d</code> and <code>#appendI15dTitle</code>
++ * can contain an optional mnemonic marker. The mnemonic and mnemonic index
++ * are indicated by a single ampersand (<tt>&</tt>).
++ * For example <tt>"&Save"</tt>, or
++ * <tt>"Save &as"</tt>. To use the ampersand itself,
++ * duplicate it, for example <tt>"Look&&Feel"</tt>.<p>
++ *
++ * <strong>Example:</strong>
+ * <pre>
+ * public void build() {
+ * FormLayout layout = new FormLayout(
+@@ -68,7 +109,7 @@
+ * builder.append("Identifier", identifierField);
+ * builder.nextLine();
+ *
+- * builder.append("PTI [kW]", new JTextField());
++ * builder.append("PTI [kW]", new JTextField());
+ * builder.append("Power [kW]", new JTextField());
+ *
+ * builder.append("s [mm]", new JTextField());
+@@ -76,18 +117,18 @@
+ *
+ * builder.appendSeparator("Diameters");
+ *
+- * builder.append("da [mm]", new JTextField());
++ * builder.append("da [mm]", new JTextField());
+ * builder.append("di [mm]", new JTextField());
+ *
+- * builder.append("da2 [mm]", new JTextField());
++ * builder.append("da2 [mm]", new JTextField());
+ * builder.append("di2 [mm]", new JTextField());
+ *
+- * builder.append("R [mm]", new JTextField());
++ * builder.append("R [mm]", new JTextField());
+ * builder.append("D [mm]", new JTextField());
+ *
+ * builder.appendSeparator("Criteria");
+ *
+- * builder.append("Location", buildLocationComboBox());
++ * builder.append("Location", buildLocationComboBox());
+ * builder.append("k-factor", new JTextField());
+ *
+ * builder.appendSeparator("Bolts");
+@@ -100,199 +141,354 @@
+ *
+ * builder.append("ds [mm]", new JTextField());
+ * }
+- * </pre>
++ * </pre><p>
++ *
++ * <strong>Custom Row Example:</strong>
++ * <pre>
++ * public JComponent buildPanel() {
++ * initComponents();
++ *
++ * FormLayout layout = new FormLayout(
++ * "right:pref, 3dlu, default:grow",
++ * "");
++ * DefaultFormBuilder builder = new DefaultFormBuilder(layout);
++ * builder.setDefaultDialogBorder();
++ * builder.setRowGroupingEnabled(true);
++ *
++ * CellConstraints cc = new CellConstraints();
++ *
++ * // In this approach, we add a gap and a custom row.
++ * // The advantage of this approach is, that we can express
++ * // the row spec and comment area cell constraints freely.
++ * // The disadvantage is the misalignment of the leading label.
++ * // Also the row's height may be inconsistent with other rows.
++ * builder.appendSeparator("Single Custom Row");
++ * builder.append("Name", name1Field);
++ * builder.appendRow(builder.getLineGapSpec());
++ * builder.appendRow(new RowSpec("top:31dlu")); // Assumes line is 14, gap is 3
++ * builder.nextLine(2);
++ * builder.append("Comment");
++ * builder.add(new JScrollPane(comment1Area),
++ * cc.xy(builder.getColumn(), builder.getRow(), "fill, fill"));
++ * builder.nextLine();
++ *
++ * // In this approach, we append a standard row with gap before it.
++ * // The advantage is, that the leading label is aligned well.
++ * // The disadvantage is that the comment area now spans
++ * // multiple cells and is slightly less flexible.
++ * // Also the row's height may be inconsistent with other rows.
++ * builder.appendSeparator("Standard + Custom Row");
++ * builder.append("Name", name2Field);
++ * builder.append("Comment");
++ * builder.appendRow(new RowSpec("17dlu")); // Assumes line is 14, gap is 3
++ * builder.add(new JScrollPane(comment2Area),
++ * cc.xywh(builder.getColumn(), builder.getRow(), 1, 2));
++ * builder.nextLine(2);
++ *
++ * // In this approach, we append two standard rows with associated gaps.
++ * // The advantage is, that the leading label is aligned well,
++ * // and the height is consistent with other rows.
++ * // The disadvantage is that the comment area now spans
++ * // multiple cells and is slightly less flexible.
++ * builder.appendSeparator("Two Standard Rows");
++ * builder.append("Name", name3Field);
++ * builder.append("Comment");
++ * builder.nextLine();
++ * builder.append("");
++ * builder.nextRow(-2);
++ * builder.add(new JScrollPane(comment3Area),
++ * cc.xywh(builder.getColumn(), builder.getRow(), 1, 3));
++ *
++ * return builder.getPanel();
++ * }
++ * </pre><p>
++ *
++ * TODO: Consider adding a method for appending a component that spans the
++ * remaining columns in the current row. Method name candidates are
++ * <code>#appendFullSpan</code> and <code>#appendRemaining</code>.
+ *
+ * @author Karsten Lentzsch
++ * @version $Revision: 1.10 $
++ * @since 1.0.3
++ *
+ * @see com.jgoodies.forms.builder.AbstractFormBuilder
+ * @see com.jgoodies.forms.factories.FormFactory
+ * @see com.jgoodies.forms.layout.FormLayout
+ */
+ public final class DefaultFormBuilder extends I15dPanelBuilder {
++
++ /**
++ * Holds the row specification that is reused to describe rows
++ * that are intended for labels and components.
++ *
++ * @see #setDefaultRowSpec(RowSpec)
++ */
++ private RowSpec defaultRowSpec = FormFactory.PREF_ROWSPEC;
++
+ /**
+ * Holds the row specification that is reused to describe
+ * the constant gaps between component lines.
++ *
++ * @see #setLineGapSize(ConstantSize)
+ */
+ private RowSpec lineGapSpec = FormFactory.LINE_GAP_ROWSPEC;
++
+ /**
+- * Holds the row specification that describes the constant gaps
++ * Holds the row specification that describes the constant gaps
+ * between paragraphs.
++ *
++ * @see #setParagraphGapSize(ConstantSize)
+ */
+ private RowSpec paragraphGapSpec = FormFactory.PARAGRAPH_GAP_ROWSPEC;
++
+ /**
+ * Holds the offset of the leading column - often 0 or 1.
++ *
++ * @see #getLeadingColumnOffset()
++ * @see #setLeadingColumnOffset(int)
++ * @see #getLeadingColumn()
+ */
+ private int leadingColumnOffset = 0;
++
+ /**
+- * Determines wether new data rows are being grouped or not.
++ * Determines whether new data rows are being grouped or not.
++ *
++ * @see #isRowGroupingEnabled()
++ * @see #setRowGroupingEnabled(boolean)
+ */
+ private boolean rowGroupingEnabled = false;
++
++
+ // Instance Creation ****************************************************
+- /** * Constructs an instance of <code>DefaultFormBuilder</code> for the given
++
++ /**
++ * Constructs a <code>DefaultFormBuilder</code> for the given
+ * layout.
+- *
++ *
+ * @param layout the <code>FormLayout</code> to be used
+- */
++ */
+ public DefaultFormBuilder(FormLayout layout) {
+- this(new JPanel(), layout);
++ this(layout, new JPanel(null));
+ }
++
++
+ /**
+- * Constructs an instance of <code>DefaultFormBuilder</code> for the given
+- * panel and layout.
+- *
+- * @param panel the layout container
+- * @param layout the <code>FormLayout</code> to be used
+- */
+- public DefaultFormBuilder(JPanel panel, FormLayout layout) {
+- this(panel, layout, null);
++ * Constructs a <code>DefaultFormBuilder</code> for the given
++ * layout and panel.
++ *
++ * @param layout the <code>FormLayout</code> to be used
++ * @param panel the layout container
++ */
++ public DefaultFormBuilder(FormLayout layout, JPanel panel) {
++ this(layout, null, panel);
+ }
++
++
+ /**
+- * Constructs an instance of <code>DefaultFormBuilder</code> for the given
++ * Constructs a <code>DefaultFormBuilder</code> for the given
+ * layout and resource bundle.
+- *
++ *
+ * @param layout the <code>FormLayout</code> to be used
+ * @param bundle the <code>ResourceBundle</code> used to lookup i15d
+ * strings
+- */
++ */
+ public DefaultFormBuilder(FormLayout layout, ResourceBundle bundle) {
+- this(new JPanel(), layout, bundle);
++ this(layout, bundle, new JPanel(null));
+ }
++
++
+ /**
+- * Constructs an instance of <code>DefaultFormBuilder</code> for the given
+- * panel, layout and resource bundle.
+- *
+- * @param panel the layout container
++ * Constructs a <code>DefaultFormBuilder</code> for the given
++ * layout, resource bundle, and panel.
++ *
+ * @param layout the <code>FormLayout</code> to be used
++ * @param panel the layout container
+ * @param bundle the <code>ResourceBundle</code> used to lookup i15d
+- * strings
+- */
+- public DefaultFormBuilder(JPanel panel, FormLayout layout, ResourceBundle bundle) {
+- super(panel, layout, bundle);
+- }
+- // Settings Gap Sizes ***************************************************
+- /**
+- * Sets the size of gaps between component lines using the given
+- * constant size.
+- *
+- * @param lineGapSize the <coide>ConstantSize</code> that describes
+- * the size of the gaps between component lines
++ * strings
+ */
+- public void setLineGapSize(ConstantSize lineGapSize) {
+- RowSpec rowSpec = FormFactory.createGapRowSpec(lineGapSize);
+- // No longer supported in version 1.0.4/1.0.5 which are the oldest available versions in maven
+- // central repo
+- //
+- //this.lineGapSpec = rowSpec.asUnmodifyable();
+- this.lineGapSpec = rowSpec ;
++ public DefaultFormBuilder(FormLayout layout, ResourceBundle bundle, JPanel panel) {
++ super(layout, bundle, panel);
+ }
++
++
++ // Configuration **********************************************************
++
+ /**
+- * Returns the row specification that is used to separate component lines.
+- *
+- * @return the <code>RowSpec</code> that is used to separate lines
++ * Returns the row specification that is used for component rows.
++ *
++ * @return the {@code RowSpec} used for component rows
++ *
++ * @since 1.2
++ */
++ public RowSpec getDefaultRowSpec() {
++ return defaultRowSpec;
++ }
++
++
++ /**
++ * Sets the row specification that shall be used for component rows.
++ * It is {@link FormFactory#PREF_ROWSPEC} by default.
++ *
++ * @param defaultRowSpec the RowSpec to be used for component rows
++ *
++ * @since 1.2
++ */
++ public void setDefaultRowSpec(RowSpec defaultRowSpec) {
++ this.defaultRowSpec = defaultRowSpec;
++ }
++
++
++ /**
++ * Returns the row specification that is used to separate component row.
++ *
++ * @return the <code>RowSpec</code> that is used to separate component rows
+ */
+ public RowSpec getLineGapSpec() {
+ return lineGapSpec;
+ }
++
++
++ /**
++ * Sets the size of gaps between component lines using the given
++ * constant size.<p>
++ *
++ * <strong>Examples:</strong><pre>
++ * builder.setLineGapSize(Sizes.ZERO);
++ * builder.setLineGapSize(Sizes.DLUY9);
++ * builder.setLineGapSize(Sizes.pixel(1));
++ * </pre>
++ *
++ * @param lineGapSize the <code>ConstantSize</code> that describes
++ * the size of the gaps between component lines
++ */
++ public void setLineGapSize(ConstantSize lineGapSize) {
++ RowSpec rowSpec = RowSpec.createGap(lineGapSize);
++ this.lineGapSpec = rowSpec;
++ }
++
++
+ /**
+- * Sets the size of gaps between paragraphs using the given
+- * constant size.
+- *
+- * @param paragraphGapSize the <coide>ConstantSize</code> that describes
++ * Sets the size of gaps between paragraphs using the given
++ * constant size.<p>
++ *
++ * <strong>Examples:</strong><pre>
++ * builder.setParagraphGapSize(Sizes.DLUY14);
++ * builder.setParagraphGapSize(Sizes.dluY(22));
++ * builder.setParagraphGapSize(Sizes.pixel(42));
++ * </pre>
++ *
++ * @param paragraphGapSize the <code>ConstantSize</code> that describes
+ * the size of the gaps between paragraphs
+ */
+ public void setParagraphGapSize(ConstantSize paragraphGapSize) {
+- RowSpec rowSpec = FormFactory.createGapRowSpec(paragraphGapSize);
+- // No longer supported in version 1.0.4/1.0.5 which are the oldest available versions in maven
+- // central repo
+- //
+- //this.paragraphGapSpec = rowSpec.asUnmodifyable();
++ RowSpec rowSpec = RowSpec.createGap(paragraphGapSize);
+ this.paragraphGapSpec = rowSpec;
+ }
++
++
+ /**
+ * Returns the offset of the leading column, often 0 or 1.
+- *
++ *
+ * @return the offset of the leading column
+ */
+ public int getLeadingColumnOffset() {
+ return leadingColumnOffset;
+ }
++
++
+ /**
+ * Sets the offset of the leading column, often 0 or 1.
+- *
++ *
+ * @param columnOffset the new offset of the leading column
+ */
+ public void setLeadingColumnOffset(int columnOffset) {
+ this.leadingColumnOffset = columnOffset;
+ }
++
++
+ /**
+ * Returns whether new data rows are being grouped or not.
+- *
++ *
+ * @return true indicates grouping enabled, false disabled
+ */
+ public boolean isRowGroupingEnabled() {
+ return rowGroupingEnabled;
+ }
++
++
+ /**
+ * Enables or disables the grouping of new data rows.
+- *
++ *
+ * @param enabled indicates grouping enabled, false disabled
+ */
+ public void setRowGroupingEnabled(boolean enabled) {
+ rowGroupingEnabled = enabled;
+ }
++
++
+ // Filling Columns ******************************************************
++
+ /**
+- * Adds a component to the panel using the default constraints.
+- * Proceeds to the next data column.
+- *
++ * Adds a component to the panel using the default constraints
++ * with a column span of 1. Then proceeds to the next data column.
++ *
+ * @param component the component to add
+ */
+ public void append(Component component) {
+ append(component, 1);
+ }
++
++
+ /**
+ * Adds a component to the panel using the default constraints with
+ * the given columnSpan. Proceeds to the next data column.
+- *
++ *
+ * @param component the component to append
+- * @param columnSpan the column span used to add
++ * @param columnSpan the column span used to add
+ */
+ public void append(Component component, int columnSpan) {
+ ensureCursorColumnInGrid();
+ ensureHasGapRow(lineGapSpec);
+ ensureHasComponentLine();
+- setColumnSpan(columnSpan);
+- add(component);
+- setColumnSpan(1);
++
++ add(component, createLeftAdjustedConstraints(columnSpan));
+ nextColumn(columnSpan + 1);
+ }
++
++
+ /**
+ * Adds two components to the panel; each component will span a single
+ * data column. Proceeds to the next data column.
+- *
++ *
+ * @param c1 the first component to add
+ * @param c2 the second component to add
+- */
++ */
+ public void append(Component c1, Component c2) {
+ append(c1);
+ append(c2);
+ }
++
++
+ /**
+ * Adds three components to the panel; each component will span a single
+ * data column. Proceeds to the next data column.
+- *
++ *
+ * @param c1 the first component to add
+ * @param c2 the second component to add
+ * @param c3 the third component to add
+- */
++ */
+ public void append(Component c1, Component c2, Component c3) {
+ append(c1);
+ append(c2);
+ append(c3);
+ }
++
++
+ // Appending Labels with optional components ------------------------------
++
+ /**
+ * Adds a text label to the panel and proceeds to the next column.
+- *
++ *
+ * @param textWithMnemonic the label's text - may mark a mnemonic
+ * @return the added label
+ */
+@@ -301,212 +497,296 @@
+ append(label);
+ return label;
+ }
++
++
+ /**
+- * Adds a text label and component to the panel.
+- * Then proceeds to the next data column.
+- *
++ * Adds a text label and component to the panel.
++ * Then proceeds to the next data column.<p>
++ *
++ * The created label is labeling the given component; so the component
++ * gets the focus if the (optional) label mnemonic is pressed.
++ *
+ * @param textWithMnemonic the label's text - may mark a mnemonic
+ * @param component the component to add
+ * @return the added label
+- */
++ */
+ public JLabel append(String textWithMnemonic, Component component) {
+ return append(textWithMnemonic, component, 1);
+ }
++
++
+ /**
+ * Adds a text label and component to the panel; the component will span
+- * the specified number columns. Proceeds to the next data column.
+- * <p>
+- * The created label is labelling the given component; so the component
++ * the specified number columns. Proceeds to the next data column,
++ * and goes to the next line if the boolean flag is set.<p>
++ *
++ * The created label is labeling the given component; so the component
+ * gets the focus if the (optional) label mnemonic is pressed.
+- *
++ *
++ * @param textWithMnemonic the label's text - may mark a mnemonic
++ * @param c the component to add
++ * @param nextLine true forces a next line
++ * @return the added label
++ * @see JLabel#setLabelFor(java.awt.Component)
++ */
++ public JLabel append(String textWithMnemonic, Component c, boolean nextLine) {
++ JLabel label = append(textWithMnemonic, c);
++ if (nextLine) {
++ nextLine();
++ }
++ return label;
++ }
++
++
++ /**
++ * Adds a text label and component to the panel; the component will span
++ * the specified number columns. Proceeds to the next data column.<p>
++ *
++ * The created label is labeling the given component; so the component
++ * gets the focus if the (optional) label mnemonic is pressed.
++ *
+ * @param textWithMnemonic the label's text - may mark a mnemonic
+ * @param c the component to add
+ * @param columnSpan number of columns the component shall span
+ * @return the added label
+- * @see JLabel#setLabelFor
+- */
++ * @see JLabel#setLabelFor(java.awt.Component)
++ */
+ public JLabel append(String textWithMnemonic, Component c, int columnSpan) {
+ JLabel label = append(textWithMnemonic);
+ label.setLabelFor(c);
+ append(c, columnSpan);
+ return label;
+ }
++
++
+ /**
+ * Adds a text label and two components to the panel; each component
+- * will span a single column. Proceeds to the next data column.
+- *
++ * will span a single column. Proceeds to the next data column.<p>
++ *
++ * The created label is labeling the first component; so the component
++ * gets the focus if the (optional) label mnemonic is pressed.
++ *
+ * @param textWithMnemonic the label's text - may mark a mnemonic
+ * @param c1 the first component to add
+ * @param c2 the second component to add
+ * @return the added label
+- */
++ */
+ public JLabel append(String textWithMnemonic, Component c1, Component c2) {
+ JLabel label = append(textWithMnemonic, c1);
+ append(c2);
+ return label;
+ }
++
++
+ /**
+ * Adds a text label and two components to the panel; each component
+- * will span a single column. Proceeds to the next data column.
+- *
++ * will span a single column. Proceeds to the next data column.<p>
++ *
++ * The created label is labeling the first component; so the component
++ * gets the focus if the (optional) label mnemonic is pressed.
++ *
+ * @param textWithMnemonic the label's text - may mark a mnemonic
+ * @param c1 the first component to add
+ * @param c2 the second component to add
+ * @param colSpan the column span for the second component
+- */
+- public void append(String textWithMnemonic, Component c1, Component c2, int colSpan) {
+- append(textWithMnemonic, c1);
++ * @return the created label
++ */
++ public JLabel append(String textWithMnemonic, Component c1, Component c2, int colSpan) {
++ JLabel label = append(textWithMnemonic, c1);
+ append(c2, colSpan);
++ return label;
+ }
++
++
+ /**
+ * Adds a text label and three components to the panel; each component
+- * will span a single column. Proceeds to the next data column.
+- *
++ * will span a single column. Proceeds to the next data column.<p>
++ *
++ * The created label is labeling the first component; so the component
++ * gets the focus if the (optional) label mnemonic is pressed.
++ *
+ * @param textWithMnemonic the label's text - may mark a mnemonic
+ * @param c1 the first component to add
+ * @param c2 the second component to add
+ * @param c3 the third component to add
+ * @return the added label
+- */
++ */
+ public JLabel append(String textWithMnemonic, Component c1, Component c2, Component c3) {
+ JLabel label = append(textWithMnemonic, c1, c2);
+ append(c3);
+ return label;
+ }
++
++
+ /**
+ * Adds a text label and four components to the panel; each component
+- * will span a single column. Proceeds to the next data column.
+- *
++ * will span a single column. Proceeds to the next data column.<p>
++ *
++ * The created label is labeling the first component; so the component
++ * gets the focus if the (optional) label mnemonic is pressed.
++ *
+ * @param textWithMnemonic the label's text - may mark a mnemonic
+ * @param c1 the first component to add
+ * @param c2 the second component to add
+ * @param c3 the third component to add
+ * @param c4 the fourth component to add
+ * @return the added label
+- */
++ */
+ public JLabel append(String textWithMnemonic, Component c1, Component c2, Component c3, Component c4) {
+ JLabel label = append(textWithMnemonic, c1, c2, c3);
+ append(c4);
+ return label;
+ }
++
++
+ // Appending internationalized labels with optional components ------------
++
+ /**
+- * Adds an internationalized (i15d) text label to the panel using
++ * Adds an internationalized (i15d) text label to the panel using
+ * the given resource key and proceeds to the next column.
+- *
++ *
+ * @param resourceKey the resource key for the the label's text
+ * @return the added label
+ */
+ public JLabel appendI15d(String resourceKey) {
+ return append(getI15dString(resourceKey));
+ }
++
++
+ /**
+- * Adds an internationalized (i15d) text label to the panel using the given resource key;
+- * then proceeds to the next data column and adds a component with
+- * the given column span. Proceeds to the next data column.
+- *
+- * @param resourceKey the resource key for the text to add
+- * @param c the component to add
+- * @param columnSpan number of columns the component shall span
+- * @return the added label
+- */
+- public JLabel appendI15d(String resourceKey, Component c, int columnSpan) {
+- JLabel label = appendI15d(resourceKey);
+- append(c, columnSpan);
+- return label;
+- }
+- /**
+- * Adds an internationalized (i15d) text label and component to the panel.
+- * Then proceeds to the next data column.
+- *
++ * Adds an internationalized (i15d) text label and component
++ * to the panel. Then proceeds to the next data column.<p>
++ *
++ * The created label is labeling the given component; so the component
++ * gets the focus if the (optional) label mnemonic is pressed.
++ *
+ * @param resourceKey the resource key for the text to add
+ * @param component the component to add
+ * @return the added label
+- */
++ */
+ public JLabel appendI15d(String resourceKey, Component component) {
+- return appendI15d(resourceKey, component, 1);
++ return append(getI15dString(resourceKey), component, 1);
+ }
++
++
+ /**
+- * Adds an internationalized (i15d) text label and component to the panel.
+- * Then proceeds to the next data column.
+- * Goes to the next line if the boolean flag is set.
+- *
++ * Adds an internationalized (i15d) text label and component
++ * to the panel. Then proceeds to the next data column.
++ * Goes to the next line if the boolean flag is set.<p>
++ *
++ * The created label is labeling the first component; so the component
++ * gets the focus if the (optional) label mnemonic is pressed.
++ *
+ * @param resourceKey the resource key for the text to add
+ * @param component the component to add
+ * @param nextLine true forces a next line
+ * @return the added label
+- */
++ */
+ public JLabel appendI15d(String resourceKey, Component component, boolean nextLine) {
+- JLabel label = appendI15d(resourceKey, component, 1);
+- if (nextLine) {
+- nextLine();
+- }
+- return label;
++ return append(getI15dString(resourceKey), component, nextLine);
++ }
++
++
++ /**
++ * Adds an internationalized (i15d) text label to the panel using
++ * the given resource key; then proceeds to the next data column
++ * and adds a component with the given column span.
++ * Proceeds to the next data column.<p>
++ *
++ * The created label is labeling the first component; so the component
++ * gets the focus if the (optional) label mnemonic is pressed.
++ *
++ * @param resourceKey the resource key for the text to add
++ * @param c the component to add
++ * @param columnSpan number of columns the component shall span
++ * @return the added label
++ */
++ public JLabel appendI15d(String resourceKey, Component c, int columnSpan) {
++ return append(getI15dString(resourceKey), c, columnSpan);
+ }
++
++
+ /**
+- * Adds an internationalized (i15d) text label and two components to the panel; each component
+- * will span a single column. Proceeds to the next data column.
+- *
++ * Adds an internationalized (i15d) text label and two components
++ * to the panel; each component will span a single column.
++ * Proceeds to the next data column.<p>
++ *
++ * The created label is labeling the first component; so the component
++ * gets the focus if the (optional) label mnemonic is pressed.
++ *
+ * @param resourceKey the resource key for the text to add
+ * @param c1 the first component to add
+ * @param c2 the second component to add
+ * @return the added label
+- */
++ */
+ public JLabel appendI15d(String resourceKey, Component c1, Component c2) {
+- JLabel label = appendI15d(resourceKey, c1);
+- append(c2);
+- return label;
++ return append(getI15dString(resourceKey), c1, c2);
+ }
++
++
+ /**
+- * Adds an internationalized (i15d) text label and two components to the panel; each component
+- * will span a single column. Proceeds to the next data column.
+- *
++ * Adds an internationalized (i15d) text label and two components
++ * to the panel; each component will span a single column.
++ * Proceeds to the next data column.<p>
++ *
++ * The created label is labeling the first component; so the component
++ * gets the focus if the (optional) label mnemonic is pressed.
++ *
+ * @param resourceKey the resource key for the text to add
+ * @param c1 the first component to add
+ * @param c2 the second component to add
+ * @param colSpan the column span for the second component
+ * @return the added label
+- */
++ */
+ public JLabel appendI15d(String resourceKey, Component c1, Component c2, int colSpan) {
+- JLabel label = appendI15d(resourceKey, c1);
+- append(c2, colSpan);
+- return label;
++ return append(getI15dString(resourceKey), c1, c2, colSpan);
+ }
++
++
+ /**
+- * Adds an internationalized (i15d) text label and three components to the panel; each component
+- * will span a single column. Proceeds to the next data column.
+- *
++ * Adds an internationalized (i15d) text label and three components
++ * to the panel; each component will span a single column.
++ * Proceeds to the next data column.<p>
++ *
++ * The created label is labeling the first component; so the component
++ * gets the focus if the (optional) label mnemonic is pressed.
++ *
+ * @param resourceKey the resource key for the text to add
+ * @param c1 the first component to add
+ * @param c2 the second component to add
+ * @param c3 the third component to add
+ * @return the added label
+- */
++ */
+ public JLabel appendI15d(String resourceKey, Component c1, Component c2, Component c3) {
+- JLabel label = appendI15d(resourceKey, c1, c2);
+- append(c3);
+- return label;
++ return append(getI15dString(resourceKey), c1, c2, c3);
+ }
++
++
+ /**
+- * Adds an internationalized (i15d) text label and four components to the panel;
+- * each component will span a single column. Proceeds to the next data column.
+- *
++ * Adds an internationalized (i15d) text label and four components
++ * to the panel; each component will span a single column.
++ * Proceeds to the next data column.<p>
++ *
++ * The created label is labeling the first component; so the component
++ * gets the focus if the (optional) label mnemonic is pressed.
++ *
+ * @param resourceKey the resource key for the text to add
+ * @param c1 the first component to add
+ * @param c2 the second component to add
+ * @param c3 the third component to add
+ * @param c4 the third component to add
+ * @return the added label
+- */
++ */
+ public JLabel appendI15d(String resourceKey, Component c1, Component c2, Component c3, Component c4) {
+- JLabel label = appendI15d(resourceKey, c1, c2, c3);
+- append(c4);
+- return label;
++ return append(getI15dString(resourceKey), c1, c2, c3, c4);
+ }
++
++
+ // Adding Titles ----------------------------------------------------------
++
+ /**
+ * Adds a title label to the panel and proceeds to the next column.
+- *
++ *
+ * @param textWithMnemonic the label's text - may mark a mnemonic
+ * @return the added title label
+ */
+@@ -515,35 +795,43 @@
+ append(titleLabel);
+ return titleLabel;
+ }
++
++
+ /**
+- * Adds an internationalized title label to the panel and
++ * Adds an internationalized title label to the panel and
+ * proceeds to the next column.
+- *
++ *
+ * @param resourceKey the resource key for the title's text
+ * @return the added title label
+ */
+ public JLabel appendI15dTitle(String resourceKey) {
+ return appendTitle(getI15dString(resourceKey));
+ }
++
++
+ // Appending Separators ---------------------------------------------------
++
+ /**
+ * Adds a separator without text that spans all columns.
+- *
+- * @return the added titled separator
++ *
++ * @return the added titled separator
+ */
+ public JComponent appendSeparator() {
+ return appendSeparator("");
+ }
++
++
+ /**
+ * Adds a separator with the given text that spans all columns.
+- *
++ *
+ * @param text the separator title text
+- * @return the added titled separator
++ * @return the added titled separator
+ */
+ public JComponent appendSeparator(String text) {
+ ensureCursorColumnInGrid();
+ ensureHasGapRow(paragraphGapSpec);
+ ensureHasComponentLine();
++
+ setColumn(super.getLeadingColumn());
+ int columnSpan = getColumnCount();
+ setColumnSpan(getColumnCount());
+@@ -552,47 +840,60 @@
+ nextColumn(columnSpan);
+ return titledSeparator;
+ }
++
++
+ /**
+- * Appends an internationalized titled separator for
++ * Appends an internationalized titled separator for
+ * the given resource key that spans all columns.
+- *
++ *
+ * @param resourceKey the resource key for the separator title's text
++ * @return the added titled separator
+ */
+- public void appendI15dSeparator(String resourceKey) {
+- appendSeparator(getI15dString(resourceKey));
++ public JComponent appendI15dSeparator(String resourceKey) {
++ return appendSeparator(getI15dString(resourceKey));
+ }
++
++
+ // Overriding Superclass Behavior ***************************************
++
+ /**
+- * Returns the leading column. Unlike the superclass we take a
+- * column offset into account.
+- *
++ * Returns the leading column. Unlike the superclass this method
++ * honors the column offset.
++ *
+ * @return the leading column
+ */
+ protected int getLeadingColumn() {
+ int column = super.getLeadingColumn();
+ return column + getLeadingColumnOffset() * getColumnIncrementSign();
+ }
++
++
+ // Adding Rows **********************************************************
++
+ /**
+- * Ensures that the cursor is in the grid. In case it's beyond the
++ * Ensures that the cursor is in the grid. In case it's beyond the
+ * form's right hand side, the cursor is moved to the leading column
+ * of the next line.
+ */
+ private void ensureCursorColumnInGrid() {
+- if (getColumn() > getColumnCount()) {
++ if ( ( isLeftToRight() && (getColumn() > getColumnCount()))
++ || (!isLeftToRight() && (getColumn() < 1))) {
+ nextLine();
+ }
+ }
++
++
+ /**
+ * Ensures that we have a gap row before the next component row.
+ * Checks if the current row is the given <code>RowSpec</code>
+ * and appends this row spec if necessary.
+- *
++ *
+ * @param gapRowSpec the row specification to check for
+ */
+ private void ensureHasGapRow(RowSpec gapRowSpec) {
+ if ((getRow() == 1) || (getRow() <= getRowCount()))
+ return;
++
+ if (getRow() <= getRowCount()) {
+ RowSpec rowSpec = getCursorRowSpec();
+ if ((rowSpec == gapRowSpec))
+@@ -601,25 +902,29 @@
+ appendRow(gapRowSpec);
+ nextLine();
+ }
++
++
+ /**
+ * Ensures that the form has a component row. Adds a component row
+ * if the cursor is beyond the form's bottom.
+ */
+ private void ensureHasComponentLine() {
+ if (getRow() <= getRowCount()) return;
+- appendRow(FormFactory.PREF_ROWSPEC);
++ appendRow(getDefaultRowSpec());
+ if (isRowGroupingEnabled()) {
+ getLayout().addGroupedRow(getRow());
+- }
++ }
+ }
++
++
+ /**
+- * Looks up and answers the row specification of the current row.
+- *
++ * Looks up and returns the row specification of the current row.
++ *
+ * @return the row specification of the current row
+ */
+ private RowSpec getCursorRowSpec() {
+ return getLayout().getRowSpec(getRow());
+ }
+-
+-
++
++
+ }
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/I15dPanelBuilder.java
++++ /dev/null
+@@ -1,180 +0,0 @@
+-/*
+- * Copyright (c) 2003 JGoodies Karsten Lentzsch. All Rights Reserved.
+- *
+- * Redistribution and use in source and binary forms, with or without
+- * modification, are permitted provided that the following conditions are met:
+- *
+- * o Redistributions of source code must retain the above copyright notice,
+- * this list of conditions and the following disclaimer.
+- *
+- * o Redistributions in binary form must reproduce the above copyright notice,
+- * this list of conditions and the following disclaimer in the documentation
+- * and/or other materials provided with the distribution.
+- *
+- * o Neither the name of JGoodies Karsten Lentzsch nor the names of
+- * its contributors may be used to endorse or promote products derived
+- * from this software without specific prior written permission.
+- *
+- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+- * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+- */
+-package net.sourceforge.squirrel_sql.client.gui.builders;
+-import java.util.MissingResourceException;
+-import java.util.ResourceBundle;
+-import javax.swing.JComponent;
+-import javax.swing.JLabel;
+-import javax.swing.JPanel;
+-import com.jgoodies.forms.builder.PanelBuilder;
+-import com.jgoodies.forms.layout.CellConstraints;
+-import com.jgoodies.forms.layout.FormLayout;
+-/**
+- * A general purpose panel builder that uses the {@link FormLayout}
+- * to layout <code>JPanel</code>s. In addition to its superclass
+- * {@link PanelBuilder} this class provides convenience behavior to map
+- * resource keys to their associated internationalized (i15d) strings
+- * when adding labels, titles and titled separators.
+- * <p>
+- * This class is not yet part of the binary Forms library;
+- * it comes with the Forms distributions as an extra.
+- * <b>The API is work in progress and may change without notice.</b>
+- * If you want to use this class, you may consider copying it into your codebase.
+- *
+- * @author Karsten Lentzsch
+- * @see ResourceBundle
+- */
+-public class I15dPanelBuilder extends PanelBuilder {
+- /**
+- * Holds the <code>ResourceBundle</code> used to lookup internationalized
+- * (i15d) String resources.
+- */
+- private final ResourceBundle bundle;
+- // Instance Creation ****************************************************
+- /**
+- * Constructs an instance of <code>I15dPanelBuilder</code> for the given
+- * panel and layout.
+- *
+- * @param panel the layout container
+- * @param layout the <code>FormLayout</code> used to layout the container
+- * @param bundle the <code>ResourceBundle</code> used to lookup i15d
+- * strings
+- */
+- public I15dPanelBuilder(JPanel panel, FormLayout layout,
+- ResourceBundle bundle) {
+- super(panel, layout);
+- this.bundle = bundle;
+- }
+- /**
+- * Constructs an instance of <code>I15dPanelBuilder</code> for the given
+- * layout. Uses an instance of <code>JPanel</code> as layout container.
+- *
+- * @param layout the form layout used to layout the container
+- * @param bundle the resource bundle used to lookup i15d strings
+- */
+- public I15dPanelBuilder(FormLayout layout, ResourceBundle bundle) {
+- this(new JPanel(), layout, bundle);
+- }
+- // Adding Labels and Separators *****************************************
+- /**
+- * Adds an internationalized (i15d) textual label to the form using the
+- * specified constraints.
+- *
+- * @param resourceKey the resource key for the label's text
+- * @param constraints the label's cell constraints
+- * @return the added label
+- */
+- public final JLabel addI15dLabel(String resourceKey,
+- CellConstraints constraints) {
+- return addLabel(getI15dString(resourceKey), constraints);
+- }
+- /**
+- * Adds an internationalized (i15d) textual label to the form using the
+- * specified constraints.
+- *
+- * @param resourceKey the resource key for the label's text
+- * @param encodedConstraints a string representation for the constraints
+- * @return the added label
+- */
+- public final JLabel addI15dLabel(String resourceKey,
+- String encodedConstraints) {
+- return addI15dLabel(resourceKey,
+- new CellConstraints(encodedConstraints));
+- }
+- /**
+- * Adds an internationalized (i15d) titled separator to the form using the
+- * specified constraints.
+- *
+- * @param resourceKey the resource key for the separator title
+- * @param constraints the separator's cell constraints
+- * @return the added titled separator
+- */
+- public final JComponent addI15dSeparator(String resourceKey,
+- CellConstraints constraints) {
+- return addSeparator(getI15dString(resourceKey), constraints);
+- }
+- /**
+- * Adds an internationalized (i15d) titled separator to the form using
+- * the specified constraints.
+- *
+- * @param resourceKey the resource key for the separator titel
+- * @param encodedConstraints a string representation for the constraints
+- * @return the added titled separator
+- */
+- public final JComponent addI15dSeparator(String resourceKey,
+- String encodedConstraints) {
+- return addI15dSeparator(resourceKey, new CellConstraints(
+- encodedConstraints));
+- }
+- /**
+- * Adds a title to the form using the specified constraints.
+- *
+- * @param resourceKey the resource key for the separator title
+- * @param constraints the separator's cell constraints
+- * @return the added title label
+- */
+- public final JLabel addI15dTitle(String resourceKey,
+- CellConstraints constraints) {
+- return addTitle(getI15dString(resourceKey), constraints);
+- }
+- /**
+- * Adds a title to the form using the specified constraints.
+- *
+- * @param resourceKey the resource key for the separator titel
+- * @param encodedConstraints a string representation for the constraints
+- * @return the added title label
+- */
+- public final JLabel add15dTitle(String resourceKey,
+- String encodedConstraints) {
+- return addI15dTitle(resourceKey,
+- new CellConstraints(encodedConstraints));
+- }
+- // Helper Code **********************************************************
+- /**
+- * Looks up and answers the internationalized (i15d) string for the given
+- * resource key from the <code>ResourceBundle</code>.
+- *
+- * @param resourceKey the key to look for in the resource bundle
+- * @return the associated internationalized string, or the resource key
+- * itself in case of a missing resource
+- * @throws IllegalStateException if no <code>ResourceBundle</code>
+- * has been set
+- */
+- protected String getI15dString(String resourceKey) {
+- if (bundle == null)
+- throw new IllegalStateException("You must specify a ResourceBundle"
+- + " before using the internationalization support.");
+- try {
+- return bundle.getString(resourceKey);
+- } catch (MissingResourceException mre) {
+- return resourceKey;
+- }
+- }
+-}
Added: trunk/squirrel-sql/debian/patches/002-squirrelsql-version.patch
===================================================================
--- trunk/squirrel-sql/debian/patches/002-squirrelsql-version.patch (rev 0)
+++ trunk/squirrel-sql/debian/patches/002-squirrelsql-version.patch 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,12 @@
+Description: Workaround for squirrelsql.version property set by squirrelsql-version-plugin and
+ substituted by maven resource filtering during original build process.
+Forwarded: not-needed
+From: Debian Java Maintainers <pkg-java-maintainers at lists.alioth.debian.org>
+Last-Update: 2011-01-09
+--- a/app/src/main/resources/net/sourceforge/squirrel_sql/client/Version.properties
++++ b/app/src/main/resources/net/sourceforge/squirrel_sql/client/Version.properties
+@@ -1 +1 @@
+-squirrelsql.version=${squirrelsql.version}
+\ No newline at end of file
++squirrelsql.version=3.2.0
+\ No newline at end of file
Added: trunk/squirrel-sql/debian/patches/003-squirrelsql-plugins-parent-pom.patch
===================================================================
--- trunk/squirrel-sql/debian/patches/003-squirrelsql-plugins-parent-pom.patch (rev 0)
+++ trunk/squirrel-sql/debian/patches/003-squirrelsql-plugins-parent-pom.patch 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,15 @@
+Description: Synchronized the dependency on the plugin assembly descriptor to be the same as the version of this project.
+From: Rob Manning
+Origin: upstream, http://squirrel-sql.svn.sourceforge.net/viewvc/squirrel-sql/trunk/sql12/plugins/squirrelsql-plugins-parent-pom/pom.xml?r1=5984&r2=6028&view=patch
+Last-Update: 2011-01-09
+--- a/plugins/squirrelsql-plugins-parent-pom/pom.xml
++++ b/plugins/squirrelsql-plugins-parent-pom/pom.xml
+@@ -210,7 +210,7 @@
+ <dependency>
+ <groupId>net.sf.squirrel-sql.plugins</groupId>
+ <artifactId>squirrelsql-plugins-assembly-descriptor</artifactId>
+- <version>3.2.0-SNAPSHOT</version>
++ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+ <executions>
Added: trunk/squirrel-sql/debian/patches/004-squirrelsql-plugins-assembly-descripton-pom.patch
===================================================================
--- trunk/squirrel-sql/debian/patches/004-squirrelsql-plugins-assembly-descripton-pom.patch (rev 0)
+++ trunk/squirrel-sql/debian/patches/004-squirrelsql-plugins-assembly-descripton-pom.patch 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,14 @@
+Description: changed group for consistency with other projects in this level of the build tree
+From: Rob Manning
+Origin: upstream, http://squirrel-sql.svn.sourceforge.net/viewvc/squirrel-sql/trunk/sql12/plugins/squirrelsql-plugins-assembly-descriptor/pom.xml?r1=5984&r2=6034&view=patch
+Last-Update: 2011-01-09
+--- a/plugins/squirrelsql-plugins-assembly-descriptor/pom.xml
++++ b/plugins/squirrelsql-plugins-assembly-descriptor/pom.xml
+@@ -8,6 +8,7 @@
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+
++ <groupId>net.sf.squirrel-sql.plugins</groupId>
+ <artifactId>squirrelsql-plugins-assembly-descriptor</artifactId>
+ <packaging>jar</packaging>
+
Added: trunk/squirrel-sql/debian/patches/005-squirrelsql-plugins-hibernate-HibernateUtil.patch
===================================================================
--- trunk/squirrel-sql/debian/patches/005-squirrelsql-plugins-hibernate-HibernateUtil.patch (rev 0)
+++ trunk/squirrel-sql/debian/patches/005-squirrelsql-plugins-hibernate-HibernateUtil.patch 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,35 @@
+Description: Hibernate Plugin: Removed unused imports to regain compile
+ independence from Hibernate API changes, see patch ID 316838
+From: Gerd Wagner
+Origin: upstream, svn diff -r r5984:r6150
+Last-Update: 2011-02-05
+--- a/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/util/HibernateUtil.java
++++ b/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/util/HibernateUtil.java
+@@ -18,25 +18,14 @@
+ */
+ package net.sourceforge.squirrel_sql.plugins.hibernate.util;
+
+-import java.io.*;
+-import java.sql.SQLException;
+-
+-import net.sourceforge.squirrel_sql.client.gui.db.ISQLAliasExt;
+-import net.sourceforge.squirrel_sql.client.session.ISession;
+-import net.sourceforge.squirrel_sql.fw.sql.ISQLDatabaseMetaData;
+-import net.sourceforge.squirrel_sql.fw.sql.ISQLDriver;
+ import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
+ import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
+-
+ import net.sourceforge.squirrel_sql.fw.xml.XMLBeanReader;
+ import net.sourceforge.squirrel_sql.fw.xml.XMLException;
+ import net.sourceforge.squirrel_sql.plugins.hibernate.HibernatePlugin;
+ import net.sourceforge.squirrel_sql.plugins.hibernate.configuration.HibernateConfigController;
+-import org.hibernate.SessionFactory;
+-import org.hibernate.cfg.Configuration;
+-import org.hibernate.cfg.Environment;
+-import org.hibernate.dialect.Dialect;
+-import org.hibernate.dialect.DialectFactory;
++
++import java.io.*;
+
+ /**
+ * Class that provides utility methods for obtaining SessionFactory objects.
Added: trunk/squirrel-sql/debian/patches/006-launch-script-debian.patch
===================================================================
--- trunk/squirrel-sql/debian/patches/006-launch-script-debian.patch (rev 0)
+++ trunk/squirrel-sql/debian/patches/006-launch-script-debian.patch 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,29 @@
+Description: Workaround for IZPACK_JAVA_HOME and SQUIRREL_SQL_HOME filled by IzPack installer.
+ IzPack is not used for squirrel-sql package in Debian. Instead of using %INSTALL_PATH
+ direct path is assigned to SQUIRREL_SQL_HOME. IZPACK_JAVA_HOME is not used.
+Forwarded: not-needed
+From: Debian Java Maintainers <pkg-java-maintainers at lists.alioth.debian.org>
+Last-Update: 2011-01-09
+--- a/installer/squirrelsql-launcher/src/main/resources/squirrel-sql.sh
++++ b/installer/squirrelsql-launcher/src/main/resources/squirrel-sql.sh
+@@ -23,7 +23,7 @@
+ }
+
+ # IZPACK_JAVA_HOME is filtered in by the IzPack installer when this script is installed
+-IZPACK_JAVA_HOME=%JAVA_HOME
++#IZPACK_JAVA_HOME=%JAVA_HOME
+
+ # We detect the java executable to use according to the following algorithm:
+ #
+@@ -53,9 +53,9 @@
+
+ # SQuirreL home.
+ if $macosx ; then
+- SQUIRREL_SQL_HOME='%INSTALL_PATH/Contents/Resources/Java'
++ SQUIRREL_SQL_HOME=""
+ else
+- SQUIRREL_SQL_HOME='%INSTALL_PATH'
++ SQUIRREL_SQL_HOME="/usr/share/squirrel-sql"
+ fi
+
+ # SQuirreL home in Unix format.
Added: trunk/squirrel-sql/debian/patches/007-squirrelsql-changelog.patch
===================================================================
--- trunk/squirrel-sql/debian/patches/007-squirrelsql-changelog.patch (rev 0)
+++ trunk/squirrel-sql/debian/patches/007-squirrelsql-changelog.patch 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,18 @@
+Description: Update for 3.2.0 release
+From: Rob Manning
+Origin: upstream, svn diff -r r5984:r5985
+Last-Update: 2011-01-25
+--- a/doc/src/main/resources/changes.txt
++++ b/doc/src/main/resources/changes.txt
+@@ -1,8 +1,9 @@
+ SQuirreL SQL Client Change Log
+ ==============================
+
+-Not yet released - available from SVN or in the latest snapshot:
+-----------------------------------------------------------------
++
++3.2.0 (11/21/2010)
++==================
+
+ Enhancements:
+
Added: trunk/squirrel-sql/debian/patches/008-native2ascii.patch
===================================================================
--- trunk/squirrel-sql/debian/patches/008-native2ascii.patch (rev 0)
+++ trunk/squirrel-sql/debian/patches/008-native2ascii.patch 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,82 @@
+Description: Convert some native-encoded characters to Unicode-encoded (\udddd notation) in order to build squirrel in Debian clean chroot.
+Forwarded: not-needed
+From: Debian Java Maintainers <pkg-java-maintainers at lists.alioth.debian.org>
+Last-Update: 2011-01-31
+--- a/fw/src/main/java/net/sourceforge/squirrel_sql/fw/codereformat/CodeReformatorKernel.java
++++ b/fw/src/main/java/net/sourceforge/squirrel_sql/fw/codereformat/CodeReformatorKernel.java
+@@ -38,11 +38,11 @@
+
+ Vector<String> ret = new Vector<String>();
+
+- // toUpperCase replaces the German ß by ss.
++ // toUpperCase replaces the German \u00df by ss.
+ // This will kill reformating later.
+ // Since upperIn is just for building pieces
+- // it is OK to place ß here.
+- String upperIn = in.replaceAll("ß", "s");
++ // it is OK to place \u00df here.
++ String upperIn = in.replaceAll("\u00df", "s");
+
+
+ upperIn = upperIn.toUpperCase();
+--- a/fw/src/main/java/net/sourceforge/squirrel_sql/fw/dialects/ProgressDialectExt.java
++++ b/fw/src/main/java/net/sourceforge/squirrel_sql/fw/dialects/ProgressDialectExt.java
+@@ -680,7 +680,7 @@
+ public String getCreateViewSQL(final String viewName, final String definition, final String checkOption,
+ final DatabaseObjectQualifier qualifier, final SqlGenerationPreferences prefs)
+ {
+- // CREATE VIEW name [(view_col [, view_col …])]
++ // CREATE VIEW name [(view_col [, view_col \u2026])]
+ // AS <select> [WITH CHECK OPTION];
+
+ // "CREATE VIEW $viewName$ " +
+--- a/fw/src/main/java/net/sourceforge/squirrel_sql/fw/dialects/PointbaseDialectExt.java
++++ b/fw/src/main/java/net/sourceforge/squirrel_sql/fw/dialects/PointbaseDialectExt.java
+@@ -649,7 +649,7 @@
+ public String getCreateViewSQL(final String viewName, final String definition, final String checkOption,
+ final DatabaseObjectQualifier qualifier, final SqlGenerationPreferences prefs)
+ {
+- // CREATE VIEW name [(view_col [, view_col …])]
++ // CREATE VIEW name [(view_col [, view_col \u2026])]
+ // AS <select> [WITH CHECK OPTION];
+
+ // "CREATE VIEW $viewName$ " +
+--- a/fw/src/main/java/net/sourceforge/squirrel_sql/fw/dialects/FirebirdDialectExt.java
++++ b/fw/src/main/java/net/sourceforge/squirrel_sql/fw/dialects/FirebirdDialectExt.java
+@@ -617,7 +617,7 @@
+ SqlGenerationPreferences prefs)
+ {
+ // CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]] INDEX index
+- // ON table (col [, col …]);
++ // ON table (col [, col \u2026]);
+
+ StringTemplate st = new StringTemplate(ST_CREATE_INDEX_STYLE_THREE);
+ // "CREATE $unique$ $storageOption$ INDEX $indexName$ " +
+@@ -675,7 +675,7 @@
+ public String getCreateViewSQL(String viewName, String definition, String checkOption,
+ DatabaseObjectQualifier qualifier, SqlGenerationPreferences prefs)
+ {
+- // CREATE VIEW name [(view_col [, view_col …])]
++ // CREATE VIEW name [(view_col [, view_col \u2026])]
+ // AS <select> [WITH CHECK OPTION];
+
+ // "CREATE VIEW $viewName$ " +
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/PleaseWaitDialog.java
++++ b/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/PleaseWaitDialog.java
+@@ -1,6 +1,6 @@
+ package net.sourceforge.squirrel_sql.client.session.mainpanel;
+ /*
+- * Copyright (C) 2007 Thorsten Mürell
++ * Copyright (C) 2007 Thorsten M\u00fcrell
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+@@ -37,7 +37,7 @@
+ /**
+ * The dialog to ask the user to wait.
+ *
+- * @author Thorsten Mürell
++ * @author Thorsten M\u00fcrell
+ */
+ public class PleaseWaitDialog extends DialogWidget implements ActionListener {
+ private static final long serialVersionUID = 8870277695490954084L;
Added: trunk/squirrel-sql/debian/patches/009-plugin-liclink.patch
===================================================================
--- trunk/squirrel-sql/debian/patches/009-plugin-liclink.patch (rev 0)
+++ trunk/squirrel-sql/debian/patches/009-plugin-liclink.patch 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,26 @@
+Description: Workaround to have the same file name for different plugins.
+Forwarded: not-needed
+From: Debian Java Maintainers <pkg-java-maintainers at lists.alioth.debian.org>
+Last-Update: 2011-02-10
+--- a/plugins/laf/src/main/java/net/sourceforge/squirrel_sql/plugins/laf/LAFPlugin.java
++++ b/plugins/laf/src/main/java/net/sourceforge/squirrel_sql/plugins/laf/LAFPlugin.java
+@@ -156,7 +156,7 @@
+ */
+ public String getLicenceFileName()
+ {
+- return "licences.html";
++ return "licence.txt";
+ }
+
+ /**
+--- a/plugins/dbcopy/src/main/java/net/sourceforge/squirrel_sql/plugins/dbcopy/DBCopyPlugin.java
++++ b/plugins/dbcopy/src/main/java/net/sourceforge/squirrel_sql/plugins/dbcopy/DBCopyPlugin.java
+@@ -153,7 +153,7 @@
+ @Override
+ public String getLicenceFileName()
+ {
+- return "license.txt";
++ return "licence.txt";
+ }
+
+ /**
Added: trunk/squirrel-sql/debian/patches/disable_autoupdate.dpatch
===================================================================
--- trunk/squirrel-sql/debian/patches/disable_autoupdate.dpatch (rev 0)
+++ trunk/squirrel-sql/debian/patches/disable_autoupdate.dpatch 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,11313 @@
+Description: disable_autoupdate.dpatch by <markus at mheberling1> adopted for quilt and 3.2.0 codebase
+Forwarded: not-needed
+From: Debian Java Maintainers <pkg-java-maintainers at lists.alioth.debian.org>
+Last-Update: 2011-01-25
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/Application.java
++++ b/app/src/main/java/net/sourceforge/squirrel_sql/client/Application.java
+@@ -64,11 +64,6 @@
+ import net.sourceforge.squirrel_sql.client.session.mainpanel.SQLHistoryItem;
+ import net.sourceforge.squirrel_sql.client.session.properties.EditWhereCols;
+ import net.sourceforge.squirrel_sql.client.session.schemainfo.SchemaInfoCacheSerializer;
+-import net.sourceforge.squirrel_sql.client.update.autocheck.UpdateCheckTimer;
+-import net.sourceforge.squirrel_sql.client.update.autocheck.UpdateCheckTimerImpl;
+-import net.sourceforge.squirrel_sql.client.update.gui.installer.PreLaunchHelper;
+-import net.sourceforge.squirrel_sql.client.update.gui.installer.PreLaunchHelperFactory;
+-import net.sourceforge.squirrel_sql.client.update.gui.installer.PreLaunchHelperFactoryImpl;
+ import net.sourceforge.squirrel_sql.client.util.ApplicationFiles;
+ import net.sourceforge.squirrel_sql.fw.datasetviewer.CellImportExportInfoSaver;
+ import net.sourceforge.squirrel_sql.fw.datasetviewer.cellcomponent.DTProperties;
+@@ -160,10 +155,7 @@
+
+ private List<ApplicationListener> _listeners = new ArrayList<ApplicationListener>();
+
+- private UpdateCheckTimer updateCheckTimer = null;
+-
+- private PreLaunchHelperFactory preLaunchHelperFactory = new PreLaunchHelperFactoryImpl();
+-
++
+ /**
+ * Default ctor.
+ */
+@@ -216,8 +208,6 @@
+ {
+ s_log.info(s_stringMgr.getString("Application.shutdown", Calendar.getInstance().getTime()));
+
+- updateCheckTimer.stop();
+-
+ saveApplicationState();
+
+ if (!closeAllSessions()) { return false; }
+@@ -401,16 +391,7 @@
+ * 3.x installations that still need to be upgraded), then it would be safe to remove this code.
+ */
+ private void updateLaunchScript() {
+- try
+- {
+- PreLaunchHelper helper = preLaunchHelperFactory.createPreLaunchHelper();
+- helper.updateLaunchScript();
+- helper.copySplashImage();
+- }
+- catch (Exception e)
+- {
+- s_log.error("Unexpected exception while attempting to update the launch script: "+e.getMessage(), e);
+- }
++
+ }
+
+ public IPluginManager getPluginManager()
+@@ -793,8 +774,6 @@
+ }
+ }
+
+- updateCheckTimer = new UpdateCheckTimerImpl(this);
+- updateCheckTimer.start();
+ }
+
+ /**
+@@ -811,6 +790,7 @@
+ {
+ splash.indicateNewTask(taskDescription);
+ }
++
+ }
+
+ private void preferencesHaveChanged(PropertyChangeEvent evt)
+@@ -1212,13 +1192,4 @@
+ _jdbcDebugType = _prefs.getJdbcDebugType();
+ }
+ }
+-
+- public void setUpdateCheckTimer(UpdateCheckTimer timer) {
+- this.updateCheckTimer = timer;
+- }
+-
+- public void setPreLaunchHelperFactory(PreLaunchHelperFactory preLaunchHelperFactory)
+- {
+- this.preLaunchHelperFactory = preLaunchHelperFactory;
+- }
+ }
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/action/ActionCollection.java
++++ b/app/src/main/java/net/sourceforge/squirrel_sql/client/action/ActionCollection.java
+@@ -473,7 +473,6 @@
+ add(new TileHorizontalAction(_app));
+ add(new TileVerticalAction(_app));
+ add(new ToggleAutoCommitAction(_app));
+- add(new UpdateAction(_app));
+ add(new ViewHelpAction(_app));
+ add(new ViewLogsAction(_app));
+ add(new PreviousSqlAction(_app));
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/mainframe/MainFrameMenuBar.java
++++ b/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/mainframe/MainFrameMenuBar.java
+@@ -407,8 +407,6 @@
+ JMenu menu = rsrc.createMenu(SquirrelResources.IMenuResourceKeys.HELP);
+ addToMenu(rsrc, ViewHelpAction.class, menu);
+
+- menu.addSeparator();
+- addToMenu(rsrc, UpdateAction.class, menu);
+ if (!_osxPluginLoaded)
+ {
+ addToMenu(rsrc, AboutAction.class, menu);
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/mainframe/action/UpdateAction.java
++++ /dev/null
+@@ -1,59 +0,0 @@
+-package net.sourceforge.squirrel_sql.client.mainframe.action;
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-import java.awt.event.ActionEvent;
+-
+-import net.sourceforge.squirrel_sql.client.IApplication;
+-import net.sourceforge.squirrel_sql.client.action.SquirrelAction;
+-/**
+- * This <CODE>Action</CODE> displays the Update Manager
+- *
+- *
+- */
+-public class UpdateAction extends SquirrelAction
+-{
+- private static final long serialVersionUID = 4082643943728263683L;
+-
+- /**
+- * Ctor.
+- *
+- * @param app Application API.
+- *
+- * @throws IllegalArgumentException
+- * Thrown if a <TT>null</TT> <TT>IApplication</TT> passed.
+- */
+- public UpdateAction(IApplication app)
+- {
+- super(app);
+- if (app == null)
+- {
+- throw new IllegalArgumentException("Null IApplication passed");
+- }
+- }
+-
+- /**
+- * Display the about box.
+- *
+- * @param evt The event being processed.
+- */
+- public void actionPerformed(ActionEvent evt)
+- {
+- new UpdateCommand(getApplication()).execute();
+- }
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/mainframe/action/UpdateCommand.java
++++ /dev/null
+@@ -1,69 +0,0 @@
+-package net.sourceforge.squirrel_sql.client.mainframe.action;
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-import net.sourceforge.squirrel_sql.client.IApplication;
+-import net.sourceforge.squirrel_sql.client.update.UpdateController;
+-import net.sourceforge.squirrel_sql.client.update.UpdateControllerFactory;
+-import net.sourceforge.squirrel_sql.client.update.UpdateControllerFactoryImpl;
+-import net.sourceforge.squirrel_sql.client.update.UpdateUtilImpl;
+-import net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloaderFactoryImpl;
+-import net.sourceforge.squirrel_sql.fw.gui.JOptionPaneService;
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapperFactoryImpl;
+-import net.sourceforge.squirrel_sql.fw.util.ICommand;
+-/**
+- * This <CODE>ICommand</CODE> allows the user to check for updates and apply changes to the currently
+- * installed software.
+- */
+-public class UpdateCommand implements ICommand
+-{
+- /** Application API. */
+- private IApplication _app;
+-
+- /** The factory that creates the UpdateController or re-uses the one previously created one */
+- private UpdateControllerFactory updateControllerFactory = new UpdateControllerFactoryImpl();
+-
+- /**
+- * Ctor.
+- *
+- * @param app Application API.
+- *
+- * @throws IllegalArgumentException
+- * Thrown if a <TT>null</TT> <TT>IApplication</TT> passed.
+- */
+- public UpdateCommand(IApplication app)
+- {
+- super();
+- if (app == null)
+- {
+- throw new IllegalArgumentException("Null IApplication passed");
+- }
+- _app = app;
+- }
+-
+- /**
+- * Display the software update dialog
+- */
+- public void execute()
+- {
+- UpdateController updateController =
+- updateControllerFactory.createUpdateController(_app, new ArtifactDownloaderFactoryImpl(),
+- new UpdateUtilImpl(), new JOptionPaneService(), new FileWrapperFactoryImpl());
+- updateController.showUpdateDialog();
+- }
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/preferences/UpdateChannelComboBoxEntry.java
++++ /dev/null
+@@ -1,81 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.preferences;
+-
+-/**
+- * An abstraction for update channel combobox entries. This just allows
+- * the label to be internationalized, while still allowing for the application
+- * to know what the user's preference for update channel is.
+- *
+- * @author manningr
+- */
+-public class UpdateChannelComboBoxEntry {
+-
+- /**
+- * An enumeration that defines the different update check channels that
+- * a user can choose
+- */
+- public enum ChannelType {
+- STABLE, SNAPSHOT
+- }
+-
+- /** the channel to use for software updates */
+- private ChannelType _channel = null;
+-
+- /** the label to show to the user for this software update channel */
+- private String _displayName = null;
+-
+- /**
+- * Construct a new update channel entry
+- *
+- * @param channel
+- * the channel to use for software updates
+- * @param displayName
+- * the label to show to the user for this software update channel
+- */
+- public UpdateChannelComboBoxEntry(ChannelType channel, String displayName) {
+- _channel = channel;
+- _displayName = displayName;
+- }
+-
+- /* (non-Javadoc)
+- * @see java.lang.Object#toString()
+- */
+- public String toString() {
+- return _displayName;
+- }
+-
+-
+- /**
+- * @return returns a boolean indicating whether or not the channel is for
+- * "stable" updates.
+- */
+- public boolean isStable() {
+- return _channel == ChannelType.STABLE;
+- }
+-
+- /**
+- * @return returns a boolean indicating whether or not the channel is for
+- * "snapshot" updates.
+- */
+- public boolean isSnapshot() {
+- return _channel == ChannelType.SNAPSHOT;
+- }
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/preferences/UpdateCheckFrequencyComboBoxEntry.java
++++ /dev/null
+@@ -1,63 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.preferences;
+-
+-import net.sourceforge.squirrel_sql.client.update.UpdateCheckFrequency;
+-
+-/**
+- * An abstraction for update check frequency combo-box entries. This just allows
+- * the label to be internationalized, while still allowing for the application
+- * to know what the user's preference for update check frequency is.
+- */
+-public class UpdateCheckFrequencyComboBoxEntry {
+-
+- /** the frequency with which to check the site for software updates */
+- private UpdateCheckFrequency _frequency = null;
+-
+- /** the label to show to the user for this software update frequency */
+- private String _displayName = null;
+-
+- /**
+- * Construct a new update check frequency entry
+- *
+- * @param frequency
+- * the frequency with which to check the site for software updates
+- * @param displayName
+- * the label to show to the user for this software update frequency
+- */
+- public UpdateCheckFrequencyComboBoxEntry(UpdateCheckFrequency frequency, String displayName) {
+- _frequency = frequency;
+- _displayName = displayName;
+- }
+-
+- /**
+- * @see java.lang.Object#toString()
+- */
+- public String toString() {
+- return _displayName;
+- }
+-
+- /**
+- * @return the UpdateCheckFrequency Enum that is associated with this combo box entry.
+- */
+- public UpdateCheckFrequency getUpdateCheckFrequencyEnum() {
+- return _frequency;
+- }
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/preferences/UpdatePreferencesPanel.java
++++ /dev/null
+@@ -1,702 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.preferences;
+-
+-import java.awt.Color;
+-import java.awt.Dimension;
+-import java.awt.GridBagConstraints;
+-import java.awt.GridBagLayout;
+-import java.awt.Insets;
+-import java.awt.event.ActionEvent;
+-import java.awt.event.ActionListener;
+-import java.awt.event.ItemEvent;
+-import java.awt.event.ItemListener;
+-
+-import javax.swing.BorderFactory;
+-import javax.swing.Box;
+-import javax.swing.ButtonGroup;
+-import javax.swing.JButton;
+-import javax.swing.JCheckBox;
+-import javax.swing.JComboBox;
+-import javax.swing.JLabel;
+-import javax.swing.JPanel;
+-import javax.swing.JRadioButton;
+-import javax.swing.JSeparator;
+-import javax.swing.JTextField;
+-import javax.swing.SwingConstants;
+-import javax.swing.event.DocumentEvent;
+-import javax.swing.event.DocumentListener;
+-
+-import net.sourceforge.squirrel_sql.client.IApplication;
+-import net.sourceforge.squirrel_sql.client.preferences.UpdateChannelComboBoxEntry.ChannelType;
+-import net.sourceforge.squirrel_sql.client.update.UpdateCheckFrequency;
+-import net.sourceforge.squirrel_sql.client.update.UpdateUtil;
+-import net.sourceforge.squirrel_sql.client.update.UpdateUtilImpl;
+-import net.sourceforge.squirrel_sql.fw.util.StringManager;
+-import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
+-import net.sourceforge.squirrel_sql.fw.util.StringUtilities;
+-
+-public class UpdatePreferencesPanel extends JPanel
+-{
+- private static final Color CONNECTION_FAILURE_COLOR = Color.RED;
+-
+- private static final Color CONNECTION_SUCCESS_COLOR = new Color(67, 181, 118);
+-
+- /** Internationalized strings for this class. */
+- private static final StringManager s_stringMgr =
+- StringManagerFactory.getStringManager(UpdatePreferencesPanel.class);
+-
+- private static final UpdateUtil _updateUtil = new UpdateUtilImpl();
+-
+- static interface i18n
+- {
+-
+- // i18n[UpdatePreferencesPanel.atStartupLabel=At Startup]
+- String AT_STARTUP_LABEL = s_stringMgr.getString("UpdatePreferencesPanel.atStartupLabel");
+-
+- // i18n[UpdatePreferencesPanel.autoBorderLabel=Automatic Updates]
+- String AUTO_BORDER_LABEL = s_stringMgr.getString("UpdatePreferencesPanel.autoBorderLabel");
+-
+- // i18n[UpdatePreferencesPanel.autoCheckFrequency=How often to check for
+- // updates:]
+- String AUTO_CHECK_FREQUENCY = s_stringMgr.getString("UpdatePreferencesPanel.autoCheckFrequency");
+-
+- // i18n[UpdatePreferencesPanel.channel=Channel:]
+- String CHANNEL = s_stringMgr.getString("UpdatePreferencesPanel.channel");
+-
+- // i18n[UpdatePreferencesPanel.updateSiteBorderLabel=Update Site]
+- String UPDATE_SITE_BORDER_LABEL = s_stringMgr.getString("UpdatePreferencesPanel.updateSiteBorderLabel");
+-
+- // i18n[UpdatePreferencesPanel.enableAutoUpdate=Enable Automatic Updates]
+- String ENABLE_AUTO_UPDATE = s_stringMgr.getString("UpdatePreferencesPanel.enableAutoUpdate");
+-
+- // i18n[UpdatePreferencesPanel.localPathLabel=Local Path:]
+- String LOCAL_PATH = s_stringMgr.getString("UpdatePreferencesPanel.localPathLabel");
+-
+- // i18n[UpdatePreferencesPanel.localSiteButtonLabel=Local]
+- String LOCAL_SITE_BUTTON_LABEL = s_stringMgr.getString("UpdatePreferencesPanel.localSiteButtonLabel");
+-
+- // i18n[UpdatePreferencesPanel.path=Path:]
+- String PATH = s_stringMgr.getString("UpdatePreferencesPanel.path");
+-
+- // i18n[UpdatePreferencesPanel.port=Port:]
+- String PORT = s_stringMgr.getString("UpdatePreferencesPanel.port");
+-
+- // i18n[UpdatePreferencesPanel.server=Server:]
+- String SERVER = s_stringMgr.getString("UpdatePreferencesPanel.server");
+-
+- // i18n[UpdatePreferencesPanel.dailyLabel=Daily]
+- String DAILY_LABEL = s_stringMgr.getString("UpdatePreferencesPanel.dailyLabel");
+-
+- // i18n[UpdatePreferencesPanel.weeklyLabel=Weekly]
+- String WEEKLY_LABEL = s_stringMgr.getString("UpdatePreferencesPanel.weeklyLabel");
+-
+- // i18n[UpdatePreferencesPanel.remoteSiteButtonLabel=Remote]
+- String REMOTE_SITE_BUTTON_LABEL = s_stringMgr.getString("UpdatePreferencesPanel.remoteSiteButtonLabel");
+-
+- // i18n[UpdatePreferencesPanel.siteTypeLabel=Site Type:]
+- String SITE_TYPE_LABEL = s_stringMgr.getString("UpdatePreferencesPanel.siteTypeLabel");
+-
+- // i18n[UpdatePreferencesPanel.testLabel=Test Connection]
+- String TEST_LABEL = s_stringMgr.getString("UpdatePreferencesPanel.testLabel");
+-
+- // i18n[UpdatePreferencesPanel.urlLabel=Url:]
+- String URL = s_stringMgr.getString("UpdatePreferencesPanel.urlLabel");
+-
+- // i18n[UpdatePreferencesPanel.statusLableSuccessMsg=Connected Successfully]
+- String STATUS_LABEL_SUCCESS_MSG = s_stringMgr.getString("UpdatePreferencesPanel.statusLableSuccessMsg");
+-
+- // i18n[UpdatePreferencesPanel.statusLableFailureMsg=Connection failed. See log for error.]
+- String STATUS_LABEL_FAILURE_MSG = s_stringMgr.getString("UpdatePreferencesPanel.statusLableFailureMsg");
+-
+- // i18n[UpdatePreferencesPanel.connectionFailureDialogMsg=Unable to download release.xml from the
+- // specified location]
+- String CONNECTION_FAILURE_DIALOG_MSG =
+- s_stringMgr.getString("UpdatePreferencesPanel.connectionFailureDialogMsg");
+- }
+-
+- private static final long serialVersionUID = 6411907298042579120L;
+-
+- private JLabel _serverLabel = null;
+-
+- private JLabel _portLabel = null;
+-
+- private JLabel _pathLabel = null;
+-
+- private JLabel _localPathLabel = null;
+-
+- private JLabel _channelLabel = null;
+-
+- private JLabel _urlLabel = null;
+-
+- private JTextField _updateServerName = new JTextField();
+-
+- private JTextField _updateServerPort = new JTextField();
+-
+- private JTextField _updateServerPath = new JTextField();
+-
+- private JTextField _localPath = new JTextField();
+-
+- private JTextField _updateUrl = new JTextField();
+-
+- private JLabel siteTypeLabel = null;
+-
+- private JRadioButton _remoteTypeButton = new JRadioButton(i18n.REMOTE_SITE_BUTTON_LABEL);
+-
+- private JRadioButton _localTypeButton = new JRadioButton(i18n.LOCAL_SITE_BUTTON_LABEL);
+-
+- private ButtonGroup _updateSiteTypeGroup = new ButtonGroup();
+-
+- private UpdateChannelComboBoxEntry stableChannel =
+- new UpdateChannelComboBoxEntry(ChannelType.STABLE, "stable");
+-
+- private UpdateChannelComboBoxEntry snapshotChannel =
+- new UpdateChannelComboBoxEntry(ChannelType.SNAPSHOT, "snapshot");
+-
+- private JComboBox _updateServerChannel = new JComboBox(new Object[] { stableChannel, snapshotChannel });
+-
+- private JCheckBox _enableAutoUpdateChk = new JCheckBox(i18n.ENABLE_AUTO_UPDATE);
+-
+- private UpdateCheckFrequencyComboBoxEntry checkAtStartup =
+- new UpdateCheckFrequencyComboBoxEntry(UpdateCheckFrequency.STARTUP, i18n.AT_STARTUP_LABEL);
+-
+- private UpdateCheckFrequencyComboBoxEntry checkDaily =
+- new UpdateCheckFrequencyComboBoxEntry(UpdateCheckFrequency.DAILY, i18n.DAILY_LABEL);
+-
+- private UpdateCheckFrequencyComboBoxEntry checkWeekly =
+- new UpdateCheckFrequencyComboBoxEntry(UpdateCheckFrequency.WEEKLY, i18n.WEEKLY_LABEL);
+-
+- private JComboBox _updateCheckFrequency =
+- new JComboBox(new Object[] { checkAtStartup, checkDaily, checkWeekly });
+-
+- private JButton _testConnectionButton = new JButton(i18n.TEST_LABEL);
+-
+- private JLabel _testConnectionStatusLabel = new JLabel();
+-
+- private final Insets SEP_INSETS = new Insets(10, 14, 0, 14);
+-
+- private final Insets LABEL_INSETS = new Insets(2, 28, 6, 0);
+-
+- private final Insets FIELD_INSETS = new Insets(2, 8, 6, 28);
+-
+- private IApplication _app;
+-
+- public UpdatePreferencesPanel()
+- {
+- super(new GridBagLayout());
+- createUserInterface();
+- }
+-
+- void loadData(SquirrelPreferences prefs)
+- {
+- final IUpdateSettings updateSettings = prefs.getUpdateSettings();
+-
+- _updateServerName.setText(updateSettings.getUpdateServer());
+- _updateServerPort.setText(updateSettings.getUpdateServerPort());
+- _updateServerPath.setText(updateSettings.getUpdateServerPath());
+-
+- String channelStr = updateSettings.getUpdateServerChannel();
+- _updateServerChannel.setSelectedItem(stableChannel);
+- if (channelStr != null && channelStr.equals(ChannelType.SNAPSHOT.name()))
+- {
+- _updateServerChannel.setSelectedItem(snapshotChannel);
+- }
+-
+- _enableAutoUpdateChk.setSelected(updateSettings.isEnableAutomaticUpdates());
+-
+- UpdateCheckFrequency updateCheckFrequency =
+- UpdateCheckFrequency.getEnumForString(updateSettings.getUpdateCheckFrequency());
+-
+- if (updateCheckFrequency == UpdateCheckFrequency.DAILY)
+- {
+- _updateCheckFrequency.setSelectedItem(checkDaily);
+- }
+- if (updateCheckFrequency == UpdateCheckFrequency.STARTUP)
+- {
+- _updateCheckFrequency.setSelectedItem(checkAtStartup);
+- }
+- if (updateCheckFrequency == UpdateCheckFrequency.WEEKLY)
+- {
+- _updateCheckFrequency.setSelectedItem(checkWeekly);
+- }
+-
+- if (updateSettings.isRemoteUpdateSite())
+- {
+- _remoteTypeButton.setSelected(true);
+- enableRemoteSite();
+- }
+- else
+- {
+- _localTypeButton.setSelected(true);
+- enableLocalPath();
+- }
+- _localPath.setText(updateSettings.getFileSystemUpdatePath());
+- updateControlStatus();
+- updateUrl();
+- }
+-
+- void applyChanges(SquirrelPreferences prefs)
+- {
+-
+- final IUpdateSettings updateSettings = new UpdateSettings();
+-
+- updateSettings.setUpdateServer(_updateServerName.getText());
+- updateSettings.setUpdateServerPort(_updateServerPort.getText());
+- updateSettings.setUpdateServerPath(_updateServerPath.getText());
+-
+- UpdateChannelComboBoxEntry channelEntry =
+- (UpdateChannelComboBoxEntry) _updateServerChannel.getSelectedItem();
+-
+- String channelStr = ChannelType.STABLE.name();
+- if (channelEntry.isSnapshot())
+- {
+- channelStr = ChannelType.SNAPSHOT.name();
+- }
+- updateSettings.setUpdateServerChannel(channelStr);
+-
+- updateSettings.setEnableAutomaticUpdates(_enableAutoUpdateChk.isSelected());
+-
+- UpdateCheckFrequencyComboBoxEntry freqEntry =
+- (UpdateCheckFrequencyComboBoxEntry) _updateCheckFrequency.getSelectedItem();
+-
+- updateSettings.setUpdateCheckFrequency(freqEntry.getUpdateCheckFrequencyEnum().name());
+- updateSettings.setRemoteUpdateSite(_remoteTypeButton.isSelected());
+- updateSettings.setFileSystemUpdatePath(_localPath.getText());
+-
+- prefs.setUpdateSettings(updateSettings);
+-
+- }
+-
+- private void updateControlStatus()
+- {
+- final boolean enableAutoCheck = _enableAutoUpdateChk.isSelected();
+- _updateCheckFrequency.setEnabled(enableAutoCheck);
+- }
+-
+- private void createUserInterface()
+- {
+- final GridBagConstraints gbc = new GridBagConstraints();
+- gbc.fill = GridBagConstraints.HORIZONTAL;
+- gbc.insets = new Insets(4, 4, 4, 4);
+- gbc.gridx = 0;
+- gbc.gridy = 0;
+- gbc.weightx = 1;
+- add(createUpdateSitePanel(), gbc);
+- ++gbc.gridy;
+- add(createAutoUpdatePanel(), gbc);
+-
+- final ActionListener lis = new MyActionHandler();
+- _enableAutoUpdateChk.addActionListener(lis);
+- }
+-
+- private JPanel createUpdateSitePanel()
+- {
+- JPanel pnl = new JPanel(new GridBagLayout());
+- pnl.setBorder(BorderFactory.createTitledBorder(i18n.UPDATE_SITE_BORDER_LABEL));
+-
+- ItemListener urlUpdateItemListener = new UrlItemListener();
+- DocumentListener urlDocumentListener = new UrlDocumentListener();
+- final GridBagConstraints gbc = new GridBagConstraints();
+-
+- setSeparatorConstraints(gbc, 0);
+- gbc.gridwidth = 1;
+- gbc.weightx = 0;
+- gbc.fill = GridBagConstraints.NONE;
+- gbc.anchor = GridBagConstraints.EAST;
+- siteTypeLabel = new JLabel(i18n.SITE_TYPE_LABEL, JLabel.RIGHT);
+- pnl.add(siteTypeLabel, gbc);
+-
+- // Site type
+-
+- setSeparatorConstraints(gbc, 0);
+- gbc.gridx = 1;
+- gbc.gridwidth = 1;
+- gbc.fill = GridBagConstraints.NONE;
+- pnl.add(getSiteTypePanel(), gbc);
+-
+- setSeparatorConstraints(gbc, 1);
+- pnl.add(getSep(), gbc);
+-
+- // Update server name
+-
+- setLabelConstraints(gbc, 2);
+- _serverLabel = new JLabel(i18n.SERVER, SwingConstants.RIGHT);
+- pnl.add(_serverLabel, gbc);
+-
+- setFieldConstraints(gbc, 2);
+- _updateServerName.getDocument().addDocumentListener(urlDocumentListener);
+- pnl.add(_updateServerName, gbc);
+-
+- // Update server port
+-
+- setLabelConstraints(gbc, 3);
+- _portLabel = new JLabel(i18n.PORT, SwingConstants.RIGHT);
+- pnl.add(_portLabel, gbc);
+-
+- setFieldConstraints(gbc, 3);
+- _updateServerPort.getDocument().addDocumentListener(urlDocumentListener);
+- pnl.add(_updateServerPort, gbc);
+-
+- // Path to release.xml
+-
+- setLabelConstraints(gbc, 4);
+- _pathLabel = new JLabel(i18n.PATH, SwingConstants.RIGHT);
+- pnl.add(_pathLabel, gbc);
+-
+- setFieldConstraints(gbc, 4);
+- _updateServerPath.getDocument().addDocumentListener(urlDocumentListener);
+- pnl.add(_updateServerPath, gbc);
+-
+- // Channnel combo-box
+-
+- setLabelConstraints(gbc, 5);
+- _channelLabel = new JLabel(i18n.CHANNEL, SwingConstants.RIGHT);
+- pnl.add(_channelLabel, gbc);
+-
+- setFieldConstraints(gbc, 5);
+- gbc.fill = GridBagConstraints.NONE;
+- _updateServerChannel.addItemListener(urlUpdateItemListener);
+- pnl.add(_updateServerChannel, gbc);
+-
+- // URL text field
+-
+- setLabelConstraints(gbc, 6);
+- _urlLabel = new JLabel(i18n.URL, SwingConstants.RIGHT);
+- pnl.add(_urlLabel, gbc);
+-
+- setFieldConstraints(gbc, 6);
+- updateUrl();
+- pnl.add(_updateUrl, gbc);
+-
+- // Test Connection Button Panel (Both the button and the status label
+-
+- setFieldConstraints(gbc, 7);
+-
+- Box buttonBox = Box.createHorizontalBox();
+- buttonBox.add(_testConnectionButton);
+- buttonBox.add(Box.createHorizontalStrut(20));
+- buttonBox.add(_testConnectionStatusLabel);
+- _testConnectionButton.addActionListener(new TestConnectionButtonListener());
+- pnl.add(buttonBox, gbc);
+-
+- // Separator
+-
+- setSeparatorConstraints(gbc, 8);
+- pnl.add(getSep(), gbc);
+-
+- // Local update directory
+-
+- setLabelConstraints(gbc, 9);
+- _localPathLabel = new JLabel(i18n.LOCAL_PATH, SwingConstants.RIGHT);
+- pnl.add(_localPathLabel, gbc);
+-
+- setFieldConstraints(gbc, 9);
+- pnl.add(_localPath, gbc);
+- return pnl;
+- }
+-
+- /**
+- * Sets the specified GridBagConstraints with the specified grid y coordinate and:<br>
+- * <br>
+- * grid x = 0 <br>
+- * grid width = 1 <br>
+- * weight x = 1 <br>
+- * insets = LABEL_INSETS <br>
+- * fill = GridBagConstraints.NONE <br>
+- * anchor = GridBagConstraints.EAST
+- *
+- * @param gbc
+- * the constraints to set
+- * @param gridy
+- * the grid y coordinate
+- */
+- private void setLabelConstraints(GridBagConstraints gbc, int gridy)
+- {
+- gbc.gridx = 0;
+- gbc.gridy = gridy;
+- gbc.gridwidth = 1;
+- gbc.weightx = 0;
+- gbc.insets = LABEL_INSETS;
+- gbc.fill = GridBagConstraints.NONE;
+- gbc.anchor = GridBagConstraints.EAST;
+- }
+-
+- /**
+- * Sets the specified GridBagConstraints with the specified grid y coordinate and:<br>
+- * <br>
+- * grid x = 1 <br>
+- * grid width = 1 <br>
+- * weight x = 1 <br>
+- * insets = FIELD_INSETS <br>
+- * fill = GridBagConstraints.HORIZONTAL <br>
+- * anchor = GridBagConstraints.WEST
+- *
+- * @param gbc
+- * the constraints to set
+- * @param gridy
+- * the grid y coordinate
+- */
+- private void setFieldConstraints(GridBagConstraints gbc, int gridy)
+- {
+- gbc.gridx = 1;
+- gbc.gridy = gridy;
+- gbc.gridwidth = 1;
+- gbc.weightx = 1;
+- gbc.insets = FIELD_INSETS;
+- gbc.fill = GridBagConstraints.HORIZONTAL;
+- gbc.anchor = GridBagConstraints.WEST;
+-
+- }
+-
+- /**
+- * Sets the specified GridBagConstraints with the specified grid y coordinate and:<br>
+- * <br>
+- * grid x = 0 <br>
+- * grid width = 2 <br>
+- * weight x = 1 <br>
+- * insets = SEP_INSETS <br>
+- * fill = GridBagConstraints.HORIZONTAL <br>
+- * anchor = GridBagConstraints.WEST
+- *
+- * @param gbc
+- * the constraints to set
+- * @param gridy
+- * the grid y coordinate
+- */
+- private void setSeparatorConstraints(GridBagConstraints gbc, int gridy)
+- {
+- gbc.gridx = 0;
+- gbc.gridy = gridy;
+- gbc.gridwidth = 2;
+- gbc.weightx = 1;
+- gbc.insets = SEP_INSETS;
+- gbc.fill = GridBagConstraints.HORIZONTAL;
+- gbc.anchor = GridBagConstraints.WEST;
+- }
+-
+- private void enableRemoteSite()
+- {
+- _localPath.setEnabled(false);
+- _localPathLabel.setEnabled(false);
+- _updateServerChannel.setEnabled(true);
+- _updateServerName.setEnabled(true);
+- _updateServerPath.setEnabled(true);
+- _updateServerPort.setEnabled(true);
+- _serverLabel.setEnabled(true);
+- _portLabel.setEnabled(true);
+- _pathLabel.setEnabled(true);
+- _channelLabel.setEnabled(true);
+- _testConnectionButton.setEnabled(true);
+- _testConnectionStatusLabel.setEnabled(true);
+- _updateUrl.setEnabled(true);
+- _urlLabel.setEnabled(true);
+- }
+-
+- private void enableLocalPath()
+- {
+- _localPath.setEnabled(true);
+- _localPathLabel.setEnabled(true);
+- _updateServerChannel.setEnabled(false);
+- _updateServerName.setEnabled(false);
+- _updateServerPath.setEnabled(false);
+- _updateServerPort.setEnabled(false);
+- _serverLabel.setEnabled(false);
+- _portLabel.setEnabled(false);
+- _pathLabel.setEnabled(false);
+- _channelLabel.setEnabled(false);
+- _testConnectionButton.setEnabled(false);
+- _testConnectionStatusLabel.setEnabled(false);
+- _updateUrl.setEnabled(false);
+- _urlLabel.setEnabled(false);
+-
+- }
+-
+- private void updateUrl()
+- {
+-
+- String portStr = _updateServerPort.getText();
+- StringBuilder tmp = new StringBuilder("http://");
+- tmp.append(_updateServerName.getText());
+- if (!StringUtilities.isEmpty(portStr))
+- {
+- tmp.append(":");
+- tmp.append(_updateServerPort.getText());
+- }
+- tmp.append("/");
+- tmp.append(_updateServerPath.getText());
+- tmp.append("/");
+- tmp.append(_updateServerChannel.getSelectedItem().toString());
+- tmp.append("/release.xml");
+- _updateUrl.setText(tmp.toString());
+- _updateUrl.setEditable(false);
+- _updateUrl.revalidate();
+- }
+-
+- private JPanel getSiteTypePanel()
+- {
+- _remoteTypeButton.addActionListener(new ActionListener()
+- {
+- public void actionPerformed(ActionEvent e)
+- {
+- enableRemoteSite();
+- }
+- });
+- _localTypeButton.addActionListener(new ActionListener()
+- {
+- public void actionPerformed(ActionEvent e)
+- {
+- enableLocalPath();
+- }
+- });
+- _updateSiteTypeGroup.add(_remoteTypeButton);
+- _updateSiteTypeGroup.add(_localTypeButton);
+- JPanel siteTypePanel = new JPanel();
+- siteTypePanel.add(_remoteTypeButton);
+- siteTypePanel.add(_localTypeButton);
+- return siteTypePanel;
+- }
+-
+- private JSeparator getSep()
+- {
+- JSeparator sep = new JSeparator(SwingConstants.HORIZONTAL);
+- // separators need preferred size in GridBagLayout
+- sep.setPreferredSize(new Dimension(100, 20));
+- sep.setMinimumSize(new Dimension(100, 20));
+- return sep;
+- }
+-
+- private JPanel createAutoUpdatePanel()
+- {
+- JPanel pnl = new JPanel(new GridBagLayout());
+- pnl.setBorder(BorderFactory.createTitledBorder(i18n.AUTO_BORDER_LABEL));
+-
+- final GridBagConstraints gbc = new GridBagConstraints();
+- gbc.anchor = GridBagConstraints.WEST;
+- gbc.insets = new Insets(4, 4, 4, 4);
+- gbc.gridx = 0;
+- gbc.gridy = 0;
+- gbc.gridwidth = 2;
+- gbc.fill = GridBagConstraints.HORIZONTAL;
+- pnl.add(_enableAutoUpdateChk, gbc);
+-
+- gbc.gridwidth = 1;
+-
+- gbc.gridx = 0;
+- gbc.gridy = 1;
+- gbc.weightx = 0;
+- gbc.insets = new Insets(4, 20, 4, 10);
+- pnl.add(new JLabel(i18n.AUTO_CHECK_FREQUENCY, JLabel.LEFT), gbc);
+-
+- gbc.gridx = 1;
+- gbc.gridy = 1;
+- gbc.weightx = 1;
+- gbc.insets = new Insets(4, 0, 4, 0);
+- gbc.fill = GridBagConstraints.NONE;
+- pnl.add(this._updateCheckFrequency, gbc);
+-
+- return pnl;
+- }
+-
+- private final class MyActionHandler implements ActionListener
+- {
+- public void actionPerformed(ActionEvent evt)
+- {
+- updateControlStatus();
+- }
+- }
+-
+- /**
+- * Sets the IApplication that is used to display error messages.
+- *
+- * @param app
+- * the IApplication implementation
+- */
+- public void setApplication(IApplication app)
+- {
+- _app = app;
+- }
+-
+- private class TestConnectionButtonListener implements ActionListener
+- {
+- public void actionPerformed(ActionEvent e)
+- {
+- String serverName = _updateServerName.getText();
+-
+- StringBuilder path = new StringBuilder(_updateServerPath.getText());
+- path.append("/");
+- path.append(_updateServerChannel.getSelectedItem().toString());
+-
+- String portString = _updateServerPort.getText();
+-
+- try
+- {
+- int port = 80;
+- if (!StringUtilities.isEmpty(portString))
+- {
+- port = Integer.parseInt(_updateServerPort.getText());
+- }
+- _updateUtil.downloadCurrentRelease(serverName, port, path.toString(),
+- UpdateUtil.RELEASE_XML_FILENAME, _app.getSquirrelPreferences().getProxySettings());
+- _testConnectionStatusLabel.setText(i18n.STATUS_LABEL_SUCCESS_MSG);
+- _testConnectionStatusLabel.setForeground(CONNECTION_SUCCESS_COLOR);
+- }
+- catch (Exception e1)
+- {
+- _testConnectionStatusLabel.setText(i18n.STATUS_LABEL_FAILURE_MSG);
+- _testConnectionStatusLabel.setForeground(CONNECTION_FAILURE_COLOR);
+- _app.showErrorDialog(i18n.CONNECTION_FAILURE_DIALOG_MSG, e1);
+-
+- }
+-
+- }
+- }
+-
+- /**
+- * A listener that will update the url whenever the associated document is modified
+- *
+- * @author manningr
+- */
+- private class UrlDocumentListener implements DocumentListener
+- {
+- public void changedUpdate(DocumentEvent e)
+- {
+- updateUrl();
+- }
+-
+- public void insertUpdate(DocumentEvent e)
+- {
+- updateUrl();
+-
+- }
+-
+- public void removeUpdate(DocumentEvent e)
+- {
+- updateUrl();
+-
+- }
+- }
+-
+- private class UrlItemListener implements ItemListener
+- {
+- public void itemStateChanged(ItemEvent e)
+- {
+- updateUrl();
+- }
+- }
+-}
+\ No newline at end of file
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/preferences/UpdatePreferencesTab.java
++++ /dev/null
+@@ -1,103 +0,0 @@
+-package net.sourceforge.squirrel_sql.client.preferences;
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-import java.awt.Component;
+-
+-
+-import net.sourceforge.squirrel_sql.client.IApplication;
+-import net.sourceforge.squirrel_sql.fw.util.StringManager;
+-import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
+-
+-public class UpdatePreferencesTab implements IGlobalPreferencesPanel
+-{
+-
+- /** Internationalized strings for this class. */
+- private static final StringManager s_stringMgr =
+- StringManagerFactory.getStringManager(UpdatePreferencesTab.class);
+-
+- static interface i18n {
+-
+- // i18n[UpdatePreferencesTab.title=Update]
+- String TITLE = s_stringMgr.getString("UpdatePreferencesTab.title");
+-
+- // i18n[UpdatePreferencesTab.hint=Software Update Settings]
+- String HINT = s_stringMgr.getString("UpdatePreferencesTab.hint");
+-
+- }
+-
+- /** Panel to be displayed in preferences dialog. */
+- private UpdatePreferencesPanel _myPanel;
+-
+- /** Application API. */
+- private IApplication _app;
+-
+-
+- /**
+- * Default ctor.
+- */
+- public UpdatePreferencesTab()
+- {
+- super();
+- }
+-
+- public void initialize(IApplication app)
+- {
+- if (app == null)
+- {
+- throw new IllegalArgumentException("Null IApplication passed");
+- }
+-
+- _app = app;
+-
+- UpdatePreferencesPanel updatePanel = (UpdatePreferencesPanel)getPanelComponent();
+- updatePanel.setApplication(_app);
+- updatePanel.loadData(_app.getSquirrelPreferences());
+- }
+-
+- public void uninitialize(IApplication app)
+- {
+-
+- }
+-
+- public synchronized Component getPanelComponent()
+- {
+- if (_myPanel == null)
+- {
+- _myPanel = new UpdatePreferencesPanel();
+- }
+- return _myPanel;
+- }
+-
+- public synchronized void applyChanges()
+- {
+- _myPanel.applyChanges(_app.getSquirrelPreferences());
+- }
+-
+- public String getTitle()
+- {
+- return i18n.TITLE;
+- }
+-
+- public String getHint()
+- {
+- return i18n.HINT;
+- }
+-
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/preferences/UpdateSettings.java
++++ /dev/null
+@@ -1,226 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.preferences;
+-
+-import java.io.Serializable;
+-
+-import net.sourceforge.squirrel_sql.client.Version;
+-
+-/**
+- * Software update settings.
+- */
+-public class UpdateSettings implements Cloneable, IUpdateSettings, Serializable
+-{
+- private static final long serialVersionUID = -1305655179503568153L;
+-
+- /** Name of software update server. */
+- private String updateServer = "www.squirrel-sql.net";
+-
+- /** Port for software update server. */
+- private String updateServerPort = "80";
+-
+- /** Path to channel directories on software update server. */
+- private String updateServerPath = "updates";
+-
+- /** Update channel on the software update server. */
+- private String updateServerChannel = "stable";
+-
+- /** Whether or not to periodically check for software updates */
+- private boolean enableAutomaticUpdates = true;
+-
+- /** How often to check for updates - at startup / weekly */
+- private String updateCheckFrequency = "WEEKLY";
+-
+- /** The last time an update check was made in milliseconds */
+- private String lastUpdateCheckTimeMillis = "0";
+-
+- /** Whether or not the update site is on a remote server */
+- private boolean isRemoteUpdateSite = true;
+-
+- private String fileSystemUpdatePath = "";
+-
+- public UpdateSettings() {
+- if (Version.isSnapshotVersion()) {
+- updateServerChannel = "snapshot";
+- }
+- }
+-
+- /**
+- * @see java.lang.Object#clone()
+- */
+- @Override
+- public Object clone() throws CloneNotSupportedException
+- {
+- return super.clone();
+- }
+-
+- /**
+- * Copy Constructor
+- *
+- * @param updateSettings a <code>UpdateSettings</code> object
+- */
+- public UpdateSettings(IUpdateSettings updateSettings)
+- {
+- this.updateServer = updateSettings.getUpdateServer();
+- this.updateServerPort = updateSettings.getUpdateServerPort();
+- this.updateServerPath = updateSettings.getUpdateServerPath();
+- this.updateServerChannel = updateSettings.getUpdateServerChannel();
+- this.enableAutomaticUpdates = updateSettings.isEnableAutomaticUpdates();
+- this.updateCheckFrequency = updateSettings.getUpdateCheckFrequency();
+- this.lastUpdateCheckTimeMillis = updateSettings.getLastUpdateCheckTimeMillis();
+- this.isRemoteUpdateSite = updateSettings.isRemoteUpdateSite();
+- this.fileSystemUpdatePath = updateSettings.getFileSystemUpdatePath();
+- }
+-
+- /**
+- * @return the updateServer
+- */
+- public String getUpdateServer() {
+- return updateServer;
+- }
+-
+- /**
+- * @param updateServer the updateServer to set
+- */
+- public void setUpdateServer(String updateServer) {
+- this.updateServer = updateServer;
+- }
+-
+- /**
+- * @return the updateServerPort
+- */
+- public String getUpdateServerPort() {
+- return updateServerPort;
+- }
+-
+- /**
+- * @param updateServerPort the updateServerPort to set
+- */
+- public void setUpdateServerPort(String updateServerPort) {
+- this.updateServerPort = updateServerPort;
+- }
+-
+- /**
+- * @return the updateServerPath
+- */
+- public String getUpdateServerPath() {
+- return updateServerPath;
+- }
+-
+- /**
+- * @param updateServerPath the updateServerPath to set
+- */
+- public void setUpdateServerPath(String updateServerPath) {
+- this.updateServerPath = updateServerPath;
+- }
+-
+- /**
+- * @return the updateServerChannel
+- */
+- public String getUpdateServerChannel() {
+- return updateServerChannel;
+- }
+-
+- /**
+- * @param updateServerChannel the updateServerChannel to set
+- */
+- public void setUpdateServerChannel(String updateServerChannel) {
+- this.updateServerChannel = updateServerChannel;
+- }
+-
+- /**
+- * @return the enableAutomaticUpdates
+- */
+- public boolean isEnableAutomaticUpdates() {
+- return enableAutomaticUpdates;
+- }
+-
+- /**
+- * @param enableAutomaticUpdates the enableAutomaticUpdates to set
+- */
+- public void setEnableAutomaticUpdates(boolean enableAutomaticUpdates) {
+- this.enableAutomaticUpdates = enableAutomaticUpdates;
+- }
+-
+- /**
+- * @return the updateCheckFrequency
+- */
+- public String getUpdateCheckFrequency() {
+- return updateCheckFrequency;
+- }
+-
+- /**
+- * @param updateCheckFrequency the updateCheckFrequency to set
+- */
+- public void setUpdateCheckFrequency(String updateCheckFrequency) {
+- this.updateCheckFrequency = updateCheckFrequency;
+- }
+-
+- /**
+- * @return the lastUpdateCheckTimeMillis
+- */
+- public String getLastUpdateCheckTimeMillis() {
+- return lastUpdateCheckTimeMillis;
+- }
+-
+- /**
+- * @param lastUpdateCheckTimeMillis the lastUpdateCheckTimeMillis to set
+- */
+- public void setLastUpdateCheckTimeMillis(String lastUpdateCheckTimeMillis) {
+- this.lastUpdateCheckTimeMillis = lastUpdateCheckTimeMillis;
+- }
+-
+- /**
+- * Returns a boolean value to indicate whether or not the user wants to use
+- * a remote site. If this is false, it is assumed to mean that the user
+- * wants to specify a local directory on the filesystem
+- *
+- * @return true if remote site; false otherwise.
+- */
+- public boolean isRemoteUpdateSite() {
+- return this.isRemoteUpdateSite;
+- }
+-
+- /**
+- * Sets a boolean value to indicate whether or not the user wants to use
+- * a remote site. If this is false, it is assumed to mean that the user
+- * wants to specify a local directory on the filesystem
+- *
+- * @param true for remote site; false for local directory.
+- */
+- public void setRemoteUpdateSite(boolean isRemoteUpdateSite) {
+- this.isRemoteUpdateSite = isRemoteUpdateSite;
+- }
+-
+- /**
+- * @return the fileSystemUpdatePath
+- */
+- public String getFileSystemUpdatePath() {
+- return fileSystemUpdatePath;
+- }
+-
+- /**
+- * @param fileSystemUpdatePath the fileSystemUpdatePath to set
+- */
+- public void setFileSystemUpdatePath(String fileSystemUpdatePath) {
+- this.fileSystemUpdatePath = fileSystemUpdatePath;
+- }
+-
+-
+-}
+\ No newline at end of file
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/preferences/GlobalPreferencesSheet.java
++++ b/app/src/main/java/net/sourceforge/squirrel_sql/client/preferences/GlobalPreferencesSheet.java
+@@ -307,7 +307,6 @@
+ _panels.add(new SQLPreferencesPanel(_app.getMainFrame()));
+ _panels.add(new ProxyPreferencesPanel());
+ _panels.add(new DataTypePreferencesPanel());
+- _panels.add(new UpdatePreferencesTab());
+
+ // Go thru all loaded plugins asking for panels.
+ PluginInfo[] plugins = _app.getPluginManager().getPluginInformation();
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/preferences/IUpdateSettings.java
++++ /dev/null
+@@ -1,126 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.preferences;
+-
+-
+-/**
+- * Interface for settings pertaining to software updates.
+- */
+-public interface IUpdateSettings
+-{
+-
+- /**
+- * @return the updateServer
+- */
+- public abstract String getUpdateServer();
+-
+- /**
+- * @param updateServer the updateServer to set
+- */
+- public abstract void setUpdateServer(String updateServer);
+-
+- /**
+- * @return the updateServerPort
+- */
+- public abstract String getUpdateServerPort();
+-
+- /**
+- * @param updateServerPort the updateServerPort to set
+- */
+- public abstract void setUpdateServerPort(String updateServerPort);
+-
+- /**
+- * @return the updateServerPath
+- */
+- public abstract String getUpdateServerPath();
+-
+- /**
+- * @param updateServerPath the updateServerPath to set
+- */
+- public abstract void setUpdateServerPath(String updateServerPath);
+-
+- /**
+- * @return the updateServerChannel
+- */
+- public abstract String getUpdateServerChannel();
+-
+- /**
+- * @param updateServerChannel the updateServerChannel to set
+- */
+- public abstract void setUpdateServerChannel(String updateServerChannel);
+-
+- /**
+- * @return the enableAutomaticUpdates
+- */
+- public abstract boolean isEnableAutomaticUpdates();
+-
+- /**
+- * @param enableAutomaticUpdates the enableAutomaticUpdates to set
+- */
+- public abstract void setEnableAutomaticUpdates(boolean enableAutomaticUpdates);
+-
+- /**
+- * @return the updateCheckFrequency
+- */
+- public abstract String getUpdateCheckFrequency();
+-
+- /**
+- * @param updateCheckFrequency the updateCheckFrequency to set
+- */
+- public abstract void setUpdateCheckFrequency(String updateCheckFrequency);
+-
+- /**
+- * @return the lastUpdateCheckTimeMillis
+- */
+- public abstract String getLastUpdateCheckTimeMillis();
+-
+- /**
+- * @param lastUpdateCheckTimeMillis the lastUpdateCheckTimeMillis to set
+- */
+- public abstract void setLastUpdateCheckTimeMillis(String lastUpdateCheckTimeMillis);
+-
+- /**
+- * Returns a boolean value to indicate whether or not the user wants to use
+- * a remote site. If this is false, it is assumed to mean that the user
+- * wants to specify a local directory on the filesystem
+- *
+- * @return true if remote site; false otherwise.
+- */
+- public abstract boolean isRemoteUpdateSite();
+-
+- /**
+- * Sets a boolean value to indicate whether or not the user wants to use
+- * a remote site. If this is false, it is assumed to mean that the user
+- * wants to specify a local directory on the filesystem
+- *
+- * @param true for remote site; false for local directory.
+- */
+- public abstract void setRemoteUpdateSite(boolean isRemoteUpdateSite);
+-
+- /**
+- * @return the fileSystemUpdatePath
+- */
+- public abstract String getFileSystemUpdatePath();
+-
+- /**
+- * @param fileSystemUpdatePath the fileSystemUpdatePath to set
+- */
+- public abstract void setFileSystemUpdatePath(String fileSystemUpdatePath);
+-
+-}
+\ No newline at end of file
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/preferences/SquirrelPreferencesBeanInfo.java
++++ b/app/src/main/java/net/sourceforge/squirrel_sql/client/preferences/SquirrelPreferencesBeanInfo.java
+@@ -79,8 +79,6 @@
+ "setActionKeys", "getActionKeys", "setActionKeys"),
+ new PropertyDescriptor(PROXY, SquirrelPreferences.class, "getProxySettings",
+ "setProxySettings"),
+- new PropertyDescriptor(UPDATE, SquirrelPreferences.class, "getUpdateSettings",
+- "setUpdateSettings"),
+ new PropertyDescriptor(SHOW_LOADED_DRIVERS_ONLY, SquirrelPreferences.class,
+ "getShowLoadedDriversOnly", "setShowLoadedDriversOnly"),
+ new PropertyDescriptor(MAXIMIMIZE_SESSION_SHEET_ON_OPEN, SquirrelPreferences.class,
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/preferences/SquirrelPreferences.java
++++ b/app/src/main/java/net/sourceforge/squirrel_sql/client/preferences/SquirrelPreferences.java
+@@ -63,7 +63,6 @@
+ String PLUGIN_OBJECTS = "pluginObjects";
+ String PLUGIN_STATUSES = "pluginStatuses";
+ String PROXY = "proxyPerferences";
+- String UPDATE = "updatePreferences";
+ String SCROLLABLE_TABBED_PANES = "getUseScrollableTabbedPanes";
+ String SESSION_PROPERTIES = "sessionProperties";
+ String SHOW_ALIASES_TOOL_BAR = "showAliasesToolBar";
+@@ -182,8 +181,6 @@
+ /** Proxy settings. */
+ private ProxySettings _proxySettings = new ProxySettings();
+
+- /** Software update settings */
+- private IUpdateSettings _updateSettings = new UpdateSettings();
+
+ /** Show loaded drivers only in the Drivers window. */
+ private boolean _showLoadedDriversOnly;
+@@ -617,22 +614,6 @@
+ {
+ return (ProxySettings)_proxySettings.clone();
+ }
+-
+- public IUpdateSettings getUpdateSettings() {
+- return new UpdateSettings(_updateSettings);
+- }
+-
+- public synchronized void setUpdateSettings(IUpdateSettings data)
+- {
+- if (data == null)
+- {
+- data = new UpdateSettings();
+- }
+- final IUpdateSettings oldValue = _updateSettings;
+- _updateSettings= data;
+- getPropertyChangeReporter().firePropertyChange(IPropertyNames.UPDATE,
+- oldValue, _updateSettings);
+- }
+
+
+ public synchronized void setProxySettings(ProxySettings data)
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/DownloadStatusEventHandler.java
++++ /dev/null
+@@ -1,183 +0,0 @@
+-package net.sourceforge.squirrel_sql.client.update;
+-
+-import javax.swing.JFrame;
+-import javax.swing.ProgressMonitor;
+-
+-import net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloader;
+-import net.sourceforge.squirrel_sql.client.update.downloader.event.DownloadEventType;
+-import net.sourceforge.squirrel_sql.client.update.downloader.event.DownloadStatusEvent;
+-import net.sourceforge.squirrel_sql.client.update.downloader.event.DownloadStatusListener;
+-import net.sourceforge.squirrel_sql.fw.gui.GUIUtils;
+-import net.sourceforge.squirrel_sql.fw.util.StringManager;
+-import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
+-import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
+-import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
+-
+-/**
+- * Listener for download events and handle them appropriately. Specifically, this controls a ProgressMonitor
+- * showing progress to the user as the artifact downloader reports it. Also, a check is made each time that
+- * the downloader sends an event to see if the user canceled the download using the ProgressMonitor's cancel
+- * button. In that case, the downloader is notified that it should stop and will do so the next opportunity
+- * it gets.
+- *
+- * @author manningr
+- */
+-public class DownloadStatusEventHandler implements DownloadStatusListener
+-{
+-
+- /** I18n strings for this class */
+- private static final StringManager s_stringMgr =
+- StringManagerFactory.getStringManager(DownloadStatusEventHandler.class);
+-
+- /** Logger for this class. */
+- private final static ILogger s_log = LoggerController.createLogger(DownloadStatusEventHandler.class);
+-
+- private static interface i18n
+- {
+- // i18n[DownloadStatusEventHandler.downloadingUpdatesMsg=Downloading Files]
+- String DOWNLOADING_UPDATES_MSG = s_stringMgr.getString("DownloadStatusEventHandler.downloadingUpdatesMsg");
+-
+- // i18n[DownloadStatusEventHandler.changesRecordedTitle=Changes Recorded]
+- String CHANGES_RECORDED_TITLE = s_stringMgr.getString("DownloadStatusEventHandler.changesRecordedTitle");
+-
+- // i18n[DownloadStatusEventHandler.changesRecordedMsg=Requested changes will be made when
+- // SQuirreL is restarted]
+- String CHANGES_RECORDED_MSG = s_stringMgr.getString("DownloadStatusEventHandler.changesRecordedMsg");
+-
+- // i18n[DownloadStatusEventHandler.updateDownloadFailedTitle=Update Download Failed]
+- String UPDATE_DOWNLOAD_FAILED_TITLE =
+- s_stringMgr.getString("DownloadStatusEventHandler.updateDownloadFailedTitle");
+-
+- // i18n[DownloadStatusEventHandler.updateDownloadFailedMsg=Please consult the log for details]
+- String UPDATE_DOWNLOAD_FAILED_MSG =
+- s_stringMgr.getString("DownloadStatusEventHandler.updateDownloadFailedMsg");
+-
+- // i18n[DownloadStatusEventHandler.fileLabel=File]
+- String FILE_LABEL =
+- s_stringMgr.getString("DownloadStatusEventHandler.fileLabel");
+- }
+-
+- ProgressMonitor progressMonitor = null;
+-
+- int currentFile = 0;
+-
+- int totalFiles = 0;
+-
+- private ArtifactDownloader downloader = null;
+-
+- private UpdateController controller = null;
+-
+- public DownloadStatusEventHandler(UpdateController controller)
+- {
+- this.controller = controller;
+- }
+-
+- /**
+- * @param downloader the artifact downloader that will be sending events
+- */
+- public void setDownloader(ArtifactDownloader downloader)
+- {
+- this.downloader = downloader;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.event.DownloadStatusListener#
+- *
+- *
+- * handleDownloadStatusEvent(net.sourceforge.squirrel_sql.client.update.downloader.event.DownloadStatusEvent)
+- */
+- public void handleDownloadStatusEvent(DownloadStatusEvent evt)
+- {
+- logDebug("handleDownloadStatusEvent: processing event: "+evt);
+-
+- if (progressMonitor != null && progressMonitor.isCanceled())
+- {
+- downloader.stopDownload();
+- return;
+- }
+- if (evt.getType() == DownloadEventType.DOWNLOAD_STARTED)
+- {
+- totalFiles = evt.getFileCountTotal();
+- currentFile = 0;
+- handleDownloadStarted();
+- }
+- if (evt.getType() == DownloadEventType.DOWNLOAD_FILE_STARTED)
+- {
+- setNote(i18n.FILE_LABEL + ": " + evt.getFilename());
+- }
+-
+- if (evt.getType() == DownloadEventType.DOWNLOAD_FILE_COMPLETED)
+- {
+- setProgress(++currentFile);
+- }
+-
+- if (evt.getType() == DownloadEventType.DOWNLOAD_STOPPED)
+- {
+- setProgress(totalFiles);
+- }
+-
+- // When all updates are retrieved, tell the user that the updates will be installed upon the
+- // next startup.
+- if (evt.getType() == DownloadEventType.DOWNLOAD_COMPLETED)
+- {
+- controller.showMessage(i18n.CHANGES_RECORDED_TITLE, i18n.CHANGES_RECORDED_MSG);
+- setProgress(totalFiles);
+- }
+- if (evt.getType() == DownloadEventType.DOWNLOAD_FAILED)
+- {
+- controller.showErrorMessage(i18n.UPDATE_DOWNLOAD_FAILED_TITLE, i18n.UPDATE_DOWNLOAD_FAILED_MSG);
+- setProgress(totalFiles);
+- }
+- }
+-
+- private void setProgress(final int value)
+- {
+- logDebug("setProgress: value=", value);
+- GUIUtils.processOnSwingEventThread(new Runnable()
+- {
+- public void run()
+- {
+- progressMonitor.setProgress(value);
+- }
+- });
+- }
+-
+- private void setNote(final String note)
+- {
+- logDebug("setNote: value=", note);
+- GUIUtils.processOnSwingEventThread(new Runnable()
+- {
+- public void run()
+- {
+- progressMonitor.setNote(note);
+- }
+- });
+- }
+-
+- private void handleDownloadStarted()
+- {
+- logDebug("handleDownloadStarted: launching progress monitor");
+- GUIUtils.processOnSwingEventThread(new Runnable()
+- {
+- public void run()
+- {
+- final JFrame frame = controller.getMainFrame();
+- progressMonitor =
+- new ProgressMonitor(frame, i18n.DOWNLOADING_UPDATES_MSG, i18n.DOWNLOADING_UPDATES_MSG, 0,
+- totalFiles);
+- setProgress(0);
+- }
+- });
+- }
+-
+- private void logDebug(Object ... msgs) {
+- StringBuilder tmp = new StringBuilder();
+- for (Object msg : msgs) {
+- tmp.append(msg.toString());
+- }
+- if (s_log.isDebugEnabled()) {
+- s_log.debug(tmp.toString());
+- }
+- }
+-
+-}
+\ No newline at end of file
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/UpdateChannel.java
++++ /dev/null
+@@ -1,36 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update;
+-
+-/**
+- * The types of update channels supported by the update manager
+- *
+- * @author manningr
+- */
+-public enum UpdateChannel {
+-
+- /* Channel that provides stable release updates */
+- STABLE,
+-
+- /*
+- * Channel that provides snapshot release updates - more frequent and less
+- * stable
+- */
+- SNAPSHOT
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/UpdateCheckFrequency.java
++++ /dev/null
+@@ -1,70 +0,0 @@
+-/*
+- * Copyright (C) 2008 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update;
+-
+-/**
+- * An enum class that represents possible user choices for how often to check to see if the software is
+- * current.
+- */
+-public enum UpdateCheckFrequency
+-{
+- DAILY, // Check once a day
+- WEEKLY, // Check once a week
+- STARTUP; // check every time the app launches
+-
+- /** time in milliseconds for one day */
+- public long DAY_DURATION = 1000 * 60 * 60 * 24;
+-
+- /** time in milliseconds for one week */
+- public long WEEK_DURATION = 7 * DAY_DURATION;
+-
+- /**
+- * Returns a boolean value indicating whether or not it is time to check for updates
+- *
+- * @param delta
+- * the time between the last update check and now.
+- * @return true if DAILY update check frequency and delta exceeds DAY_DURATION and true if WEEKLY update
+- * check frequency and delta exceeds WEEK_DURATION; false is returned otherwise.
+- */
+- public boolean isTimeForUpdateCheck(long delta)
+- {
+- if (this == DAILY && delta > DAY_DURATION) { return true; }
+- if (this == WEEKLY && delta > WEEK_DURATION) { return true; }
+- return false;
+- }
+-
+- /**
+- * Returns a type-safe enum for the specified value.
+- *
+- * @param value
+- * can be a case-insensitive string value corresponding to a value in this Enum (e.g "daily",
+- * "weekly", or "startup".
+- * @return an UpdateCheckFrequncy instance.
+- * @throws IllegalArgumentException
+- * if the parameter doesn't match (ignoring case) any of the values in this Enum
+- */
+- public static UpdateCheckFrequency getEnumForString(String value)
+- {
+- if ("daily".equalsIgnoreCase(value)) { return UpdateCheckFrequency.DAILY; }
+- if ("startup".equalsIgnoreCase(value)) { return UpdateCheckFrequency.STARTUP; }
+- if ("weekly".equalsIgnoreCase(value)) { return UpdateCheckFrequency.WEEKLY; }
+- throw new IllegalArgumentException("Uknown update check frequency: " + value);
+-
+- }
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/UpdateController.java
++++ /dev/null
+@@ -1,120 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update;
+-
+-import java.util.List;
+-
+-import javax.swing.JFrame;
+-
+-import net.sourceforge.squirrel_sql.client.update.gui.ArtifactStatus;
+-
+-/**
+- * This interface allows the update summary view to send messages to the
+- * controller based on the user's interaction with the view. This allows the
+- * view to be completely unaware of the UpdateController's implementation; the
+- * business logic is separated from the view. Any logic that doesn't directly
+- * affect the view in some way, should be located in this interface.
+- *
+- * @author manningr
+- */
+-public interface UpdateController {
+-
+- /**
+- * Returns a boolean value indicating whether or not there are updates
+- * available to be installed. The sequence of steps involved is :
+- *
+- * 1. Find the local release.xml file
+- * 2. Load the local release.xml file as a ChannelXmlBean.
+- * 3. Determine the channel that the user has (stable or snapshot)
+- * 4. Get the release.xml file as a ChannelXmlBean from the server
+- * 5. Determine if it is the same as the local copy, which was placed either
+- * by the installer or the last update?
+- *
+- * @return true if the installed software is latest; false otherwise.
+- */
+- //boolean isUpToDate() throws Exception;
+-
+- String getUpdateServerName();
+-
+- String getUpdateServerPort();
+-
+- String getUpdateServerPath();
+-
+- String getUpdateServerChannel();
+-
+- int getUpdateServerPortAsInt();
+-
+- void showMessage(String title, String msg);
+-
+- boolean showConfirmMessage(String title, String msg);
+-
+- void showErrorMessage(String title, String msg, Exception e);
+-
+- void showErrorMessage(String title, String msg);
+-
+- void showUpdateDialog();
+-
+- /**
+- * Ask the UpdateController to check for updated artifacts.
+- */
+- void checkUpToDate();
+-
+- /**
+- * The user wishes to add/update/remove the specified list of Artifacts. Each
+- * artifact status specifies the user's desired action. This will :
+- *
+- * 1. Persist the list of actions to a change list file in the update dir.
+- * 2. Start a background thread to retrieve each update file from the server.
+- * 3. When downloading is complete, ask the user if they want to install now.
+- * 4. If the user wants to install now :
+- * a. Backup files that will be removed/updated.
+- * b. shutdown and launch the updater
+- * c. Updater installs updated files
+- * d. SQuirreL starts again.
+- *
+- * @param artifactStatusList the list of changes to make to
+- * installed/available artifacts.
+- * @param releaseVersionWillChange a boolean value indicating whether or not the changes being applied will
+- * change the installed release version
+- */
+- void applyChanges(List<ArtifactStatus> artifactStatusList, boolean releaseVersionWillChange);
+-
+- /**
+- * Returns a boolean value to indicate whether or not the user wants to use
+- * a remote site. If this is false, it is assumed to mean that the user
+- * wants to specify a local directory on the filesystem
+- *
+- * @return true if remote site; false otherwise.
+- */
+- boolean isRemoteUpdateSite();
+-
+- /**
+- *
+- * @return
+- */
+- public boolean isTimeToCheckForUpdates();
+-
+- public void promptUserToDownloadAvailableUpdates();
+-
+- public JFrame getMainFrame();
+-
+-
+-
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/UpdateControllerFactory.java
++++ /dev/null
+@@ -1,38 +0,0 @@
+-/*
+- * Copyright (C) 2008 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update;
+-
+-import net.sourceforge.squirrel_sql.client.IApplication;
+-import net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloaderFactory;
+-import net.sourceforge.squirrel_sql.fw.gui.JOptionPaneService;
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapperFactory;
+-
+-public interface UpdateControllerFactory
+-{
+- /**
+- * @param app
+- * @param downloaderFactory
+- * @param util
+- * @param jOptionPaneService
+- * @param fileWrapperFactory
+- * @return
+- */
+- UpdateController createUpdateController(IApplication app, ArtifactDownloaderFactory downloaderFactory,
+- UpdateUtil util, JOptionPaneService jOptionPaneService, FileWrapperFactory fileWrapperFactory);
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/UpdateControllerFactoryImpl.java
++++ /dev/null
+@@ -1,46 +0,0 @@
+-/*
+- * Copyright (C) 2008 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update;
+-
+-import net.sourceforge.squirrel_sql.client.IApplication;
+-import net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloaderFactory;
+-import net.sourceforge.squirrel_sql.fw.gui.JOptionPaneService;
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapperFactory;
+-
+-public class UpdateControllerFactoryImpl implements UpdateControllerFactory
+-{
+-
+- private static UpdateControllerImpl _instance = null;
+-
+- public UpdateController createUpdateController(IApplication app,
+- ArtifactDownloaderFactory downloaderFactory, UpdateUtil util, JOptionPaneService jOptionPaneService,
+- FileWrapperFactory fileWrapperFactory)
+- {
+- if (_instance == null)
+- {
+- _instance = new UpdateControllerImpl(app);
+- _instance.setArtifactDownloaderFactory(downloaderFactory);
+- _instance.setUpdateUtil(util);
+- _instance.setJOptionPaneService(jOptionPaneService);
+- _instance.setFileWrapperFactory(fileWrapperFactory);
+- }
+- return _instance;
+- }
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/UpdateControllerImpl.java
++++ /dev/null
+@@ -1,675 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update;
+-
+-import static java.lang.System.currentTimeMillis;
+-import static net.sourceforge.squirrel_sql.client.update.UpdateUtil.RELEASE_XML_FILENAME;
+-import static net.sourceforge.squirrel_sql.fw.util.Utilities.checkNull;
+-
+-import java.io.FileNotFoundException;
+-import java.util.ArrayList;
+-import java.util.HashSet;
+-import java.util.List;
+-import java.util.Set;
+-
+-import javax.swing.JFrame;
+-import javax.swing.JOptionPane;
+-
+-import net.sourceforge.squirrel_sql.client.IApplication;
+-import net.sourceforge.squirrel_sql.client.plugin.IPluginManager;
+-import net.sourceforge.squirrel_sql.client.plugin.PluginInfo;
+-import net.sourceforge.squirrel_sql.client.preferences.GlobalPreferencesActionListener;
+-import net.sourceforge.squirrel_sql.client.preferences.GlobalPreferencesSheet;
+-import net.sourceforge.squirrel_sql.client.preferences.IUpdateSettings;
+-import net.sourceforge.squirrel_sql.client.preferences.UpdatePreferencesPanel;
+-import net.sourceforge.squirrel_sql.client.update.async.ReleaseFileUpdateCheckTask;
+-import net.sourceforge.squirrel_sql.client.update.async.UpdateCheckRunnableCallback;
+-import net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloader;
+-import net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloaderFactory;
+-import net.sourceforge.squirrel_sql.client.update.gui.ArtifactAction;
+-import net.sourceforge.squirrel_sql.client.update.gui.ArtifactStatus;
+-import net.sourceforge.squirrel_sql.client.update.gui.CheckUpdateListener;
+-import net.sourceforge.squirrel_sql.client.update.gui.UpdateManagerDialog;
+-import net.sourceforge.squirrel_sql.client.update.gui.UpdateSummaryDialog;
+-import net.sourceforge.squirrel_sql.client.update.xmlbeans.ChannelXmlBean;
+-import net.sourceforge.squirrel_sql.fw.gui.GUIUtils;
+-import net.sourceforge.squirrel_sql.fw.gui.IJOptionPaneService;
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapper;
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapperFactory;
+-import net.sourceforge.squirrel_sql.fw.util.StringManager;
+-import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
+-import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
+-import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
+-
+-/**
+- * This class implements the business logic needed by the view (UpdateManagerDialog), to let the user install
+- * new or updated software (the model)
+- *
+- * @author manningr
+- */
+-public class UpdateControllerImpl implements UpdateController, CheckUpdateListener
+-{
+-
+- /** This is the pattern that all translation jars (i18n) begin with */
+- public static final String TRANSLATION_JAR_PREFIX = "squirrel-sql_";
+-
+- /** Logger for this class. */
+- private static final ILogger s_log = LoggerController.createLogger(UpdateControllerImpl.class);
+-
+- /** I18n strings for this class */
+- private static final StringManager s_stringMgr =
+- StringManagerFactory.getStringManager(UpdateControllerImpl.class);
+-
+- /** the application and services it provides */
+- private IApplication _app = null;
+-
+- /** utility class for low-level update routines */
+- private UpdateUtil _util = null;
+-
+- /** the release that we downloaded when we last checked */
+- private ChannelXmlBean _currentChannelBean = null;
+-
+- /** the release we had installed the last time we checked / updated */
+- private ChannelXmlBean _installedChannelBean = null;
+-
+- /** Used to be able to bring the update dialog back up after re-config */
+- private static GlobalPrefsListener listener = null;
+-
+- /** The class that we use which is responsible for downloading artifacts */
+- private ArtifactDownloader _downloader = null;
+-
+- private ArtifactDownloaderFactory _downloaderFactory = null;
+-
+- /** Service that allows this class to safely present informative JOptionPanes to the user */
+- private IJOptionPaneService _jOptionPaneService = null;
+-
+- /** Factory for creating FileWrapper objects */
+- private FileWrapperFactory fileWrapperFactory = null;
+-
+- static interface i18n
+- {
+-
+- // i18n[UpdateControllerImpl.exceptionMsg=Exception was: ]
+- String EXCEPTION_MSG = s_stringMgr.getString("UpdateControllerImpl.exceptionMsg");
+-
+- // i18n[UpdateControllerImpl.updateCheckFailedTitle=Update Check Failed]
+- String UPDATE_CHECK_FAILED_TITLE = s_stringMgr.getString("UpdateControllerImpl.updateCheckFailedTitle");
+-
+- // i18n[UpdateControllerImpl.softwareVersionCurrentMsg=This software's version is the most recent]
+- String SOFTWARE_VERSION_CURRENT_MSG =
+- s_stringMgr.getString("UpdateControllerImpl.softwareVersionCurrentMsg");
+-
+- // i18n[UpdateControllerImpl.updateCheckTitle=Update Check]
+- String UPDATE_CHECK_TITLE = s_stringMgr.getString("UpdateControllerImpl.updateCheckTitle");
+-
+- // i18n[UpdateControllerImpl.changesRecordedTitle=Changes Recorded]
+- String CHANGES_RECORDED_TITLE = s_stringMgr.getString("UpdateControllerImpl.changesRecordedTitle");
+-
+- // i18n[UpdateControllerImpl.changesRecordedMsg=Requested changes will be made when
+- // SQuirreL is restarted]
+- String CHANGES_RECORDED_MSG = s_stringMgr.getString("UpdateControllerImpl.changesRecordedMsg");
+-
+- // i18n[UpdateControllerImpl.releaseFileDownloadFailedMsg=Release file couldn't be downloaded. Please
+- // check your settings.]
+- String RELEASE_FILE_DOWNLOAD_FAILED_MSG =
+- s_stringMgr.getString("UpdateControllerImpl.releaseFileDownloadFailedMsg");
+-
+- // i18n[UpdateControllerImpl.promptToDownloadAvailableUpdatesMsg=There are updates available.
+- // Do you want to download them now?]
+- String PROMPT_TO_DOWNLOAD_AVAILABLE_UPDATES_MSG =
+- s_stringMgr.getString("UpdateControllerImpl.promptToDownloadAvailableUpdatesMsg");
+-
+- // i18n[UpdateControllerImpl.promptToDownloadAvailableUpdatesTitle=Updates Available]
+- String PROMPT_TO_DOWNLOAD_AVAILABLE_UPDATES_TITLE =
+- s_stringMgr.getString("UpdateControllerImpl.promptToDownloadAvailableUpdatesTitle");
+-
+- }
+-
+- /**
+- * Constructor
+- *
+- * @param app
+- * the application and services it provides
+- */
+- public UpdateControllerImpl(IApplication app)
+- {
+- _app = app;
+- if (listener == null)
+- {
+- listener = new GlobalPrefsListener();
+- GlobalPreferencesSheet.addGlobalPreferencesActionListener(listener);
+- }
+- }
+-
+- /**
+- * @param factory
+- */
+- public void setArtifactDownloaderFactory(ArtifactDownloaderFactory factory)
+- {
+- checkNull("setArtifactDownloaderFactory", "factory", factory);
+- this._downloaderFactory = factory;
+- }
+-
+- /**
+- * Sets the utility class for low-level update routines
+- *
+- * @param util
+- * the Update utility class to use.
+- */
+- public void setUpdateUtil(UpdateUtil util)
+- {
+- checkNull("setUpdateUtil","util", util);
+- this._util = util;
+- _util.setPluginManager(_app.getPluginManager());
+- }
+-
+- /**
+- * Setter to allow injection of the service implementation.
+- *
+- * @param jOptionPaneService
+- * the non-static service that handles JOptionPane's static calls.
+- */
+- public void setJOptionPaneService(IJOptionPaneService jOptionPaneService)
+- {
+- checkNull("setJOptionPaneService","jOptionPaneService", jOptionPaneService);
+- this._jOptionPaneService = jOptionPaneService;
+- }
+-
+- /**
+- * @param fileWrapperFactory
+- * the fileFileWrapperFactory to set
+- */
+- public void setFileWrapperFactory(FileWrapperFactory fileWrapperFactory)
+- {
+- checkNull("setFileWrapperFactory","fileWrapperFactory", fileWrapperFactory);
+- this.fileWrapperFactory = fileWrapperFactory;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateController#showUpdateDialog()
+- */
+- public void showUpdateDialog()
+- {
+- final JFrame parent = _app.getMainFrame();
+- final IUpdateSettings settings = getUpdateSettings();
+- final boolean isRemoteUpdateSite = settings.isRemoteUpdateSite();
+- GUIUtils.processOnSwingEventThread(new Runnable()
+- {
+-
+- @Override
+- public void run()
+- {
+- UpdateManagerDialog dialog = new UpdateManagerDialog(parent, isRemoteUpdateSite);
+- if (isRemoteUpdateSite)
+- {
+- dialog.setUpdateServerName(settings.getUpdateServer());
+- dialog.setUpdateServerPort(settings.getUpdateServerPort());
+- dialog.setUpdateServerPath(settings.getUpdateServerPath());
+- dialog.setUpdateServerChannel(settings.getUpdateServerChannel());
+- }
+- else
+- {
+- dialog.setLocalUpdatePath(settings.getFileSystemUpdatePath());
+- }
+- dialog.addCheckUpdateListener(UpdateControllerImpl.this);
+- dialog.setVisible(true);
+- }
+- });
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateController#isUpToDate()
+- */
+- public boolean isUpToDate() throws Exception
+- {
+-
+- IUpdateSettings settings = getUpdateSettings();
+-
+- // 1. Find the local release.xml file
+- String releaseFilename = _util.getLocalReleaseFile().getAbsolutePath();
+-
+- // 2. Load the local release.xml file as a ChannelXmlBean.
+- _installedChannelBean = _util.getLocalReleaseInfo(releaseFilename);
+-
+- // 4. Get the release.xml file as a ChannelXmlBean from the server or
+- // filesystem.
+- if (settings.isRemoteUpdateSite())
+- {
+- // 4a. Determine the channel that the user wants (stable or snapshot)
+- String channelName = getDesiredChannel(settings);
+-
+- StringBuilder releasePath = new StringBuilder("/");
+- releasePath.append(getUpdateServerPath());
+- releasePath.append("/");
+- releasePath.append(channelName);
+- releasePath.append("/");
+-
+- _currentChannelBean =
+- _util.downloadCurrentRelease(getUpdateServerName(), getUpdateServerPortAsInt(),
+- releasePath.toString(), RELEASE_XML_FILENAME, _app.getSquirrelPreferences().getProxySettings());
+- }
+- else
+- {
+- // 4b. Copy the release.xml file to the download directory then load the current release channel bean
+- FileWrapper updateSiteReleaseXmlFilePath =
+- fileWrapperFactory.create(settings.getFileSystemUpdatePath(), RELEASE_XML_FILENAME);
+- FileWrapper downloadReleaseXmlFile =
+- fileWrapperFactory.create(_util.getDownloadsDir(), RELEASE_XML_FILENAME);
+- _util.copyFile(updateSiteReleaseXmlFilePath, downloadReleaseXmlFile);
+- _currentChannelBean = _util.loadUpdateFromFileSystem(settings.getFileSystemUpdatePath());
+- }
+-
+- settings.setLastUpdateCheckTimeMillis("" + currentTimeMillis());
+- saveUpdateSettings(settings);
+-
+- // 5. Is it the same as the local copy, which was placed either by the
+- // installer or the last update?
+- return _currentChannelBean.equals(_installedChannelBean);
+- }
+-
+- /**
+- * This method takes a look at preference for channel and the channel that the user currently has installed
+- * and logs an info if switching from one to channel to another.
+- *
+- * @return the name of the channel that the user wants.
+- */
+- private String getDesiredChannel(final IUpdateSettings settings)
+- {
+- String desiredChannel = settings.getUpdateServerChannel().toLowerCase();
+- String currentChannelName = _installedChannelBean.getName();
+-
+- if (!currentChannelName.equals(desiredChannel))
+- {
+- if (s_log.isInfoEnabled())
+- {
+- s_log.info("getDesiredChannel: User is switching distribution channel from "
+- + "installed channel (" + currentChannelName + ") to new channel (" + desiredChannel + ")");
+- }
+- }
+- return desiredChannel;
+- }
+-
+- /**
+- * Returns a set of plugins (internal names) of plugins that are currently installed (regardless of whether
+- * or not they are enabled).
+- *
+- * @return a set of plugin internal names
+- */
+- public Set<String> getInstalledPlugins()
+- {
+- Set<String> result = new HashSet<String>();
+- IPluginManager pmgr = _app.getPluginManager();
+- PluginInfo[] infos = pmgr.getPluginInformation();
+- for (PluginInfo info : infos)
+- {
+- result.add(info.getInternalName());
+- }
+- return result;
+- }
+-
+- /**
+- * Go get the files that need to be updated. The specified list could have new files to get (INSTALL),
+- * existing files to remove (REMOVE). This method's only concern is with fetching the new artifacts to be
+- * installed.
+- */
+- public void pullDownUpdateFiles(List<ArtifactStatus> artifactStatusList,
+- DownloadStatusEventHandler handler, boolean releaseVersionWillChange)
+- {
+-
+- List<ArtifactStatus> newartifactsList = new ArrayList<ArtifactStatus>();
+-
+- for (ArtifactStatus status : artifactStatusList)
+- {
+- if (status.getArtifactAction() == ArtifactAction.INSTALL)
+- {
+- newartifactsList.add(status);
+- }
+- }
+-
+- if (newartifactsList.size() > 0)
+- {
+- _downloader = _downloaderFactory.create(newartifactsList);
+- _downloader.setUtil(_util);
+- _downloader.setProxySettings(_app.getSquirrelPreferences().getProxySettings());
+- _downloader.setIsRemoteUpdateSite(isRemoteUpdateSite());
+- _downloader.setHost(getUpdateServerName());
+- _downloader.setPort(Integer.parseInt(getUpdateServerPort()));
+- _downloader.setPath(getUpdateServerPath());
+- _downloader.setFileSystemUpdatePath(getUpdateSettings().getFileSystemUpdatePath());
+- _downloader.addDownloadStatusListener(handler);
+- _downloader.setReleaseVersionWillChange(releaseVersionWillChange);
+- handler.setDownloader(_downloader);
+- _downloader.setChannelName(getUpdateServerChannel().toLowerCase());
+- _downloader.start();
+- }
+- else
+- {
+- showMessage(i18n.CHANGES_RECORDED_TITLE, i18n.CHANGES_RECORDED_MSG);
+- }
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateController#getUpdateServerChannel()
+- */
+- public String getUpdateServerChannel()
+- {
+- return getUpdateSettings().getUpdateServerChannel();
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateController#getUpdateServerName()
+- */
+- public String getUpdateServerName()
+- {
+- return getUpdateSettings().getUpdateServer();
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateController#isRemoteUpdateSite()
+- */
+- public boolean isRemoteUpdateSite()
+- {
+- return getUpdateSettings().isRemoteUpdateSite();
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateController#getUpdateServerPath()
+- */
+- public String getUpdateServerPath()
+- {
+- return getUpdateSettings().getUpdateServerPath();
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateController#getUpdateServerPort()
+- */
+- public String getUpdateServerPort()
+- {
+- return getUpdateSettings().getUpdateServerPort();
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateController#getUpdateServerPortAsInt()
+- */
+- public int getUpdateServerPortAsInt()
+- {
+- return Integer.parseInt(getUpdateServerPort());
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateController# showConfirmMessage(java.lang.String,
+- * java.lang.String)
+- */
+- public boolean showConfirmMessage(String title, String msg)
+- {
+- int result =
+- _jOptionPaneService.showConfirmDialog(_app.getMainFrame(), msg, title, JOptionPane.YES_NO_OPTION,
+- JOptionPane.QUESTION_MESSAGE);
+- return (result == JOptionPane.YES_OPTION);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateController#showMessage(java.lang.String,
+- * java.lang.String)
+- */
+- public void showMessage(String title, String msg)
+- {
+- _jOptionPaneService.showMessageDialog(_app.getMainFrame(), msg, title, JOptionPane.INFORMATION_MESSAGE);
+-
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateController#showErrorMessage(java.lang.String,
+- * java.lang.String)
+- */
+- public void showErrorMessage(final String title, final String msg, final Exception e)
+- {
+- s_log.error(msg, e);
+- _jOptionPaneService.showMessageDialog(_app.getMainFrame(), msg, title, JOptionPane.ERROR_MESSAGE);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateController#showErrorMessage(java.lang.String,
+- * java.lang.String)
+- */
+- public void showErrorMessage(String title, String msg)
+- {
+- showErrorMessage(title, msg, null);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateController#isTimeToCheckForUpdates()
+- */
+- public boolean isTimeToCheckForUpdates()
+- {
+- IUpdateSettings settings = getUpdateSettings();
+-
+- if (!settings.isEnableAutomaticUpdates()) { return false; }
+-
+- long lastCheckTime = Long.parseLong(settings.getLastUpdateCheckTimeMillis());
+- long delta = currentTimeMillis() - lastCheckTime;
+-
+- UpdateCheckFrequency updateCheckFrequency = _util.getUpdateCheckFrequency(settings);
+-
+- return updateCheckFrequency.isTimeForUpdateCheck(delta);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateController#promptUserToDownloadAvailableUpdates()
+- */
+- public void promptUserToDownloadAvailableUpdates()
+- {
+- boolean userSaidYes =
+- showConfirmMessage(i18n.PROMPT_TO_DOWNLOAD_AVAILABLE_UPDATES_TITLE,
+- i18n.PROMPT_TO_DOWNLOAD_AVAILABLE_UPDATES_MSG);
+- if (userSaidYes)
+- {
+- showUpdateDialog();
+- }
+- else
+- {
+- s_log.info("promptUserToDownloadAvailableUpdates: user decided not to download updates at "
+- + "this time (currentTimeMillis=" + System.currentTimeMillis() + ")");
+- }
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateController#checkUpToDate()
+- */
+- public void checkUpToDate()
+- {
+- UpdateCheckRunnableCallback callback = new UpdateCheckRunnableCallback()
+- {
+-
+- public void updateCheckComplete(final boolean isUpdateToDate,
+- final ChannelXmlBean installedChannelXmlBean, final ChannelXmlBean currentChannelXmlBean)
+- {
+- GUIUtils.processOnSwingEventThread(new Runnable()
+- {
+- public void run()
+- {
+- if (isUpdateToDate)
+- {
+- showMessage(i18n.UPDATE_CHECK_TITLE, i18n.SOFTWARE_VERSION_CURRENT_MSG);
+- }
+- // build data
+- _currentChannelBean = currentChannelXmlBean;
+- _installedChannelBean = installedChannelXmlBean;
+- List<ArtifactStatus> artifactStatusItems = _util.getArtifactStatus(_currentChannelBean);
+- String installedVersion = _installedChannelBean.getCurrentRelease().getVersion();
+- String currentVersion = _currentChannelBean.getCurrentRelease().getVersion();
+-
+- // build ui
+- showUpdateSummaryDialog(artifactStatusItems, installedVersion, currentVersion);
+- }
+-
+- });
+- }
+-
+- public void updateCheckFailed(final Exception e)
+- {
+- if (e == null)
+- {
+- showErrorMessage(i18n.UPDATE_CHECK_FAILED_TITLE, i18n.RELEASE_FILE_DOWNLOAD_FAILED_MSG);
+- }
+- else if (e instanceof FileNotFoundException)
+- {
+- String msg =
+- s_stringMgr.getString("UpdateControllerImpl.localReleaseFileNotFound",
+- _util.getSquirrelHomeDir() + "/" + UpdateUtil.LOCAL_UPDATE_DIR_NAME + "/"
+- + RELEASE_XML_FILENAME);
+- showErrorMessage(i18n.UPDATE_CHECK_FAILED_TITLE, msg);
+- }
+- else
+- {
+- showErrorMessage(i18n.UPDATE_CHECK_FAILED_TITLE, i18n.EXCEPTION_MSG + e.getClass().getName()
+- + ":" + e.getMessage(), e);
+- }
+- }
+-
+- };
+-
+- ReleaseFileUpdateCheckTask runnable =
+- new ReleaseFileUpdateCheckTask(callback, getUpdateSettings(), _util, _app);
+- runnable.start();
+-
+- }
+-
+- private void showUpdateSummaryDialog(final List<ArtifactStatus> artifactStatusItems,
+- final String installedVersion, final String currentVersion)
+- {
+- GUIUtils.processOnSwingEventThread(new Runnable()
+- {
+-
+- public void run()
+- {
+- UpdateSummaryDialog dialog =
+- new UpdateSummaryDialog(_app.getMainFrame(), artifactStatusItems, UpdateControllerImpl.this);
+- dialog.setInstalledVersion(installedVersion);
+- dialog.setAvailableVersion(currentVersion);
+- GUIUtils.centerWithinParent(_app.getMainFrame());
+- dialog.setVisible(true);
+- }
+-
+- });
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateController#applyChanges(java.util.List, boolean)
+- */
+- public void applyChanges(List<ArtifactStatus> artifactStatusList, boolean releaseVersionWillChange)
+- {
+- try
+- {
+- // Persists the change list to the update directory.
+- _util.saveChangeList(artifactStatusList);
+-
+- // Kick off a thread to go and fetch the files one-by-one and register
+- // callback class - DownloadStatusEventHandler
+- pullDownUpdateFiles(artifactStatusList, new DownloadStatusEventHandler(this),
+- releaseVersionWillChange);
+- }
+- catch (Exception e)
+- {
+- showErrorMessage(i18n.UPDATE_CHECK_FAILED_TITLE, i18n.EXCEPTION_MSG + e.getClass().getName() + ":"
+- + e.getMessage(), e);
+- }
+-
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.gui.CheckUpdateListener#showPreferences()
+- */
+- public void showPreferences()
+- {
+- // 1. Wait for user to click ok/close
+- listener.setWaitingForOk(true);
+-
+- // 2. Display global preferences
+- GlobalPreferencesSheet.showSheet(_app, UpdatePreferencesPanel.class);
+-
+- }
+-
+- public JFrame getMainFrame()
+- {
+- return _app.getMainFrame();
+- }
+-
+- /* Helper methods */
+-
+- /**
+- * Returns the UpdateSettings from preferences.
+- *
+- * @return
+- */
+- private IUpdateSettings getUpdateSettings()
+- {
+- return _app.getSquirrelPreferences().getUpdateSettings();
+- }
+-
+- /**
+- * @param settings
+- */
+- private void saveUpdateSettings(final IUpdateSettings settings)
+- {
+- _app.getSquirrelPreferences().setUpdateSettings(settings);
+- }
+-
+- private class GlobalPrefsListener implements GlobalPreferencesActionListener
+- {
+-
+- private boolean waitingForOk = false;
+-
+- public void onDisplayGlobalPreferences()
+- {
+- }
+-
+- public void onPerformClose()
+- {
+- showDialog();
+- }
+-
+- public void onPerformOk()
+- {
+- showDialog();
+- }
+-
+- /**
+- * Re-show the dialog if we were waiting for Ok/Close.
+- */
+- private void showDialog()
+- {
+- // 2. When the user clicks ok, then display update dialog again.
+- if (waitingForOk)
+- {
+- waitingForOk = false;
+- showUpdateDialog();
+- }
+- }
+-
+- /**
+- * @param waitingForOk
+- * the waitingForOk to set
+- */
+- public void setWaitingForOk(boolean waitingForOk)
+- {
+- this.waitingForOk = waitingForOk;
+- }
+- }
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/UpdateUtil.java
++++ /dev/null
+@@ -1,398 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update;
+-
+-import java.io.FileNotFoundException;
+-import java.io.IOException;
+-import java.util.List;
+-import java.util.Set;
+-
+-import net.sourceforge.squirrel_sql.client.plugin.IPluginManager;
+-import net.sourceforge.squirrel_sql.client.preferences.IUpdateSettings;
+-import net.sourceforge.squirrel_sql.client.update.gui.ArtifactStatus;
+-import net.sourceforge.squirrel_sql.client.update.xmlbeans.ChangeListXmlBean;
+-import net.sourceforge.squirrel_sql.client.update.xmlbeans.ChannelXmlBean;
+-import net.sourceforge.squirrel_sql.client.update.xmlbeans.ReleaseXmlBean;
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapper;
+-import net.sourceforge.squirrel_sql.fw.util.IProxySettings;
+-
+-public interface UpdateUtil
+-{
+-
+- /**
+- * where we expect to find release.xml, which describes what the user has installed previously.
+- */
+- public static final String LOCAL_UPDATE_DIR_NAME = "update";
+-
+- /**
+- * The directory under the local update directory where previous versions of artifacts are saved for
+- * recovery purposes or if the user decides to revert to the previous version.
+- */
+- public static final String BACKUP_ROOT_DIR_NAME = "backup";
+-
+- /**
+- * The name of the release xml file that describes the installed version
+- */
+- public static final String RELEASE_XML_FILENAME = "release.xml";
+-
+- /**
+- * The name of the file that stores the user's desired actions with respect to a set of available updates.
+- */
+- public static final String CHANGE_LIST_FILENAME = "changeList.xml";
+-
+- /**
+- * This is the directory below the update directory where updated files are downloaded for installation.
+- */
+- public final static String DOWNLOADS_DIR_NAME = "downloads";
+-
+- /** the value for artifact type that identifies it as a core artifact */
+- public static final String CORE_ARTIFACT_ID = "core";
+-
+- /** the value for artifact type that identifies it as a plugin artifact */
+- public static final String PLUGIN_ARTIFACT_ID = "plugin";
+-
+- /** the value for artifact type that identifies it as a plugin artifact */
+- public static final String TRANSLATION_ARTIFACT_ID = "i18n";
+-
+- /** The SQuirreL jar that contains the core classes in the "app" module */
+- public static final String SQUIRREL_SQL_JAR_FILENAME = "squirrel-sql.jar";
+-
+- /** The documentation archive that contains all of core documentation - assume that top directory is doc */
+- public static final String DOCS_ARCHIVE_FILENAME = "doc.zip";
+-
+- /**
+- * Downloads the current release available at the specified host and path.
+- *
+- * @param host
+- * the host to open an HTTP connection to.
+- * @param port
+- * the port to open an HTTP connection to.
+- * @param path
+- * the path on the host's webserver to the file.
+- * @param fileToGet
+- * the file to get.
+- * @return
+- */
+- ChannelXmlBean downloadCurrentRelease(final String host, final int port, final String path,
+- final String fileToGet, final IProxySettings proxySettings) throws Exception;
+-
+- /**
+- * Loads the channel xml bean from the file system.
+- *
+- * @param path
+- * the directory to find release.xml in
+- * @return the ChannelXmlBean that represents the specified path.
+- */
+- ChannelXmlBean loadUpdateFromFileSystem(final String path);
+-
+- /**
+- * Downloads the specified file from the specified server and stores it by the same name in the specified
+- * destination directory.
+- *
+- * @param host
+- * the name of the server
+- * @param port
+- * the port on the server
+- * @param fileToGet
+- * the name of the file to download
+- * @param fileSize
+- * the size of the file in bytes
+- * @param checksum
+- * the checksum of the file
+- * @param proxySettings
+- * information about the web-proxy to use if any
+- * @return a string representing the full local path to where the file was downloaded to
+- * @throws Exception
+- */
+- String downloadHttpUpdateFile(String host, int port, String fileToGet, String destDir, long fileSize,
+- long checksum, IProxySettings proxySettings) throws Exception;
+-
+- /**
+- * Downloads the a file from a local directory into our update downloads directory.
+- *
+- * @param fileToGet
+- * the file to retreive.
+- * @param destDir
+- * the destination directory into which to place the file.
+- * @return true if the download succeeded; false otherwise.
+- */
+- boolean downloadLocalUpdateFile(String fileToGet, String destDir) throws FileNotFoundException,
+- IOException;
+-
+- /**
+- * Copies the specified from file to the specified to file. If "to" is a directory, then this will copy
+- * "from" into that directory and the resulting file will have the same name.
+- *
+- * @param from
+- * the file to copy from
+- * @param to
+- * the file to copy to
+- */
+- void copyFile(final FileWrapper from, final FileWrapper to) throws FileNotFoundException, IOException;
+-
+-
+- /**
+- * Lists the specified fromDir and moves all of the files found in that directory that match the specified
+- * filePattern to the specified toDir
+- * directory.
+- *
+- * @param fromDir
+- * the directory to copy files from
+- * @param toDir
+- * the directory to copy files to
+- * @throws FileNotFoundException
+- * @throws IOException
+- */
+- void moveFiles(final FileWrapper fromDir, final String filePattern, boolean matchPattern,
+- final FileWrapper toDir) throws FileNotFoundException, IOException;
+-
+-
+- /**
+- * Lists the specified fromDir and copies all of the files found in that directory to the specified toDir
+- * directory.
+- *
+- * @param fromDir
+- * the directory to copy files from
+- * @param toDir
+- * the directory to copy files to
+- * @throws FileNotFoundException
+- * @throws IOException
+- */
+- void copyDir(final FileWrapper fromDir, final FileWrapper toDir) throws FileNotFoundException, IOException;
+-
+- /**
+- * Lists the specified fromDir and copies all of the files found in that directory to the specified toDir
+- * directory.
+- *
+- * @param fromDir
+- * the directory to copy files from
+- * @param filePattern
+- * the pattern against which to compare the name of the file
+- * @param matchPattern
+- * a boolean value indicating whether or not to match the specified file pattern. If true, then
+- * only filenames that match the pattern are copied. If false, the only filenames that do not
+- * match the pattern are copied.
+- * @param toDir
+- * the directory to copy files to
+- * @throws FileNotFoundException
+- * @throws IOException
+- */
+- void copyDir(final FileWrapper fromDir, final String filePattern, boolean matchPattern,
+- final FileWrapper toDir) throws FileNotFoundException, IOException;
+-
+- /**
+- * Returns an ChannelXmlBean that describes the locally installed release.
+- *
+- * @param localReleaseFile
+- * the xml file to decode into an xmlbean.
+- * @return a ChannelXmlBean
+- */
+- ChannelXmlBean getLocalReleaseInfo(String localReleaseFile);
+-
+- /**
+- * Returns the top-level directory in which all installed components of SQuirreL live under.
+- *
+- * @return a File representing the home directory of SQuirreL
+- */
+- FileWrapper getSquirrelHomeDir();
+-
+- /**
+- * Returns the top-level directory in which all installed plugins of SQuirreL live under.
+- *
+- * @return a File representing the plugins directory of SQuirreL
+- */
+- FileWrapper getSquirrelPluginsDir();
+-
+- /**
+- * Returns the top-level directory in which all core libraries (and possibly translations) of SQuirreL live
+- * under.
+- *
+- * @return a File representing the core library directory of SQuirreL
+- */
+- FileWrapper getSquirrelLibraryDir();
+-
+- /**
+- * Returns the file that represents the list of changes to make when running the prelaunch update
+- * application
+- *
+- * @return a File representing the change list.
+- */
+- FileWrapper getChangeListFile();
+-
+- FileWrapper checkDir(FileWrapper parent, String child);
+-
+- void createZipFile(FileWrapper zipFile, FileWrapper... sourceFiles) throws FileNotFoundException,
+- IOException;
+-
+- /**
+- * Returns the update directory in which all information about available updates and the user's desired
+- * actions are located.
+- *
+- * @return a File representing the update directory.
+- */
+- FileWrapper getSquirrelUpdateDir();
+-
+- /**
+- * Create and save a ChangeListXmlBean to the update directory.
+- *
+- * @param changes
+- * the list of changes to be persisted
+- * @throws FileNotFoundException
+- * if the file to be written couldn't be found.
+- */
+- void saveChangeList(List<ArtifactStatus> changes) throws FileNotFoundException;
+-
+- /**
+- * Retrieves the change list (if one exists) from the update directory.
+- *
+- * @return a change list bean.
+- * @throws FileNotFoundException
+- * if the file couldn't be found.
+- */
+- ChangeListXmlBean getChangeList() throws FileNotFoundException;
+-
+- /**
+- * Returns the absolute path to the release xml file that describes what release the user currently has.
+- *
+- * @return the absolute path to the release xml file
+- * @throws FileNotFoundException
+- * if the release xml file couldn't be found.
+- */
+- FileWrapper getLocalReleaseFile() throws FileNotFoundException;
+-
+- /**
+- * Builds a list of ArtifactStatus objects from the specified ChannelXmlBean
+- *
+- * @param channelXmlBean
+- * the bean that represents the channel that the user is pulling updates from.
+- * @return a list of ArtifactStatus objects that describe all of the available artifacts from the specified
+- * channel.
+- */
+- List<ArtifactStatus> getArtifactStatus(ChannelXmlBean channelXmlBean);
+-
+- List<ArtifactStatus> getArtifactStatus(ReleaseXmlBean releaseXmlBean);
+-
+- /**
+- * Returns a set of plugin archive filenames - one for each installed plugin.
+- */
+- Set<String> getInstalledPlugins();
+-
+- /**
+- * Returns a set of translation filenames - one jar for each translation.
+- *
+- * @return
+- */
+- Set<String> getInstalledTranslations();
+-
+- /**
+- * @return the _pluginManager
+- */
+- IPluginManager getPluginManager();
+-
+- /**
+- * @param manager
+- * the _pluginManager to set
+- */
+- void setPluginManager(IPluginManager manager);
+-
+- /**
+- * Returns the top-level directory that contains artifact type sub-folders into which downloaded files are
+- * copied.
+- *
+- * @return a File representing the root directory of the download tree.
+- */
+- FileWrapper getDownloadsDir();
+-
+- FileWrapper getCoreDownloadsDir();
+-
+- FileWrapper getPluginDownloadsDir();
+-
+- FileWrapper getI18nDownloadsDir();
+-
+- FileWrapper getBackupDir();
+-
+- FileWrapper getCoreBackupDir();
+-
+- FileWrapper getPluginBackupDir();
+-
+- FileWrapper getI18nBackupDir();
+-
+- /**
+- * Returns the absolute path to the location of the squirrel-sql.jar file.
+- *
+- * @return a File representing the current installed squirrel-sql.jar file.
+- */
+- FileWrapper getInstalledSquirrelMainJarLocation();
+-
+- ChangeListXmlBean getChangeList(FileWrapper changeListFile) throws FileNotFoundException;
+-
+- FileWrapper getFile(FileWrapper installDir, String artifactName);
+-
+- /**
+- * This function will recursivly delete directories and files.
+- *
+- * @param path
+- * File or Directory to be deleted
+- * @return true indicates success.
+- */
+- boolean deleteFile(FileWrapper path);
+-
+- /**
+- * Extracts the specified zip file to the specified output directory.
+- *
+- * @param zipFile
+- * the compressed archive file to extract
+- * @param outputDirectory
+- * the directory into which to extract
+- * @throws IOException
+- * if an error occurs
+- */
+- void extractZipFile(FileWrapper zipFile, FileWrapper outputDirectory) throws IOException;
+-
+- /**
+- * Returns the absolute path to the file in the downloads section for the specified ArtifactStatus
+- *
+- * @param status
+- * the ArtifactStatus that describes the type and name of this artifact.
+- * @return a File object representing the location of the artifact in the downloads directory.
+- */
+- FileWrapper getDownloadFileLocation(ArtifactStatus status);
+-
+- boolean isPresentInDownloadsDirectory(ArtifactStatus status);
+-
+- /**
+- * Get the checksum for the specified file. This has a side effect in that it caches the checksum for
+- * speedier lookup on subsequent calls.
+- *
+- * @param f
+- * the file to get the checksum for
+- * @return the checksum as a long. If an error occurs, this method will return -1
+- */
+- public long getCheckSum(FileWrapper f);
+-
+- /**
+- * Returns an Enum value representing the users preference for how often to automatically check for
+- * updates.
+- *
+- * @param settings
+- * the settings to look in.
+- * @return the Enum value
+- */
+- public UpdateCheckFrequency getUpdateCheckFrequency(IUpdateSettings settings);
+-}
+\ No newline at end of file
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/UpdateUtilImpl.java
++++ /dev/null
+@@ -1,1097 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update;
+-
+-import java.io.FileInputStream;
+-import java.io.FileNotFoundException;
+-import java.io.FileOutputStream;
+-import java.io.IOException;
+-import java.io.InputStream;
+-import java.net.URL;
+-import java.util.ArrayList;
+-import java.util.Arrays;
+-import java.util.HashMap;
+-import java.util.HashSet;
+-import java.util.List;
+-import java.util.Set;
+-import java.util.zip.ZipEntry;
+-import java.util.zip.ZipInputStream;
+-import java.util.zip.ZipOutputStream;
+-
+-import net.sourceforge.squirrel_sql.client.ApplicationArguments;
+-import net.sourceforge.squirrel_sql.client.plugin.IPluginManager;
+-import net.sourceforge.squirrel_sql.client.plugin.PluginInfo;
+-import net.sourceforge.squirrel_sql.client.preferences.IUpdateSettings;
+-import net.sourceforge.squirrel_sql.client.update.gui.ArtifactStatus;
+-import net.sourceforge.squirrel_sql.client.update.util.PathUtils;
+-import net.sourceforge.squirrel_sql.client.update.util.PathUtilsImpl;
+-import net.sourceforge.squirrel_sql.client.update.xmlbeans.ArtifactXmlBean;
+-import net.sourceforge.squirrel_sql.client.update.xmlbeans.ChangeListXmlBean;
+-import net.sourceforge.squirrel_sql.client.update.xmlbeans.ChannelXmlBean;
+-import net.sourceforge.squirrel_sql.client.update.xmlbeans.ModuleXmlBean;
+-import net.sourceforge.squirrel_sql.client.update.xmlbeans.ReleaseXmlBean;
+-import net.sourceforge.squirrel_sql.client.update.xmlbeans.UpdateXmlSerializer;
+-import net.sourceforge.squirrel_sql.client.update.xmlbeans.UpdateXmlSerializerImpl;
+-import net.sourceforge.squirrel_sql.client.util.ApplicationFileWrappers;
+-import net.sourceforge.squirrel_sql.client.util.ApplicationFileWrappersImpl;
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapper;
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapperFactory;
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapperFactoryImpl;
+-import net.sourceforge.squirrel_sql.fw.util.IOUtilities;
+-import net.sourceforge.squirrel_sql.fw.util.IOUtilitiesImpl;
+-import net.sourceforge.squirrel_sql.fw.util.IProxySettings;
+-import net.sourceforge.squirrel_sql.fw.util.StringUtilities;
+-import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
+-import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
+-
+-/**
+- * Low-level utility methods for the UpdateController. Among other things this class provides file locations
+- * for important directories that are needed for backup/restore, installation/removal of updates and existing
+- * software. The following is a pictorial anatomy of the update directory.
+- *
+- * SQUIRREL_SQL_HOME/
+- * |
+- * + update/ (root of the update hierarchy)
+- * |
+- * + backup/ (original files that are to be updated are copied here for recovery purposes)
+- * | |
+- * | + core/
+- * | |
+- * | + i18n/
+- * | |
+- * | + plugin/
+- * |
+- * + downloads/
+- * | |
+- * | + core/
+- * | |
+- * | + i18n/
+- * | |
+- * | + plugin/
+- * |
+- * + changeList.xml (describes what is in downloads to be installed - deleted after update)
+- * |
+- * + release.xml (describes the release that is currently installed)
+- *
+- * @author manningr
+- */
+-public class UpdateUtilImpl implements UpdateUtil
+-{
+- // This class is used both inside and outside of SQuirreL (updater application). When this class is used
+- // by the updater application, the SQuirreL Main class is not used, and so ApplicationArguments must be
+- // initialized here or else the logger initialization will fail.
+- static {
+- ApplicationArguments.getInstance();
+- }
+- /** Logger for this class. */
+- private final static ILogger s_log = LoggerController.createLogger(UpdateUtilImpl.class);
+-
+- /** the PluginManager that tells us what plugins are installed */
+- private IPluginManager _pluginManager = null;
+-
+- /** The size of the buffer to use when extracting files from a ZIP archive */
+- public final static int ZIP_EXTRACTION_BUFFER_SIZE = 8192;
+-
+- /**
+- * Since it can take a while to compute a checksum for large jars, here we cache them for later use. The
+- * key is the absolute path to the file. The value is it's checksum
+- */
+- private HashMap<String, Long> fileChecksumMap = new HashMap<String, Long>();
+-
+- /** TODO: Spring-inject when this class is a Spring bean */
+- private PathUtils _pathUtils = new PathUtilsImpl();
+-
+- public void setPathUtils(PathUtils pathUtils)
+- {
+- this._pathUtils = pathUtils;
+- }
+-
+- /** TODO: Spring-inject when this class is a Spring bean */
+- private FileWrapperFactory _fileWrapperFactory = new FileWrapperFactoryImpl();
+-
+- public void setFileWrapperFactory(FileWrapperFactory factory)
+- {
+- _fileWrapperFactory = factory;
+- }
+-
+- /** TODO: Spring-inject when this class is a Spring bean */
+- private ApplicationFileWrappers _appFileWrappers = new ApplicationFileWrappersImpl();
+-
+- public void setApplicationFileWrappers(ApplicationFileWrappers appFileWrappers)
+- {
+- _appFileWrappers = appFileWrappers;
+- }
+-
+- /** TODO: Spring-inject when this class is a Spring bean */
+- private IOUtilities _iou = new IOUtilitiesImpl();
+-
+- public void setIOUtilities(IOUtilities iou)
+- {
+- _iou = iou;
+- }
+-
+- /**
+- * the utility class that reads and writes release info from/to the release.xml file TODO: Spring-inject
+- * when this class is a Spring bean
+- */
+- private UpdateXmlSerializer _serializer = new UpdateXmlSerializerImpl();
+-
+- public void setUpdateXmlSerializer(UpdateXmlSerializer serializer)
+- {
+- _serializer = serializer;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getCheckSum(java.io.File)
+- */
+- public long getCheckSum(FileWrapper f)
+- {
+- String absPath = f.getAbsolutePath();
+-
+- Long result = -1L;
+- if (fileChecksumMap.containsKey(absPath))
+- {
+- result = fileChecksumMap.get(absPath);
+- }
+- else
+- {
+- try
+- {
+- result = _iou.getCheckSum(f);
+- }
+- catch (IOException e)
+- {
+- s_log.error("getCheckSum: failed to compute the checksum for file (" + f.getAbsolutePath()
+- + "): " + e.getMessage(), e);
+- }
+- // -1 is stored if the checksum operation failed. This will ensure that comparison with any other
+- // file's checksum will be different - even if they happen to be the same file.
+- fileChecksumMap.put(absPath, result);
+- }
+- return result;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#downloadCurrentRelease(java.lang.String, int,
+- * java.lang.String, java.lang.String)
+- */
+- public ChannelXmlBean downloadCurrentRelease(final String host, final int port, final String path,
+- final String fileToGet, final IProxySettings proxySettings) throws Exception
+- {
+- ChannelXmlBean result = null;
+- if (s_log.isDebugEnabled())
+- {
+- s_log.debug("downloadCurrentRelease: host=" + host + " port=" + port + " path=" + path
+- + " fileToGet=" + fileToGet);
+- }
+- result = downloadCurrentReleaseHttp(host, port, path, fileToGet, proxySettings);
+- return result;
+- }
+-
+- /**
+- * Loads the channel xml bean from the file system.throw new IOException();
+- *
+- * @param path
+- * the directory to find release.xml in
+- * @return the ChannelXmlBean that represents the specified path.
+- */
+- public ChannelXmlBean loadUpdateFromFileSystem(final String path)
+- {
+- ChannelXmlBean result = null;
+- try
+- {
+- FileWrapper f = _fileWrapperFactory.create(path);
+- if (!f.isDirectory())
+- {
+- s_log.error("FileSystem path (" + path + ") is not a directory.");
+- }
+- else
+- {
+- f = _fileWrapperFactory.create(f, RELEASE_XML_FILENAME);
+- result = _serializer.readChannelBean(f);
+- }
+- }
+- catch (IOException e)
+- {
+- s_log.error("Unexpected exception while attempting " + "load updates from filesystem path (" + path
+- + "): " + e.getMessage(), e);
+- }
+-
+- return result;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#downloadLocalUpdateFile(java.lang.String,
+- * java.lang.String)
+- */
+- public boolean downloadLocalUpdateFile(String fileToGet, String destDir) throws FileNotFoundException,
+- IOException
+- {
+- boolean result = false;
+- FileWrapper fromFile = _fileWrapperFactory.create(fileToGet);
+- if (fromFile.isFile() && fromFile.canRead())
+- {
+- String filename = fromFile.getName();
+- FileWrapper toFile = _fileWrapperFactory.create(destDir, filename);
+- copyFile(fromFile, toFile);
+- result = true;
+- }
+- else
+- {
+- s_log.error("File " + fileToGet + " doesn't appear to be readable");
+- }
+- return result;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#copyFile(FileWrapper, FileWrapper)
+- */
+- public void copyFile(final FileWrapper from, final FileWrapper to) throws FileNotFoundException,
+- IOException
+- {
+- if (!from.exists())
+- {
+- s_log.error("Cannot copy from file (" + from.getAbsolutePath() + ") which doesn't appear to exist.");
+- return;
+- }
+- FileWrapper toFile = to;
+- // Check to see if to is a directory and convert toFile to be the name of the file in that directory.
+- if (to.isDirectory())
+- {
+- toFile = getFile(to, from.getName());
+- }
+- if (s_log.isDebugEnabled())
+- {
+- s_log.debug("Copying from file (" + from.getAbsolutePath() + ") to file ("
+- + toFile.getAbsolutePath() + ")");
+- }
+- if (toFile.exists())
+- {
+- long fromCheckSum = getCheckSum(from);
+- long toCheckSum = getCheckSum(toFile);
+- if (fromCheckSum == toCheckSum)
+- {
+- if (s_log.isInfoEnabled())
+- {
+- s_log.info("File to be copied(" + from.getAbsolutePath() + ") has the same checksum("
+- + fromCheckSum + ") as the file to copy to (" + toFile.getAbsolutePath()
+- + "). Skipping copy.");
+- }
+- return;
+- }
+- }
+- _iou.copyFile(from, toFile);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#copyDir(
+- * net.sourceforge.squirrel_sql.fw.util.FileWrapper,
+- * java.lang.String, boolean, net.sourceforge.squirrel_sql.fw.util.FileWrapper)
+- */
+- @Override
+- public void moveFiles(FileWrapper fromDir, String filePattern, boolean matchPattern, FileWrapper toDir)
+- throws FileNotFoundException, IOException
+- {
+- if (StringUtilities.isEmpty(filePattern)) {
+- throw new IllegalArgumentException("filePattern arg cannot be empty or null");
+- }
+- if (!fromDir.isDirectory()) { throw new IllegalArgumentException("Expected fromDir("
+- + fromDir.getAbsolutePath() + ") to be a directory."); }
+- if (!toDir.isDirectory()) { throw new IllegalArgumentException("Expected toDir("
+- + toDir.getAbsolutePath() + ") to be a directory."); }
+-
+- List<FileWrapper> filesToMove = getFilterFileList(fromDir, filePattern, matchPattern);
+- for (FileWrapper file : filesToMove) {
+- copyFile(file, toDir);
+- if (s_log.isDebugEnabled()) {
+- s_log.debug("moveFiles: Attempting to delete file "+file.getAbsolutePath());
+- }
+- if (file.delete()) {
+- s_log.error("moveFiles: Unable to delete file "+file.getAbsolutePath());
+- }
+-
+- }
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#copyDir(FileWrapper, FileWrapper)
+- */
+- public void copyDir(FileWrapper fromDir, FileWrapper toDir) throws FileNotFoundException, IOException
+- {
+- verifyDirectory(fromDir, toDir);
+- FileWrapper[] files = fromDir.listFiles();
+- copyFiles(Arrays.asList(files), toDir);
+- }
+-
+- private void verifyDirectory(FileWrapper fromDir, FileWrapper toDir) {
+- if (!fromDir.isDirectory()) { throw new IllegalArgumentException("Expected fromDir("
+- + fromDir.getAbsolutePath() + ") to be a directory."); }
+- if (!toDir.isDirectory()) { throw new IllegalArgumentException("Expected toDir("
+- + toDir.getAbsolutePath() + ") to be a directory."); }
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#copyDir(
+- * net.sourceforge.squirrel_sql.fw.util.FileWrapper,
+- * java.lang.String, boolean, net.sourceforge.squirrel_sql.fw.util.FileWrapper)
+- */
+- @Override
+- public void copyDir(FileWrapper fromDir, String filePattern, boolean matchPattern, FileWrapper toDir)
+- throws FileNotFoundException, IOException
+- {
+- if (StringUtilities.isEmpty(filePattern)) {
+- throw new IllegalArgumentException("filePattern arg cannot be empty or null");
+- }
+- verifyDirectory(fromDir, toDir);
+- List<FileWrapper> filesToCopy = getFilterFileList(fromDir, filePattern, matchPattern);
+- copyFiles(filesToCopy, toDir);
+- }
+-
+- /**
+- * Builds a list of FileWrappers that represent each of the files in the specified fromDir whose name
+- * matches or doesn't match the specified filePattern. A true value for the matchPattern flag indicates
+- * that files which match the pattern should be included. False indicates that only files that do not
+- * match the pattern should be included.
+- *
+- * @param fromDir
+- * @param filePattern
+- * @param matchPattern
+- * @return
+- * @throws FileNotFoundException
+- * @throws IOException
+- */
+- private List<FileWrapper> getFilterFileList(FileWrapper fromDir, String filePattern, boolean matchPattern)
+- throws FileNotFoundException, IOException
+- {
+- FileWrapper[] files = fromDir.listFiles();
+- List<FileWrapper> filesToCopy = new ArrayList<FileWrapper>();
+-
+-
+- for (FileWrapper sourceFile : files) {
+-
+- boolean fileNameMatchesPattern = sourceFile.getName().matches(filePattern);
+- if (matchPattern && fileNameMatchesPattern) {
+- filesToCopy.add(sourceFile);
+- }
+- if (!matchPattern && !fileNameMatchesPattern) {
+- filesToCopy.add(sourceFile);
+- }
+- }
+- return filesToCopy;
+- }
+-
+- /**
+- * Expects the toDir to be a directory. This check should be made in the public method.
+- * @param files
+- * @param toDir
+- * @throws FileNotFoundException
+- * @throws IOException
+- */
+- private void copyFiles(List<FileWrapper> files, FileWrapper toDir)
+- throws FileNotFoundException, IOException
+- {
+- for (FileWrapper sourceFile : files)
+- {
+- copyFile(sourceFile, toDir);
+- }
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getLocalReleaseInfo(java.lang.String)
+- */
+- public ChannelXmlBean getLocalReleaseInfo(String localReleaseFile)
+- {
+- ChannelXmlBean result = null;
+- if (s_log.isDebugEnabled())
+- {
+- s_log.debug("Attempting to read local release file: " + localReleaseFile);
+- }
+- try
+- {
+- result = _serializer.readChannelBean(localReleaseFile);
+- }
+- catch (IOException e)
+- {
+- s_log.error("Unable to read local release file: " + e.getMessage(), e);
+- }
+- return result;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getSquirrelHomeDir()
+- */
+- public FileWrapper getSquirrelHomeDir()
+- {
+- FileWrapper squirrelHomeDir = _appFileWrappers.getSquirrelHomeDir();
+- if (!squirrelHomeDir.isDirectory())
+- {
+- s_log.error("SQuirreL Home Directory (" + squirrelHomeDir.getAbsolutePath()
+- + " doesn't appear to be a directory");
+- }
+- return squirrelHomeDir;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getInstalledSquirrelMainJarLocation()
+- */
+- public FileWrapper getInstalledSquirrelMainJarLocation()
+- {
+- return _fileWrapperFactory.create(getSquirrelHomeDir(), SQUIRREL_SQL_JAR_FILENAME);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getSquirrelPluginsDir()
+- */
+- public FileWrapper getSquirrelPluginsDir()
+- {
+- FileWrapper squirrelHomeDir = _appFileWrappers.getPluginsDirectory();
+- if (!squirrelHomeDir.isDirectory())
+- {
+- s_log.error("SQuirreL Plugins Directory (" + squirrelHomeDir.getAbsolutePath()
+- + " doesn't appear to be a directory");
+- }
+- return squirrelHomeDir;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getSquirrelLibraryDir()
+- */
+- public FileWrapper getSquirrelLibraryDir()
+- {
+- FileWrapper squirrelLibDir = _appFileWrappers.getLibraryDirectory();
+- if (!squirrelLibDir.isDirectory())
+- {
+- s_log.error("SQuirreL Library Directory (" + squirrelLibDir.getAbsolutePath()
+- + " doesn't appear to be a directory");
+- }
+- return squirrelLibDir;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getSquirrelUpdateDir()
+- */
+- public FileWrapper getSquirrelUpdateDir()
+- {
+- return getDir(_appFileWrappers.getUpdateDirectory(), null, true);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getDownloadsDir()
+- */
+- public FileWrapper getDownloadsDir()
+- {
+- return getDir(getSquirrelUpdateDir(), DOWNLOADS_DIR_NAME, true);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getCoreDownloadsDir()
+- */
+- public FileWrapper getCoreDownloadsDir()
+- {
+- return getDir(getDownloadsDir(), CORE_ARTIFACT_ID, true);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getPluginDownloadsDir()
+- */
+- public FileWrapper getPluginDownloadsDir()
+- {
+- return getDir(getDownloadsDir(), PLUGIN_ARTIFACT_ID, true);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getI18nDownloadsDir()
+- */
+- public FileWrapper getI18nDownloadsDir()
+- {
+- return getDir(getDownloadsDir(), TRANSLATION_ARTIFACT_ID, true);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getBackupDir()
+- */
+- public FileWrapper getBackupDir()
+- {
+- return getDir(getSquirrelUpdateDir(), BACKUP_ROOT_DIR_NAME, false);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getCoreBackupDir()
+- */
+- public FileWrapper getCoreBackupDir()
+- {
+- return getDir(getBackupDir(), CORE_ARTIFACT_ID, false);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getI18nBackupDir()
+- */
+- public FileWrapper getI18nBackupDir()
+- {
+- return getDir(getBackupDir(), TRANSLATION_ARTIFACT_ID, false);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getPluginBackupDir()
+- */
+- public FileWrapper getPluginBackupDir()
+- {
+- return getDir(getBackupDir(), PLUGIN_ARTIFACT_ID, false);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getChangeListFile()
+- */
+- public FileWrapper getChangeListFile()
+- {
+- FileWrapper updateDir = getSquirrelUpdateDir();
+- FileWrapper changeListFile = _fileWrapperFactory.create(updateDir, CHANGE_LIST_FILENAME);
+- return changeListFile;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#saveChangeList(java.util.List)
+- */
+- public void saveChangeList(List<ArtifactStatus> changes) throws FileNotFoundException
+- {
+- ChangeListXmlBean changeBean = new ChangeListXmlBean();
+- changeBean.setChanges(changes);
+- _serializer.write(changeBean, getChangeListFile());
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getChangeList()
+- */
+- public ChangeListXmlBean getChangeList() throws FileNotFoundException
+- {
+- return _serializer.readChangeListBean(getChangeListFile());
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getLocalReleaseFile()
+- */
+- public FileWrapper getLocalReleaseFile() throws FileNotFoundException
+- {
+- FileWrapper result = null;
+- try
+- {
+- FileWrapper[] files = getSquirrelHomeDir().listFiles();
+- for (FileWrapper file : files)
+- {
+- if (LOCAL_UPDATE_DIR_NAME.equals(file.getName()))
+- {
+- FileWrapper[] updateFiles = file.listFiles();
+- for (FileWrapper updateFile : updateFiles)
+- {
+- if (RELEASE_XML_FILENAME.equals(updateFile.getName()))
+- {
+- result = updateFile;
+- }
+- }
+- }
+- }
+- }
+- catch (Exception e)
+- {
+- s_log.error("getLocalReleaseFile: Exception encountered while " + "attempting to find "
+- + RELEASE_XML_FILENAME + " file");
+- }
+- if (result == null) { throw new FileNotFoundException("File " + RELEASE_XML_FILENAME
+- + " could not be found"); }
+- return result;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getArtifactStatus(net.sourceforge.squirrel_sql.client.update.xmlbeans.ChannelXmlBean)
+- */
+- public List<ArtifactStatus> getArtifactStatus(ChannelXmlBean channelXmlBean)
+- {
+-
+- ReleaseXmlBean releaseXmlBean = channelXmlBean.getCurrentRelease();
+- return getArtifactStatus(releaseXmlBean);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#
+- * getArtifactStatus(net.sourceforge.squirrel_sql.client.update.xmlbeans.ReleaseXmlBean)
+- */
+- public List<ArtifactStatus> getArtifactStatus(ReleaseXmlBean releaseXmlBean)
+- {
+- Set<String> installedPlugins = getInstalledPlugins();
+- Set<String> installedTranslations = getInstalledTranslations();
+- ArrayList<ArtifactStatus> result = new ArrayList<ArtifactStatus>();
+- Set<ModuleXmlBean> currentModuleBeans = releaseXmlBean.getModules();
+- for (ModuleXmlBean module : currentModuleBeans)
+- {
+- Set<ArtifactXmlBean> artifactBeans = module.getArtifacts();
+- String moduleName = module.getName();
+- for (ArtifactXmlBean artifact : artifactBeans)
+- {
+- ArtifactStatus status = new ArtifactStatus(artifact);
+- status.setType(moduleName);
+- if (status.isCoreArtifact())
+- {
+- status.setInstalled(true);
+- }
+- if (status.isPluginArtifact() && installedPlugins.contains(artifact.getName()))
+- {
+- status.setInstalled(true);
+- }
+- if (status.isTranslationArtifact() && installedTranslations.contains(artifact.getName()))
+- {
+- status.setInstalled(true);
+- }
+- result.add(status);
+- }
+- }
+- return result;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getInstalledPlugins()
+- */
+- public Set<String> getInstalledPlugins()
+- {
+- HashSet<String> result = new HashSet<String>();
+-
+- for (PluginInfo info : _pluginManager.getPluginInformation())
+- {
+- result.add(info.getInternalName() + ".zip");
+- }
+- return result;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getInstalledTranslations()
+- */
+- public Set<String> getInstalledTranslations()
+- {
+- HashSet<String> result = new HashSet<String>();
+- FileWrapper libDir = getSquirrelLibraryDir();
+- for (String filename : libDir.list())
+- {
+- if (filename.startsWith("squirrel-sql_"))
+- {
+- result.add(filename);
+- }
+- }
+- return result;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getPluginManager()
+- */
+- public IPluginManager getPluginManager()
+- {
+- return _pluginManager;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#setPluginManager(net.sourceforge.squirrel_sql.client.plugin.PluginManager)
+- */
+- public void setPluginManager(IPluginManager manager)
+- {
+- _pluginManager = manager;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#checkDir(FileWrapper, java.lang.String)
+- */
+- public FileWrapper checkDir(FileWrapper parent, String child)
+- {
+- FileWrapper dir = _fileWrapperFactory.create(parent, child);
+- if (!dir.exists() && !dir.mkdir())
+- {
+- s_log.error("checkDir: Failed to mkdir - " + dir.getAbsolutePath());
+- }
+- return dir;
+- }
+-
+- /**
+- * TODO: move to IOUtilities
+- *
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#createZipFile(FileWrapper, FileWrapper[])
+- */
+- public void createZipFile(FileWrapper zipFile, FileWrapper... sourceFiles) throws FileNotFoundException,
+- IOException
+- {
+- ZipOutputStream os = new ZipOutputStream(new FileOutputStream(zipFile.getAbsolutePath()));
+- zipFileOs(os, sourceFiles);
+- os.close();
+- }
+-
+- /**
+- * This function will recursively delete directories and files.
+- *
+- * @param path
+- * File or Directory to be deleted
+- * @return true indicates successfully deleted the file or directory.
+- */
+- public boolean deleteFile(FileWrapper path)
+- {
+- boolean result = true;
+- if (path.exists())
+- {
+- if (path.isFile())
+- {
+- result = path.delete();
+- if (s_log.isInfoEnabled())
+- {
+- if (result)
+- {
+- s_log.info("deleteFile: successfully deleted file = " + path.getAbsolutePath());
+- }
+- else
+- {
+- s_log.info("deleteFile: failed to delete file = " + path.getAbsolutePath());
+- }
+- }
+- }
+- else
+- {
+- FileWrapper[] files = path.listFiles();
+- for (int i = 0; i < files.length; i++)
+- {
+- result = result && deleteFile(files[i]);
+- }
+- result = result && path.delete();
+- }
+- }
+- return result;
+- }
+-
+- /**
+- * TODO: Move this to IOUtilities Extracts the specified zip file to the specified output directory.
+- *
+- * @param zipFile
+- * @param outputDirectory
+- * @throws IOException
+- */
+- public void extractZipFile(FileWrapper zipFile, FileWrapper outputDirectory) throws IOException
+- {
+- if (!outputDirectory.isDirectory())
+- {
+- s_log.error("Output directory specified (" + outputDirectory.getAbsolutePath()
+- + ") doesn't appear to be a directory");
+- return;
+- }
+- FileInputStream fis = null;
+- ZipInputStream zis = null;
+- FileOutputStream fos = null;
+- try
+- {
+- fis = new FileInputStream(zipFile.getAbsolutePath());
+- zis = new ZipInputStream(fis);
+- ZipEntry zipEntry = zis.getNextEntry();
+- while (zipEntry != null)
+- {
+- String name = zipEntry.getName();
+- if (zipEntry.isDirectory())
+- {
+- checkDir(outputDirectory, name);
+- }
+- else
+- {
+- FileWrapper newFile = _fileWrapperFactory.create(outputDirectory, name);
+- if (newFile.exists())
+- {
+- if (s_log.isInfoEnabled())
+- {
+- s_log.info("Deleting extraction file that already exists:" + newFile.getAbsolutePath());
+- }
+- newFile.delete();
+- }
+- fos = new FileOutputStream(newFile.getAbsolutePath());
+- byte[] buffer = new byte[ZIP_EXTRACTION_BUFFER_SIZE];
+- int n = 0;
+- while ((n = zis.read(buffer, 0, ZIP_EXTRACTION_BUFFER_SIZE)) > -1)
+- {
+- fos.write(buffer, 0, n);
+- }
+- fos.close();
+- }
+- zipEntry = zis.getNextEntry();
+- }
+- }
+- finally
+- {
+- _iou.closeOutputStream(fos);
+- _iou.closeInputStream(fis);
+- _iou.closeInputStream(zis);
+- }
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getChangeList(FileWrapper)
+- */
+- public ChangeListXmlBean getChangeList(FileWrapper changeListFile) throws FileNotFoundException
+- {
+- return _serializer.readChangeListBean(changeListFile);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#getFile(FileWrapper, java.lang.String)
+- */
+- public FileWrapper getFile(FileWrapper installDir, String artifactName)
+- {
+- return _fileWrapperFactory.create(installDir, artifactName);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#downloadHttpUpdateFile(java.lang.String, int,
+- * java.lang.String, java.lang.String, long, long)
+- */
+- public String downloadHttpUpdateFile(final String host, final int port, final String fileToGet,
+- final String destDir, final long fileSize, final long checksum, final IProxySettings proxySettings)
+- throws Exception
+- {
+- URL url = _iou.constructHttpUrl(host, port, fileToGet);
+- String result = null;
+- FileWrapper resultFile = _fileWrapperFactory.create(destDir, _pathUtils.getFileFromPath(fileToGet));
+- result = resultFile.getAbsolutePath();
+-
+- if (s_log.isDebugEnabled())
+- {
+- s_log.debug("downloadHttpFile: writing http response body to file: " + resultFile);
+- }
+-
+- int totalLength = _iou.downloadHttpFile(url, resultFile, proxySettings);
+-
+- verifySize(url, fileSize, totalLength);
+- return result;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#
+- * getDownloadFileLocation(net.sourceforge.squirrel_sql.client.update.gui.ArtifactStatus)
+- */
+- public FileWrapper getDownloadFileLocation(ArtifactStatus status)
+- {
+- FileWrapper result = null;
+- if (CORE_ARTIFACT_ID.equals(status.getType()))
+- {
+- result = getFile(getCoreDownloadsDir(), status.getName());
+- }
+- if (PLUGIN_ARTIFACT_ID.equals(status.getType()))
+- {
+- result = getFile(getPluginDownloadsDir(), status.getName());
+- }
+- if (TRANSLATION_ARTIFACT_ID.equals(status.getType()))
+- {
+- result = getFile(getI18nDownloadsDir(), status.getName());
+- }
+- return result;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#
+- * isPresentInDownloadsDirectory(net.sourceforge.squirrel_sql.client.update.gui.ArtifactStatus)
+- */
+- public boolean isPresentInDownloadsDirectory(ArtifactStatus status)
+- {
+- boolean result = false;
+-
+- FileWrapper downloadFile = getDownloadFileLocation(status);
+-
+- if (downloadFile.exists())
+- {
+- long checkSum = getCheckSum(downloadFile);
+- if (status.getChecksum() == checkSum)
+- {
+- if (downloadFile.length() == status.getSize())
+- {
+- result = true;
+- }
+- }
+- }
+- return result;
+- }
+-
+- /* Helper Methods */
+-
+- /**
+- * Verifies that the byte size of what was downloaded matches the expected size of the artifact. If
+- * expected is -1, this check will be skipped; this is expected in the case where the release.xml file is
+- * being downloaded and there is no information about big it is. When -1 is expected, then a log message is
+- * created and this check is skipped.
+- *
+- * @param url
+- * the URL that was downloaded from
+- * @param expected
+- * the number of bytes expected to be downloaded
+- * @param actual
+- * the actual number of bytes downloaded
+- * @throws Exception
+- * if the two counts do not match.
+- */
+- private void verifySize(URL url, long expected, long actual) throws Exception
+- {
+- if (expected == -1)
+- {
+- if (s_log.isInfoEnabled())
+- {
+- s_log.info("verifySize: expected size was -1. Skipping check for url: " + url.toString());
+- }
+- return;
+- }
+- if (expected != actual) { throw new Exception("Attempt to get file contents from url ("
+- + url.toString() + ") resulted in " + actual + " bytes downloaded, but " + expected
+- + " bytes were expected."); }
+- }
+-
+- /**
+- * Writes the specified sourceFile(s) contents to the specified Zip output stream.
+- *
+- * @param os
+- * the Zip OutputStream to write to
+- * @param sourceFiles
+- * the files to read from
+- * @throws FileNotFoundException
+- * if one of the files could not be found
+- * @throws IOException
+- * if and IO error occurs
+- */
+- private void zipFileOs(ZipOutputStream os, FileWrapper[] sourceFiles) throws FileNotFoundException,
+- IOException
+- {
+- for (FileWrapper file : sourceFiles)
+- {
+- if (file.isDirectory())
+- {
+- zipFileOs(os, file.listFiles());
+- }
+- else
+- {
+- FileInputStream fis = null;
+- try
+- {
+- fis = new FileInputStream(file.getAbsolutePath());
+- os.putNextEntry(new ZipEntry(file.getPath()));
+- _iou.copyBytes(fis, os);
+- }
+- finally
+- {
+- _iou.closeInputStream(fis);
+- }
+- }
+- }
+- }
+-
+- /**
+- * @param parent
+- * @param dirName
+- * @param create
+- * @return
+- */
+- private FileWrapper getDir(FileWrapper parent, String dirName, boolean create)
+- {
+- FileWrapper result = null;
+- if (dirName != null)
+- {
+- result = _fileWrapperFactory.create(parent, dirName);
+- }
+- else
+- {
+- result = parent;
+- }
+- if (!result.isDirectory())
+- {
+- if (result.exists())
+- {
+- // If the update dir, is actually a file, log an error.
+- s_log.error(dirName + " directory (" + result.getAbsolutePath()
+- + ") doesn't appear to be a directory");
+- }
+- else
+- {
+- // If the downloads dir doesn't already exist, just create it.
+- if (create)
+- {
+- result.mkdir();
+- }
+- }
+- }
+- return result;
+- }
+-
+- /**
+- * @param host
+- * @param port
+- * @param path
+- * @param fileToGet
+- * @return
+- * @throws Exception
+- * if the current release file could not be downloaded
+- */
+- private ChannelXmlBean downloadCurrentReleaseHttp(final String host, final int port, final String path,
+- final String file, final IProxySettings proxySettings) throws Exception
+- {
+-
+- ChannelXmlBean result = null;
+- InputStream is = null;
+- try
+- {
+- String fileToGet = _pathUtils.buildPath(true, path, file);
+-
+- // We set expected and checksum to -1 here, since we don't have that information for release.xml file
+- // TODO: Can HttpClient be used to get the byte-size of release.xml so we can perform this check?
+- String filename =
+- downloadHttpUpdateFile(host, port, fileToGet, getDownloadsDir().getAbsolutePath(), -1, -1,
+- proxySettings);
+- FileWrapper releaseXmlFile = _fileWrapperFactory.create(filename);
+- if (releaseXmlFile.exists())
+- {
+- result = _serializer.readChannelBean(releaseXmlFile);
+- }
+- else
+- {
+- throw new FileNotFoundException("Current release file couldn't be downloaded");
+- }
+- }
+- finally
+- {
+- _iou.closeInputStream(is);
+- }
+- return result;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.UpdateUtil#
+- * getUpdateCheckFrequency(net.sourceforge.squirrel_sql.client.preferences.IUpdateSettings)
+- */
+- public UpdateCheckFrequency getUpdateCheckFrequency(IUpdateSettings settings)
+- {
+- UpdateCheckFrequency result = UpdateCheckFrequency.STARTUP;
+- String updateCheckFrequencyStr = settings.getUpdateCheckFrequency();
+- if ("weekly".equalsIgnoreCase(updateCheckFrequencyStr))
+- {
+- result = UpdateCheckFrequency.WEEKLY;
+- }
+- if ("daily".equalsIgnoreCase(updateCheckFrequencyStr))
+- {
+- result = UpdateCheckFrequency.DAILY;
+- }
+- if ("startup".equalsIgnoreCase(updateCheckFrequencyStr))
+- {
+- result = UpdateCheckFrequency.STARTUP;
+- }
+- return result;
+- }
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/async/ReleaseFileUpdateCheckTask.java
++++ /dev/null
+@@ -1,208 +0,0 @@
+-/*
+- * Copyright (C) 2008 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.async;
+-
+-import static java.lang.System.currentTimeMillis;
+-import static net.sourceforge.squirrel_sql.client.update.UpdateUtil.RELEASE_XML_FILENAME;
+-import net.sourceforge.squirrel_sql.client.IApplication;
+-import net.sourceforge.squirrel_sql.client.preferences.IUpdateSettings;
+-import net.sourceforge.squirrel_sql.client.update.UpdateUtil;
+-import net.sourceforge.squirrel_sql.client.update.xmlbeans.ChannelXmlBean;
+-import net.sourceforge.squirrel_sql.fw.util.Utilities;
+-import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
+-import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
+-
+-/**
+- * We need to check to see if the release is current in several places. First, we must check when the user
+- * prompts us to which is running on the event dispatch thread. Since this is a potentially a long-running
+- * operation, this class uses the thread-pool to off-load it's work from the UI thread. Second, we must check
+- * that the release is current when the update check timer says to, based on user preferences. So, this the
+- * thread-pool isn't needed in that case and this class is used synchronously, since the timer thread is
+- * already not the UI thread.
+- *
+- * @author manningr
+- */
+-public class ReleaseFileUpdateCheckTask implements Runnable
+-{
+-
+- /** Logger for this class. */
+- private static final ILogger s_log = LoggerController.createLogger(ReleaseFileUpdateCheckTask.class);
+-
+- private UpdateCheckRunnableCallback _callback = null;
+-
+- private IUpdateSettings _settings = null;
+-
+- private UpdateUtil _util = null;
+-
+- private IApplication _app = null;
+-
+- private boolean isUpToDate = false;
+-
+- public ReleaseFileUpdateCheckTask(UpdateCheckRunnableCallback callback, IUpdateSettings settings,
+- UpdateUtil util, IApplication app)
+- {
+- Utilities.checkNull("ReleaseFileUpdateCheckRunnable", "settings", settings, "util", util, "app", app);
+- _callback = callback;
+- _settings = settings;
+- _util = util;
+- _app = app;
+- }
+-
+- public void start()
+- {
+- if (_app == null) { throw new IllegalStateException(
+- "_app was null - cannot access the thread pool for asynchronous use"); }
+- _app.getThreadPool().addTask(this);
+- }
+-
+- /**
+- * Results in a boolean value (isUpToDate) indicating whether or not there are updates available to be
+- * installed. This will also produce the installed and current ChannelXmlBeans and if used asynchronously
+- * (callback is not null), then this will invoke the appropriate callback method. One side effect is that
+- * the last update check time is stored in update settings so that the update check timer knows when to
+- * schedule another check at startup. The sequence of steps involved is : 1. Find the local release.xml
+- * file 2. Load the local release.xml file as a ChannelXmlBean. 3. Get the release.xml file as a
+- * ChannelXmlBean from the server or local filesystem 3a. For server, Determine the channel that the user
+- * has (stable or snapshot) 5. Determine if it is the same as the local copy, which was placed either by
+- * the installer or the last update?
+- *
+- * @see java.lang.Runnable#run()
+- */
+- public void run()
+- {
+- String releaseFilename = null;
+-
+- // 1. Find the local release.xml file. Bail with exception if we cannot find it.
+- try
+- {
+- releaseFilename = _util.getLocalReleaseFile().getAbsolutePath();
+- }
+- catch (Exception e)
+- {
+- s_log.error("Unexpected exception while attempting to find local release file: "+e.getMessage(), e);
+- if (_callback != null) {
+- _callback.updateCheckFailed(e);
+- }
+- return;
+- }
+-
+- // 2. Load the local release.xml file as a ChannelXmlBean.
+- ChannelXmlBean installedChannelBean = _util.getLocalReleaseInfo(releaseFilename);
+-
+- // 3. & 3a. Get the release.xml file as a ChannelXmlBean from the server or
+- // filesystem.
+- ChannelXmlBean currentChannelBean = getCurrentChannelXmlBean(installedChannelBean);
+-
+- // Record now as the last time we checked for updates.
+- _settings.setLastUpdateCheckTimeMillis("" + currentTimeMillis());
+- _app.getSquirrelPreferences().setUpdateSettings(_settings);
+-
+- // 5. Is it the same as the local copy, which was placed either by the
+- // installer or the last update?
+- if (currentChannelBean == null)
+- {
+- s_log.warn("run: currentChannelBean was null - it is inconclusive whether or not the software "
+- + "is current : assuming that it is for now");
+- if (_callback != null) {
+- _callback.updateCheckFailed(null);
+- }
+- }
+- else
+- {
+- isUpToDate = currentChannelBean.equals(installedChannelBean);
+- if (_callback != null)
+- {
+- _callback.updateCheckComplete(isUpToDate, installedChannelBean, currentChannelBean);
+- }
+- }
+- }
+-
+- /**
+- * Uses settings to determine where to get the current release.xml that is available and retrieves it as an
+- * XML bean. This will return null (and log a warning) if it couldn't be retrieved.
+- *
+- * @param installedChannelBean
+- * the XML bean that represents what is installed.
+- * @return an XML bean that represents what release is currently available or null if it couldn't be
+- * downloaded
+- */
+- private ChannelXmlBean getCurrentChannelXmlBean(ChannelXmlBean installedChannelBean)
+- {
+- ChannelXmlBean currentChannelBean = null;
+- if (_settings.isRemoteUpdateSite())
+- {
+- // 3a. For server, Determine the channel that the user has (stable or snapshot)
+- String channelName = getDesiredChannel(_settings, installedChannelBean);
+-
+- try
+- {
+- StringBuilder releasePath = new StringBuilder("/");
+- releasePath.append(_settings.getUpdateServerPath());
+- releasePath.append("/");
+- releasePath.append(channelName);
+- releasePath.append("/");
+-
+- currentChannelBean =
+- _util.downloadCurrentRelease(_settings.getUpdateServer(),
+- Integer.parseInt(_settings.getUpdateServerPort()), releasePath.toString(),
+- RELEASE_XML_FILENAME, _app.getSquirrelPreferences().getProxySettings());
+- }
+- catch (Exception e)
+- {
+- s_log.error("Unexpected exception: " + e.getMessage(), e);
+- }
+- }
+- else
+- {
+- currentChannelBean = _util.loadUpdateFromFileSystem(_settings.getFileSystemUpdatePath());
+- }
+- return currentChannelBean;
+- }
+-
+- /**
+- * This method takes a look at preference for channel and the channel that the user currently has installed
+- * and logs an info if switching from one to channel to another.
+- *
+- * @return the name of the channel that the user wants.
+- */
+- private String getDesiredChannel(final IUpdateSettings settings, final ChannelXmlBean _installedChannelBean)
+- {
+- String desiredChannel = settings.getUpdateServerChannel().toLowerCase();
+- String currentChannelName = _installedChannelBean.getName();
+-
+- if (!currentChannelName.equals(desiredChannel))
+- {
+- if (s_log.isInfoEnabled())
+- {
+- s_log.info("getDesiredChannel: User is switching distribution channel from "
+- + "installed channel (" + currentChannelName + ") to new channel (" + desiredChannel + ")");
+- }
+- }
+- return desiredChannel;
+- }
+-
+- /**
+- * @return the isUpToDate
+- */
+- public boolean isUpToDate()
+- {
+- return isUpToDate;
+- }
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/async/UpdateCheckRunnableCallback.java
++++ /dev/null
+@@ -1,46 +0,0 @@
+-/*
+- * Copyright (C) 2008 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.async;
+-
+-import net.sourceforge.squirrel_sql.client.update.xmlbeans.ChannelXmlBean;
+-
+-/**
+- * This is implemented by callers using the ReleaseFileUpdateCheckTask asynchronously. If a non-null
+- * implementation is passed to ReleaseFileUpdateCheckTask, it will use a separate thread to do the work in the
+- * run method, then call the appropriate method in this interface when finished.
+- *
+- * @author manningr
+- *
+- */
+-public interface UpdateCheckRunnableCallback
+-{
+- /**
+- *
+- * @param isUpdateToDate
+- * @param installedChannelXmlBean
+- * @param currentChannelXmlBean
+- */
+- void updateCheckComplete(boolean isUpdateToDate, ChannelXmlBean installedChannelXmlBean,
+- ChannelXmlBean currentChannelXmlBean);
+-
+- /**
+- * @param e
+- */
+- void updateCheckFailed(Exception e);
+-}
+\ No newline at end of file
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/autocheck/UpdateCheckTimer.java
++++ /dev/null
+@@ -1,37 +0,0 @@
+-/*
+- * Copyright (C) 2008 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.autocheck;
+-
+-/**
+- * An interface which describes the API to the background task that periodically wakes up to check for
+- * updates
+- *
+- */
+-public interface UpdateCheckTimer
+-{
+- /**
+- * Start the timer
+- */
+- void start();
+-
+- /**
+- * Stop the timer
+- */
+- void stop();
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/autocheck/UpdateCheckTimerImpl.java
++++ /dev/null
+@@ -1,193 +0,0 @@
+-/*
+- * Copyright (C) 2008 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.autocheck;
+-
+-import net.sourceforge.squirrel_sql.client.IApplication;
+-import net.sourceforge.squirrel_sql.client.preferences.IUpdateSettings;
+-import net.sourceforge.squirrel_sql.client.update.UpdateCheckFrequency;
+-import net.sourceforge.squirrel_sql.client.update.UpdateController;
+-import net.sourceforge.squirrel_sql.client.update.UpdateControllerFactory;
+-import net.sourceforge.squirrel_sql.client.update.UpdateControllerFactoryImpl;
+-import net.sourceforge.squirrel_sql.client.update.UpdateUtil;
+-import net.sourceforge.squirrel_sql.client.update.UpdateUtilImpl;
+-import net.sourceforge.squirrel_sql.client.update.async.ReleaseFileUpdateCheckTask;
+-import net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloaderFactoryImpl;
+-import net.sourceforge.squirrel_sql.fw.gui.JOptionPaneService;
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapperFactory;
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapperFactoryImpl;
+-import net.sourceforge.squirrel_sql.fw.util.Utilities;
+-import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
+-import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
+-
+-/**
+- * This class maintains it's own Thread so that it can periodically check for updates, and notify the user
+- * when updates are detected.
+- */
+-public class UpdateCheckTimerImpl implements UpdateCheckTimer
+-{
+-
+- private UpdateCheckRunnable runnable = new UpdateCheckRunnable();
+-
+- private UpdateControllerFactory updateControllerFactory = new UpdateControllerFactoryImpl();
+-
+- private UpdateController updateController = null;
+-
+- private IApplication _app = null;
+-
+- private IUpdateSettings _updateSettings = null;
+-
+- /** Logger for this class. */
+- private static final ILogger s_log = LoggerController.createLogger(UpdateCheckTimerImpl.class);
+-
+- private UpdateUtil _util = new UpdateUtilImpl();
+-
+- private JOptionPaneService _JOptionPaneService = new JOptionPaneService();
+-
+- private FileWrapperFactory _fileWrapperFactory = new FileWrapperFactoryImpl();
+-
+- public UpdateCheckTimerImpl(IApplication app)
+- {
+- this._app = app;
+- _updateSettings = _app.getSquirrelPreferences().getUpdateSettings();
+-
+- }
+-
+- public void start()
+- {
+- if (!_updateSettings.isEnableAutomaticUpdates()) { return; }
+- updateController =
+- updateControllerFactory.createUpdateController(_app, new ArtifactDownloaderFactoryImpl(), _util,
+- _JOptionPaneService, _fileWrapperFactory);
+- Thread t = new Thread(runnable);
+- t.setName("Update Check Timer Thread");
+- t.start();
+- }
+-
+- public void stop()
+- {
+- if (!_updateSettings.isEnableAutomaticUpdates()) { return; }
+- runnable.stop();
+- }
+-
+- /**
+- * Class that implements the timer functionality.
+- */
+- private class UpdateCheckRunnable implements Runnable
+- {
+-
+- private boolean stopped = false;
+-
+- private boolean firstCheck = true;
+-
+- /**
+- * After making an initial check This loops indefinitely
+- *
+- * @see java.lang.Runnable#run()
+- */
+- public void run()
+- {
+- // Since this timer must be started when SQuirreL is launched, wait a couple of minutes for
+- // SQuirreL to get done initializing the UI.
+- Utilities.sleep(120 * 1000L);
+-
+- while (!stopped)
+- {
+- if (firstCheck)
+- {
+- firstCheck = false;
+- if (isUpdateCheckFrequencyAtStartup() && !isUpToDate())
+- {
+- logDebug("run: update check configured for startup and software is not up-to-date");
+- updateController.promptUserToDownloadAvailableUpdates();
+-
+- // Since the user only wants to be notified of updates at startup, return here, thereby
+- // freeing up the thread.
+- return;
+- }
+- }
+- else
+- {
+- logDebug("run: not the first check; sleeping for an hour.");
+- sleepForAnHour();
+- }
+-
+- if (!isUpdateCheckFrequencyAtStartup() && updateController.isTimeToCheckForUpdates())
+- {
+- logDebug("run: not configured to check at startup and it's now time to check again.");
+- if (!isUpToDate())
+- {
+- logDebug("run: software is not up-to-date, so prompting user to download updates.");
+- updateController.promptUserToDownloadAvailableUpdates();
+- }
+- }
+- }
+-
+- }
+-
+- private void logDebug(String msg)
+- {
+- if (s_log.isDebugEnabled())
+- {
+- s_log.debug(msg);
+- }
+- }
+-
+- private boolean isUpToDate()
+- {
+- boolean result = true;
+- try
+- {
+- logDebug("isUpToDate: checking to see if software is up-to-date; currentTimeMillis = "
+- + System.currentTimeMillis());
+-
+- ReleaseFileUpdateCheckTask task =
+- new ReleaseFileUpdateCheckTask(null, _updateSettings, _util, _app);
+-
+- // Since this thread is not a UI thread, it is ok to run the task synchronously.
+- task.run();
+- result = task.isUpToDate();
+- }
+- catch (Exception e)
+- {
+- s_log.error("isUpToDate: Unable to determine up-to-date status: " + e.getMessage(), e);
+- }
+- return result;
+- }
+-
+- private boolean isUpdateCheckFrequencyAtStartup()
+- {
+- String freqStr = _updateSettings.getUpdateCheckFrequency();
+- UpdateCheckFrequency updateCheckFrequency = UpdateCheckFrequency.getEnumForString(freqStr);
+-
+- return updateCheckFrequency == UpdateCheckFrequency.STARTUP;
+- }
+-
+- public void stop()
+- {
+- stopped = true;
+- }
+-
+- private void sleepForAnHour()
+- {
+- Utilities.sleep(1000 * 60 * 60);
+- }
+-
+- }
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/downloader/ArtifactDownloader.java
++++ /dev/null
+@@ -1,131 +0,0 @@
+-/*
+- * Copyright (C) 2008 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.downloader;
+-
+-import java.util.List;
+-
+-import net.sourceforge.squirrel_sql.client.update.UpdateUtil;
+-import net.sourceforge.squirrel_sql.client.update.downloader.event.DownloadStatusListener;
+-import net.sourceforge.squirrel_sql.client.update.gui.ArtifactStatus;
+-import net.sourceforge.squirrel_sql.fw.util.IProxySettings;
+-
+-public interface ArtifactDownloader
+-{
+-
+- void start();
+-
+- /**
+- * Stop downloading files as soon as possible.
+- */
+- void stopDownload();
+-
+- /**
+- * @return the list of ArtifactStatus items that describe each file to downloaded
+- */
+- List<ArtifactStatus> getArtifactStatus();
+-
+- /**
+- * @param status
+- * the list of ArtifactStatus items that describe each file to downloaded
+- */
+- void setArtifactStatus(List<ArtifactStatus> status);
+-
+- /**
+- * @return a boolean indicating whether a remote site or local dir is being used.
+- */
+- boolean isRemoteUpdateSite();
+-
+- /**
+- * @param remoteUpdateSite
+- * a boolean indicating whether a remote site or local dir is being used.
+- */
+- void setIsRemoteUpdateSite(boolean remoteUpdateSite);
+-
+- /**
+- * @return the _host
+- */
+- String getHost();
+-
+- /**
+- * @param host
+- * the _host to set
+- */
+- void setHost(String host);
+-
+- /**
+- * @return the _path
+- */
+- String getPath();
+-
+- void setPath(String path);
+-
+- /**
+- * @return the _util
+- */
+- UpdateUtil getUtil();
+-
+- /**
+- * Adds the specified listener
+- *
+- * @param listener
+- */
+- void addDownloadStatusListener(DownloadStatusListener listener);
+-
+- /**
+- * Removes the specified listener
+- *
+- * @param listener
+- */
+- void removeDownloadListener(DownloadStatusListener listener);
+-
+- /**
+- * @return the _fileSystemUpdatePath
+- */
+- String getFileSystemUpdatePath();
+-
+- /**
+- * @param systemUpdatePath
+- * the _fileSystemUpdatePath to set
+- */
+- void setFileSystemUpdatePath(String systemUpdatePath);
+-
+- void setPort(int updateServerPort);
+-
+- void setChannelName(String name);
+-
+- /**
+- * Sets the update utility to use.
+- *
+- * @param util
+- */
+- void setUtil(UpdateUtil util);
+-
+- public void setProxySettings(IProxySettings settings);
+-
+- /**
+- * @return the releaseVersionWillChange
+- */
+- public boolean isReleaseVersionWillChange();
+-
+- /**
+- * @param releaseVersionWillChange the releaseVersionWillChange to set
+- */
+- public void setReleaseVersionWillChange(boolean releaseVersionWillChange);
+-
+-}
+\ No newline at end of file
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/downloader/ArtifactDownloaderFactory.java
++++ /dev/null
+@@ -1,35 +0,0 @@
+-/*
+- * Copyright (C) 2008 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.downloader;
+-
+-import java.util.List;
+-
+-import net.sourceforge.squirrel_sql.client.update.gui.ArtifactStatus;
+-
+-public interface ArtifactDownloaderFactory
+-{
+-
+- /**
+- *
+- * @param artifactStatus
+- * @return
+- */
+- ArtifactDownloader create(List<ArtifactStatus> artifactStatus);
+-
+-}
+\ No newline at end of file
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/downloader/ArtifactDownloaderFactoryImpl.java
++++ /dev/null
+@@ -1,39 +0,0 @@
+-/*
+- * Copyright (C) 2008 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.downloader;
+-
+-import java.util.List;
+-
+-import net.sourceforge.squirrel_sql.client.update.gui.ArtifactStatus;
+-import net.sourceforge.squirrel_sql.fw.util.Utilities;
+-
+-public class ArtifactDownloaderFactoryImpl implements ArtifactDownloaderFactory
+-{
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloaderFactory#create(java.util.List)
+- */
+- public ArtifactDownloader create(List<ArtifactStatus> artifactStatus) {
+- Utilities.checkNull("create", "artifactStatus", artifactStatus);
+- if (artifactStatus.size() == 0) {
+- throw new IllegalArgumentException("create: list parameter must have one or more artifacts");
+- }
+- return new ArtifactDownloaderImpl(artifactStatus);
+- }
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/downloader/ArtifactDownloaderImpl.java
++++ /dev/null
+@@ -1,473 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.downloader;
+-
+-import java.io.FileNotFoundException;
+-import java.io.IOException;
+-import java.util.ArrayList;
+-import java.util.List;
+-
+-import net.sourceforge.squirrel_sql.client.update.UpdateUtil;
+-import net.sourceforge.squirrel_sql.client.update.downloader.event.DownloadEventType;
+-import net.sourceforge.squirrel_sql.client.update.downloader.event.DownloadStatusEvent;
+-import net.sourceforge.squirrel_sql.client.update.downloader.event.DownloadStatusListener;
+-import net.sourceforge.squirrel_sql.client.update.gui.ArtifactStatus;
+-import net.sourceforge.squirrel_sql.client.update.util.PathUtils;
+-import net.sourceforge.squirrel_sql.client.update.util.PathUtilsImpl;
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapper;
+-import net.sourceforge.squirrel_sql.fw.util.IProxySettings;
+-import net.sourceforge.squirrel_sql.fw.util.Utilities;
+-import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
+-import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
+-
+-/**
+- * Loops through a list of artifacts and downloads each one into the appropriate directory. Notifies listeners
+- * of important events.
+- *
+- * @author manningr
+- */
+-public class ArtifactDownloaderImpl implements Runnable, ArtifactDownloader
+-{
+- /** Logger for this class. */
+- private final static ILogger s_log = LoggerController.createLogger(ArtifactDownloaderImpl.class);
+-
+- /** This is the pattern that all translation jars (i18n) begin with */
+- public static final String TRANSLATION_JAR_PREFIX_PATTERN = "squirrel-sql_.*";
+-
+- private List<ArtifactStatus> _artifactStatus = null;
+-
+- private volatile boolean _stopped = false;
+-
+- private boolean _isRemoteUpdateSite = true;
+-
+- private String _host = null;
+-
+- private String _path = null;
+-
+- private String _fileSystemUpdatePath = null;
+-
+- private List<DownloadStatusListener> listeners = new ArrayList<DownloadStatusListener>();
+-
+- Thread downloadThread = null;
+-
+- String _updatesDir = null;
+-
+- private int _port = 80;
+-
+- /** The name of the channel from which we are downloading artifacts */
+- private String _channelName;
+-
+- private UpdateUtil _util = null;
+-
+- private PathUtils _pathUtils = new PathUtilsImpl();
+-
+- private IProxySettings _proxySettings = null;
+-
+- private boolean releaseVersionWillChange = false;
+-
+- private RetryStrategy _retryStrategy = new DefaultRetryStrategyImpl();
+-
+- public ArtifactDownloaderImpl(List<ArtifactStatus> artifactStatus)
+- {
+- _artifactStatus = artifactStatus;
+- downloadThread = new Thread(this, "ArtifactDownloadThread");
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloader#start()
+- */
+- public void start()
+- {
+- downloadThread.start();
+- }
+-
+- /**
+- * Runnable interface method implementation
+- */
+- public void run()
+- {
+- long totalBytesDownloaded = 0;
+- try
+- {
+-
+- prepareDownloadsDirectory();
+-
+- sendDownloadStarted(_artifactStatus.size());
+- for (ArtifactStatus status : _artifactStatus)
+- {
+- if (_stopped)
+- {
+- sendDownloadStopped();
+- return;
+- }
+- else
+- {
+- sendDownloadFileStarted(status.getName());
+- }
+- String fileToGet =
+- _pathUtils.buildPath(true, _path, _channelName, status.getType(), status.getName());
+-
+- String destDir = getArtifactDownloadDestDir(status);
+-
+- if (_util.isPresentInDownloadsDirectory(status))
+- {
+- if (s_log.isInfoEnabled())
+- {
+- s_log.info("run: Skipping download of file (" + fileToGet + ") which is already present "
+- + "in the downloads directory.");
+- }
+- sendDownloadFileCompleted(status.getName());
+- continue;
+- }
+-
+- boolean result = true;
+- if (_isRemoteUpdateSite)
+- {
+- int count = 0;
+- boolean success = false;
+- while (_retryStrategy.shouldTryAgain(count++) && !success)
+- {
+- success = attemptFileDownload(fileToGet, destDir, status);
+- if (!success)
+- {
+- Utilities.sleep(_retryStrategy.getTimeToWaitBeforeRetrying(count));
+- }
+- }
+- if (!success)
+- {
+- sendDownloadFailed();
+- return;
+- }
+- }
+- else
+- {
+- fileToGet =
+- _pathUtils.buildPath(false, this._fileSystemUpdatePath, status.getType(), status.getName());
+- result = _util.downloadLocalUpdateFile(fileToGet, destDir);
+- }
+- if (result == false)
+- {
+- sendDownloadFailed();
+- return;
+- }
+- else
+- {
+- sendDownloadFileCompleted(status.getName());
+- totalBytesDownloaded += status.getSize();
+- }
+- }
+- }
+- catch (FileNotFoundException e)
+- {
+- s_log.error("run: Unexpected exception: " + e.getMessage(), e);
+- sendDownloadFailed();
+- return;
+- }
+- catch (IOException e)
+- {
+- s_log.error("run: Unexpected exception: " + e.getMessage(), e);
+- sendDownloadFailed();
+- return;
+- }
+- if (s_log.isInfoEnabled())
+- {
+- s_log.info("run: Downloaded " + totalBytesDownloaded + " bytes total for all update files.");
+- }
+- sendDownloadComplete();
+- }
+-
+- private void prepareDownloadsDirectory() throws FileNotFoundException, IOException
+- {
+- // if the release version doesn't change, we won't be pulling down core artifacts. So, we just
+- // need to make sure that all core files have been copied from their installed locations into the
+- // corresponding directory in download, which is in the CLASSPATH of the updater. This covers the
+- // case where the update is being run for the first time after install, and no new version is
+- // available, but the user wants to install/remove plugins and/or translations.
+- if (!releaseVersionWillChange)
+- {
+- // Copy core files minus any i18n jars to core downloads directory
+- _util.copyDir(_util.getSquirrelLibraryDir(), TRANSLATION_JAR_PREFIX_PATTERN, false,
+- _util.getCoreDownloadsDir());
+-
+- // Copy i18n files to i18n downloads directory
+- _util.copyDir(_util.getSquirrelLibraryDir(), TRANSLATION_JAR_PREFIX_PATTERN, true,
+- _util.getI18nDownloadsDir());
+-
+- // Copy the app module jar to core downloads directory
+- _util.copyFile(_util.getInstalledSquirrelMainJarLocation(), _util.getCoreDownloadsDir());
+- }
+- // Move any i18n files that are located in the core downloads dir to the i18n downloads dir. The spring
+- // application context will not load properly (for some unknown reason) when there are i18n jars in the
+- // classpath. So as a work-around, we simply ensure that they are where they should be anyway.
+- // Previously we were not as careful about this, so it is possible that i18n jars were copied into the
+- // core downloads directory.
+- _util.moveFiles(_util.getCoreDownloadsDir(), TRANSLATION_JAR_PREFIX_PATTERN, true,
+- _util.getI18nDownloadsDir());
+- }
+-
+- private boolean attemptFileDownload(String fileToGet, String destDir, ArtifactStatus status)
+- {
+- boolean success = true;
+-
+- try
+- {
+- _util.downloadHttpUpdateFile(_host, _port, fileToGet, destDir, status.getSize(),
+- status.getChecksum(), _proxySettings);
+- }
+- catch (Exception e)
+- {
+- s_log.error("run: encountered exception while attempting to download file (" + fileToGet + "): "
+- + e.getMessage(), e);
+- success = false;
+- }
+- return success;
+- }
+-
+- private String getArtifactDownloadDestDir(ArtifactStatus status)
+- {
+-
+- FileWrapper destDir = _util.getCoreDownloadsDir();
+- if (UpdateUtil.PLUGIN_ARTIFACT_ID.equals(status.getType()))
+- {
+- destDir = _util.getPluginDownloadsDir();
+- }
+- if (UpdateUtil.TRANSLATION_ARTIFACT_ID.equals(status.getType()))
+- {
+- destDir = _util.getI18nDownloadsDir();
+- }
+- return destDir.getAbsolutePath();
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloader#stopDownload()
+- */
+- public void stopDownload()
+- {
+- _stopped = true;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloader#getArtifactStatus()
+- */
+- public List<ArtifactStatus> getArtifactStatus()
+- {
+- return _artifactStatus;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloader#setArtifactStatus(java.util.List)
+- */
+- public void setArtifactStatus(List<ArtifactStatus> status)
+- {
+- _artifactStatus = status;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloader#isRemoteUpdateSite()
+- */
+- public boolean isRemoteUpdateSite()
+- {
+- return _isRemoteUpdateSite;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloader#setIsRemoteUpdateSite(boolean)
+- */
+- public void setIsRemoteUpdateSite(boolean remoteUpdateSite)
+- {
+- _isRemoteUpdateSite = remoteUpdateSite;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloader#getHost()
+- */
+- public String getHost()
+- {
+- return _host;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloader#setHost(java.lang.String)
+- */
+- public void setHost(String host)
+- {
+- this._host = host;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloader#getPath()
+- */
+- public String getPath()
+- {
+- return _path;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloader#setPath(java.lang.String)
+- */
+- public void setPath(String path)
+- {
+- this._path = path;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloader#getUtil()
+- */
+- public UpdateUtil getUtil()
+- {
+- return _util;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloader#addDownloadStatusListener(net.sourceforge.squirrel_sql.client.update.downloader.event.DownloadStatusListener)
+- */
+- public void addDownloadStatusListener(DownloadStatusListener listener)
+- {
+- listeners.add(listener);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloader#removeDownloadListener(net.sourceforge.squirrel_sql.client.update.downloader.event.DownloadStatusListener)
+- */
+- public void removeDownloadListener(DownloadStatusListener listener)
+- {
+- listeners.remove(listener);
+- }
+-
+- private void sendEvent(DownloadStatusEvent evt)
+- {
+- for (DownloadStatusListener listener : listeners)
+- {
+- listener.handleDownloadStatusEvent(evt);
+- }
+- }
+-
+- private void sendDownloadStarted(int totalFileCount)
+- {
+- DownloadStatusEvent evt = new DownloadStatusEvent(DownloadEventType.DOWNLOAD_STARTED);
+- evt.setFileCountTotal(totalFileCount);
+- sendEvent(evt);
+- }
+-
+- private void sendDownloadStopped()
+- {
+- DownloadStatusEvent evt = new DownloadStatusEvent(DownloadEventType.DOWNLOAD_STOPPED);
+- sendEvent(evt);
+- }
+-
+- private void sendDownloadComplete()
+- {
+- DownloadStatusEvent evt = new DownloadStatusEvent(DownloadEventType.DOWNLOAD_COMPLETED);
+- sendEvent(evt);
+- }
+-
+- private void sendDownloadFailed()
+- {
+- DownloadStatusEvent evt = new DownloadStatusEvent(DownloadEventType.DOWNLOAD_FAILED);
+- sendEvent(evt);
+- }
+-
+- private void sendDownloadFileStarted(String filename)
+- {
+- DownloadStatusEvent evt = new DownloadStatusEvent(DownloadEventType.DOWNLOAD_FILE_STARTED);
+- evt.setFilename(filename);
+- sendEvent(evt);
+- }
+-
+- private void sendDownloadFileCompleted(String filename)
+- {
+- DownloadStatusEvent evt = new DownloadStatusEvent(DownloadEventType.DOWNLOAD_FILE_COMPLETED);
+- evt.setFilename(filename);
+- sendEvent(evt);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloader#getFileSystemUpdatePath()
+- */
+- public String getFileSystemUpdatePath()
+- {
+- return _fileSystemUpdatePath;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloader#setFileSystemUpdatePath(java.lang.String)
+- */
+- public void setFileSystemUpdatePath(String systemUpdatePath)
+- {
+- _fileSystemUpdatePath = systemUpdatePath;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloader#setPort(int)
+- */
+- public void setPort(int updateServerPort)
+- {
+- _port = updateServerPort;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloader#setChannelName(java.lang.String)
+- */
+- public void setChannelName(String name)
+- {
+- _channelName = name;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloader#setUtil(net.sourceforge.squirrel_sql.client.update.UpdateUtil)
+- */
+- public void setUtil(UpdateUtil util)
+- {
+- this._util = util;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloader#setProxySettings(net.sourceforge.squirrel_sql.fw.util.IProxySettings)
+- */
+- public void setProxySettings(IProxySettings settings)
+- {
+- _proxySettings = settings;
+- }
+-
+- /**
+- * @return the releaseVersionWillChange
+- */
+- public boolean isReleaseVersionWillChange()
+- {
+- return releaseVersionWillChange;
+- }
+-
+- /**
+- * @param releaseVersionWillChange
+- * the releaseVersionWillChange to set
+- */
+- public void setReleaseVersionWillChange(boolean releaseVersionWillChange)
+- {
+- this.releaseVersionWillChange = releaseVersionWillChange;
+- }
+-
+- /**
+- * @param strategy the _retryStrategy to set
+- */
+- public void setRetryStrategy(RetryStrategy strategy)
+- {
+- _retryStrategy = strategy;
+- }
+-
+-}
+\ No newline at end of file
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/downloader/DefaultRetryStrategyImpl.java
++++ /dev/null
+@@ -1,42 +0,0 @@
+-/*
+- * Copyright (C) 2009 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.downloader;
+-
+-public class DefaultRetryStrategyImpl implements RetryStrategy
+-{
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.RetryStrategy#getTimeToWaitBeforeRetrying(int)
+- */
+- @Override
+- public long getTimeToWaitBeforeRetrying(int failureCount)
+- {
+- return (failureCount + 1) * 3000;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.downloader.RetryStrategy#shouldTryAgain(int)
+- */
+- @Override
+- public boolean shouldTryAgain(int failureCount)
+- {
+- return failureCount <= 3;
+- }
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/downloader/RetryStrategy.java
++++ /dev/null
+@@ -1,49 +0,0 @@
+-/*
+- * Copyright (C) 2009 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.downloader;
+-
+-/**
+- * An interface which specifies the API necessary for an implementation which tells the ArtifactDownloader
+- * whether or not it should retry to download an artifact upon successive failures and how long to wait before
+- * retrying. This is an attempt to make this behavior pluggable in order to allow for time between retrying to
+- * download from websites, but make the tests run as quickly as possible.
+- */
+-public interface RetryStrategy
+-{
+- /**
+- * Whether or not the specified failureCount indicates that the operation should be retried.
+- *
+- * @param failureCount
+- * the number of times the operation has failed
+- * @return true if the operation should be retried; false otherwise
+- */
+- boolean shouldTryAgain(int failureCount);
+-
+- /**
+- * How long to wait before trying again. The specified failure count can be used to implement an
+- * exponential backoff so that with each successive retry, more time is given to allow the circumstances
+- * that yielded failure to correct themselves. For example, file transfer can fail for many reasons, most
+- * of which are transient failures that will correct themselves if given enough time.
+- *
+- * @param failureCount
+- * the number of times that the operation has failed so far.
+- * @return the number of milliseconds to wait before retrying.
+- */
+- long getTimeToWaitBeforeRetrying(int failureCount);
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/downloader/event/DownloadEventType.java
++++ /dev/null
+@@ -1,39 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.downloader.event;
+-
+-/**
+- * An enumeration of the types of download events that can occur.
+- *
+- * @author manningr
+- */
+-public enum DownloadEventType {
+- /** Started the process of downloading one or more files */
+- DOWNLOAD_STARTED,
+- /** User chose to stop the process of downloading one or more files */
+- DOWNLOAD_STOPPED,
+- /** The process of downloading one or more files failed for some reason */
+- DOWNLOAD_FAILED,
+- /** The process of downloading one or more files completed without error */
+- DOWNLOAD_COMPLETED,
+- /** The download of a single file started */
+- DOWNLOAD_FILE_STARTED,
+- /** The download of a single file completed */
+- DOWNLOAD_FILE_COMPLETED
+-}
+\ No newline at end of file
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/downloader/event/DownloadStatusEvent.java
++++ /dev/null
+@@ -1,121 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.downloader.event;
+-
+-/**
+- * Describes something that happened while downloading updates. This might be download started/ended, file
+- * started/ended, etc.
+- *
+- * @author manningr
+- */
+-public class DownloadStatusEvent
+-{
+-
+- private DownloadEventType _type = null;
+-
+- private String _filename = null;
+-
+- private int _fileCountTotal = 0;
+-
+- private Exception _exception = null;
+-
+- public DownloadStatusEvent(DownloadEventType type)
+- {
+- this._type = type;
+- }
+-
+- public DownloadEventType getType()
+- {
+- return this._type;
+- }
+-
+- /**
+- * @return the _filename
+- */
+- public String getFilename()
+- {
+- return _filename;
+- }
+-
+- /**
+- * @param _filename
+- * the _filename to set
+- */
+- public void setFilename(String _filename)
+- {
+- this._filename = _filename;
+- }
+-
+- /**
+- * @return the _exception
+- */
+- public Exception getException()
+- {
+- return _exception;
+- }
+-
+- /**
+- * @param _exception
+- * the _exception to set
+- */
+- public void setException(Exception _exception)
+- {
+- this._exception = _exception;
+- }
+-
+- /**
+- * @return the _fileCountTotal
+- */
+- public int getFileCountTotal()
+- {
+- return _fileCountTotal;
+- }
+-
+- /**
+- * @param countTotal
+- * the _fileCountTotal to set
+- */
+- public void setFileCountTotal(int countTotal)
+- {
+- _fileCountTotal = countTotal;
+- }
+-
+- /**
+- * Constructs a <code>String</code> with all attributes in name = value format.
+- *
+- * @return a <code>String</code> representation of this object.
+- */
+- public String toString()
+- {
+- final String TAB = " ";
+-
+- String retValue = "";
+-
+- retValue = "DownloadStatusEvent ( "
+- + super.toString() + TAB
+- + "_type = " + this._type + TAB
+- + "_filename = " + this._filename + TAB
+- + "_fileCountTotal = " + this._fileCountTotal + TAB
+- + "_exception = " + this._exception + TAB
+- + " )";
+-
+- return retValue;
+- }
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/downloader/event/DownloadStatusListener.java
++++ /dev/null
+@@ -1,32 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.downloader.event;
+-
+-
+-/**
+- * Callback interface that allows the update controller to be notified when the
+- * downloads have completed/failed.
+- *
+- * @author manningr
+- */
+-public interface DownloadStatusListener {
+-
+- void handleDownloadStatusEvent(DownloadStatusEvent evt);
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/ArtifactAction.java
++++ /dev/null
+@@ -1,39 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui;
+-
+-import java.io.Serializable;
+-
+-import net.sourceforge.squirrel_sql.client.update.xmlbeans.EnumPersistenceDelegate;
+-
+-/**
+- * An enumeration that captures a user's desire for change for any given
+- * artifact.
+- *
+- * @author manningr
+- *
+- */
+-public enum ArtifactAction implements Serializable {
+- NONE,
+- INSTALL,
+- REMOVE;
+-
+- static { EnumPersistenceDelegate.installFor(values()[0].getClass()); }
+-}
+-
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/ArtifactStatus.java
++++ /dev/null
+@@ -1,286 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui;
+-
+-import java.io.Serializable;
+-
+-import net.sourceforge.squirrel_sql.client.update.UpdateUtil;
+-import net.sourceforge.squirrel_sql.client.update.xmlbeans.ArtifactXmlBean;
+-import net.sourceforge.squirrel_sql.fw.util.StringManager;
+-import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
+-
+-/**
+- * Data object that contains information about available artifact updates. Each
+- * instance describes the status of one single update artifact.
+- *
+- * @author manningr
+- */
+-public class ArtifactStatus implements Serializable {
+-
+- private transient static final long serialVersionUID = 3902196017013411091L;
+-
+- /** Internationalized strings for this class. */
+- private transient static final StringManager s_stringMgr =
+- StringManagerFactory.getStringManager(ArtifactStatus.class);
+-
+- private interface i18n extends Serializable {
+- //i18n[ArtifactStatus.translationLabel=translation]
+- String TRANSLATION_LABEL = s_stringMgr.getString("ArtifactStatus.translationLabel");
+-
+- //i18n[ArtifactStatus.coreLabel=core]
+- String CORE_LABEL = s_stringMgr.getString("ArtifactStatus.coreLabel");
+-
+- //i18n[ArtifactStatus.pluginLabel=plugin]
+- String PLUGIN_LABEL = s_stringMgr.getString("ArtifactStatus.pluginLabel");
+- }
+-
+- /** the name of the artifact */
+- private String name = null;
+-
+- /** the type of the artifact (e.g. Core, Plugin, Translation (I18n)) */
+- private String type;
+-
+- /** boolean indicating whether or not the artifact is currently installed */
+- private boolean installed;
+-
+- /** The type of this artifact, which is displayed to the user */
+- private String displayType;
+-
+- /** The action to take with this artifact */
+- private ArtifactAction artifactAction = ArtifactAction.NONE;
+-
+- /** The size of the artifact in bytes */
+- private long size;
+-
+- /** The checksum of the artifact */
+- private long checksum;
+-
+- public ArtifactStatus() {}
+-
+- /**
+- * Constructs an ArtifactStatus from the specified ArtifactXmlBean
+- *
+- * @param artifactXmlBean
+- */
+- public ArtifactStatus(ArtifactXmlBean artifactXmlBean) {
+- this.name = artifactXmlBean.getName();
+- this.installed = artifactXmlBean.isInstalled();
+- this.size = artifactXmlBean.getSize();
+- this.checksum = artifactXmlBean.getChecksum();
+- setType(artifactXmlBean.getType());
+- }
+-
+- /**
+- * @return the _name
+- */
+- public String getName() {
+- return name;
+- }
+-
+- /**
+- * @param name the _name to set
+- */
+- public void setName(String name) {
+- this.name = name;
+- }
+-
+- /**
+- * @return the _type
+- */
+- public String getType() {
+- return type;
+- }
+-
+- /**
+- * @param type the _type to set
+- */
+- public void setType(String type) {
+- this.type = type;
+- if (type == null) {
+- return;
+- }
+- if (type.equals(UpdateUtil.TRANSLATION_ARTIFACT_ID)) {
+- this.displayType = i18n.TRANSLATION_LABEL;
+- }
+- if (type.equals(UpdateUtil.CORE_ARTIFACT_ID)) {
+- this.displayType = i18n.CORE_LABEL;
+- }
+- if (type.equals(UpdateUtil.PLUGIN_ARTIFACT_ID)) {
+- this.displayType = i18n.PLUGIN_LABEL;
+- }
+- }
+-
+- public boolean isCoreArtifact() {
+- return UpdateUtil.CORE_ARTIFACT_ID.equals(this.type);
+- }
+-
+- public boolean isPluginArtifact() {
+- return UpdateUtil.PLUGIN_ARTIFACT_ID.equals(this.type);
+- }
+-
+- public boolean isTranslationArtifact() {
+- return UpdateUtil.TRANSLATION_ARTIFACT_ID.equals(this.type);
+- }
+-
+- /**
+- * @return the installed
+- */
+- public boolean isInstalled() {
+- return installed;
+- }
+-
+- /**
+- * @param installed the installed to set
+- */
+- public void setInstalled(boolean installed) {
+- this.installed = installed;
+- }
+-
+- /**
+- * @return the artifactAction
+- */
+- public ArtifactAction getArtifactAction() {
+- return artifactAction;
+- }
+-
+- /**
+- * @param action the artifactAction to set
+- */
+- public void setArtifactAction(ArtifactAction artifactAction) {
+- this.artifactAction = artifactAction;
+- }
+-
+- /**
+- * @return the displayType
+- */
+- public String getDisplayType() {
+- return displayType;
+- }
+-
+- /**
+- * @param displayType the displayType to set
+- */
+- public void setDisplayType(String displayType) {
+- this.displayType = displayType;
+- }
+-
+- /**
+- * @see java.lang.Object#hashCode()
+- */
+- @Override
+- public int hashCode() {
+- final int prime = 31;
+- int result = 1;
+- result = prime * result + ((name == null) ? 0 : name.hashCode());
+- result = prime * result + ((type == null) ? 0 : type.hashCode());
+- return result;
+- }
+-
+- /**
+- * @see java.lang.Object#equals(java.lang.Object)
+- */
+- @Override
+- public boolean equals(Object obj) {
+- if (this == obj)
+- return true;
+- if (obj == null)
+- return false;
+- if (getClass() != obj.getClass())
+- return false;
+- final ArtifactStatus other = (ArtifactStatus) obj;
+- if (name == null) {
+- if (other.name != null)
+- return false;
+- } else if (!name.equals(other.name))
+- return false;
+- if (type == null) {
+- if (other.type != null)
+- return false;
+- } else if (!type.equals(other.type))
+- return false;
+- return true;
+- }
+-
+- /**
+- * Constructs a <code>String</code> with all attributes
+- * in name = value format.
+- *
+- * @return a <code>String</code> representation
+- * of this object.
+- */
+- public String toString()
+- {
+- final String TAB = " ";
+-
+- String retValue = "";
+-
+- retValue = "ArtifactStatus ( "
+- + super.toString() + TAB
+- + "name = " + this.name + TAB
+- + "type = " + this.type + TAB
+- + "installed = " + this.installed + TAB
+- + "displayType = " + this.displayType + TAB
+- + "artifactAction = " + this.artifactAction + TAB
+- + " )";
+-
+- return retValue;
+- }
+-
+- /**
+- * Sets the size (in bytes) of the artifact.
+- *
+- * @param size the size of the file.
+- */
+- public void setSize(long size)
+- {
+- this.size = size;
+- }
+-
+- /**
+- * @return the size
+- */
+- public long getSize()
+- {
+- return size;
+- }
+-
+- /**
+- * Sets the checksum of the file.
+- *
+- * @param checksum the checksum of the file.
+- */
+- public void setChecksum(long checksum)
+- {
+- this.checksum = checksum;
+- }
+-
+- /**
+- * Returns the checksum of the file.
+- *
+- * @return the checksum the checksum of the file.
+- */
+- public long getChecksum()
+- {
+- return checksum;
+- }
+-
+-
+-
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/CheckUpdateListener.java
++++ /dev/null
+@@ -1,48 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui;
+-
+-/**
+- * A callback interface that allows the UpdateManagerDialog to tell the
+- * controller that the user wants to check for updates, without requiring the
+- * UpdateManagerDialog to have a reference to the UpdateController.
+- *
+- * @author manningr
+- */
+-public interface CheckUpdateListener {
+-
+- /**
+- * Check for updates to the installed software.
+- */
+- void checkUpToDate();
+-
+- /**
+- * Displays an error message dialog with the specified details.
+- *
+- * @param title the title of the error message dialog
+- * @param msg a message describing
+- * @param e the exception that was encountered
+- */
+- void showErrorMessage(String title, String msg, Exception e);
+-
+- /**
+- * Shows the update preferences
+- */
+- void showPreferences();
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/UpdateManagerDialog.java
++++ /dev/null
+@@ -1,358 +0,0 @@
+-package net.sourceforge.squirrel_sql.client.update.gui;
+-
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-
+-import java.awt.BorderLayout;
+-import java.awt.Color;
+-import java.awt.Dimension;
+-import java.awt.GridBagConstraints;
+-import java.awt.GridBagLayout;
+-import java.awt.Insets;
+-import java.awt.event.ActionEvent;
+-import java.awt.event.ActionListener;
+-import java.util.ArrayList;
+-
+-import javax.swing.JButton;
+-import javax.swing.JDialog;
+-import javax.swing.JFrame;
+-import javax.swing.JLabel;
+-import javax.swing.JPanel;
+-import javax.swing.JTextField;
+-import javax.swing.SwingConstants;
+-import javax.swing.border.Border;
+-import javax.swing.border.EmptyBorder;
+-import javax.swing.border.LineBorder;
+-
+-import net.sourceforge.squirrel_sql.fw.gui.GUIUtils;
+-import net.sourceforge.squirrel_sql.fw.util.StringManager;
+-import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
+-
+-/**
+- * The dialog that presents the user with the option to check for updates.
+- *
+- */
+-public class UpdateManagerDialog extends JDialog {
+- private static final long serialVersionUID = 1L;
+-
+- /** Internationalized strings for this class. */
+- private static final StringManager s_stringMgr =
+- StringManagerFactory.getStringManager(UpdateManagerDialog.class);
+-
+- /* GUI Widgets */
+-
+- /** Check button for dialog */
+- private JButton _checkBtn = null;
+-
+- /** Configure button for dialog */
+- private JButton _configBtn = null;
+-
+- /** Close button for dialog. */
+- private JButton _closeBtn = null;
+-
+- /** server hostname textfield */
+- private JTextField _updateServerNameTF = null;
+-
+- /** server port textfield */
+- private JTextField _updateServerPortTF = null;
+-
+- /** server path textfield */
+- private JTextField _updateServerPathTF = null;
+-
+- /** server channel textfield */
+- private JTextField _updateServerChannelTF = null;
+-
+- /** local path textfield */
+- private JTextField _localUpdatePath = null;
+-
+- /** registered check update listeners */
+- private ArrayList<CheckUpdateListener> _checkUpdateListeners =
+- new ArrayList<CheckUpdateListener>();
+-
+- private boolean isRemoteUpdateSite = true;
+-
+- static interface i18n {
+- // i18n[UpdateManagerDialog.channelLabel=Channel:]
+- String CHANNEL_LABEL = s_stringMgr.getString("UpdateManagerDialog.channelLabel");
+-
+- // i18n[UpdateManagerDialog.checkButtonLabel=Check]
+- String CHECK_LABEL = s_stringMgr.getString("UpdateManagerDialog.checkButtonLabel");
+-
+- // i18n[UpdateManagerDialog.closeLabel=Close]
+- String CLOSE_LABEL = s_stringMgr.getString("UpdateManagerDialog.closeLabel");
+-
+- // i18n[UpdateManagerDialog.hostLabel=Host:]
+- String HOST_LABEL = s_stringMgr.getString("UpdateManagerDialog.hostLabel");
+-
+- String LOCAL_UPDATE_PATH_LABEL = "Local Update Path:";
+-
+- // i18n[UpdateManagerDialog.repositoryTabLabel=Repository]
+- String LOCATION_TAB_LABEL = s_stringMgr.getString("UpdateManagerDialog.repositoryTabLabel");
+-
+- // i18n[UpdateManagerDialog.pathLabel=Path:]
+- String PATH_LABEL = s_stringMgr.getString("UpdateManagerDialog.pathLabel");
+-
+- // i18n[UpdateManagerDialog.portLabel=Port:]
+- String PORT_LABEL = s_stringMgr.getString("UpdateManagerDialog.portLabel");
+-
+- // i18n[UpdateManagerDialog.settingsLabel=Settings]
+- String SETTINGS_LABEL = s_stringMgr.getString("UpdateManagerDialog.settingsLabel");
+-
+- // i18n[UpdateManagerDialog.title=Update Manager]
+- String TITLE = s_stringMgr.getString("UpdateManagerDialog.title");
+- }
+-
+- /**
+- *
+- * @param parent
+- */
+- public UpdateManagerDialog(JFrame parent, boolean isRemoteUpdateSite) {
+- super(parent, i18n.TITLE, true);
+- setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
+- this.isRemoteUpdateSite = isRemoteUpdateSite;
+- init();
+- }
+-
+- /**
+- * Sets the value for the update server name.
+- *
+- * @param name the hostname of the update server.
+- */
+- public void setUpdateServerName(String nameStr) {
+- _updateServerNameTF.setText(nameStr);
+- }
+-
+- /**
+- * Sets the value for the update server port.
+- *
+- * @param port the port of the update server.
+- */
+- public void setUpdateServerPort(String portStr) {
+- _updateServerPortTF.setText(portStr);
+- }
+-
+- /**
+- * Sets the update server path (directory where release.xml is located).
+- *
+- * @param pathStr the update server path.
+- */
+- public void setUpdateServerPath(String pathStr) {
+- _updateServerPathTF.setText(pathStr);
+- }
+-
+- /**
+- * Sets the update server channel.
+- *
+- * @param channelStr the update server channel.
+- */
+- public void setUpdateServerChannel(String channelStr) {
+- _updateServerChannelTF.setText(channelStr);
+- }
+-
+- public void setLocalUpdatePath(String path) {
+- _localUpdatePath.setText(path);
+- }
+-
+-
+- /**
+- * Adds a listener which is called when check for updates action is invoked
+- * from this dialog.
+- *
+- * @param listener the CheckUpdateListener to be registered.
+- */
+- public void addCheckUpdateListener(CheckUpdateListener listener) {
+- this._checkUpdateListeners.add(listener);
+- }
+-
+- /** Initialized the UI components */
+- private void init() {
+- this.setLayout(new BorderLayout());
+- JPanel locationPanel = null;
+- if (isRemoteUpdateSite) {
+- locationPanel = getRemoteLocationPanel();
+- } else {
+- locationPanel = getLocalUpdateSitePanel();
+- }
+-
+- this.add(locationPanel, BorderLayout.CENTER);
+- this.add(getButtonPanel(), BorderLayout.SOUTH);
+- this.setSize(300, 200);
+- GUIUtils.centerWithinParent(this);
+- }
+-
+- private JPanel getRemoteLocationPanel() {
+- EmptyBorder border = new EmptyBorder(new Insets(5, 5, 5, 5));
+- Dimension mediumField = new Dimension(200, 20);
+- Dimension portField = new Dimension(50, 20);
+-
+- JPanel locationPanel = new JPanel();
+- locationPanel.setBorder(new EmptyBorder(0, 0, 0, 10));
+- locationPanel.setLayout(new GridBagLayout());
+-
+- int x = 0;
+- int y = -1;
+-
+- GridBagConstraints c = new GridBagConstraints();
+- c.gridx = x;
+- c.gridy = y;
+- c.anchor = GridBagConstraints.NORTH;
+-
+- JLabel hostLabel = getBorderedLabel(i18n.HOST_LABEL, border);
+- _updateServerNameTF = getSizedTextField(mediumField);
+-
+- locationPanel.add(hostLabel, getLabelConstraints(c));
+- locationPanel.add(_updateServerNameTF, getFieldFillHorizontalConstaints(c));
+-
+- JLabel portLabel = getBorderedLabel(i18n.PORT_LABEL, border);
+- _updateServerPortTF = getSizedTextField(portField);
+-
+- locationPanel.add(portLabel, getLabelConstraints(c));
+- locationPanel.add(_updateServerPortTF, getFieldConstraints(c));
+-
+- JLabel pathLabel = getBorderedLabel(i18n.PATH_LABEL, border);
+- _updateServerPathTF = getSizedTextField(mediumField);
+-
+- locationPanel.add(pathLabel, getLabelConstraints(c));
+- locationPanel.add(_updateServerPathTF, getFieldFillHorizontalConstaints(c));
+-
+- JLabel channelLabel = getBorderedLabel(i18n.CHANNEL_LABEL, border);
+- _updateServerChannelTF = getSizedTextField(mediumField);
+-
+- locationPanel.add(channelLabel, getLabelConstraints(c));
+- locationPanel.add(_updateServerChannelTF, getFieldFillHorizontalConstaints(c));
+- locationPanel.setBorder(new LineBorder(Color.LIGHT_GRAY, 1));
+-
+- return locationPanel;
+- }
+-
+- private JPanel getLocalUpdateSitePanel() {
+- EmptyBorder border = new EmptyBorder(new Insets(5, 5, 5, 5));
+- Dimension mediumField = new Dimension(200, 20);
+-
+- JPanel locationPanel = new JPanel();
+- locationPanel.setBorder(new EmptyBorder(0, 0, 0, 10));
+- locationPanel.setLayout(new GridBagLayout());
+-
+- int x = 0;
+- int y = -1;
+-
+- GridBagConstraints c = new GridBagConstraints();
+- c.gridx = x;
+- c.gridy = y;
+- c.anchor = GridBagConstraints.NORTH;
+-
+- JLabel localUpdatePathLabel = getBorderedLabel(i18n.LOCAL_UPDATE_PATH_LABEL, border);
+- _localUpdatePath = getSizedTextField(mediumField);
+-
+- locationPanel.add(localUpdatePathLabel, getLabelConstraints(c));
+- locationPanel.add(_localUpdatePath, getFieldFillHorizontalConstaints(c));
+-
+- return locationPanel;
+- }
+-
+- private JPanel getButtonPanel() {
+- JPanel result = new JPanel();
+-
+- _checkBtn = new JButton(i18n.CHECK_LABEL);
+- _checkBtn.addActionListener(new ActionListener() {
+- public void actionPerformed(ActionEvent e) {
+- UpdateManagerDialog.this.setVisible(false);
+- for (CheckUpdateListener listener: _checkUpdateListeners) {
+- try {
+- listener.checkUpToDate();
+- } catch (Exception ex) {
+- listener.showErrorMessage(
+- "Unexpected Exception",
+- "Update check failed with Exception: " + ex.getMessage(),
+- ex);
+- }
+- }
+- }
+- });
+-
+- _configBtn = new JButton(i18n.SETTINGS_LABEL);
+- _configBtn.addActionListener(new ActionListener() {
+- public void actionPerformed(ActionEvent e) {
+- UpdateManagerDialog.this.setVisible(false);
+- for (CheckUpdateListener listener: _checkUpdateListeners) {
+- listener.showPreferences();
+- }
+- }
+- });
+-
+- _closeBtn = new JButton(i18n.CLOSE_LABEL);
+- _closeBtn.addActionListener(new ActionListener() {
+- public void actionPerformed(ActionEvent e) {
+- UpdateManagerDialog.this.setVisible(false);
+- }
+- });
+-
+- result.add(_checkBtn);
+- result.add(_configBtn);
+- result.add(_closeBtn);
+- return result;
+- }
+-
+- private GridBagConstraints getLabelConstraints(GridBagConstraints c) {
+- c.gridx = 0;
+- c.gridy++;
+- c.anchor = GridBagConstraints.EAST;
+- c.fill = GridBagConstraints.NONE;
+- c.weightx = 0;
+- c.weighty = 0;
+- return c;
+- }
+-
+- private GridBagConstraints getFieldFillHorizontalConstaints(
+- GridBagConstraints c) {
+- c.gridx++;
+- c.anchor = GridBagConstraints.WEST;
+- c.weightx = 1;
+- c.weighty = 1;
+- c.fill = GridBagConstraints.HORIZONTAL;
+- c.insets = new Insets(0, 0, 0, 5);
+- return c;
+- }
+-
+- private GridBagConstraints getFieldConstraints(GridBagConstraints c) {
+- c.gridx++;
+- c.anchor = GridBagConstraints.WEST;
+- c.weightx = 1;
+- c.weighty = 1;
+- c.fill = GridBagConstraints.NONE;
+- return c;
+- }
+-
+- private JLabel getBorderedLabel(String text, Border border) {
+- JLabel result = new JLabel(text);
+- result.setBorder(border);
+- result.setPreferredSize(new Dimension(115, 20));
+- result.setHorizontalAlignment(SwingConstants.RIGHT);
+- return result;
+- }
+-
+- private JTextField getSizedTextField(Dimension preferredSize) {
+- JTextField result = new JTextField();
+- result.setPreferredSize(preferredSize);
+- result.setMinimumSize(preferredSize);
+- result.setEditable(false);
+- return result;
+- }
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/UpdateSummaryDialog.java
++++ /dev/null
+@@ -1,182 +0,0 @@
+-package net.sourceforge.squirrel_sql.client.update.gui;
+-
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * colbell at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-import java.awt.BorderLayout;
+-import java.awt.Container;
+-import java.awt.Frame;
+-import java.awt.event.ActionEvent;
+-import java.awt.event.ActionListener;
+-import java.awt.event.KeyEvent;
+-import java.util.List;
+-
+-import javax.swing.AbstractAction;
+-import javax.swing.BorderFactory;
+-import javax.swing.JButton;
+-import javax.swing.JComponent;
+-import javax.swing.JDialog;
+-import javax.swing.JFrame;
+-import javax.swing.JLabel;
+-import javax.swing.JPanel;
+-import javax.swing.JScrollPane;
+-import javax.swing.KeyStroke;
+-
+-import net.sourceforge.squirrel_sql.client.update.UpdateController;
+-import net.sourceforge.squirrel_sql.fw.gui.GUIUtils;
+-import net.sourceforge.squirrel_sql.fw.util.StringManager;
+-import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
+-
+-/**
+- * This dialog displays a summary of update information
+- */
+-public class UpdateSummaryDialog extends JDialog {
+- private static final long serialVersionUID = 1L;
+-
+- /** Internationalized strings for this class. */
+- private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(UpdateSummaryDialog.class);
+-
+- private UpdateSummaryTable _updateSummaryTable;
+-
+- private JLabel _installedVersionLabel = null;
+-
+- private JLabel _availableVersionLabel = null;
+-
+- private String _installedVersion = null;
+-
+- private String _availableVersion = null;
+-
+- static interface i18n {
+- // i18n[UpdateSummaryDialog.applyLabel=Apply Changes]
+- String APPLY_LABEL = s_stringMgr.getString("UpdateSummaryDialog.applyLabel");
+-
+- // i18n[UpdateSummaryDialog.title=Update Summary]
+- String TITLE = s_stringMgr.getString("UpdateSummaryDialog.title");
+-
+- // i18n[UpdateSummaryDialog.currentVersionPrefix=Current Version:]
+- String AVAILABLE_VERSION_PREFIX =
+- s_stringMgr.getString("UpdateSummaryDialog.currentVersionPrefix");
+-
+- // i18n[UpdateSummaryDialog.installedVersionPrefix=Installed Version:]
+- String INSTALLED_VERSION_PREFIX =
+- s_stringMgr.getString("UpdateSummaryDialog.installedVersionPrefix");
+-
+- //i18n[UpdateSummaryDialog.close=Close]
+- String CLOSE_LABEL =
+- s_stringMgr.getString("UpdateSummaryDialog.close");
+- }
+-
+- public UpdateSummaryDialog(Frame owner, List<ArtifactStatus> artifactStatus,
+- UpdateController updateController)
+- {
+- super(owner, i18n.TITLE);
+- createGUI(artifactStatus, updateController);
+- }
+-
+- public void setInstalledVersion(String installedVersion) {
+- _installedVersion = installedVersion;
+- StringBuilder tmp = new StringBuilder(i18n.INSTALLED_VERSION_PREFIX);
+- tmp.append(" ");
+- tmp.append(installedVersion);
+- _installedVersionLabel.setText(tmp.toString());
+- setReleaseVersionWillChangeFlag();
+- }
+-
+- public void setAvailableVersion(String availableVersion) {
+- _availableVersion = availableVersion;
+- StringBuilder tmp = new StringBuilder(i18n.AVAILABLE_VERSION_PREFIX);
+- tmp.append(" ");
+- tmp.append(availableVersion);
+- _availableVersionLabel.setText(tmp.toString());
+- setReleaseVersionWillChangeFlag();
+- }
+-
+- private void setReleaseVersionWillChangeFlag() {
+- if (_availableVersion == null || _installedVersion == null) {
+- return;
+- }
+- _updateSummaryTable.setReleaseVersionWillChange(!_availableVersion.equals(_installedVersion));
+- }
+-
+- private void createGUI(final List<ArtifactStatus> artifactStatus,
+- final UpdateController updateController) {
+- setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+-
+- final Container contentPane = getContentPane();
+- contentPane.setLayout(new BorderLayout());
+-
+- _installedVersionLabel = new JLabel();
+- _installedVersionLabel.setBorder(BorderFactory.createEmptyBorder(1, 4, 1, 4));
+-
+- _availableVersionLabel = new JLabel();
+- _availableVersionLabel.setBorder(BorderFactory.createEmptyBorder(1, 4, 1, 4));
+-
+- JPanel labelPanel = new JPanel();
+- labelPanel.add(_installedVersionLabel);
+- labelPanel.add(_availableVersionLabel);
+- // Label panel containing the versions for the update at top of dialog.
+- contentPane.add(labelPanel, BorderLayout.NORTH);
+-
+- UpdateSummaryTableModel model = new UpdateSummaryTableModel(artifactStatus);
+- _updateSummaryTable = new UpdateSummaryTable(artifactStatus, model);
+- contentPane.add(new JScrollPane(_updateSummaryTable), BorderLayout.CENTER);
+-
+- final JPanel btnsPnl = new JPanel();
+- final JButton okBtn = new JButton(i18n.APPLY_LABEL);
+- okBtn.addActionListener(new ActionListener() {
+- public void actionPerformed(ActionEvent evt) {
+- List<ArtifactStatus> changes =
+- _updateSummaryTable.getUserRequestedChanges();
+- updateController.applyChanges(changes, _updateSummaryTable.getReleaseVersionWillChange());
+- }
+- });
+- btnsPnl.add(okBtn);
+-
+- final JButton closeBtn = new JButton(i18n.CLOSE_LABEL);
+- closeBtn.addActionListener(new ActionListener() {
+- public void actionPerformed(ActionEvent evt) {
+- dispose();
+- }
+- });
+- btnsPnl.add(closeBtn);
+- contentPane.add(btnsPnl, BorderLayout.SOUTH);
+-
+- AbstractAction closeAction = new AbstractAction() {
+- private static final long serialVersionUID = 1L;
+-
+- public void actionPerformed(ActionEvent actionEvent) {
+- setVisible(false);
+- dispose();
+- }
+- };
+- KeyStroke escapeStroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
+- getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
+- .put(escapeStroke, "CloseAction");
+- getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
+- .put(escapeStroke, "CloseAction");
+- getRootPane().getInputMap(JComponent.WHEN_FOCUSED).put(escapeStroke,
+- "CloseAction");
+- getRootPane().getActionMap().put("CloseAction", closeAction);
+-
+- pack();
+- setSize(655, 500);
+- GUIUtils.centerWithinParent(this);
+- setResizable(true);
+-
+- }
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/UpdateSummaryTable.java
++++ /dev/null
+@@ -1,273 +0,0 @@
+-package net.sourceforge.squirrel_sql.client.update.gui;
+-
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-import static net.sourceforge.squirrel_sql.client.update.gui.ArtifactAction.INSTALL;
+-import static net.sourceforge.squirrel_sql.client.update.gui.ArtifactAction.NONE;
+-import static net.sourceforge.squirrel_sql.client.update.gui.ArtifactAction.REMOVE;
+-
+-import java.awt.event.ActionEvent;
+-import java.awt.event.ActionListener;
+-import java.awt.event.MouseAdapter;
+-import java.awt.event.MouseEvent;
+-import java.util.ArrayList;
+-import java.util.Iterator;
+-import java.util.List;
+-
+-import javax.swing.ComboBoxModel;
+-import javax.swing.DefaultCellEditor;
+-import javax.swing.DefaultComboBoxModel;
+-import javax.swing.JComboBox;
+-import javax.swing.JMenuItem;
+-import javax.swing.JPopupMenu;
+-import javax.swing.ListSelectionModel;
+-import javax.swing.event.PopupMenuEvent;
+-import javax.swing.event.PopupMenuListener;
+-import javax.swing.table.DefaultTableColumnModel;
+-import javax.swing.table.TableColumn;
+-import javax.swing.table.TableColumnModel;
+-
+-import net.sourceforge.squirrel_sql.fw.gui.SortableTable;
+-import net.sourceforge.squirrel_sql.fw.util.StringManager;
+-import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
+-
+-/**
+- * Implements the table summary of updates which includes artifacts in each of
+- * the core, plugins and translations modules.
+- *
+- * @author manningr
+- */
+-public class UpdateSummaryTable extends SortableTable {
+-
+- private static final long serialVersionUID = 1L;
+-
+- /** Internationalized strings for this class. */
+- private static final StringManager s_stringMgr =
+- StringManagerFactory.getStringManager(UpdateSummaryTable.class);
+-
+- private interface i18n {
+- //i18n[UpdateSummaryTable.allTranslationsLabel=All translations]
+- String ALL_TRANSLATIONS_LABEL = s_stringMgr.getString("UpdateSummaryTable.allTranslationsLabel");
+-
+- //i18n[UpdateSummaryTable.allPluginsLabel=All plugins]
+- String ALL_PLUGINS_LABEL = s_stringMgr.getString("UpdateSummaryTable.allPluginsLabel");
+-
+- //i18n[UpdateSummaryTable.installOptionsLabel=Install Options]
+- String INSTALL_OPTIONS_LABEL = s_stringMgr.getString("UpdateSummaryTable.installOptionsLabel");
+- }
+-
+- private List<ArtifactStatus> _artifacts = null;
+- private boolean _releaseVersionWillChange = false;
+- private UpdateSummaryTableModel _model = null;
+-
+- public UpdateSummaryTable(List<ArtifactStatus> artifactStatus,
+- UpdateSummaryTableModel model) {
+- super(model);
+- _model = model;
+- _artifacts = artifactStatus;
+- setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
+- getTableHeader().setResizingAllowed(true);
+- getTableHeader().setReorderingAllowed(true);
+- setAutoCreateColumnsFromModel(false);
+- setAutoResizeMode(AUTO_RESIZE_LAST_COLUMN);
+-
+- final TableColumnModel tcm = new DefaultTableColumnModel();
+- JComboBox _actionComboBox = new JComboBox();
+- for (int i = 0; i < model.getColumnCount(); ++i) {
+- final TableColumn col = new TableColumn(i, model.getColumnWidth(i));
+- col.setHeaderValue(model.getColumnName(i));
+- if (i == 3) {
+- col.setCellEditor(new DefaultCellEditor(initCbo(_actionComboBox)));
+- }
+- tcm.addColumn(col);
+- }
+- setColumnModel(tcm);
+- initPopup();
+- }
+-
+- /**
+- * Gets the list of changes requested by the user.
+- */
+- public List<ArtifactStatus> getUserRequestedChanges() {
+- List<ArtifactStatus> changes = new ArrayList<ArtifactStatus>();
+- for (ArtifactStatus artifactStatus : _artifacts) {
+- if (artifactStatus.getArtifactAction() != ArtifactAction.NONE) {
+- changes.add(artifactStatus);
+- }
+- }
+- return changes;
+- }
+-
+- /**
+- * This will adjust the list of artifacts presented to the user based on whether or not the release version
+- * will change.
+- *
+- * @param releaseVersionWillChange
+- * a boolean value indicating whether or not the release version will change - that is, whether
+- * or not new core artifacts will be downloaded.
+- */
+- public void setReleaseVersionWillChange(boolean releaseVersionWillChange)
+- {
+- Iterator<ArtifactStatus> i = _artifacts.iterator();
+- _releaseVersionWillChange = releaseVersionWillChange;
+- if (releaseVersionWillChange) {
+- // All currently installed artifacts will be marked with INSTALL action.
+- while (i.hasNext()) {
+- ArtifactStatus status = i.next();
+- if (status.isInstalled()) {
+- status.setArtifactAction(ArtifactAction.INSTALL);
+- }
+- }
+-
+- } else {
+- // Remove the core items since they are the most recent, and the user is not allowed to remove them
+- while (i.hasNext()) {
+- ArtifactStatus status = i.next();
+- if (status.isCoreArtifact()) {
+- i.remove();
+- }
+- }
+-
+- }
+- }
+-
+- /**
+- * @return a boolean value indicating whether or not the release version will change with this update.
+- */
+- public boolean getReleaseVersionWillChange() {
+- return _releaseVersionWillChange;
+- }
+-
+-
+- private void initPopup() {
+- final JPopupMenu popup = new JPopupMenu(i18n.INSTALL_OPTIONS_LABEL);
+-
+- JMenuItem pluginItem = new JMenuItem(i18n.ALL_PLUGINS_LABEL);
+- pluginItem.addActionListener(new ActionListener() {
+- public void actionPerformed(ActionEvent e) {
+- for (ArtifactStatus status : _artifacts) {
+- if (status.isPluginArtifact()) {
+- status.setArtifactAction(ArtifactAction.INSTALL);
+- }
+- }
+- _model.fireTableDataChanged();
+- }
+- });
+- JMenuItem translationItem = new JMenuItem(i18n.ALL_TRANSLATIONS_LABEL);
+- translationItem.addActionListener(new ActionListener() {
+- public void actionPerformed(ActionEvent e) {
+- for (ArtifactStatus status : _artifacts) {
+- if (status.isTranslationArtifact()) {
+- status.setArtifactAction(ArtifactAction.INSTALL);
+- }
+- }
+- _model.fireTableDataChanged();
+- }
+- });
+-
+- popup.add(pluginItem);
+- popup.add(translationItem);
+-
+- addMouseListener(new MouseAdapter() {
+- public void mousePressed(MouseEvent event){
+- if(popup.isPopupTrigger(event)){
+- popup.show(event.getComponent(), event.getX(),event.getY());
+- }
+- }
+- public void mouseReleased(MouseEvent event){
+- if(popup.isPopupTrigger(event)){
+- popup.show(event.getComponent(), event.getX(),event.getY());
+- }
+- }
+- });
+- }
+-
+- private JComboBox initCbo(final JComboBox cbo) {
+- cbo.setEditable(false);
+- setModel(cbo, NONE, INSTALL, REMOVE);
+-
+- cbo.addPopupMenuListener(new PopupMenuListener() {
+- public void popupMenuCanceled(PopupMenuEvent e) {}
+- public void popupMenuWillBecomeInvisible(PopupMenuEvent e){}
+- public void popupMenuWillBecomeVisible(PopupMenuEvent e)
+- {
+- JComboBox source =(JComboBox) e.getSource();
+- updateDataModel(source);
+- }
+- });
+-
+- return cbo;
+- }
+-
+- /**
+- * We want to adjust the items in the popup menu that are available to the user to select
+- * based on 1) whether or not the release version will change, and 2) what type of artifact the row
+- * is dealing with and 3) whether or not the artifact is already installed
+- * @param e
+- * @param source
+- */
+- private void updateDataModel(JComboBox source) {
+- final int row = UpdateSummaryTable.this.getEditingRow();
+- if (row == -1) {
+- return;
+- }
+- final ArtifactStatus as = UpdateSummaryTable.this._artifacts.get(row);
+-
+- // is it installed?
+- boolean installed = as.isInstalled();
+-
+- // get the type of artifact
+- if (as.isCoreArtifact()) {
+- if (_releaseVersionWillChange) {
+- source.setModel(getComboBoxModel(INSTALL));
+- } else {
+- // core artifacts are not displayed
+- }
+- } else {
+- if (_releaseVersionWillChange) {
+- if (installed) {
+- setModel(source, INSTALL, REMOVE);
+- } else {
+- setModel(source, NONE, INSTALL);
+- }
+- } else {
+- if (installed) {
+- setModel(source, NONE, REMOVE);
+- } else {
+- setModel(source, NONE, INSTALL);
+- }
+- }
+- }
+- }
+-
+- private void setModel(JComboBox box, ArtifactAction... actions) {
+- ComboBoxModel oldModel = box.getModel();
+- box.setModel(getComboBoxModel(actions));
+- if (oldModel.getSize() != actions.length) {
+- box.firePropertyChange("itemCount", oldModel.getSize(), actions.length);
+- }
+- }
+-
+- private ComboBoxModel getComboBoxModel(ArtifactAction... actions) {
+- ComboBoxModel result = new DefaultComboBoxModel(actions);
+- result.setSelectedItem(actions[0]);
+- return result;
+- }
+-
+-}
+\ No newline at end of file
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/UpdateSummaryTableActionItem.java
++++ /dev/null
+@@ -1,42 +0,0 @@
+-package net.sourceforge.squirrel_sql.client.update.gui;
+-
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-
+-
+-public class UpdateSummaryTableActionItem
+-{
+- private ArtifactAction _action;
+-
+- private UpdateSummaryTableActionItem(ArtifactAction action)
+- {
+- this._action = action;
+- }
+-
+- public String toString()
+- {
+- return _action.name();
+- }
+-
+- public void setValue(ArtifactAction action) {
+- this._action = action;
+- }
+-
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/UpdateSummaryTableModel.java
++++ /dev/null
+@@ -1,149 +0,0 @@
+-/*
+- * Copyright (C) 2008 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui;
+-
+-import java.util.ArrayList;
+-import java.util.List;
+-
+-import javax.swing.table.AbstractTableModel;
+-
+-import net.sourceforge.squirrel_sql.fw.util.StringManager;
+-import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
+-
+-
+-/**
+- * Model for the UpdateSummaryTable.
+- */
+-public class UpdateSummaryTableModel extends AbstractTableModel
+-{
+-
+- private static final long serialVersionUID = 1L;
+-
+- private List<ArtifactStatus> _artifacts = new ArrayList<ArtifactStatus>();
+-
+- /** Internationalized strings for this class. */
+- private static final StringManager s_stringMgr =
+- StringManagerFactory.getStringManager(UpdateSummaryTableModel.class);
+-
+- private interface i18n {
+- // i18n[UpdateSummaryTable.yes=yes]
+- String YES_VAL = s_stringMgr.getString("UpdateSummaryTable.yes");
+-
+- // i18n[UpdateSummaryTable.no=no]
+- String NO_VAL = s_stringMgr.getString("UpdateSummaryTable.no");
+- }
+-
+- private final static Class<?>[] s_dataTypes =
+- new Class[] {
+- String.class, // ArtifactName
+- String.class, // Type
+- String.class, // Installed?
+- UpdateSummaryTableActionItem.class, // Install/Update/Remove
+- };
+-
+- private final String[] s_hdgs = new String[] {
+- s_stringMgr.getString("UpdateSummaryTable.artifactNameLabel"),
+- s_stringMgr.getString("UpdateSummaryTable.typeLabel"),
+- s_stringMgr.getString("UpdateSummaryTable.installedLabel"),
+- s_stringMgr.getString("UpdateSummaryTable.actionLabel"), };
+-
+-
+- private final int[] s_columnWidths = new int[] { 150, 100, 100, 50 };
+-
+- UpdateSummaryTableModel(List<ArtifactStatus> artifacts) {
+- _artifacts = artifacts;
+- }
+-
+- /**
+- * @see javax.swing.table.TableModel#getValueAt(int, int)
+- */
+- public Object getValueAt(int row, int col) {
+- final ArtifactStatus as = _artifacts.get(row);
+- switch (col) {
+- case 0:
+- return as.getName();
+- case 1:
+- return as.getType();
+- case 2:
+- return as.isInstalled() ? i18n.YES_VAL : i18n.NO_VAL;
+- case 3:
+- if (as.isCoreArtifact()) {
+- return ArtifactAction.INSTALL;
+- }
+- return as.getArtifactAction();
+- default:
+- throw new IndexOutOfBoundsException("" + col);
+- }
+- }
+-
+- /**
+- * @see javax.swing.table.TableModel#getRowCount()
+- */
+- public int getRowCount() {
+- return _artifacts.size();
+- }
+-
+- /**
+- * @see javax.swing.table.TableModel#getColumnCount()
+- */
+- public int getColumnCount() {
+- return s_hdgs.length;
+- }
+-
+- /**
+- * @see javax.swing.table.AbstractTableModel#getColumnName(int)
+- */
+- public String getColumnName(int col) {
+- return s_hdgs[col];
+- }
+-
+- /**
+- * @see javax.swing.table.AbstractTableModel#getColumnClass(int)
+- */
+- public Class<?> getColumnClass(int col) {
+- return s_dataTypes[col];
+- }
+-
+- /**
+- * @see javax.swing.table.AbstractTableModel#isCellEditable(int, int)
+- */
+- public boolean isCellEditable(int row, int col) {
+- return col == 3;
+- }
+-
+- /**
+- * @see javax.swing.table.AbstractTableModel#setValueAt(java.lang.Object, int, int)
+- */
+- public void setValueAt(Object value, int row, int col) {
+- final ArtifactStatus as = _artifacts.get(row);
+- ArtifactAction action =
+- ArtifactAction.valueOf(value.toString());
+- as.setArtifactAction(action);
+- }
+-
+- /**
+- * @return the column width for the specified column
+- */
+- public int getColumnWidth(int col)
+- {
+- return s_columnWidths[col];
+- }
+-
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/ArtifactInstaller.java
++++ /dev/null
+@@ -1,82 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui.installer;
+-
+-
+-import java.io.FileNotFoundException;
+-import java.io.IOException;
+-
+-import net.sourceforge.squirrel_sql.client.update.gui.installer.event.InstallStatusListener;
+-import net.sourceforge.squirrel_sql.client.update.xmlbeans.ChangeListXmlBean;
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapper;
+-
+-/**
+- * Interface for the class that applies changes given in a ChangeListXmlBean to the actual installed files,
+- * using the download files. Provision for backing up current version of files and restoring is also provided.
+- */
+-public interface ArtifactInstaller
+-{
+-
+- /**
+- * Adds the specified InstallStatusListener for the purpose of notification using InstallStatusEvents.
+- *
+- * @param listener the listener to add.
+- */
+- void addListener(InstallStatusListener listener);
+-
+- /**
+- *
+- * @return
+- * @throws FileNotFoundException
+- * @throws IOException
+- */
+- boolean backupFiles() throws FileNotFoundException, IOException;
+-
+- /**
+- *
+- * @throws FileNotFoundException
+- * @throws IOException
+- */
+- void installFiles() throws FileNotFoundException, IOException;
+-
+- /**
+- *
+- * @throws FileNotFoundException
+- * @throws IOException
+- */
+- boolean restoreBackupFiles() throws FileNotFoundException, IOException;
+-
+- /**
+- * @param changeList
+- * @throws FileNotFoundException
+- */
+- void setChangeList(ChangeListXmlBean changeList) throws FileNotFoundException;
+-
+- /**
+- * @return the changeListFile
+- */
+- FileWrapper getChangeListFile();
+-
+- /**
+- * @param changeListFile the changeListFile to set
+- */
+- void setChangeListFile(FileWrapper changeListFile);
+-
+-
+-}
+\ No newline at end of file
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/ArtifactInstallerFactory.java
++++ /dev/null
+@@ -1,32 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui.installer;
+-
+-import java.io.FileNotFoundException;
+-
+-import net.sourceforge.squirrel_sql.client.update.gui.installer.event.InstallStatusListener;
+-import net.sourceforge.squirrel_sql.client.update.xmlbeans.ChangeListXmlBean;
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapper;
+-
+-public interface ArtifactInstallerFactory {
+-
+- ArtifactInstaller create(ChangeListXmlBean changeList, InstallStatusListener listener) throws FileNotFoundException;
+-
+- ArtifactInstaller create(FileWrapper changeList, InstallStatusListener listener) throws FileNotFoundException;
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/ArtifactInstallerFactoryImpl.java
++++ /dev/null
+@@ -1,86 +0,0 @@
+-/*
+- * Copyright (C) 2008 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui.installer;
+-
+-import java.io.FileNotFoundException;
+-
+-import net.sourceforge.squirrel_sql.client.update.UpdateUtil;
+-import net.sourceforge.squirrel_sql.client.update.gui.installer.event.InstallStatusListener;
+-import net.sourceforge.squirrel_sql.client.update.xmlbeans.ChangeListXmlBean;
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapper;
+-
+-import org.springframework.beans.BeansException;
+-import org.springframework.context.ApplicationContext;
+-import org.springframework.context.ApplicationContextAware;
+-
+-public class ArtifactInstallerFactoryImpl implements ArtifactInstallerFactory, ApplicationContextAware
+-{
+- private final static String ARTIFACT_INSTALLER_ID =
+- "net.sourceforge.squirrel_sql.client.update.gui.installer.ArtifactInstaller";
+-
+- private UpdateUtil updateUtil;
+-
+- /** Spring-injected */
+- private ApplicationContext applicationContext = null;
+-
+- public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
+- {
+- this.applicationContext = applicationContext;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.gui.installer.ArtifactInstallerFactory#
+- * create(net.sourceforge.squirrel_sql.client.update.xmlbeans.ChangeListXmlBean,
+- * net.sourceforge.squirrel_sql.client.update.gui.installer.event.InstallStatusListener)
+- */
+- public ArtifactInstaller create(ChangeListXmlBean changeList, InstallStatusListener listener)
+- throws FileNotFoundException
+- {
+- ArtifactInstaller result = (ArtifactInstaller) applicationContext.getBean(ARTIFACT_INSTALLER_ID);
+- if (listener != null) {
+- result.addListener(listener);
+- }
+- result.setChangeList(changeList);
+- return result;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.gui.installer.ArtifactInstallerFactory#
+- * create(net.sourceforge.squirrel_sql.fw.util.FileWrapper,
+- * net.sourceforge.squirrel_sql.client.update.gui.installer.event.InstallStatusListener)
+- */
+- public ArtifactInstaller create(FileWrapper changeList, InstallStatusListener listener)
+- throws FileNotFoundException
+- {
+- ChangeListXmlBean changeListBean = updateUtil.getChangeList(changeList);
+- ArtifactInstaller result = create(changeListBean, listener);
+- result.setChangeListFile(changeList);
+- return result;
+- }
+-
+- /**
+- * @param updateUtil
+- * the updateUtil to set
+- */
+- public void setUpdateUtil(UpdateUtil updateUtil)
+- {
+- this.updateUtil = updateUtil;
+- }
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/ArtifactInstallerImpl.java
++++ /dev/null
+@@ -1,849 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui.installer;
+-
+-import java.io.FileNotFoundException;
+-import java.io.IOException;
+-import java.util.ArrayList;
+-import java.util.List;
+-
+-import javax.swing.SwingUtilities;
+-
+-import net.sourceforge.squirrel_sql.client.update.UpdateUtil;
+-import net.sourceforge.squirrel_sql.client.update.gui.ArtifactAction;
+-import net.sourceforge.squirrel_sql.client.update.gui.ArtifactStatus;
+-import net.sourceforge.squirrel_sql.client.update.gui.installer.event.InstallEventType;
+-import net.sourceforge.squirrel_sql.client.update.gui.installer.event.InstallStatusEvent;
+-import net.sourceforge.squirrel_sql.client.update.gui.installer.event.InstallStatusEventFactory;
+-import net.sourceforge.squirrel_sql.client.update.gui.installer.event.InstallStatusListener;
+-import net.sourceforge.squirrel_sql.client.update.gui.installer.util.InstallFileOperationInfo;
+-import net.sourceforge.squirrel_sql.client.update.gui.installer.util.InstallFileOperationInfoFactory;
+-import net.sourceforge.squirrel_sql.client.update.xmlbeans.ChangeListXmlBean;
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapper;
+-import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
+-import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
+-
+-/**
+- * This class is used by the PreLaunchUpdateApplication to install artifact files that belong to a particular
+- * change list.
+- *
+- * @author manningr
+- */
+-public class ArtifactInstallerImpl implements ArtifactInstaller
+-{
+-
+- /** Logger for this class. */
+- private static ILogger s_log = LoggerController.createLogger(ArtifactInstallerImpl.class);
+-
+- /**
+- * this list is derived from the changelist xmlbean. It will only contain the artifacts that need to be
+- * change (installed, removed).
+- */
+- private List<ArtifactStatus> _changeList = null;
+-
+- /** listeners to notify of important install events */
+- private List<InstallStatusListener> _listeners = new ArrayList<InstallStatusListener>();
+-
+- /**
+- * the top-level directory beneath which reside all files needed for updating the application (e.g.
+- * /opt/squirrel/update)
+- */
+- private FileWrapper updateDir = null;
+-
+- // Download directories
+-
+- /** the downlaods root directory (e.g. /opt/squirrel/update/downloads) */
+- private FileWrapper downloadsRootDir = null;
+-
+- /** the core sub-directory of the backup directory (e.g. /opt/squirrel/update/downloads/core) */
+- private FileWrapper coreDownloadsDir = null;
+-
+- /** the plugin sub-directory of the backup directory (e.g. /opt/squirrel/update/downloads/plugin) */
+- private FileWrapper pluginDownloadsDir = null;
+-
+- /** the i18n sub-directory of the backup directory (e.g. /opt/squirrel/update/downloads/i18n) */
+- private FileWrapper i18nDownloadsDir = null;
+-
+- // Backup directories
+-
+- /** the backup directory (e.g. /opt/squirrel/update/backup) */
+- private FileWrapper backupRootDir = null;
+-
+- /** the core sub-directory of the backup directory (e.g. /opt/squirrel/update/backup/core) */
+- private FileWrapper coreBackupDir = null;
+-
+- /** the plugin sub-directory of the backup directory (e.g. /opt/squirrel/update/backup/plugin) */
+- private FileWrapper pluginBackupDir = null;
+-
+- /** the i18n sub-directory of the backup directory (e.g. /opt/squirrel/update/backup/i18n) */
+- private FileWrapper translationBackupDir = null;
+-
+- // Install directories
+-
+- /** the top-level SQuirreL installation direction where launch scripts are (e.g. /opt/squirrel) */
+- private FileWrapper installRootDir = null;
+-
+- /** the lib directory where most core jars are (e.g. /opt/squirrel/lib) */
+- private FileWrapper coreInstallDir = null;
+-
+- /** the plugins directory where all of the plugin files are (e.g. /opt/squirrel/plugins) */
+- private FileWrapper pluginInstallDir = null;
+-
+- /** the lib directory where translation jars are (e.g. /opt/squirrel/lib) */
+- private FileWrapper i18nInstallDir = null;
+-
+- /**
+- * the file that was used to build a ChangeListXmlBean that we are using to determine which files need to
+- * be installed/removed
+- */
+- private FileWrapper changeListFile = null;
+-
+- /* Spring-injected dependencies */
+-
+- /** Spring-injected factory for creating install events */
+- private InstallStatusEventFactory installStatusEventFactory = null;
+-
+- public void setInstallStatusEventFactory(InstallStatusEventFactory installStatusEventFactory)
+- {
+- this.installStatusEventFactory = installStatusEventFactory;
+- }
+-
+- /** Spring-injected factory for creating file operation infos */
+- private InstallFileOperationInfoFactory installFileOperationInfoFactory = null;
+-
+- public void setInstallFileOperationInfoFactory(
+- InstallFileOperationInfoFactory installFileOperationInfoFactory)
+- {
+- this.installFileOperationInfoFactory = installFileOperationInfoFactory;
+- }
+-
+- /** Utility which provides path information and abstraction to file operations */
+- private UpdateUtil _util = null;
+-
+- public void setUpdateUtil(UpdateUtil util)
+- {
+- this._util = util;
+- updateDir = _util.getSquirrelUpdateDir();
+- backupRootDir = _util.checkDir(updateDir, UpdateUtil.BACKUP_ROOT_DIR_NAME);
+- downloadsRootDir = _util.checkDir(updateDir, UpdateUtil.DOWNLOADS_DIR_NAME);
+-
+- coreBackupDir = _util.checkDir(backupRootDir, UpdateUtil.CORE_ARTIFACT_ID);
+- pluginBackupDir = _util.checkDir(backupRootDir, UpdateUtil.PLUGIN_ARTIFACT_ID);
+- translationBackupDir = _util.checkDir(backupRootDir, UpdateUtil.TRANSLATION_ARTIFACT_ID);
+-
+- installRootDir = _util.getSquirrelHomeDir();
+-
+- coreInstallDir = _util.getSquirrelLibraryDir();
+- pluginInstallDir = _util.getSquirrelPluginsDir();
+- i18nInstallDir = _util.getSquirrelLibraryDir();
+-
+- coreDownloadsDir = _util.getCoreDownloadsDir();
+- pluginDownloadsDir = _util.getPluginDownloadsDir();
+- i18nDownloadsDir = _util.getI18nDownloadsDir();
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.gui.installer.ArtifactInstaller#setChangeList(net.sourceforge.squirrel_sql.client.update.xmlbeans.ChangeListXmlBean)
+- */
+- public void setChangeList(ChangeListXmlBean changeList) throws FileNotFoundException
+- {
+- _changeList = initializeChangeList(changeList);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.gui.installer.ArtifactInstaller#getChangeListFile()
+- */
+- public FileWrapper getChangeListFile()
+- {
+- return changeListFile;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.gui.installer.ArtifactInstaller#
+- * setChangeListFile(java.io.File)
+- */
+- public void setChangeListFile(FileWrapper changeListFile)
+- {
+- this.changeListFile = changeListFile;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.gui.installer.ArtifactInstaller#
+- * addListener(net.sourceforge.squirrel_sql.client.update.gui.installer.event.InstallStatusListener)
+- */
+- public void addListener(InstallStatusListener listener)
+- {
+- _listeners.add(listener);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.gui.installer.ArtifactInstaller#backupFiles()
+- */
+- public boolean backupFiles() throws FileNotFoundException, IOException
+- {
+- boolean result = true;
+- sendBackupStarted(_changeList.size());
+-
+- FileWrapper localReleaseFile = _util.getLocalReleaseFile();
+- _util.copyFile(localReleaseFile, _util.getBackupDir());
+-
+- for (ArtifactStatus status : _changeList)
+- {
+- String artifactName = status.getName();
+- sendFileBackupStarted(artifactName);
+- // Skip files that are not installed - new files
+- if (!status.isInstalled())
+- {
+- if (s_log.isInfoEnabled())
+- {
+- s_log.info("Skipping backup of artifact (" + status + ") which isn't installed.");
+- }
+- sendFileBackupComplete(artifactName);
+- continue;
+- }
+- if (status.isCoreArtifact())
+- {
+- FileWrapper installDir = getCoreArtifactLocation(artifactName, installRootDir, coreInstallDir);
+- FileWrapper coreFile = _util.getFile(installDir, artifactName);
+- FileWrapper backupFile = _util.getFile(coreBackupDir, artifactName);
+- _util.copyFile(coreFile, backupFile);
+- }
+- if (status.isPluginArtifact())
+- {
+- // artifact name for plugins is <plugin internal name>.zip
+- FileWrapper pluginBackupFile = _util.getFile(pluginBackupDir, artifactName);
+- String pluginDirectory = artifactName.replace(".zip", "");
+- String pluginJarFilename = artifactName.replace(".zip", ".jar");
+-
+- ArrayList<FileWrapper> filesToZip = new ArrayList<FileWrapper>();
+- FileWrapper pluginDirectoryFile = _util.getFile(pluginInstallDir, pluginDirectory);
+- if (pluginDirectoryFile.exists())
+- {
+- filesToZip.add(pluginDirectoryFile);
+- }
+- FileWrapper pluginJarFile = _util.getFile(pluginInstallDir, pluginJarFilename);
+- if (pluginJarFile.exists())
+- {
+- filesToZip.add(pluginJarFile);
+- }
+- if (filesToZip.size() > 0)
+- {
+- _util.createZipFile(pluginBackupFile, filesToZip.toArray(new FileWrapper[filesToZip.size()]));
+- }
+- else
+- {
+- s_log.error("Plugin (" + status.getName() + ") was listed as already installed, but it's "
+- + "files didn't exist and couldn't be backed up: pluginDirectoryFile="
+- + pluginDirectoryFile.getAbsolutePath() + " pluginJarFile="
+- + pluginJarFile.getAbsolutePath());
+- }
+- }
+- if (status.isTranslationArtifact())
+- {
+- FileWrapper translationFile = _util.getFile(i18nInstallDir, artifactName);
+- FileWrapper backupFile = _util.getFile(translationBackupDir, artifactName);
+- if (translationFile.exists())
+- {
+- _util.copyFile(translationFile, backupFile);
+- }
+- }
+- breathing();
+- sendFileBackupComplete(artifactName);
+- }
+-
+- sendBackupComplete();
+- return result;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.gui.installer.ArtifactInstaller#installFiles()
+- */
+- public void installFiles() throws IOException
+- {
+- List<FileWrapper> filesToRemove = new ArrayList<FileWrapper>();
+- List<InstallFileOperationInfo> filesToInstall = new ArrayList<InstallFileOperationInfo>();
+-
+- for (ArtifactStatus status : _changeList)
+- {
+- ArtifactAction action = status.getArtifactAction();
+- FileWrapper installDir = null;
+- FileWrapper fileToCopy = null;
+- FileWrapper fileToRemove = null;
+- String artifactName = status.getName();
+- boolean isPlugin = false;
+-
+- if (status.isCoreArtifact())
+- {
+- if (action == ArtifactAction.REMOVE)
+- {
+- s_log.error("Skipping core artifact (" + status.getName() + ") that was marked for removal");
+- continue;
+- }
+- installDir = getCoreArtifactLocation(status.getName(), installRootDir, coreInstallDir);
+- fileToCopy = _util.getFile(coreDownloadsDir, artifactName);
+- if (UpdateUtil.DOCS_ARCHIVE_FILENAME.equals(status.getName()))
+- {
+- fileToRemove = _util.getFile(installDir, artifactName.replace(".zip", ""));
+- }
+- else
+- {
+- fileToRemove = _util.getFile(installDir, artifactName);
+- }
+-
+- filesToRemove.add(fileToRemove);
+- }
+- if (status.isPluginArtifact())
+- {
+- isPlugin = true;
+- installDir = pluginInstallDir;
+- if (action != ArtifactAction.REMOVE)
+- {
+- fileToCopy = _util.getFile(pluginDownloadsDir, artifactName);
+- }
+-
+- // Need to remove the existing jar in the plugins directory and all of the files beneath the
+- // plugin-named directory.
+- String jarFileToRemove = artifactName.replace(".zip", ".jar");
+- String pluginDirectoryToRemove = artifactName.replace(".zip", "");
+-
+- filesToRemove.add(_util.getFile(installDir, jarFileToRemove));
+- filesToRemove.add(_util.getFile(installDir, pluginDirectoryToRemove));
+- }
+- if (status.isTranslationArtifact())
+- {
+- installDir = i18nInstallDir;
+- if (action != ArtifactAction.REMOVE)
+- {
+- fileToCopy = _util.getFile(i18nDownloadsDir, artifactName);
+- }
+- fileToRemove = _util.getFile(installDir, artifactName);
+- filesToRemove.add(fileToRemove);
+- }
+- if (fileToCopy != null)
+- {
+- InstallFileOperationInfo info = installFileOperationInfoFactory.create(fileToCopy, installDir);
+- info.setPlugin(isPlugin);
+- info.setArtifactName(artifactName);
+- filesToInstall.add(info);
+- }
+-
+- }
+- boolean success = removeOldFiles(filesToRemove);
+- success = success && installFiles(filesToInstall);
+- success = success && backupAndDeleteChangeListFile();
+- success = success && installNewReleaseXmlFile();
+-
+- if (!success)
+- {
+- restoreFilesFromBackup(filesToInstall);
+- }
+-
+- sendInstallComplete();
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.gui.installer.ArtifactInstaller#restoreBackupFiles(net.sourceforge.squirrel_sql.client.update.xmlbeans.ChangeListXmlBean)
+- */
+- public boolean restoreBackupFiles() throws FileNotFoundException, IOException
+- {
+- for (ArtifactStatus status : _changeList)
+- {
+- String name = status.getName();
+- FileWrapper backupDir = null;
+- FileWrapper installDir = null;
+-
+- if (status.isCoreArtifact())
+- {
+- backupDir = coreBackupDir;
+- installDir = getCoreArtifactLocation(name, installRootDir, coreInstallDir);
+- }
+- if (status.isPluginArtifact())
+- {
+- backupDir = pluginBackupDir;
+- installDir = pluginInstallDir;
+- }
+- if (status.isTranslationArtifact())
+- {
+- backupDir = translationBackupDir;
+- installDir = coreInstallDir; // translations are most likely to be found in core lib dir.
+- }
+- FileWrapper backupJarPath = _util.getFile(backupDir, name);
+- FileWrapper installJarPath = _util.getFile(installDir, name);
+-
+- if (!_util.deleteFile(installJarPath))
+- {
+- return false;
+- }
+- else
+- {
+- _util.copyFile(backupJarPath, installJarPath);
+- }
+- }
+- if (!_util.deleteFile(_util.getLocalReleaseFile()))
+- {
+- return false;
+- }
+- else
+- {
+- FileWrapper backupReleaseFile = _util.getFile(_util.getBackupDir(), UpdateUtil.RELEASE_XML_FILENAME);
+- _util.copyFile(backupReleaseFile, updateDir);
+- }
+-
+- return true;
+- }
+-
+- // Helper methods
+-
+- private void breathing()
+- {
+- // In case this is called by the AWT thread, log a message - this is most likey a bug
+- if (SwingUtilities.isEventDispatchThread())
+- {
+- if (s_log.isDebugEnabled())
+- {
+- s_log.debug("breathing: ignoring request to sleep the event dispatch thread");
+- }
+- return;
+- }
+- synchronized (this)
+- {
+- try
+- {
+- wait(50);
+- }
+- catch (InterruptedException e)
+- {
+- if (s_log.isInfoEnabled())
+- {
+- s_log.info("breathing: Interrupted", e);
+- }
+- }
+- }
+- }
+-
+- /**
+- * Since it possible that some artifacts haven't changed between releases, and it is time-consuming to read
+- * the contents of the installed file to compute it's checksum, we do that here just once and boil the
+- * change list down to just those files that have physically changed, by comparing byte-size and checksum.
+- */
+- private List<ArtifactStatus> initializeChangeList(ChangeListXmlBean changeListBean)
+- {
+- sendInitChangelistStarted(changeListBean.getChanges().size());
+- ArrayList<ArtifactStatus> result = new ArrayList<ArtifactStatus>();
+- for (ArtifactStatus status : changeListBean.getChanges())
+- {
+- String artifactName = status.getName();
+- sendFileInitChangelistStarted(artifactName);
+-
+- // Always add plugins - there is not a good way to compare plugin zips and their extracted contents
+- // at the moment.
+- // TODO: Determine the best way to derive the filesize and checksum of the plugin zip that was last
+- // extracted. Should we keep it around? How about using the current release.xml file ? Come to
+- // think of it, perhaps we shouldn't be computing the checksum of *any* existing files, why don't
+- // we just get it from the current release.xml file?
+- if (status.isPluginArtifact())
+- {
+- result.add(status);
+- sendFileInitChangelistComplete(artifactName);
+- continue;
+- }
+-
+- if (status.getArtifactAction() == ArtifactAction.INSTALL)
+- {
+- FileWrapper installedFileLocation = null;
+- // Skip the artifact if it is identical to the one that is already installed
+- if (status.isCoreArtifact())
+- {
+- installedFileLocation =
+- _util.getFile(getCoreArtifactLocation(status.getName(), installRootDir, coreInstallDir),
+- status.getName());
+- }
+- if (status.isTranslationArtifact())
+- {
+- installedFileLocation = _util.getFile(coreInstallDir, status.getName());
+- }
+-
+- long installedSize = installedFileLocation.length();
+- if (installedSize == status.getSize())
+- {
+- long installedCheckSum = _util.getCheckSum(installedFileLocation);
+- if (installedCheckSum == status.getChecksum())
+- {
+- if (s_log.isDebugEnabled())
+- {
+- s_log.debug("initializeChangeList: found a core/translation artifact that is not "
+- + "installed: installedSize= " + installedSize + " installedCheckSum="
+- + installedCheckSum + " statusSize=" + status.getSize() + " statusChecksum="
+- + status.getChecksum());
+- }
+- sendFileInitChangelistComplete(artifactName);
+- continue;
+- }
+- }
+- }
+-
+- // We have a core or translation file that is not already installed - add it
+- result.add(status);
+- sendFileInitChangelistComplete(artifactName);
+- }
+- sendInitChangelistComplete();
+- return result;
+- }
+-
+- /* Handle squirrel-sql.jar and documentation archive carefully - they live at the top */
+- private FileWrapper getCoreArtifactLocation(String artifactName, FileWrapper rootDir, FileWrapper coreDir)
+- {
+- if (UpdateUtil.SQUIRREL_SQL_JAR_FILENAME.equals(artifactName)
+- || UpdateUtil.DOCS_ARCHIVE_FILENAME.equals(artifactName))
+- {
+- return rootDir;
+- }
+- else
+- {
+- return coreDir;
+- }
+- }
+-
+- private void restoreFilesFromBackup(List<InstallFileOperationInfo> filesToInstall)
+- {
+- // TODO Auto-generated method stub
+- }
+-
+- private boolean backupAndDeleteChangeListFile()
+- {
+- boolean result = true;
+- if (changeListFile != null)
+- {
+- try
+- {
+- _util.copyFile(changeListFile, backupRootDir);
+- result = _util.deleteFile(changeListFile);
+- }
+- catch (IOException e)
+- {
+- result = false;
+- s_log.error("Unexpected exception: " + e.getMessage(), e);
+- }
+- }
+- else
+- {
+- if (s_log.isInfoEnabled())
+- {
+- s_log.info("moveChangeListFile: Changelist file was null. Skipping move");
+- }
+- }
+- return result;
+- }
+-
+- /**
+- * Install the downloaded release.xml file into the updates root directory so that the update knows the
+- * current release has changed.
+- *
+- * @return true if install was successful; false otherwise.
+- */
+- private boolean installNewReleaseXmlFile()
+- {
+- boolean result = true;
+-
+- try
+- {
+- _util.deleteFile(_util.getLocalReleaseFile());
+- }
+- catch (FileNotFoundException e)
+- {
+- // strange that release xml file wasn't found; but not a problem at this point - just log it.
+- if (s_log.isInfoEnabled())
+- {
+- s_log.info("installNewReleaseXmlFile: release file to be replaced was missing.");
+- }
+- }
+- FileWrapper downloadReleaseFile = _util.getFile(downloadsRootDir, UpdateUtil.RELEASE_XML_FILENAME);
+- try
+- {
+- _util.copyFile(downloadReleaseFile, updateDir);
+- }
+- catch (FileNotFoundException e)
+- {
+- result = false;
+- s_log.error("installNewReleaseXmlFile: unexpected exception - " + e.getMessage(), e);
+- }
+- catch (IOException e)
+- {
+- result = false;
+- s_log.error("installNewReleaseXmlFile: unexpected exception - " + e.getMessage(), e);
+- }
+- return result;
+- }
+-
+- /**
+- * Removes the specified list of File objects (can represent either a file or directory)
+- *
+- * @param filesToRemove
+- * the files to be removed.
+- * @return true if the remove operation was successful and false otherwise.
+- */
+- private boolean removeOldFiles(List<FileWrapper> filesToRemove)
+- {
+- boolean result = true;
+- sendRemoveStarted(filesToRemove.size());
+- for (FileWrapper fileToRemove : filesToRemove)
+- {
+- sendFileRemoveStarted(fileToRemove.getName());
+- result = removeOldFile(fileToRemove);
+- if (!result)
+- {
+- break;
+- }
+- breathing();
+- sendFileRemoveComplete(fileToRemove.getName());
+- }
+- sendRemoveComplete();
+- return result;
+- }
+-
+- /**
+- * Removes the old file that will be replaced by the new.
+- *
+- * @param fileToRemove
+- * the File that represents the file to be removed
+- * @return true if the remove operation was successful and false otherwise.
+- */
+- private boolean removeOldFile(FileWrapper fileToRemove)
+- {
+- boolean result = true;
+- String absolutePath = fileToRemove.getAbsolutePath();
+- if (s_log.isDebugEnabled())
+- {
+- s_log.debug("Examining file to remove: " + absolutePath);
+- }
+- if (fileToRemove.exists())
+- {
+- try
+- {
+- if (s_log.isDebugEnabled())
+- {
+- s_log.debug("Attempting to delete file: " + absolutePath);
+- }
+- result = _util.deleteFile(fileToRemove);
+- if (!result)
+- {
+- s_log.error("Delete operation failed for file/directory: " + absolutePath);
+- }
+- }
+- catch (SecurityException e)
+- {
+- result = false;
+- s_log.error("Unexpected security exception: " + e.getMessage());
+- }
+- }
+- else
+- {
+- if (s_log.isInfoEnabled())
+- {
+- s_log.info("Skipping delete of file doesn't appear to exist: " + absolutePath);
+- }
+- }
+- return result;
+- }
+-
+- private boolean installFiles(List<InstallFileOperationInfo> filesToInstall) throws IOException
+- {
+- sendInstallStarted(_changeList.size());
+- breathing();
+-
+- boolean result = true;
+- for (InstallFileOperationInfo info : filesToInstall)
+- {
+- try
+- {
+- sendFileInstallStarted(info.getArtifactName());
+- installFile(info);
+- sendFileInstallComplete(info.getArtifactName());
+- }
+- catch (Exception e)
+- {
+- s_log.error("installFiles: unexpected exception: " + e.getMessage(), e);
+- result = false;
+- break;
+- }
+- breathing();
+- }
+- return result;
+- }
+-
+- private void installFile(InstallFileOperationInfo info) throws IOException
+- {
+- FileWrapper installDir = info.getInstallDir();
+- FileWrapper fileToCopy = info.getFileToInstall();
+-
+- if (fileToCopy.getAbsolutePath().endsWith(".zip"))
+- {
+- // This file is a zip; it needs to be extracted into the install directory. All zips are packaged
+- // in such a way that the extraction beneath install directory is all that is required.
+- _util.extractZipFile(fileToCopy, installDir);
+- }
+- else
+- {
+- _util.copyFile(fileToCopy, installDir);
+- }
+-
+- }
+-
+- private void sendInitChangelistStarted(int numFilesToBackup)
+- {
+- logInfo("Changelist initialization started");
+- InstallStatusEvent evt = installStatusEventFactory.create(InstallEventType.INIT_CHANGELIST_STARTED);
+- evt.setNumFilesToUpdate(numFilesToBackup);
+- sendEvent(evt);
+- }
+-
+- private void sendFileInitChangelistStarted(String artifactName)
+- {
+- logInfo("Changelist init started for file: " + artifactName);
+- InstallStatusEvent evt = installStatusEventFactory.create(InstallEventType.FILE_INIT_CHANGELIST_STARTED);
+- evt.setArtifactName(artifactName);
+- sendEvent(evt);
+- }
+-
+- private void sendFileInitChangelistComplete(String artifactName)
+- {
+- logInfo("Changelist init complete for file: " + artifactName);
+- InstallStatusEvent evt = installStatusEventFactory.create(InstallEventType.FILE_INIT_CHANGELIST_COMPLETE);
+- evt.setArtifactName(artifactName);
+- sendEvent(evt);
+- }
+-
+- private void sendInitChangelistComplete()
+- {
+- logInfo("Changelist initialization complete");
+- InstallStatusEvent evt = installStatusEventFactory.create(InstallEventType.INIT_CHANGELIST_COMPLETE);
+- sendEvent(evt);
+- }
+-
+- private void sendBackupStarted(int numFilesToBackup)
+- {
+- logInfo("Backup started");
+- InstallStatusEvent evt = installStatusEventFactory.create(InstallEventType.BACKUP_STARTED);
+- evt.setNumFilesToUpdate(numFilesToBackup);
+- sendEvent(evt);
+- }
+-
+- private void sendFileBackupStarted(String artifactName)
+- {
+- logInfo("Backup started for file: " + artifactName);
+- InstallStatusEvent evt = installStatusEventFactory.create(InstallEventType.FILE_BACKUP_STARTED);
+- evt.setArtifactName(artifactName);
+- sendEvent(evt);
+- }
+-
+- private void sendFileBackupComplete(String artifactName)
+- {
+- logInfo("Backup complete for file: " + artifactName);
+- InstallStatusEvent evt = installStatusEventFactory.create(InstallEventType.FILE_BACKUP_COMPLETE);
+- evt.setArtifactName(artifactName);
+- sendEvent(evt);
+- }
+-
+- private void sendBackupComplete()
+- {
+- logInfo("Backup complete");
+- InstallStatusEvent evt = installStatusEventFactory.create(InstallEventType.BACKUP_COMPLETE);
+- sendEvent(evt);
+- }
+-
+-
+- private void sendRemoveStarted(int numFilesToRemove)
+- {
+- logInfo("Remove started");
+- InstallStatusEvent evt = installStatusEventFactory.create(InstallEventType.REMOVE_STARTED);
+- evt.setNumFilesToUpdate(numFilesToRemove);
+- sendEvent(evt);
+- }
+-
+- private void sendFileRemoveStarted(String artifactName)
+- {
+- logInfo("Remove started for file: " + artifactName);
+- InstallStatusEvent evt = installStatusEventFactory.create(InstallEventType.FILE_REMOVE_STARTED);
+- evt.setArtifactName(artifactName);
+- sendEvent(evt);
+- }
+-
+- private void sendFileRemoveComplete(String artifactName)
+- {
+- logInfo("Remove complete for file: " + artifactName);
+- InstallStatusEvent evt = installStatusEventFactory.create(InstallEventType.FILE_REMOVE_COMPLETE);
+- evt.setArtifactName(artifactName);
+- sendEvent(evt);
+- }
+-
+- private void sendRemoveComplete()
+- {
+- logInfo("Remove complete");
+- InstallStatusEvent evt = installStatusEventFactory.create(InstallEventType.REMOVE_COMPLETE);
+- sendEvent(evt);
+- }
+-
+- private void sendInstallStarted(int numFilesToUpdate)
+- {
+- logInfo("Install started");
+- InstallStatusEvent evt = installStatusEventFactory.create(InstallEventType.INSTALL_STARTED);
+- evt.setNumFilesToUpdate(numFilesToUpdate);
+- sendEvent(evt);
+- }
+-
+- private void sendFileInstallStarted(String artifactName)
+- {
+- logInfo("Install started for file: " + artifactName);
+- InstallStatusEvent evt = installStatusEventFactory.create(InstallEventType.FILE_INSTALL_STARTED);
+- evt.setArtifactName(artifactName);
+- sendEvent(evt);
+- }
+-
+- private void sendFileInstallComplete(String artifactName)
+- {
+- logInfo("Install complete for file: " + artifactName);
+- InstallStatusEvent evt = installStatusEventFactory.create(InstallEventType.FILE_INSTALL_COMPLETE);
+- evt.setArtifactName(artifactName);
+- sendEvent(evt);
+- }
+-
+- private void sendInstallComplete()
+- {
+- logInfo("Install completed");
+- InstallStatusEvent evt = installStatusEventFactory.create(InstallEventType.INSTALL_COMPLETE);
+- sendEvent(evt);
+- }
+-
+- private void sendEvent(InstallStatusEvent evt)
+- {
+- for (InstallStatusListener listener : _listeners)
+- {
+- listener.handleInstallStatusEvent(evt);
+- }
+- }
+-
+- private void logInfo(String message)
+- {
+- if (s_log.isInfoEnabled())
+- {
+- s_log.info(message);
+- }
+- }
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/ClasspathFunctionFixer.java
++++ /dev/null
+@@ -1,87 +0,0 @@
+-package net.sourceforge.squirrel_sql.client.update.gui.installer;
+-
+-import net.sourceforge.squirrel_sql.fw.util.IOUtilities;
+-import net.sourceforge.squirrel_sql.fw.util.ScriptLineFixer;
+-
+-/*
+- * Copyright (C) 2010 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-
+-/**
+- * This script line fixer updates the buildCPFromDir function in squirrel-sql.sh to fix a bug that was
+- * causing the classpath of the update application to prefer the installed jars rather than the ones that
+- * were downloaded.
+- */
+-public class ClasspathFunctionFixer implements ScriptLineFixer
+-{
+-
+- private boolean inFunctionDeclaration = false;
+-
+- private boolean scriptWasAlreadyFixed = false;
+-
+- private boolean sawOpenCurlyBrace = false;
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.fw.util.ScriptLineFixer#fixLine(java.lang.String, java.lang.String)
+- */
+- @Override
+- public String fixLine(String scriptFileName, String line)
+- {
+- if (scriptWasAlreadyFixed) {
+- return line;
+- }
+-
+- if (!scriptFileName.toLowerCase().endsWith(".sh")) {
+- return line;
+- }
+-
+- if (line.contains("buildCPFromDir()")) {
+- inFunctionDeclaration = true;
+- return line;
+- }
+- if (inFunctionDeclaration) {
+-
+- if (line.contains("{")) {
+- sawOpenCurlyBrace = true;
+- return line;
+- }
+-
+- // Perhaps the line has already been added. If so, skip future checks.
+- if (line.contains("CP=\"\"")) {
+- scriptWasAlreadyFixed = true;
+- return line;
+- }
+-
+- // At this point we are still in the function declaration, and the current line is neither the
+- // opening curly brace, nor the 'CP=""' line, so it must be the first actual line of the function.
+- // So, add in the
+-
+- if (sawOpenCurlyBrace) {
+- inFunctionDeclaration = false;
+- scriptWasAlreadyFixed = true;
+- StringBuilder alteredLine = new StringBuilder();
+- alteredLine.append("\tCP=\"\"");
+- alteredLine.append(IOUtilities.NEW_LINE);
+- alteredLine.append(line);
+- return alteredLine.toString();
+- }
+- }
+- return line;
+- }
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/PreLaunchHelper.java
++++ /dev/null
+@@ -1,56 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui.installer;
+-
+-import java.io.IOException;
+-
+-/**
+- * Interface for the class that does the heavy lifting with regard to checking for and installing any updates
+- * prior to launching the application.
+- */
+-public interface PreLaunchHelper
+-{
+- /**
+- * Installs updates that have been downloaded previously.
+- *
+- * @param prompt if true, this will present the user with a dialog asking them whether or not updates
+- * should be applied.
+- */
+- void installUpdates(boolean prompt);
+-
+- /**
+- * This will prompt the user to be sure they want to revert to the previous version and restore from
+- * backup if that is the case.
+- */
+- void restoreFromBackup();
+-
+- /**
+- * Updates the launch script with changes made necessary by the new release.
+- *
+- * @throws IOException if an I/O error occurs
+- */
+- public void updateLaunchScript() throws IOException;
+-
+- /**
+- * Copies the splash image from
+- * @throws IOException
+- */
+- public void copySplashImage() throws IOException;
+-
+-}
+\ No newline at end of file
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/PreLaunchHelperFactory.java
++++ /dev/null
+@@ -1,27 +0,0 @@
+-package net.sourceforge.squirrel_sql.client.update.gui.installer;
+-
+-/*
+- * Copyright (C) 2010 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-
+-public interface PreLaunchHelperFactory
+-{
+-
+- public abstract PreLaunchHelper createPreLaunchHelper();
+-
+-}
+\ No newline at end of file
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/PreLaunchHelperFactoryImpl.java
++++ /dev/null
+@@ -1,44 +0,0 @@
+-package net.sourceforge.squirrel_sql.client.update.gui.installer;
+-
+-import org.springframework.context.ApplicationContext;
+-import org.springframework.context.support.ClassPathXmlApplicationContext;
+-
+-/*
+- * Copyright (C) 2010 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-
+-public class PreLaunchHelperFactoryImpl implements PreLaunchHelperFactory
+-{
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.gui.installer.PreLaunchHelperFactory#createPreLaunchHelper()
+- */
+- public PreLaunchHelper createPreLaunchHelper() {
+- String[] appCtx = new String[] {
+- "classpath:net/sourceforge/squirrel_sql/fw/util/net.sourceforge.squirrel_sql.fw.util.applicationContext.xml",
+- "classpath:net/sourceforge/squirrel_sql/client/update/gui/installer/net.sourceforge.squirrel_sql.client.update.gui.installer.applicationContext.xml",
+- "classpath:net/sourceforge/squirrel_sql/client/update/gui/installer/event/net.sourceforge.squirrel_sql.client.update.gui.installer.event.applicationContext.xml",
+- "classpath:net/sourceforge/squirrel_sql/client/update/gui/installer/util/net.sourceforge.squirrel_sql.client.update.gui.installer.util.applicationContext.xml",
+- "classpath:net/sourceforge/squirrel_sql/client/update/util/net.sourceforge.squirrel_sql.client.update.util.applicationContext.xml"
+- };
+-
+- ApplicationContext ctx = new ClassPathXmlApplicationContext(appCtx);
+- return (PreLaunchHelper)ctx.getBean(PreLaunchHelper.class.getName());
+- }
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/PreLaunchHelperImpl.java
++++ /dev/null
+@@ -1,459 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui.installer;
+-
+-import java.io.File;
+-import java.io.FileNotFoundException;
+-import java.io.IOException;
+-import java.util.ArrayList;
+-import java.util.List;
+-
+-import javax.swing.JOptionPane;
+-
+-import net.sourceforge.squirrel_sql.client.update.UpdateUtil;
+-import net.sourceforge.squirrel_sql.client.update.gui.ArtifactStatus;
+-import net.sourceforge.squirrel_sql.client.update.gui.installer.event.InstallStatusListener;
+-import net.sourceforge.squirrel_sql.client.update.gui.installer.event.InstallStatusListenerImpl;
+-import net.sourceforge.squirrel_sql.client.update.xmlbeans.ChangeListXmlBean;
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapper;
+-import net.sourceforge.squirrel_sql.fw.util.IOUtilities;
+-import net.sourceforge.squirrel_sql.fw.util.ScriptLineFixer;
+-import net.sourceforge.squirrel_sql.fw.util.StringManager;
+-import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
+-import net.sourceforge.squirrel_sql.fw.util.Utilities;
+-import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
+-import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
+-
+-import org.springframework.beans.factory.annotation.Required;
+-
+-/**
+- * This is a bean that the prelaunch app uses. The pre-launch app main class (PreLaunchUpdateApplication)
+- * loads the spring context, and therefore can't managed by spring. So, it is very small and most of it's
+- * logic for doing updates resides here.
+- *
+- * @author manningr
+- */
+-public class PreLaunchHelperImpl implements PreLaunchHelper
+-{
+-
+- /** The message we show the user in the update dialog that is shown when there are updates to install */
+- private String INSTALL_UPDATES_MESSAGE;
+-
+- /**
+- * The title of the dialect that we show the user in the update dialog that is shown when there are updates
+- * to install
+- */
+- private String INSTALL_UPDATES_TITLE;
+-
+- private String RESTORE_FROM_BACKUP_TITLE;
+-
+- private String RESTORE_FROM_BACKUP_MESSAGE;
+-
+- private String RESTORE_FAILED_MESSAGE;
+-
+- private String BACKUP_FAILED_MESSAGE;
+-
+- private String INSTALL_FAILED_MESSAGE;
+-
+- /** Internationalized strings for this class */
+- private StringManager s_stringMgr;
+-
+- /** Logger for this class. */
+- private ILogger s_log;
+-
+- /** Used to override logic for calculating script location for testing purposes */
+- private String scriptLocation = null;
+-
+- /* --------------------------- Spring=injected dependencies --------------------------------------------*/
+-
+- /* Spring-injected */
+- private UpdateUtil updateUtil = null;
+-
+- @Required
+- public void setUpdateUtil(UpdateUtil util)
+- {
+- Utilities.checkNull("setUpdateUtil", "util", util);
+- this.updateUtil = util;
+- }
+-
+- /* Spring-injected */
+- private ArtifactInstallerFactory artifactInstallerFactory = null;
+-
+- @Required
+- public void setArtifactInstallerFactory(ArtifactInstallerFactory artifactInstallerFactory)
+- {
+- Utilities.checkNull("setArtifactInstallerFactory", "artifactInstallerFactory", artifactInstallerFactory);
+- this.artifactInstallerFactory = artifactInstallerFactory;
+- }
+-
+- /* Spring-injected */
+- private List<ScriptLineFixer> scriptLineFixers = null;
+-
+- @Required
+- public void setScriptLineFixers(List<ScriptLineFixer> scriptLineFixers)
+- {
+- Utilities.checkNull("setScriptLineFixers", "scriptLineFixers", scriptLineFixers);
+- this.scriptLineFixers = scriptLineFixers;
+- }
+-
+- /* Spring-injected */
+- private IOUtilities ioutils = null;
+-
+- /**
+- * @param ioutils
+- * the ioutils to set
+- */
+- @Required
+- public void setIoutils(IOUtilities ioutils)
+- {
+- Utilities.checkNull("setIoutils", "ioutils", ioutils);
+- this.ioutils = ioutils;
+- }
+-
+- /* ----------------------------------- Public API ------------------------------------------------------*/
+-
+- public PreLaunchHelperImpl() throws IOException
+- {
+-
+- s_log = LoggerController.createLogger(PreLaunchHelperImpl.class);
+- s_stringMgr = StringManagerFactory.getStringManager(PreLaunchHelperImpl.class);
+-
+- // i18n[PreLaunchHelperImpl.installUpdatesTitle=Updates Available]
+- INSTALL_UPDATES_TITLE = s_stringMgr.getString("PreLaunchHelperImpl.installUpdatesTitle");
+-
+- // i18n[PreLaunchHelperImpl.installUpdatesMessage=Updates are ready to be installed. Install them now?]
+- INSTALL_UPDATES_MESSAGE = s_stringMgr.getString("PreLaunchHelperImpl.installUpdatesMessage");
+-
+- // i18n[PreLaunchHelperImpl.restoreFromBackupTitle=Confirm Restore From Backup
+- RESTORE_FROM_BACKUP_TITLE = s_stringMgr.getString("PreLaunchHelperImpl.restoreFromBackupTitle");
+-
+- // i18n[PreLaunchHelperImpl.restoreFromBackupMessage=Restore SQuirreL to previous version before
+- // last update?]
+- RESTORE_FROM_BACKUP_MESSAGE = s_stringMgr.getString("PreLaunchHelperImpl.restoreFromBackupMessage");
+-
+- // i18n[PreLaunchHelperImpl.backupFailedMessage=Backup of existing files failed. Installation cannot
+- // proceed]
+- BACKUP_FAILED_MESSAGE = s_stringMgr.getString("PreLaunchHelperImpl.backupFailedMessage");
+-
+- // i18n[PreLaunchHelperImpl.installFailedMessage=Unexpected error while attempting to install updates]
+- INSTALL_FAILED_MESSAGE = s_stringMgr.getString("PreLaunchHelperImpl.installFailedMessage");
+-
+- // i18n[PreLaunchHelperImpl.restoreFailedMessage=Restore from backup failed. Re-installation may be
+- // required.
+- RESTORE_FAILED_MESSAGE = s_stringMgr.getString("PreLaunchHelperImpl.restoreFailedMessage");
+-
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.gui.installer.PreLaunchHelper#installUpdates(boolean)
+- */
+- @Override
+- public void installUpdates(boolean prompt)
+- {
+- FileWrapper changeListFile = updateUtil.getChangeListFile();
+- if (hasChangesToBeApplied(changeListFile))
+- {
+- logInfo("Pre-launch update app detected a changeListFile to be processed");
+- if (prompt)
+- {
+- if (showConfirmDialog(INSTALL_UPDATES_MESSAGE, INSTALL_UPDATES_TITLE))
+- {
+- installUpdates(changeListFile);
+- }
+- else
+- {
+- logInfo("User cancelled update installation");
+- }
+- }
+- else
+- {
+- installUpdates(changeListFile);
+- }
+- }
+- }
+-
+- /**
+- * Updates the launch script with changes made necessary by the new release.
+- *
+- * @throws IOException
+- * if an I/O error occurs
+- */
+- @Override
+- public void updateLaunchScript() throws IOException
+- {
+- // 1. determine which script(s) to fix.
+- List<String> launchScriptLocations = getLaunchScriptLocations();
+-
+- for (String launchScript : launchScriptLocations) {
+- logInfo("Applying updates to launch script: " + launchScript);
+-
+- // 2. Get the lines from the file, applying the line fixers
+- List<String> lines = ioutils.getLinesFromFile(launchScript, scriptLineFixers);
+-
+- // 3. Write the fixed lines back out to the file.
+- ioutils.writeLinesToFile(launchScript, lines);
+- }
+- }
+-
+- private List<String> getLaunchScriptLocations() {
+- List<String> result = new ArrayList<String>();
+-
+- if (scriptLocation != null) {
+- result.add(scriptLocation);
+- return result;
+- }
+-
+- String os = System.getProperty("os.name");
+- if (os != null && os.toLowerCase().startsWith("windows")) {
+- result.add("squirrel-sql.bat");
+- // And for cygwin users on Windows
+- result.add("squirrel-sql.sh");
+- }
+- else if (os != null && os.toLowerCase().startsWith("mac"))
+- {
+- // Java on Mac OS X doesn't find squirrel-sql.sh; so construct the absolute path.
+- result.add(getMacOSContentsPath() + "/MacOS/squirrel-sql.sh");
+- }
+- else {
+- result.add("squirrel-sql.sh");
+- }
+-
+- return result;
+- }
+-
+- private String getMacOSContentsPath() {
+- // The user.dir property on the Mac is /Applications/SQuirreLSQL.app/Contents/Resources/Java
+- String userdir = System.getProperty("user.dir");
+- String[] parts = userdir.split("Contents");
+- return parts[0] + "/Contents";
+- }
+-
+- @Override
+- public void copySplashImage() throws IOException
+- {
+- // The user.dir property on the Mac is /Applications/SQuirreLSQL.app/Contents/Resources/Java
+- String squirrelHome = System.getProperty("user.dir");
+-
+-
+- String jarFilename = squirrelHome + "/update/downloads/core/squirrel-sql.jar";
+- String resourceName = "splash.jpg";
+- String pathToIconsDir = squirrelHome + "/icons";
+- String destinationFile = pathToIconsDir + "/" + resourceName;
+-
+- File iconsDir = new File(pathToIconsDir);
+- if (!iconsDir.exists()) {
+- logInfo("Icons directory ("+pathToIconsDir+") doesn't exist, so attempting to create it.");
+- boolean result = iconsDir.mkdir();
+- if (!result) {
+- s_log.error("Failed to create icons directory ("+pathToIconsDir+")");
+- }
+- }
+-
+- logInfo("Copying splash.jpg from jarfile ("+jarFilename+") to "+destinationFile);
+-
+- ioutils.copyResourceFromJarFile(jarFilename, resourceName, destinationFile);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.gui.installer.PreLaunchHelper#restoreFromBackup()
+- */
+- @Override
+- public void restoreFromBackup()
+- {
+- if (showConfirmDialog(RESTORE_FROM_BACKUP_MESSAGE, RESTORE_FROM_BACKUP_TITLE))
+- {
+-
+- try
+- {
+- FileWrapper backupDir = updateUtil.getBackupDir();
+- FileWrapper changeListFile = updateUtil.getFile(backupDir, UpdateUtil.CHANGE_LIST_FILENAME);
+- ChangeListXmlBean changeList = updateUtil.getChangeList(changeListFile);
+-
+- ArtifactInstaller installer = artifactInstallerFactory.create(changeList, null);
+- if (!installer.restoreBackupFiles())
+- {
+- showErrorDialog(RESTORE_FAILED_MESSAGE);
+- s_log.error("restoreFromBackup: " + RESTORE_FAILED_MESSAGE);
+- }
+-
+- }
+- catch (Throwable e)
+- {
+- s_log.error("Unexpected error while attempting restore from backup: " + e.getMessage(), e);
+- showErrorDialog(RESTORE_FAILED_MESSAGE);
+- }
+-
+- }
+- shutdown("Pre-launch update app finished");
+- }
+-
+- /* ------------------------------------- Helper methods ------------------------------------------------*/
+-
+- /**
+- * Peeks into the changelist file to see if there are artifacts to change. This is precautionary as the GUI
+- * should prevent the changeList file from being created if there are no artifacts to be changed.
+- *
+- * @param changeListFile
+- * the file that contains the changeList
+- * @return true if the changeListFile exists and has changes to be applied; false otherwise.
+- */
+- private boolean hasChangesToBeApplied(final FileWrapper changeListFile)
+- {
+- boolean result = false;
+- try
+- {
+- if (changeListFile.exists())
+- {
+- final ChangeListXmlBean changeListBean = updateUtil.getChangeList(changeListFile);
+- final List<ArtifactStatus> changeList = changeListBean.getChanges();
+- final int changeListSize = changeList.size();
+- logInfo("hasChangesToBeApplied: changeListFile (" + changeListSize + ") has " + changeListSize
+- + " changes to be applied");
+-
+- if (changeList != null && changeListSize > 0)
+- {
+- result = true;
+- }
+- else
+- {
+- logInfo("Aborting update: changeList was found with no updates");
+- }
+- }
+- else
+- {
+- logInfo("installUpdates: changeList file (" + changeListFile + ") doesn't exist");
+- }
+- }
+- catch (FileNotFoundException e)
+- {
+- s_log.error("hasChangesToBeApplied: unable to get change list from file (" + changeListFile + "): "
+- + e.getMessage());
+- }
+-
+- return result;
+- }
+-
+- /**
+- * Shuts down this small pre-launch helper application.
+- */
+- private void shutdown(String message)
+- {
+- logInfo(message);
+- LoggerController.shutdown();
+- System.exit(0);
+- }
+-
+- /**
+- * Install the updates, taking care to backup the originals first.
+- *
+- * @param changeList
+- * the xml file describing the changes to be made.
+- * @throws Exception
+- * if any error occurs
+- */
+- private void installUpdates(final FileWrapper changeList)
+- {
+- Thread t = new Thread(new Runnable()
+- {
+- public void run()
+- {
+- try
+- {
+- ProgressDialogController controller = new ProgressDialogControllerImpl();
+- InstallStatusListener listener = new InstallStatusListenerImpl(controller);
+- ArtifactInstaller installer = artifactInstallerFactory.create(changeList, listener);
+- if (installer.backupFiles())
+- {
+- installer.installFiles();
+- }
+- else
+- {
+- showErrorDialog(BACKUP_FAILED_MESSAGE);
+- }
+- controller.hideProgressDialog();
+- shutdown("Pre-launch update app finished");
+- }
+- catch (Throwable e)
+- {
+- String message = INSTALL_FAILED_MESSAGE + ": " + e.getMessage();
+- s_log.error(message, e);
+- showErrorDialog(message);
+- }
+-
+- }
+-
+- });
+- t.setName("Update Installer Thread");
+- t.start();
+- }
+-
+- /**
+- * Ask the user a question
+- *
+- * @param message
+- * the question to ask
+- * @param title
+- * the title of the dialog
+- * @return true if they said YES; false otherwise.
+- */
+- private boolean showConfirmDialog(String message, String title)
+- {
+- int choice =
+- JOptionPane.showConfirmDialog(null, message, title, JOptionPane.YES_NO_OPTION,
+- JOptionPane.QUESTION_MESSAGE);
+- return choice == JOptionPane.YES_OPTION;
+- }
+-
+- /**
+- * Show the user an error dialog.
+- *
+- * @param message
+- * the message to give in the dialog.
+- */
+- private void showErrorDialog(String message)
+- {
+- JOptionPane.showMessageDialog(null, message, "Error", JOptionPane.ERROR_MESSAGE);
+- }
+-
+- private void logInfo(String message)
+- {
+- if (s_log.isInfoEnabled())
+- {
+- s_log.info(message);
+- }
+- }
+-
+- /**
+- * @param scriptLocation
+- * the scriptLocation to set
+- */
+- public void setScriptLocation(String scriptLocation)
+- {
+- this.scriptLocation = scriptLocation;
+- }
+-
+- /**
+- * @return the scriptLocation
+- */
+- public String getScriptLocation()
+- {
+- return scriptLocation;
+- }
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/PreLaunchUpdateApplication.java
++++ /dev/null
+@@ -1,106 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui.installer;
+-
+-import java.io.File;
+-import java.io.IOException;
+-
+-import net.sourceforge.squirrel_sql.client.ApplicationArguments;
+-import net.sourceforge.squirrel_sql.client.SquirrelLoggerFactory;
+-import net.sourceforge.squirrel_sql.client.util.ApplicationFiles;
+-import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
+-
+-import org.apache.log4j.FileAppender;
+-import org.apache.log4j.Layout;
+-import org.apache.log4j.PatternLayout;
+-import org.apache.log4j.PropertyConfigurator;
+-
+-/**
+- * This is a small application that will be launched each time SQuirreL is started to quickly check to see if
+- * updates are available to be applied. Since this application uses Spring, it sets up the Spring context.
+- */
+-public class PreLaunchUpdateApplication
+-{
+-
+- /** The helper that most work is delegated to */
+- private static PreLaunchHelper helper = null;
+-
+- public static final String PROMPT_MODE = "prompt";
+-
+- public static final String RESTORE_MODE = "restore";
+-
+- /**
+- * Entry point of the
+- * @param args
+- */
+- public static void main(String[] args) throws IOException
+- {
+- ApplicationArguments.initialize(args);
+- initializeLogger();
+- boolean prompt = getMode(PROMPT_MODE);
+- boolean restore = getMode(RESTORE_MODE);
+- setupHelper();
+- if (!restore) {
+- helper.installUpdates(prompt);
+- helper.updateLaunchScript();
+- helper.copySplashImage();
+- } else {
+- helper.restoreFromBackup();
+- }
+- }
+-
+- // Helper methods
+-
+- private static void setupHelper()
+- {
+- PreLaunchHelperFactory preLaunchHelperFactory = new PreLaunchHelperFactoryImpl();
+- helper = preLaunchHelperFactory.createPreLaunchHelper();
+- }
+-
+- private static boolean getMode(String mode)
+- {
+- boolean prompt = false;
+- if (Boolean.getBoolean(mode)) {
+- prompt = true;
+- }
+- return prompt;
+- }
+-
+- private static void initializeLogger() throws IOException
+- {
+- String logConfigFileName = ApplicationArguments.getInstance().getLoggingConfigFileName();
+- if (logConfigFileName != null) {
+- PropertyConfigurator.configure(logConfigFileName);
+- } else {
+- ApplicationFiles appFiles = new ApplicationFiles();
+-
+- String logMessagePattern = "%-4r [%t] %-5p %c %x - %m%n";
+- Layout layout = new PatternLayout(logMessagePattern);
+-
+- File logsDir = new File(appFiles.getUserSettingsDirectory(), "logs");
+- File updateLogFile = new File(logsDir, "updater.log");
+-
+- FileAppender appender = new FileAppender(layout, updateLogFile.getAbsolutePath());
+-
+- LoggerController.registerLoggerFactory(new SquirrelLoggerFactory(appender, false));
+- }
+- }
+-
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/ProgressDialogController.java
++++ /dev/null
+@@ -1,58 +0,0 @@
+-/*
+- * Copyright (C) 2008 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui.installer;
+-
+-/**
+- * Interface for separating the display of progress for a long running task from the task that is updating it.
+- * This helps keeps UI code out of the business logic code.
+- */
+-public interface ProgressDialogController
+-{
+-
+- /**
+- * Shows a progress bar with the specified title and message, with the number of increments set to total.
+- *
+- * @param title
+- * the title of the dialog
+- * @param msg
+- * the message to display in the body of the dialog
+- * @param total
+- * the number of increments the bar is made of
+- */
+- void showProgressDialog(String title, String msg, int total);
+-
+- /**
+- * Updates the detail message in the progress bar dialog
+- *
+- * @param msg a new detail message for the body of the dialog
+- */
+- void setDetailMessage(String msg);
+-
+- /**
+- * Increments the currently displayed progress bar
+- */
+- void incrementProgress();
+-
+- void resetProgressDialog(String title, String msg, int total);
+-
+- /**
+- * Hides the currently displayed progress bar
+- */
+- void hideProgressDialog();
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/ProgressDialogControllerImpl.java
++++ /dev/null
+@@ -1,146 +0,0 @@
+-/*
+- * Copyright (C) 2008 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui.installer;
+-
+-import java.awt.BorderLayout;
+-import java.awt.Frame;
+-import java.awt.GridLayout;
+-
+-import javax.swing.JDialog;
+-import javax.swing.JLabel;
+-import javax.swing.JPanel;
+-import javax.swing.JProgressBar;
+-
+-import net.sourceforge.squirrel_sql.fw.gui.GUIUtils;
+-import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
+-import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
+-
+-/**
+- * Progress dialog controller that shows, updates and hides a single progress bar dialog.
+- */
+-public class ProgressDialogControllerImpl implements ProgressDialogController
+-{
+- /** the dialog being displayed */
+- private JDialog currentDialog = null;
+-
+- /** The message that appears in the dialog just above the detail message */
+- private JLabel currentMessage = null;
+-
+- /** The message that appears in the dialog just above the progress bar */
+- private JLabel detailMessage = null;
+-
+- /** the progress bar */
+- private JProgressBar currentProgressBar = null;
+-
+- /** Logger for this class. */
+- private static ILogger s_log = LoggerController.createLogger(ProgressDialogControllerImpl.class);
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.gui.installer.ProgressDialogController#hideProgressDialog()
+- */
+- public void hideProgressDialog()
+- {
+- s_log.info("Hiding dialog");
+- GUIUtils.processOnSwingEventThread(new Runnable()
+- {
+- public void run()
+- {
+- currentDialog.setVisible(false);
+- }
+- }, true);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.gui.installer.ProgressDialogController#incrementProgress()
+- */
+- public void incrementProgress()
+- {
+- s_log.info("incrementing progress");
+- GUIUtils.processOnSwingEventThread(new Runnable()
+- {
+- public void run()
+- {
+- int currentValue = currentProgressBar.getValue();
+- currentProgressBar.setValue(currentValue + 1);
+- }
+- }, true);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.gui.installer.ProgressDialogController#setDetailMessage(java.lang.String)
+- */
+- public void setDetailMessage(final String msg)
+- {
+- s_log.info("Setting detail message: "+msg);
+- GUIUtils.processOnSwingEventThread(new Runnable()
+- {
+- public void run()
+- {
+- detailMessage.setText(msg);
+- }
+- }, true);
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.gui.installer.ProgressDialogController#showProgressDialog(java.lang.String,
+- * java.lang.String, int)
+- */
+- public void showProgressDialog(final String title, final String msg, final int total)
+- {
+- s_log.info("showing progress dialog");
+- GUIUtils.processOnSwingEventThread(new Runnable()
+- {
+- public void run()
+- {
+- currentDialog = new JDialog((Frame) null, title);
+- currentMessage = new JLabel(msg);
+- detailMessage = new JLabel("...");
+- currentProgressBar = new JProgressBar(0, total - 1);
+-
+- JPanel panel = new JPanel(new BorderLayout());
+- JPanel messagePanel = new JPanel(new GridLayout(2,1));
+- messagePanel.add(currentMessage);
+- messagePanel.add(detailMessage);
+- panel.add(messagePanel, BorderLayout.CENTER);
+- panel.add(currentProgressBar, BorderLayout.SOUTH);
+-
+- currentDialog.getContentPane().add(panel);
+- currentDialog.setSize(300, 100);
+- GUIUtils.centerWithinScreen(currentDialog);
+- currentDialog.setVisible(true);
+- }
+- }, true);
+-
+- }
+-
+- public void resetProgressDialog(final String title, final String msg, final int total)
+- {
+- GUIUtils.processOnSwingEventThread(new Runnable() {
+- public void run() {
+- currentDialog.setTitle(title);
+- currentMessage.setText(msg);
+- currentProgressBar.setValue(0);
+- currentProgressBar.setMinimum(0);
+- currentProgressBar.setMaximum(total);
+- }
+- });
+-
+- }
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/SplashScreenFixer.java
++++ /dev/null
+@@ -1,78 +0,0 @@
+-package net.sourceforge.squirrel_sql.client.update.gui.installer;
+-
+-/*
+- * Copyright (C) 2010 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-
+-import net.sourceforge.squirrel_sql.fw.util.ScriptLineFixer;
+-
+-/**
+- * A line fixer implementation that adds the splash screen icon to the line that launches the SQuirreL
+- * application in the launcher scripts.
+- */
+-public class SplashScreenFixer implements ScriptLineFixer {
+-
+- /** The main class. Assumption is that this line is where the splash setting needs to be added */
+- public static final String CLIENT_MAIN_CLASS = "net.sourceforge.squirrel_sql.client.Main";
+-
+- /** The splash setting */
+- public static final String SPLASH_ICON = "splash.jpg";
+-
+- /** A regex pattern version of the main class */
+- private static final String MAIN_CLASS_PATTERN = "net\\.sourceforge\\.squirrel_sql\\.client\\.Main";
+-
+- /** The platform-dependent newline string */
+- public static String newline = System.getProperty("line.separator");
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.fw.util.ScriptLineFixer#fixLine(java.lang.String)
+- */
+- @Override
+- public String fixLine(String scriptFileName, String line) {
+- String result = line;
+-
+- String splashIconArgument = "-splash:" + SPLASH_ICON;
+- if (scriptFileName.toLowerCase().endsWith(".bat")) {
+- splashIconArgument = "-splash:\"%SQUIRREL_SQL_HOME%\\icons\\"+SPLASH_ICON+"\"";
+- } else {
+- splashIconArgument = "-splash:\"$SQUIRREL_SQL_HOME/icons/"+SPLASH_ICON+"\"";
+- }
+-
+- if (line.contains(CLIENT_MAIN_CLASS)) {
+- if (!line.contains(SPLASH_ICON)) {
+- String[] parts = line.split(MAIN_CLASS_PATTERN);
+- if (parts.length == 2) {
+- StringBuilder newline = new StringBuilder();
+- newline.append(parts[0]);
+- newline.append(" ");
+- newline.append(splashIconArgument);
+- newline.append(" ");
+- newline.append(CLIENT_MAIN_CLASS);
+- newline.append(" ");
+- newline.append(parts[1]);
+- result = newline.toString();
+- } else {
+- System.err.println("Uh-oh, expected parts to be 2");
+- }
+- }
+- }
+- return result;
+- }
+-
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/event/InstallEventType.java
++++ /dev/null
+@@ -1,76 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui.installer.event;
+-
+-
+-/**
+- * A type-safe enum to describe the type of an install event.
+- *
+- * @author manningr
+- *
+- */
+-public enum InstallEventType {
+-
+- /** change list initialization phase has started */
+- INIT_CHANGELIST_STARTED,
+-
+- FILE_INIT_CHANGELIST_STARTED,
+-
+- FILE_INIT_CHANGELIST_COMPLETE,
+-
+- /** change list initialization phase is complete */
+- INIT_CHANGELIST_COMPLETE,
+-
+- /** backup phase has started */
+- BACKUP_STARTED,
+-
+- /** a particular file is about to be backed up */
+- FILE_BACKUP_STARTED,
+-
+- /** a particular file has just been successfully backed up */
+- FILE_BACKUP_COMPLETE,
+-
+- /** backup phase has completed successfully */
+- BACKUP_COMPLETE,
+-
+- /** File removal phase has been started */
+- REMOVE_STARTED,
+-
+- /** file remove has started */
+- FILE_REMOVE_STARTED,
+-
+- /** file remove completed */
+- FILE_REMOVE_COMPLETE,
+-
+- /** File removal phase has completed successfully */
+- REMOVE_COMPLETE,
+-
+- /** install phase has started */
+- INSTALL_STARTED,
+-
+- /** a particular file is about to be installed */
+- FILE_INSTALL_STARTED,
+-
+- /** a particular file has just been successfully installed */
+- FILE_INSTALL_COMPLETE,
+-
+- /** install phase has completed successfully */
+- INSTALL_COMPLETE
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/event/InstallStatusEvent.java
++++ /dev/null
+@@ -1,93 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui.installer.event;
+-
+-import net.sourceforge.squirrel_sql.fw.util.Utilities;
+-
+-
+-/**
+- * An event implementation that informs the installer of key events that are
+- * happening during installation. The ArtifactInstaller generates these events as
+- * it is installing artifacts giving them to any listeners. The installer UI
+- * registers as a listener and updates the UI based on the events that it receives.
+- */
+-public class InstallStatusEvent {
+-
+- /** The name of the artifact being installed; typically a filename (e.g. fw.jar) */
+- private String _artifactName;
+-
+- /** The type of event that has occurred - see InstallEventType for detailed */
+- private InstallEventType _type;
+-
+- /** The number of files that will be added, replaced or removed */
+- private int numFilesToUpdate = 0;
+-
+- public InstallStatusEvent(InstallEventType type) {
+- Utilities.checkNull("InstallStatusEvent.init", "type", type);
+- this._type = type;
+- }
+-
+- /**
+- * @return the _artifactName
+- */
+- public String getArtifactName() {
+- return _artifactName;
+- }
+-
+- /**
+- * @param name the _artifactName to set
+- */
+- public void setArtifactName(String name) {
+- Utilities.checkNull("setArtifactName", "name", name);
+- _artifactName = name;
+- }
+-
+- /**
+- * @return the event type
+- */
+- public InstallEventType getType() {
+- return _type;
+- }
+-
+- /**
+- * @param _type the event type to set
+- */
+- public void setType(InstallEventType type) {
+- Utilities.checkNull("setType", "type", type);
+- this._type = type;
+- }
+-
+- /**
+- * @param numFilesToUpdate the numFilesToUpdate to set
+- */
+- public void setNumFilesToUpdate(int numFilesToUpdate)
+- {
+- this.numFilesToUpdate = numFilesToUpdate;
+- }
+-
+- /**
+- * @return the numFilesToUpdate
+- */
+- public int getNumFilesToUpdate()
+- {
+- return numFilesToUpdate;
+- }
+-
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/event/InstallStatusEventFactory.java
++++ /dev/null
+@@ -1,35 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui.installer.event;
+-
+-/**
+- * Interface for factory
+- *
+- * @author manningr
+- */
+-public interface InstallStatusEventFactory
+-{
+-
+- /**
+- * @param installEventType
+- * @return
+- */
+- InstallStatusEvent create(InstallEventType installEventType);
+-
+-}
+\ No newline at end of file
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/event/InstallStatusEventFactoryImpl.java
++++ /dev/null
+@@ -1,34 +0,0 @@
+-/*
+- * Copyright (C) 2008 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui.installer.event;
+-
+-/**
+- * Factory for install status events.
+- *
+- * @author manningr
+- */
+-public class InstallStatusEventFactoryImpl implements InstallStatusEventFactory
+-{
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.gui.installer.event.InstallStatusEventFactory#create(net.sourceforge.squirrel_sql.client.update.gui.installer.event.InstallEventType)
+- */
+- public InstallStatusEvent create(InstallEventType installEventType) {
+- return new InstallStatusEvent(installEventType);
+- }
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/event/InstallStatusListener.java
++++ /dev/null
+@@ -1,25 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui.installer.event;
+-
+-
+-public interface InstallStatusListener {
+-
+- void handleInstallStatusEvent(InstallStatusEvent evt);
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/event/InstallStatusListenerImpl.java
++++ /dev/null
+@@ -1,109 +0,0 @@
+-/*
+- * Copyright (C) 2008 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui.installer.event;
+-
+-import net.sourceforge.squirrel_sql.client.update.gui.installer.ProgressDialogController;
+-import net.sourceforge.squirrel_sql.fw.util.Utilities;
+-
+-public class InstallStatusListenerImpl implements InstallStatusListener
+-{
+-
+- ProgressDialogController _progressDialogController = null;
+-
+- /**
+- * @param progressDialogFactory
+- */
+- public InstallStatusListenerImpl(ProgressDialogController progressDialogFactory)
+- {
+- Utilities.checkNull("InstallStatusListenerImpl.init", "progressDialogFactory", progressDialogFactory);
+- this._progressDialogController = progressDialogFactory;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.gui.installer.event.InstallStatusListener#
+- *
+- *
+- * handleInstallStatusEvent(net.sourceforge.squirrel_sql.client.update.gui.installer.event.InstallStatusEvent)
+- */
+- public void handleInstallStatusEvent(InstallStatusEvent evt)
+- {
+- if (evt.getType() == InstallEventType.INIT_CHANGELIST_STARTED) {
+- _progressDialogController.showProgressDialog("Initializing File Change List", "Processing file:",
+- evt.getNumFilesToUpdate());
+- }
+- if (evt.getType() == InstallEventType.FILE_INIT_CHANGELIST_STARTED) {
+- _progressDialogController.setDetailMessage(evt.getArtifactName());
+- }
+- if (evt.getType() == InstallEventType.FILE_INIT_CHANGELIST_COMPLETE) {
+- _progressDialogController.incrementProgress();
+- }
+- if (evt.getType() == InstallEventType.INIT_CHANGELIST_COMPLETE) {
+- _progressDialogController.setDetailMessage("");
+- }
+- if (evt.getType() == InstallEventType.BACKUP_STARTED)
+- {
+- _progressDialogController.resetProgressDialog("Backing up files to be updated", "Backing up file:",
+- evt.getNumFilesToUpdate());
+- }
+- if (evt.getType() == InstallEventType.FILE_BACKUP_STARTED)
+- {
+- _progressDialogController.setDetailMessage(evt.getArtifactName());
+- }
+- if (evt.getType() == InstallEventType.FILE_BACKUP_COMPLETE)
+- {
+- _progressDialogController.incrementProgress();
+- }
+- if (evt.getType() == InstallEventType.BACKUP_COMPLETE)
+- {
+- _progressDialogController.setDetailMessage("");
+- }
+-
+- if (evt.getType() == InstallEventType.REMOVE_STARTED) {
+- _progressDialogController.resetProgressDialog("Removing file to be updated", "Removing file:",
+- evt.getNumFilesToUpdate());
+- }
+- if (evt.getType() == InstallEventType.FILE_REMOVE_STARTED) {
+- _progressDialogController.setDetailMessage(evt.getArtifactName());
+- }
+- if (evt.getType() == InstallEventType.FILE_REMOVE_STARTED) {
+- _progressDialogController.incrementProgress();
+- }
+- if (evt.getType() == InstallEventType.REMOVE_COMPLETE) {
+- _progressDialogController.setDetailMessage("");
+- }
+- if (evt.getType() == InstallEventType.INSTALL_STARTED)
+- {
+- _progressDialogController.resetProgressDialog("Installing updated files", "Installing file:",
+- evt.getNumFilesToUpdate());
+- }
+- if (evt.getType() == InstallEventType.FILE_INSTALL_STARTED)
+- {
+- _progressDialogController.setDetailMessage(evt.getArtifactName());
+- }
+- if (evt.getType() == InstallEventType.FILE_INSTALL_COMPLETE)
+- {
+- _progressDialogController.incrementProgress();
+- }
+- if (evt.getType() == InstallEventType.INSTALL_COMPLETE)
+- {
+- _progressDialogController.hideProgressDialog();
+- }
+- }
+-
+-}
+\ No newline at end of file
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/util/InstallFileOperationInfo.java
++++ /dev/null
+@@ -1,55 +0,0 @@
+-/*
+- * Copyright (C) 2008 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui.installer.util;
+-
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapper;
+-
+-public interface InstallFileOperationInfo {
+-
+- /**
+- * @return the fileToInstall
+- */
+- FileWrapper getFileToInstall();
+-
+- /**
+- * @return the installDir
+- */
+- FileWrapper getInstallDir();
+-
+- /**
+- * @return the isPlugin
+- */
+- public boolean isPlugin();
+-
+- /**
+- * @param isPlugin the isPlugin to set
+- */
+- public void setPlugin(boolean isPlugin);
+-
+- /**
+- * @param artifactName the artifactName to set
+- */
+- public void setArtifactName(String artifactName);
+-
+- /**
+- * @return the artifactName
+- */
+- public String getArtifactName();
+-
+-}
+\ No newline at end of file
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/util/InstallFileOperationInfoFactory.java
++++ /dev/null
+@@ -1,26 +0,0 @@
+-/*
+- * Copyright (C) 2008 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui.installer.util;
+-
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapper;
+-
+-public interface InstallFileOperationInfoFactory {
+-
+- InstallFileOperationInfo create(FileWrapper fileToCopy, FileWrapper installDir);
+-}
+\ No newline at end of file
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/util/InstallFileOperationInfoFactoryImpl.java
++++ /dev/null
+@@ -1,31 +0,0 @@
+-/*
+- * Copyright (C) 2008 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui.installer.util;
+-
+-import static net.sourceforge.squirrel_sql.fw.util.Utilities.checkNull;
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapper;
+-
+-public class InstallFileOperationInfoFactoryImpl implements InstallFileOperationInfoFactory {
+-
+-
+- public InstallFileOperationInfo create(FileWrapper fileToCopy, FileWrapper installDir) {
+- checkNull("InstallFileOperationInfo", "fileToCopy",fileToCopy, "installDir", installDir);
+- return new InstallFileOperationInfoImpl(fileToCopy, installDir);
+- }
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/gui/installer/util/InstallFileOperationInfoImpl.java
++++ /dev/null
+@@ -1,94 +0,0 @@
+-/*
+- * Copyright (C) 2008 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.gui.installer.util;
+-
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapper;
+-
+-public class InstallFileOperationInfoImpl implements InstallFileOperationInfo {
+-
+- private FileWrapper fileToInstall;
+- private FileWrapper installDir;
+- private boolean isPlugin;
+- private String artifactName;
+-
+- /**
+- * @param fileToInstall
+- * @param installDir
+- */
+- public InstallFileOperationInfoImpl(FileWrapper fileToInstall, FileWrapper installDir) {
+- super();
+- this.fileToInstall = fileToInstall;
+- this.installDir = installDir;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.gui.installer.util.InstallFileOperationInfo#getFileToInstall()
+- */
+- public FileWrapper getFileToInstall() {
+- return fileToInstall;
+- }
+- /**
+- * @param fileToInstall the fileToInstall to set
+- */
+- public void setFileToInstall(FileWrapper fileToInstall) {
+- this.fileToInstall = fileToInstall;
+- }
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.gui.installer.util.InstallFileOperationInfo#getInstallDir()
+- */
+- public FileWrapper getInstallDir() {
+- return installDir;
+- }
+- /**
+- * @return the isPlugin
+- */
+- public boolean isPlugin() {
+- return isPlugin;
+- }
+-
+- /**
+- * @param isPlugin the isPlugin to set
+- */
+- public void setPlugin(boolean isPlugin) {
+- this.isPlugin = isPlugin;
+- }
+-
+- /**
+- * @param installDir the installDir to set
+- */
+- public void setInstallDir(FileWrapper installDir) {
+- this.installDir = installDir;
+- }
+-
+- /**
+- * @param artifactName the artifactName to set
+- */
+- public void setArtifactName(String artifactName)
+- {
+- this.artifactName = artifactName;
+- }
+-
+- /**
+- * @return the artifactName
+- */
+- public String getArtifactName()
+- {
+- return artifactName;
+- }
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/util/PathUtils.java
++++ /dev/null
+@@ -1,45 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.util;
+-
+-public interface PathUtils
+-{
+-
+- /**
+- * Constructs a path out of the pathElements.
+- *
+- * @param prependSlash
+- * if true this will ensure that the result begins with "/".
+- * @param pathElements
+- * the strings to connect. They can have "/" in them which will be de-duped in the result, if
+- * necessary.
+- * @return the path that was constructed.
+- */
+- public abstract String buildPath(boolean prependSlash, String... pathElements);
+-
+- /**
+- * Returns the file part of the specified path.
+- *
+- * @param path
+- * the path
+- * @return the file part of the path
+- */
+- public abstract String getFileFromPath(String path);
+-
+-}
+\ No newline at end of file
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/util/PathUtilsImpl.java
++++ /dev/null
+@@ -1,71 +0,0 @@
+-/*
+- * Copyright (C) 2008 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.util;
+-
+-/**
+- * A utility class for manipulating paths
+- *
+- * @author manningr
+- */
+-public class PathUtilsImpl implements PathUtils
+-{
+- /**
+- * Constructs a path out of the pathElements.
+- *
+- * @param prependSlash
+- * if true this will ensure that the result begins with "/".
+- * @param pathElements
+- * the strings to connect. They can have "/" in them which will be de-duped in the result, if
+- * necessary.
+- * @return the path that was constructed.
+- */
+- public String buildPath(boolean prependSlash, String... pathElements)
+- {
+- StringBuilder result = new StringBuilder("/");
+-
+- for (String pathElement : pathElements)
+- {
+- result.append(pathElement).append("/");
+- }
+-
+- String retVal = result.toString().replace("//", "/").replace("//", "/");
+-
+- if (retVal.endsWith("/"))
+- {
+- retVal = retVal.substring(0, retVal.length() - 1);
+- }
+-
+- return retVal;
+- }
+-
+- /**
+- * Returns the file part of the specified path.
+- *
+- * @param path
+- * the path
+- * @return the file part of the path
+- */
+- public String getFileFromPath(String path)
+- {
+- if (path.indexOf("/") == -1) { return path; }
+- int slashIndex = path.lastIndexOf("/");
+- return path.substring(slashIndex+1);
+- }
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/xmlbeans/ArtifactXmlBean.java
++++ /dev/null
+@@ -1,224 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.xmlbeans;
+-
+-import java.io.Serializable;
+-
+-/**
+- * This describes a single artifact. An artifact is simply a file resource
+- * required in a given release.
+- *
+- * @author manningr
+- */
+-public class ArtifactXmlBean implements Serializable {
+-
+- private static final long serialVersionUID = -6653935534454353144L;
+-
+- private String name;
+-
+- private String type;
+-
+- private String version;
+-
+- private long size;
+-
+- private long checksum;
+-
+- private boolean installed = false;
+-
+- public ArtifactXmlBean() {
+-
+- }
+-
+- public ArtifactXmlBean(String name, String type, String version, long size,
+- long checksum) {
+-
+- this.name = name;
+- this.type = type;
+- this.version = version;
+- this.size = size;
+- this.checksum = checksum;
+- }
+-
+- /**
+- * @return the name
+- */
+- public String getName() {
+- return name;
+- }
+-
+- /**
+- * @param name the name to set
+- */
+- public void setName(String name) {
+- this.name = name;
+- }
+-
+- /**
+- * @return the type
+- */
+- public String getType() {
+- return type;
+- }
+-
+- /**
+- * @param type the type to set
+- */
+- public void setType(String type) {
+- this.type = type;
+- }
+-
+- /**
+- * @return the version
+- */
+- public String getVersion() {
+- return version;
+- }
+-
+- /**
+- * @param version the version to set
+- */
+- public void setVersion(String version) {
+- this.version = version;
+- }
+-
+- /**
+- * @return the size
+- */
+- public long getSize() {
+- return size;
+- }
+-
+- /**
+- * @param size the size to set
+- */
+- public void setSize(long size) {
+- this.size = size;
+- }
+-
+- /**
+- * @return the checksum
+- */
+- public long getChecksum() {
+- return checksum;
+- }
+-
+- /**
+- * @param checksum the checksum to set
+- */
+- public void setChecksum(long checksum) {
+- this.checksum = checksum;
+- }
+-
+- /**
+- * @return the installed
+- */
+- public boolean isInstalled() {
+- return installed;
+- }
+-
+- /**
+- * @param installed the installed to set
+- */
+- public void setInstalled(boolean installed) {
+- this.installed = installed;
+- }
+-
+- /**
+- * @see java.lang.Object#hashCode()
+- */
+- @Override
+- public int hashCode() {
+- final int prime = 31;
+- int result = 1;
+- result = prime * result + (int) (checksum ^ (checksum >>> 32));
+- result = prime * result + ((name == null) ? 0 : name.hashCode());
+- result = prime * result + (int) (size ^ (size >>> 32));
+- result = prime * result + ((type == null) ? 0 : type.hashCode());
+- result = prime * result + ((version == null) ? 0 : version.hashCode());
+- return result;
+- }
+-
+- /**
+- * Artifacts that differ only by whether or not they are installed are still
+- * considered equal for the purpose of figuring out whether the user has the
+- * latest software.
+- *
+- * @see java.lang.Object#equals(java.lang.Object)
+- */
+- @Override
+- public boolean equals(Object obj) {
+- if (this == obj)
+- return true;
+- if (obj == null)
+- return false;
+- if (getClass() != obj.getClass())
+- return false;
+- final ArtifactXmlBean other = (ArtifactXmlBean) obj;
+- if (checksum != other.checksum)
+- return false;
+- if (name == null) {
+- if (other.name != null)
+- return false;
+- } else if (!name.equals(other.name))
+- return false;
+- if (size != other.size)
+- return false;
+- if (type == null) {
+- if (other.type != null)
+- return false;
+- } else if (!type.equals(other.type))
+- return false;
+- if (version == null) {
+- if (other.version != null)
+- return false;
+- } else if (!version.equals(other.version))
+- return false;
+- return true;
+- }
+-
+- /**
+- * Constructs a <code>String</code> with all attributes
+- * in name = value format.
+- *
+- * @return a <code>String</code> representation
+- * of this object.
+- */
+- @Override
+- public String toString()
+- {
+- final String TAB = " ";
+-
+- StringBuilder retValue = new StringBuilder();
+-
+- retValue.append("ArtifactXmlBean ( ")
+- .append(super.toString()).append(TAB)
+- .append("name = ").append(this.name).append(TAB)
+- .append("type = ").append(this.type).append(TAB)
+- .append("version = ").append(this.version).append(TAB)
+- .append("size = ").append(this.size).append(TAB)
+- .append("checksum = ").append(this.checksum).append(TAB)
+- .append("installed = ").append(this.installed).append(TAB)
+- .append(" )");
+-
+- return retValue.toString();
+- }
+-
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/xmlbeans/ChangeListXmlBean.java
++++ /dev/null
+@@ -1,55 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.xmlbeans;
+-
+-import java.io.Serializable;
+-import java.util.List;
+-
+-import net.sourceforge.squirrel_sql.client.update.gui.ArtifactStatus;
+-
+-/**
+- * This bean is a javabean representation of the data in changeList.xml which is captured from the user's
+- * changes that are made using the update feature.
+- *
+- * @author manningr
+- */
+-public class ChangeListXmlBean implements Serializable {
+-
+- private static final long serialVersionUID = -5388272506303651886L;
+-
+- /** the changes to make */
+- private List<ArtifactStatus> changes = null;
+-
+- /**
+- * @return the _changes
+- */
+- public List<ArtifactStatus> getChanges() {
+- return changes;
+- }
+-
+- /**
+- * @param _changes the _changes to set
+- */
+- public void setChanges(List<ArtifactStatus> changes) {
+- this.changes = changes;
+- }
+-
+-
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/xmlbeans/ChannelXmlBean.java
++++ /dev/null
+@@ -1,119 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.xmlbeans;
+-
+-public class ChannelXmlBean {
+-
+- private String name;
+-
+- private ReleaseXmlBean currentRelease;
+-
+- /**
+- * @return the name
+- */
+- public String getName() {
+- return name;
+- }
+-
+- /**
+- * @param name the name to set
+- */
+- public void setName(String name) {
+- this.name = name;
+- }
+-
+- /**
+- * @return the currentRelease
+- */
+- public ReleaseXmlBean getCurrentRelease() {
+- return currentRelease;
+- }
+-
+- /**
+- * @param currentRelease the currentRelease to set
+- */
+- public void setCurrentRelease(ReleaseXmlBean currentRelease) {
+- this.currentRelease = currentRelease;
+- }
+-
+- /**
+- * @see java.lang.Object#hashCode()
+- */
+- @Override
+- public int hashCode() {
+- final int prime = 31;
+- int result = 1;
+- result = prime * result
+- + ((currentRelease == null) ? 0 : currentRelease.hashCode());
+- result = prime * result + ((name == null) ? 0 : name.hashCode());
+- return result;
+- }
+-
+- /**
+- * @see java.lang.Object#equals(java.lang.Object)
+- */
+- @Override
+- public boolean equals(Object obj) {
+- if (this == obj)
+- return true;
+- if (obj == null)
+- return false;
+- if (getClass() != obj.getClass())
+- return false;
+- final ChannelXmlBean other = (ChannelXmlBean) obj;
+- if (currentRelease == null) {
+- if (other.currentRelease != null)
+- return false;
+- } else if (!currentRelease.equals(other.currentRelease))
+- return false;
+- if (name == null) {
+- if (other.name != null)
+- return false;
+- } else if (!name.equals(other.name))
+- return false;
+- return true;
+- }
+-
+- /**
+- * Constructs a <code>String</code> with all attributes
+- * in name = value format.
+- *
+- * @return a <code>String</code> representation
+- * of this object.
+- */
+- @Override
+- public String toString()
+- {
+- final String TAB = " ";
+-
+- StringBuilder retValue = new StringBuilder();
+-
+- retValue.append("ChannelXmlBean ( ")
+- .append(super.toString()).append(TAB)
+- .append("name = ").append(this.name).append(TAB)
+- .append("currentRelease = ").append(this.currentRelease).append(TAB)
+- .append(" )");
+-
+- return retValue.toString();
+- }
+-
+-
+-
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/xmlbeans/EnumPersistenceDelegate.java
++++ /dev/null
+@@ -1,58 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.xmlbeans;
+-
+-import java.beans.BeanInfo;
+-import java.beans.DefaultPersistenceDelegate;
+-import java.beans.Encoder;
+-import java.beans.Expression;
+-import java.beans.IntrospectionException;
+-import java.beans.Introspector;
+-
+- at SuppressWarnings("unchecked")
+-public class EnumPersistenceDelegate extends DefaultPersistenceDelegate {
+-
+- private static EnumPersistenceDelegate INSTANCE = new EnumPersistenceDelegate();
+-
+- public static void installFor(Enum<?>[] values) {
+- Class<? extends Enum> declaringClass = values[0].getDeclaringClass();
+- installFor(declaringClass);
+-
+- for (Enum<?> e : values)
+- if (e.getClass() != declaringClass)
+- installFor(e.getClass());
+- }
+-
+- public static void installFor(Class<? extends Enum> enumClass) {
+- try {
+- BeanInfo info = Introspector.getBeanInfo( enumClass );
+- info.getBeanDescriptor().setValue( "persistenceDelegate", INSTANCE );
+- } catch( IntrospectionException exception ) {
+- throw new RuntimeException("Unable to persist enumerated type "+enumClass, exception);
+- }
+- }
+-
+- protected Expression instantiate(Object oldInstance, Encoder out) {
+- Enum e = (Enum)oldInstance;
+- return new Expression(Enum.class,
+- "valueOf",
+- new Object[] { e.getDeclaringClass(),
+- e.name() });
+- }
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/xmlbeans/ModuleType.java
++++ /dev/null
+@@ -1,33 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.xmlbeans;
+-
+-import java.io.Serializable;
+-
+-/**
+- * An enum that defines the types of modules that will be available for the
+- * user to choose to install/update.
+- *
+- * @author manningr
+- */
+-public enum ModuleType implements Serializable {
+- CORE,
+- PLUGIN,
+- I18N
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/xmlbeans/ModuleXmlBean.java
++++ /dev/null
+@@ -1,79 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.xmlbeans;
+-
+-import java.io.Serializable;
+-import java.util.HashSet;
+-import java.util.Set;
+-
+-/**
+- * A module is a group of Artifacts that work together to provide of unit of
+- * functionality. For instance, each plugin is a module; the core jars
+- * squirrel-sql.jar and fw.jar are together a module.
+- *
+- * @author manningr
+- *
+- */
+-public class ModuleXmlBean implements Serializable {
+-
+- private static final long serialVersionUID = -6047289718869161323L;
+-
+- private String name;
+-
+- private Set<ArtifactXmlBean> artifacts = new HashSet<ArtifactXmlBean>();
+-
+- /**
+- * @return the name
+- */
+- public String getName() {
+- return name;
+- }
+-
+- /**
+- * @param name the name to set
+- */
+- public void setName(String name) {
+- this.name = name;
+- }
+-
+- /**
+- * @return the artifacts
+- */
+- public Set<ArtifactXmlBean> getArtifacts() {
+- return artifacts;
+- }
+-
+- /**
+- * @param artifacts the artifacts to set
+- */
+- public void setArtifacts(Set<ArtifactXmlBean> artifacts) {
+- this.artifacts = artifacts;
+- }
+-
+- /**
+- * Adds an artifact to the set.
+- *
+- * @param artifact the artifact to add.
+- */
+- public void addArtifact(ArtifactXmlBean artifact) {
+- this.artifacts.add(artifact);
+- }
+-
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/xmlbeans/ReleaseXmlBean.java
++++ /dev/null
+@@ -1,243 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.xmlbeans;
+-
+-import java.io.Serializable;
+-import java.text.DateFormat;
+-import java.text.SimpleDateFormat;
+-import java.util.Date;
+-import java.util.HashSet;
+-import java.util.Set;
+-
+-/**
+- * This class defines the data items that compose a release.
+- *
+- * @author manningr
+- */
+-public class ReleaseXmlBean implements Serializable
+-{
+-
+- private static final long serialVersionUID = -7311033877370497900L;
+-
+- /** The name of the release (like "snapshot", "stable", etc.) */
+- private String name;
+-
+- /** The version of the release */
+- private String version;
+-
+- private Date createTime;
+-
+- private Date lastModifiedTime;
+-
+- /** Artifacts are things like jarfiles, property files, and the like */
+- Set<ModuleXmlBean> modules = new HashSet<ModuleXmlBean>();
+-
+- private DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'_'HH:mm:ss.SSSZ");
+-
+- public ReleaseXmlBean()
+- {
+- createTime = new Date();
+- lastModifiedTime = createTime;
+- }
+-
+- public ReleaseXmlBean(String name, String version)
+- {
+- this();
+- this.name = name;
+- this.version = version;
+- }
+-
+- /**
+- * @return the name
+- */
+- public String getName()
+- {
+- return name;
+- }
+-
+- /**
+- * @param name
+- * the name to set
+- */
+- public void setName(String name)
+- {
+- this.name = name;
+- lastModifiedTime = new Date();
+- }
+-
+- /**
+- * @return the version
+- */
+- public String getVersion()
+- {
+- return version;
+- }
+-
+- /**
+- * @param version
+- * the version to set
+- */
+- public void setVersion(String version)
+- {
+- this.version = version;
+- lastModifiedTime = new Date();
+- }
+-
+- /**
+- * @return the artifacts
+- */
+- public Set<ModuleXmlBean> getModules()
+- {
+- return modules;
+- }
+-
+- /**
+- * @param modules
+- * the modules to set
+- */
+- public void setModules(Set<ModuleXmlBean> modules)
+- {
+- this.modules = modules;
+- lastModifiedTime = new Date();
+- }
+-
+- /**
+- * @param module
+- */
+- public void addmodule(ModuleXmlBean module)
+- {
+- if (module == null) { return; }
+- this.modules.add(module);
+- lastModifiedTime = new Date();
+- }
+-
+- /**
+- * @see java.lang.Object#hashCode()
+- */
+- @Override
+- public int hashCode()
+- {
+- final int prime = 31;
+- int result = 1;
+- result = prime * result + ((name == null) ? 0 : name.hashCode());
+- result = prime * result + ((version == null) ? 0 : version.hashCode());
+- return result;
+- }
+-
+- /**
+- * @see java.lang.Object#equals(java.lang.Object)
+- */
+- @Override
+- public boolean equals(Object obj)
+- {
+- if (this == obj) return true;
+- if (obj == null) return false;
+- if (getClass() != obj.getClass()) return false;
+- final ReleaseXmlBean other = (ReleaseXmlBean) obj;
+- if (name == null)
+- {
+- if (other.name != null) return false;
+- }
+- else if (!name.equals(other.name)) return false;
+- if (version == null)
+- {
+- if (other.version != null) return false;
+- }
+- else if (!version.equals(other.version)) return false;
+- return true;
+- }
+-
+- /**
+- * @return the createTime
+- */
+- public String getCreateTime()
+- {
+-
+- return dateFormat.format(createTime);
+- }
+-
+- /**
+- * @param createTime
+- * the createTime to set
+- */
+- public void setCreateTime(Date createTime)
+- {
+- if (createTime == null) {
+- return;
+- }
+- this.createTime = createTime;
+- }
+-
+- /**
+- * @return the lastModifiedTime
+- */
+- public String getLastModifiedTime()
+- {
+- return dateFormat.format(lastModifiedTime);
+- }
+-
+- /**
+- * @param lastModifiedTime
+- * the lastModifiedTime to set
+- */
+- public void setLastModifiedTime(Date lastModifiedTime)
+- {
+- if (lastModifiedTime == null) { return; }
+- this.lastModifiedTime = lastModifiedTime;
+- }
+-
+- /**
+- * Constructs a <code>String</code> with all attributes in name = value format.
+- *
+- * @return a <code>String</code> representation of this object.
+- */
+- @Override
+- public String toString()
+- {
+- final String TAB = " ";
+-
+- StringBuilder retValue = new StringBuilder();
+-
+- retValue.append("ReleaseXmlBean ( ")
+- .append(super.toString())
+- .append(TAB)
+- .append("name = ")
+- .append(this.name)
+- .append(TAB)
+- .append("version = ")
+- .append(this.version)
+- .append(TAB)
+- .append("createTime = ")
+- .append(this.createTime)
+- .append(TAB)
+- .append("lastModifiedTime = ")
+- .append(this.lastModifiedTime)
+- .append(TAB)
+- .append("modules = ")
+- .append(this.modules)
+- .append(TAB)
+- .append("dateFormat = ")
+- .append(this.dateFormat)
+- .append(TAB)
+- .append(" )");
+-
+- return retValue.toString();
+- }
+-
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/xmlbeans/UpdateXmlSerializer.java
++++ /dev/null
+@@ -1,96 +0,0 @@
+-/*
+- * Copyright (C) 2008 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.xmlbeans;
+-
+-import java.io.FileNotFoundException;
+-import java.io.IOException;
+-import java.io.InputStream;
+-
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapper;
+-
+-public interface UpdateXmlSerializer {
+-
+- /**
+- * Writes the specified Release XMLBean to the specified file.
+- *
+- * @param channelBean
+- * the bean to write.
+- * @param filename
+- * the filename of the file to write to.
+- * @throws FileNotFoundException
+- * if the specified file could not be written to
+- *
+- */
+- void write(ChannelXmlBean channelBean, String filename) throws FileNotFoundException;
+-
+- /**
+- * Writes the specified ChangeList XMLBean to the specified file.
+- *
+- * @param changeBean
+- * the bean to write
+- * @param filename
+- * the filename of the file to write to
+- *
+- * @throws FileNotFoundException
+- * if the specified file could not be written to
+- */
+- void write(ChangeListXmlBean changeBean, String filename) throws FileNotFoundException;
+-
+- /**
+- * Writes the specified ChangeList XMLBean to the specified file.
+- *
+- * @param changeBean
+- * the bean to write
+- * @param filename
+- * the filename of the file to write to
+- *
+- * @throws FileNotFoundException
+- * if the specified file could not be written to
+- */
+- void write(ChangeListXmlBean changeBean, FileWrapper file) throws FileNotFoundException;
+-
+- /**
+- * Reads a Channel XMLBean from the specified file.
+- *
+- * @param filename
+- * the filename of the file to read the XML bean from.
+- * @throws IOException
+- * @throws FileNotFoundException
+- *
+- * @throws Exception
+- * if any IO exceptions occurr.
+- */
+- ChannelXmlBean readChannelBean(String filename) throws FileNotFoundException, IOException;
+-
+- ChannelXmlBean readChannelBean(FileWrapper fileWrapper) throws FileNotFoundException, IOException;
+-
+- /**
+- * Reads a Channel XMLBean from the specified InputStream.
+- *
+- * @param is
+- * the InputStream to read the XML bean from.
+- *
+- * @throws Exception
+- * if any IO exceptions occurr.
+- */
+- ChannelXmlBean readChannelBean(InputStream is) throws IOException;
+-
+- ChangeListXmlBean readChangeListBean(FileWrapper file) throws FileNotFoundException;
+-
+-}
+\ No newline at end of file
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/xmlbeans/UpdateXmlSerializerImpl.java
++++ /dev/null
+@@ -1,158 +0,0 @@
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-package net.sourceforge.squirrel_sql.client.update.xmlbeans;
+-
+-import java.beans.XMLDecoder;
+-import java.beans.XMLEncoder;
+-import java.io.BufferedInputStream;
+-import java.io.BufferedOutputStream;
+-import java.io.File;
+-import java.io.FileInputStream;
+-import java.io.FileNotFoundException;
+-import java.io.FileOutputStream;
+-import java.io.IOException;
+-import java.io.InputStream;
+-
+-import net.sourceforge.squirrel_sql.client.update.gui.ArtifactAction;
+-import net.sourceforge.squirrel_sql.fw.util.FileWrapper;
+-import net.sourceforge.squirrel_sql.fw.util.IOUtilities;
+-import net.sourceforge.squirrel_sql.fw.util.IOUtilitiesImpl;
+-
+-/**
+- * This class contains utility methods that can be used to read from and write
+- * to files containing release xml beans. The decision to use Java's XML beans
+- * support over nanoxml was difficult. If I go with nanoxml, I believe I would
+- * need a beaninfo class and some data structures might not work. Also, if we
+- * want to eliminate dependency on nanoxml, using the inherent capabilities in
+- * Java 5 seemed to be a wiser approach.
+- *
+- * @author manningr
+- */
+-public class UpdateXmlSerializerImpl implements UpdateXmlSerializer {
+-
+- /** Allows for encoding enums. */
+- private EnumPersistenceDelegate enumDelegate = new EnumPersistenceDelegate();
+-
+- private IOUtilities _iou = new IOUtilitiesImpl();
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.xmlbeans.UpdateXmlSerializer#write(net.sourceforge.squirrel_sql.client.update.xmlbeans.ChannelXmlBean, java.lang.String)
+- */
+- public void write(ChannelXmlBean channelBean, String filename)
+- throws FileNotFoundException {
+- XMLEncoder os = getXmlEncoder(filename);
+- os.writeObject(channelBean);
+- os.close();
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.xmlbeans.UpdateXmlSerializer#write(net.sourceforge.squirrel_sql.client.update.xmlbeans.ChangeListXmlBean, java.lang.String)
+- */
+- public void write(ChangeListXmlBean changeBean, String filename)
+- throws FileNotFoundException {
+- XMLEncoder os = getXmlEncoder(filename);
+- os.writeObject(changeBean);
+- os.close();
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.xmlbeans.UpdateXmlSerializer#write(net.sourceforge.squirrel_sql.client.update.xmlbeans.ChangeListXmlBean, net.sourceforge.squirrel_sql.fw.util.FileWrapper)
+- */
+- public void write(ChangeListXmlBean changeBean, FileWrapper file)
+- throws FileNotFoundException {
+- XMLEncoder os = getXmlEncoder(file.getAbsolutePath());
+- os.writeObject(changeBean);
+- os.close();
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.xmlbeans.UpdateXmlSerializer#readChannelBean(java.lang.String)
+- */
+- public ChannelXmlBean readChannelBean(String filename) throws FileNotFoundException,
+- IOException {
+- if (filename == null) {
+- throw new IllegalArgumentException("filename cannot be null");
+- }
+- return readChannelBean(new FileInputStream(filename));
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.xmlbeans.UpdateXmlSerializer#readChannelBean(net.sourceforge.squirrel_sql.fw.util.FileWrapper)
+- */
+- public ChannelXmlBean readChannelBean(FileWrapper fileWrapper) throws FileNotFoundException,
+- IOException {
+- ChannelXmlBean result = null;
+- BufferedInputStream is = null;
+- try {
+- is = new BufferedInputStream(new FileInputStream(fileWrapper.getAbsolutePath()));
+- result = readChannelBean(is);
+- } finally {
+- _iou.closeInputStream(is);
+- }
+- return result;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.xmlbeans.UpdateXmlSerializer#readChannelBean(java.io.InputStream)
+- */
+- public ChannelXmlBean readChannelBean(InputStream is) throws IOException {
+- XMLDecoder bis = null;
+- Object result = null;
+- try {
+- bis = new XMLDecoder(new BufferedInputStream(is));
+- result = bis.readObject();
+- } finally {
+- if (is != null) {
+- is.close();
+- }
+- }
+- return (ChannelXmlBean) result;
+- }
+-
+- /**
+- * @see net.sourceforge.squirrel_sql.client.update.xmlbeans.UpdateXmlSerializer#readChangeListBean(net.sourceforge.squirrel_sql.fw.util.FileWrapper)
+- */
+- public ChangeListXmlBean readChangeListBean(FileWrapper file)
+- throws FileNotFoundException {
+- XMLDecoder bis = null;
+- FileInputStream fis = null;
+- Object result = null;
+- try {
+- fis = new FileInputStream(new File(file.getAbsolutePath()));
+- bis = new XMLDecoder(new BufferedInputStream(fis));
+- result = bis.readObject();
+- } finally {
+- _iou.closeInputStream(fis);
+- if (bis != null) {
+- bis.close();
+- }
+- }
+- return (ChangeListXmlBean) result;
+- }
+-
+- private XMLEncoder getXmlEncoder(String filename)
+- throws FileNotFoundException {
+- XMLEncoder result = null;
+- BufferedOutputStream os =
+- new BufferedOutputStream(new FileOutputStream(filename));
+- result = new XMLEncoder(os);
+- result.setPersistenceDelegate(ArtifactAction.class, enumDelegate);
+- return result;
+- }
+-}
+--- a/app/src/main/java/net/sourceforge/squirrel_sql/client/update/xmlbeans/XmlBeanUtilities.java
++++ /dev/null
+@@ -1,119 +0,0 @@
+-package net.sourceforge.squirrel_sql.client.update.xmlbeans;
+-
+-/*
+- * Copyright (C) 2007 Rob Manning
+- * manningr at users.sourceforge.net
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2.1 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-
+-import java.io.File;
+-import java.io.IOException;
+-import java.util.Date;
+-
+-import net.sourceforge.squirrel_sql.client.ApplicationArguments;
+-import net.sourceforge.squirrel_sql.client.update.UpdateUtil;
+-import net.sourceforge.squirrel_sql.fw.util.IOUtilities;
+-import net.sourceforge.squirrel_sql.fw.util.IOUtilitiesImpl;
+-
+-/**
+- * Utility methods for working with XmlBeans. This will be used mostly for building releases.
+- *
+- * @author manningr
+- */
+-public class XmlBeanUtilities {
+-
+- private IOUtilities _iou = new IOUtilitiesImpl();
+-
+- /**
+- * This will create a ChannelXmlBean that describes a release as it is found in the specified directory,
+- * using the specified releaseName and version.
+- *
+- * @param channelName
+- * the name of the channel.
+- * @param releaseName
+- * the name of the release.
+- * @param version
+- * the version of the release.
+- * @param directory
+- * the directory to use as the top-level of the release.
+- *
+- * @return
+- */
+- public ChannelXmlBean buildChannelRelease(String channelName, String releaseName, String version,
+- String directory) throws IOException {
+- ChannelXmlBean result = new ChannelXmlBean();
+- result.setName(channelName);
+- ReleaseXmlBean releaseBean = new ReleaseXmlBean(releaseName, version);
+- releaseBean.setCreateTime(new Date());
+- File dir = new File(directory);
+- for (File f : dir.listFiles()) {
+- System.out.println("Processing module directory: " + f);
+- if (f.isDirectory()) {
+- // f is a module
+- ModuleXmlBean module = new ModuleXmlBean();
+- module.setName(f.getName());
+- for (File a : f.listFiles()) {
+-
+- String filename = a.getName();
+- System.out.println("Processing artifact file: " + filename);
+- String type = filename.substring(filename.indexOf(".") + 1);
+- ArtifactXmlBean artifact = new ArtifactXmlBean();
+- artifact.setName(a.getName());
+- artifact.setType(type);
+- artifact.setVersion(version);
+- artifact.setSize(a.length());
+- artifact.setChecksum(_iou.getCheckSum(a));
+- module.addArtifact(artifact);
+- }
+- releaseBean.addmodule(module);
+- }
+- }
+- result.setCurrentRelease(releaseBean);
+- return result;
+- }
+-
+- /**
+- * This is used by the build script to automate building the release.xml file that describes what is
+- * available in a particular release.
+- *
+- * @param args
+- * @throws Exception
+- */
+- public static void main(String[] args) throws Exception {
+- ApplicationArguments.initialize(new String[0]);
+- if (args.length != 3) {
+- printUsage();
+- } else {
+- File f = new File(args[2], UpdateUtil.RELEASE_XML_FILENAME);
+- String filename = f.getAbsolutePath();
+- if (f.exists()) {
+- System.err.println("File " + filename + " appears to already exist");
+- } else {
+- XmlBeanUtilities util = new XmlBeanUtilities();
+- ChannelXmlBean channelBean = util.buildChannelRelease(args[0], args[0], args[1], args[2]);
+- UpdateXmlSerializer serializer = new UpdateXmlSerializerImpl();
+-
+- System.out.println("Writing channel release bean to " + filename);
+- serializer.write(channelBean, filename);
+- }
+- }
+-
+- }
+-
+- private static void printUsage() {
+- System.err.println("Usage: java XmlBeanUtilities <channel> <version> <directory>");
+- }
+-}
Added: trunk/squirrel-sql/debian/patches/series
===================================================================
--- trunk/squirrel-sql/debian/patches/series (rev 0)
+++ trunk/squirrel-sql/debian/patches/series 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,10 @@
+001-squirrelsql-jgoodies.patch
+002-squirrelsql-version.patch
+003-squirrelsql-plugins-parent-pom.patch
+004-squirrelsql-plugins-assembly-descripton-pom.patch
+005-squirrelsql-plugins-hibernate-HibernateUtil.patch
+006-launch-script-debian.patch
+007-squirrelsql-changelog.patch
+008-native2ascii.patch
+009-plugin-liclink.patch
+disable_autoupdate.dpatch
Added: trunk/squirrel-sql/debian/rules
===================================================================
--- trunk/squirrel-sql/debian/rules (rev 0)
+++ trunk/squirrel-sql/debian/rules 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,49 @@
+#!/usr/bin/make -f
+
+include /usr/share/cdbs/1/rules/debhelper.mk
+include /usr/share/cdbs/1/class/ant.mk
+
+PACKAGE := $(DEB_SOURCE_PACKAGE)
+VERSION := $(DEB_UPSTREAM_VERSION)
+JAVA_HOME := /usr/lib/jvm/default-java
+DEB_JARS := ant-nodeps antlr asm3 cglib commons-cli commons-codec \
+ commons-collections3 commons-httpclient commons-logging commons-logging-api dom4j \
+ hibernate-annotations hibernate-commons-annotations hibernate-core hibernate-entitymanager \
+ hibernate3 jxl nanoxml spring-beans spring-context spring-context-support spring-core stringtemplate \
+ forms looks axis axis-jaxrpc axis-saaj
+DEB_ANT_BUILD_TARGET := package javadoc
+DEB_ANT_BUILDFILE := debian/build.xml
+DEB_ANT_ARGS := -Dbasedir=$(realpath .) -Dpackage=$(PACKAGE) -Dversion=$(VERSION) -Dbin.package=$(PACKAGE)
+ANT_OPTS := -Dfile.encoding=UTF-8
+API_DOCS := target/apidocs
+PLUGINS := codecompletion dataimport db2 dbcopy dbdiff derby editextras example exportconfig favs \
+ graph h2 hibernate i18n informix mssql mysql netezza postgres refactoring sessionscript smarttools sqlbookmark \
+ sqlparam sqlreplace sqlscript laf firebird sqlval sybase userscript
+#FIXME: syntax firebirdmanager oracle
+
+get-orig-source:
+ uscan --download-version $(DEB_UPSTREAM_VERSION) --force-download
+
+binary-post-install/lib$(PACKAGE)-fw-java::
+ mh_installpoms -plib$(PACKAGE)-fw-java
+ mh_installjar -plib$(PACKAGE)-fw-java -dusr/share/squirrel-sql/lib/fw.jar -l fw/pom.xml fw/target/fw-$(VERSION).jar
+
+binary-post-install/$(PACKAGE)::
+ find debian/$(PACKAGE)/usr/share/squirrel-sql/doc/ -type f -exec chmod a-x {} \;
+ find debian/$(PACKAGE)/usr/share/squirrel-sql/icons/ -type f -exec chmod a-x {} \;
+ mh_installpoms -p$(PACKAGE)
+ mh_installjar -p$(PACKAGE) -dusr/share/squirrel-sql/$(PACKAGE).jar -l app/pom.xml app/target/$(PACKAGE)-$(VERSION).jar
+ mh_installjar -p$(PACKAGE) -dusr/share/squirrel-sql/lib/versioncheck.jar -l installer/squirrelsql-java-version-checker/pom.xml installer/squirrelsql-java-version-checker/target/squirrelsql-java-version-checker-$(VERSION).jar
+ dh_installchangelogs -p$(PACKAGE) doc/src/main/resources/changes.txt
+ set -e; for PLUGIN in $(PLUGINS) ; do \
+ mh_installpom -p$(PACKAGE)-plugin-$$PLUGIN plugins/$$PLUGIN/pom.xml ; \
+ mh_installjar -p$(PACKAGE)-plugin-$$PLUGIN -dusr/share/squirrel-sql/plugins/$$PLUGIN.jar plugins/$$PLUGIN/pom.xml plugins/$$PLUGIN/target/$$PLUGIN-$(VERSION).jar ; \
+ dh_install -p$(PACKAGE)-plugin-$$PLUGIN -Xlicence -XLicence -Xlicense plugins/$$PLUGIN/src/main/resources/doc/* usr/share/squirrel-sql/plugins/$$PLUGIN/ ; \
+ dh_link -p$(PACKAGE)-plugin-$$PLUGIN usr/share/common-licenses/LGPL-2.1 usr/share/squirrel-sql/plugins/$$PLUGIN/licence.txt ; \
+ find debian/$(PACKAGE)-plugin-$$PLUGIN/usr/share/squirrel-sql/plugins/$$PLUGIN/ -type f -exec chmod a-x {} \; ; \
+ dh_installchangelogs -p$(PACKAGE)-plugin-$$PLUGIN plugins/$$PLUGIN/src/main/resources/doc/changes.txt ; \
+ done
+
+clean::
+ -rm -rf debian/tmp
+ mh_clean
\ No newline at end of file
Property changes on: trunk/squirrel-sql/debian/rules
___________________________________________________________________
Added: svn:executable
+
Added: trunk/squirrel-sql/debian/source/format
===================================================================
--- trunk/squirrel-sql/debian/source/format (rev 0)
+++ trunk/squirrel-sql/debian/source/format 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1 @@
+3.0 (quilt)
Added: trunk/squirrel-sql/debian/squirrel-sql-doc.doc-base.api
===================================================================
--- trunk/squirrel-sql/debian/squirrel-sql-doc.doc-base.api (rev 0)
+++ trunk/squirrel-sql/debian/squirrel-sql-doc.doc-base.api 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,10 @@
+Document: squirrel-sql
+Title: API Javadoc for SQuirreL SQL Client
+Author: SQuirreL SQL developers
+Abstract: This is the API Javadoc provided for the
+ squirrel-sql application.
+Section: Programming
+
+Format: HTML
+Index: /usr/share/doc/squirrel-sql/api/index.html
+Files: /usr/share/doc/squirrel-sql/api/*
Added: trunk/squirrel-sql/debian/squirrel-sql-doc.install
===================================================================
--- trunk/squirrel-sql/debian/squirrel-sql-doc.install (rev 0)
+++ trunk/squirrel-sql/debian/squirrel-sql-doc.install 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,2 @@
+
+app/target/apidocs/* usr/share/doc/squirrel-sql/api
Added: trunk/squirrel-sql/debian/squirrel-sql-plugin-laf.links
===================================================================
--- trunk/squirrel-sql/debian/squirrel-sql-plugin-laf.links (rev 0)
+++ trunk/squirrel-sql/debian/squirrel-sql-plugin-laf.links 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,5 @@
+/usr/share/java/looks.jar /usr/share/squirrel-sql/plugins/laf/lafs/looks.jar
+/usr/share/java/kunststoff.jar /usr/share/squirrel-sql/plugins/laf/lafs/kunstoff-laf.jar
+/usr/share/java/skinlf.jar /usr/share/squirrel-sql/plugins/laf/lafs/skinlf.jar
+/usr/share/java/substance.jar /usr/share/squirrel-sql/plugins/laf/lafs/substance.jar
+/usr/share/java/tinylaf.jar /usr/share/squirrel-sql/plugins/laf/lafs/tinylaf.jar
Added: trunk/squirrel-sql/debian/squirrel-sql-plugin-sqlval.links
===================================================================
--- trunk/squirrel-sql/debian/squirrel-sql-plugin-sqlval.links (rev 0)
+++ trunk/squirrel-sql/debian/squirrel-sql-plugin-sqlval.links 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,2 @@
+/usr/share/java/axis.jar /usr/share/squirrel-sql/lib/axis.jar
+/usr/share/java/axis-jaxrpc.jar /usr/share/squirrel-sql/lib/axis-jaxrpc.jar
\ No newline at end of file
Added: trunk/squirrel-sql/debian/squirrel-sql.1
===================================================================
--- trunk/squirrel-sql/debian/squirrel-sql.1 (rev 0)
+++ trunk/squirrel-sql/debian/squirrel-sql.1 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,94 @@
+.TH SQUIRREL-SQL "1" "January 2011"
+.SH NAME
+SQuirreL-SQL \- a graphical Java program that will allow you to view the structure
+of a JDBC compliant database, browse the data in tables, issue SQL commands etc.
+.SH DESCRIPTION
+usage: squirrel\-sql [options]
+.TP
+\fB\-h\fR,\-\-help
+Display Help and exit
+.TP
+\fB\-home\fR,\-\-squirrel\-home <home>
+SQuirreL home
+directory
+.TP
+\fB\-l\fR,\-\-log\-config\-file <l>
+Logging configuration
+file
+.TP
+\fB\-m\fR,\-\-use\-default\-metal\-theme
+Use default metal
+theme
+.TP
+\fB\-n\fR,\-\-native\-laf
+Use native look and
+feel
+.TP
+\fB\-nop\fR,\-\-no\-plugins
+Don't load plugins
+.TP
+\fB\-nos\fR,\-\-no\-splash
+Don't display splash
+screen
+.TP
+\fB\-pluginlist\fR,\-\-plugin\-classpath\-list <pluginlist>
+Specify a
+comma\-delimited list
+of plugins to load
+from the CLASSPATH
+.TP
+\fB\-uidebug\fR,\-\-user\-interface\-debugging
+Provides tool\-tips and
+highlighting of UI
+components for easy
+identification
+.TP
+\fB\-userdir\fR,\-\-user\-settings\-dir <userdir>
+User settings
+directory
+.TP
+\fB\-h\fR,\-\-help
+Display Help and exit
+.TP
+\fB\-home\fR,\-\-squirrel\-home <home>
+SQuirreL home
+directory
+.TP
+\fB\-l\fR,\-\-log\-config\-file <l>
+Logging configuration
+file
+.TP
+\fB\-m\fR,\-\-use\-default\-metal\-theme
+Use default metal
+theme
+.TP
+\fB\-n\fR,\-\-native\-laf
+Use native look and
+feel
+.TP
+\fB\-nop\fR,\-\-no\-plugins
+Don't load plugins
+.TP
+\fB\-nos\fR,\-\-no\-splash
+Don't display splash
+screen
+.TP
+\fB\-pluginlist\fR,\-\-plugin\-classpath\-list <pluginlist>
+Specify a
+comma\-delimited list
+of plugins to load
+from the CLASSPATH
+.TP
+\fB\-uidebug\fR,\-\-user\-interface\-debugging
+Provides tool\-tips and
+highlighting of UI
+components for easy
+identification
+.TP
+\fB\-userdir\fR,\-\-user\-settings\-dir <userdir>
+User settings
+directory
+.SH AUTHOR
+This manual page was generated using help2man and edited by Vladimir
+Kotov <vladimir at kotov.lv>, for the Debian project (but may be used
+by others).
Added: trunk/squirrel-sql/debian/squirrel-sql.install
===================================================================
--- trunk/squirrel-sql/debian/squirrel-sql.install (rev 0)
+++ trunk/squirrel-sql/debian/squirrel-sql.install 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,6 @@
+app/src/main/resources/net/sourceforge/squirrel_sql/client/resources/images/gm/splash.jpg /usr/share/squirrel-sql/icons/
+doc/src/main/resources/*.* /usr/share/squirrel-sql/doc/
+doc/src/main/resources/images /usr/share/squirrel-sql/doc/
+installer/squirrelsql-launcher/src/main/resources/icons /usr/share/squirrel-sql/
+installer/squirrelsql-launcher/src/main/resources/log4j.properties /usr/share/squirrel-sql/
+installer/squirrelsql-launcher/src/main/resources/squirrel-sql.sh /usr/share/squirrel-sql/
Added: trunk/squirrel-sql/debian/squirrel-sql.links
===================================================================
--- trunk/squirrel-sql/debian/squirrel-sql.links (rev 0)
+++ trunk/squirrel-sql/debian/squirrel-sql.links 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,27 @@
+/usr/share/squirrel-sql/squirrel-sql.sh /usr/bin/squirrel-sql
+/usr/share/common-licenses/LGPL-2.1 /usr/share/squirrel-sql/doc/licences/squirrel_licence.txt
+/usr/share/java/antlr.jar /usr/share/squirrel-sql/lib/antlr.jar
+/usr/share/java/asm3.jar /usr/share/squirrel-sql/lib/asm.jar
+/usr/share/java/asm3.jar /usr/share/squirrel-sql/lib/asm-attrs.jar
+/usr/share/java/hibernate-annotations.jar /usr/share/squirrel-sql/lib/hibernate-annotations.jar
+/usr/share/java/hibernate-commons-annotations.jar /usr/share/squirrel-sql/lib/hibernate-commons-annotations.jar
+/usr/share/java/hibernate-entitymanager.jar /usr/share/squirrel-sql/lib/hibernate-entitymanager.jar
+/usr/share/java/spring-beans.jar /usr/share/squirrel-sql/lib/spring-beans.jar
+/usr/share/java/hibernate3.jar /usr/share/squirrel-sql/lib/hibernate.jar
+/usr/share/java/spring-context.jar /usr/share/squirrel-sql/lib/spring-context.jar
+/usr/share/java/cglib.jar /usr/share/squirrel-sql/lib/cglib.jar
+/usr/share/java/jxl.jar /usr/share/squirrel-sql/lib/jxl.jar
+/usr/share/java/spring-context-support.jar /usr/share/squirrel-sql/lib/spring-context-support.jar
+/usr/share/java/log4j-1.2.jar /usr/share/squirrel-sql/lib/log4j.jar
+/usr/share/java/spring-core.jar /usr/share/squirrel-sql/lib/spring-core.jar
+/usr/share/java/commons-cli.jar /usr/share/squirrel-sql/lib/commons-cli.jar
+/usr/share/java/nanoxml2.jar /usr/share/squirrel-sql/lib/nanoxml.jar
+/usr/share/java/commons-codec.jar /usr/share/squirrel-sql/lib/commons-codec.jar
+/usr/share/java/stringtemplate.jar /usr/share/squirrel-sql/lib/stringtemplate.jar
+/usr/share/java/commons-collections3.jar /usr/share/squirrel-sql/lib/commons-collections.jar
+/usr/share/java/commons-httpclient.jar /usr/share/squirrel-sql/lib/commons-httpclient.jar
+/usr/share/java/commons-logging.jar /usr/share/squirrel-sql/lib/commons-logging.jar
+/usr/share/java/forms.jar /usr/share/squirrel-sql/lib/forms.jar
+/usr/share/java/slf4j-api.jar /usr/share/squirrel-sql/lib/slf4j-api.jar
+/usr/share/java/slf4j-log4j12.jar /usr/share/squirrel-sql/lib/slf4j-log4j12.jar
+
Added: trunk/squirrel-sql/debian/squirrel-sql.manpages
===================================================================
--- trunk/squirrel-sql/debian/squirrel-sql.manpages (rev 0)
+++ trunk/squirrel-sql/debian/squirrel-sql.manpages 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1 @@
+debian/squirrel-sql.1
Added: trunk/squirrel-sql/debian/squirrel-sql.poms
===================================================================
--- trunk/squirrel-sql/debian/squirrel-sql.poms (rev 0)
+++ trunk/squirrel-sql/debian/squirrel-sql.poms 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,3 @@
+app/pom.xml
+installer/squirrelsql-java-version-checker/pom.xml
+plugins/squirrelsql-plugins-parent-pom/pom.xml
Added: trunk/squirrel-sql/debian/watch
===================================================================
--- trunk/squirrel-sql/debian/watch (rev 0)
+++ trunk/squirrel-sql/debian/watch 2011-02-10 23:58:25 UTC (rev 13286)
@@ -0,0 +1,4 @@
+version=3
+opts="uversionmangle=s/-(alpha|beta)-/~$1/" \
+ http://squirrel-sql.svn.sourceforge.net/svnroot/squirrel-sql/tags/ squirrelsql-([\d\.]+)/ \
+ debian debian/orig-tar.sh
More information about the pkg-java-commits
mailing list