From 7a19976bc7fa75c18328f2d20926e22a4553c297 Mon Sep 17 00:00:00 2001 From: chenson42 Date: Mon, 22 Jun 2015 13:30:00 +0000 Subject: [PATCH] --- symmetric-android/pom.xml | 54 + symmetric-assemble/build.gradle | 20 +- symmetric-assemble/common.gradle | 8 +- symmetric-assemble/gradle.properties | 5 +- symmetric-assemble/pom.xml | 464 ++++++++ symmetric-client/pom.xml | 188 ++++ .../service/jmx/NodeManagementService.java | 3 - .../jumpmind/symmetric/util/SnapshotUtil.java | 72 +- symmetric-core/pom.xml | 110 ++ .../symmetric/AbstractSymmetricEngine.java | 5 +- .../jumpmind/symmetric/common/Constants.java | 2 - .../symmetric/common/ParameterConstants.java | 2 - .../symmetric/route/ChannelRouterContext.java | 9 - .../route/ConfigurationChangedDataRouter.java | 5 - .../symmetric/route/DataGapDetector.java | 184 ++-- .../symmetric/route/DataGapRouteReader.java | 9 +- .../symmetric/service/IDataService.java | 8 +- .../impl/AbstractOfflineDetectorService.java | 14 - .../service/impl/DataLoaderService.java | 3 - .../symmetric/service/impl/DataService.java | 62 +- .../symmetric/service/impl/PullService.java | 109 +- .../symmetric/service/impl/RouterService.java | 52 +- .../transport/AuthenticationException.java | 3 +- .../ConnectionRejectedException.java | 3 +- .../symmetric/transport/OfflineException.java | 21 - .../ServiceUnavailableException.java | 28 - .../transport/SyncDisabledException.java | 3 +- .../transport/TransportException.java | 2 +- .../transport/http/HttpIncomingTransport.java | 9 +- .../transport/http/HttpOutgoingTransport.java | 5 +- .../jumpmind/symmetric/web/WebConstants.java | 6 +- .../resources/symmetric-default.properties | 7 - .../src/main/resources/symmetric-schema.xml | 6 - .../jumpmind/symmetric/VersionUnitTest.java | 2 +- .../symmetric/route/DataGapDetectorTest.java | 34 + symmetric-csv/pom.xml | 36 + symmetric-db/pom.xml | 76 ++ .../db/platform/AbstractDdlBuilder.java | 1 - .../db/platform/ase/AseDdlBuilder.java | 1 + .../db/platform/db2/Db2DdlBuilder.java | 1 + .../db/platform/derby/DerbyDdlBuilder.java | 1 + .../platform/firebird/FirebirdDdlBuilder.java | 1 + .../jumpmind/db/platform/h2/H2DdlBuilder.java | 3 +- .../db/platform/hsqldb/HsqlDbDdlBuilder.java | 1 + .../platform/hsqldb2/HsqlDb2DdlBuilder.java | 1 + .../interbase/InterbaseDdlBuilder.java | 1 + .../platform/mssql/MsSql2000DdlBuilder.java | 1 + .../db/platform/mysql/MySqlDdlBuilder.java | 1 + .../db/platform/oracle/OracleDdlBuilder.java | 1 + .../postgresql/PostgreSqlDdlBuilder.java | 1 + .../platform/redshift/RedshiftDdlBuilder.java | 1 + .../sqlanywhere/SqlAnywhereDdlBuilder.java | 1 + symmetric-io/pom.xml | 150 +++ .../jumpmind/symmetric/io/data/DbExport.java | 16 +- .../io/data/reader/SymXmlDataReader.java | 16 +- .../io/data/reader/XmlDataReader.java | 16 +- .../io/data/reader/TestableDataWriter.java | 64 -- .../io/data/reader/XmlDataReaderTest.java | 31 - .../io/data/reader/xmldatareadertest1.xml | 20 - symmetric-jdbc/pom.xml | 107 ++ .../db/platform/AbstractJdbcDdlReader.java | 15 +- symmetric-parent/.gitignore | 2 + symmetric-parent/pom.xml | 995 ++++++++++++++++++ symmetric-server/pom.xml | 289 +++++ .../src/main/deploy/conf/sym_service.conf | 2 +- .../symmetric/SymmetricWebServer.java | 293 ++---- .../web/NodeConcurrencyInterceptor.java | 8 +- .../symmetric/web/SymmetricEngineHolder.java | 5 +- .../symmetric/web/SymmetricServlet.java | 14 +- .../CompressionResponseStream.java | 15 +- .../symmetric/web/rest/RestService.java | 6 +- symmetric-util/pom.xml | 76 ++ symmetric-util/src/test/resources/log4j.xml | 4 - symmetric-wrapper/pom.xml | 73 ++ 74 files changed, 3013 insertions(+), 850 deletions(-) create mode 100644 symmetric-android/pom.xml create mode 100644 symmetric-assemble/pom.xml create mode 100644 symmetric-client/pom.xml create mode 100644 symmetric-core/pom.xml delete mode 100644 symmetric-core/src/main/java/org/jumpmind/symmetric/transport/OfflineException.java delete mode 100644 symmetric-core/src/main/java/org/jumpmind/symmetric/transport/ServiceUnavailableException.java create mode 100644 symmetric-csv/pom.xml create mode 100644 symmetric-db/pom.xml create mode 100644 symmetric-io/pom.xml delete mode 100644 symmetric-io/src/test/java/org/jumpmind/symmetric/io/data/reader/TestableDataWriter.java delete mode 100644 symmetric-io/src/test/java/org/jumpmind/symmetric/io/data/reader/XmlDataReaderTest.java delete mode 100644 symmetric-io/src/test/resources/org/jumpmind/symmetric/io/data/reader/xmldatareadertest1.xml create mode 100644 symmetric-jdbc/pom.xml create mode 100644 symmetric-parent/.gitignore create mode 100644 symmetric-parent/pom.xml create mode 100644 symmetric-server/pom.xml create mode 100644 symmetric-util/pom.xml create mode 100644 symmetric-wrapper/pom.xml diff --git a/symmetric-android/pom.xml b/symmetric-android/pom.xml new file mode 100644 index 0000000000..d53fa8c2f9 --- /dev/null +++ b/symmetric-android/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + org.jumpmind.symmetric + symmetric-android + 3.7.0-SNAPSHOT + jar + android + + org.jumpmind.symmetric + symmetric-parent + 3.7.0-SNAPSHOT + ../symmetric-parent/pom.xml + + + + com.google.android + android + 2.1.2 + provided + + + org.slf4j + slf4j-android + 1.6.1-RC1 + + + org.jumpmind.symmetric + symmetric-core + + + org.slf4j + slf4j-api + + + org.slf4j + slf4j-log4j12 + + + log4j + log4j + + + net.sf.kxml + kxml2 + + + javax.annotation + jsr250-api + + + + + \ No newline at end of file diff --git a/symmetric-assemble/build.gradle b/symmetric-assemble/build.gradle index 12cd572774..aa33393c40 100644 --- a/symmetric-assemble/build.gradle +++ b/symmetric-assemble/build.gradle @@ -2,7 +2,6 @@ buildscript { repositories { jcenter() maven { url 'http://repo.spring.io/plugins-release' } - mavenCentral() } dependencies { @@ -10,7 +9,6 @@ buildscript { classpath 'org.asciidoctor:asciidoctorj-pdf:1.5.0-alpha.6' classpath 'org.springframework.build.gradle:propdeps-plugin:0.0.7' classpath 'io.spring.gradle:docbook-reference-plugin:0.3.0' - classpath 'org.hibernate.build.gradle:gradle-animalSniffer-plugin:1.0.1.Final' } } @@ -24,16 +22,6 @@ task generateJavadoc(type: Javadoc) { } subprojects { subproject -> - - checkJava5Compat = checkJava5Compat.toBoolean() - if (checkJava5Compat) { - apply plugin: 'org.hibernate.build.gradle.animalSniffer' - - dependencies { - animalSnifferSignature 'org.codehaus.mojo.signature:java15:1.0@signature' - } - } - afterEvaluate { if(plugins.hasPlugin(JavaPlugin)) { @@ -41,7 +29,7 @@ subprojects { subproject -> rootProject.tasks.generateJavadoc { source += files(sourceSets.collect { srcSet -> srcSet.allJava }) classpath += files(sourceSets*.compileClasspath) - } + } } } @@ -77,7 +65,7 @@ project(":symmetric-wrapper") { project(':symmetric-util') { description = 'Utility classes that are used by several Symmetric libraries' - dependencies { + dependencies { compile "commons-lang:commons-lang:$commonsLangVersion" compile "commons-io:commons-io:$commonsIoVersion" compile "commons-codec:commons-codec:$commonsCodecVersion" @@ -220,8 +208,8 @@ project(':symmetric-server') { exclude group: 'com.fasterxml.jackson.core' exclude group: 'commons-codec' } - compile "javax.servlet:javax.servlet-api:$servletVersion" - provided "org.eclipse.jetty:jetty-annotations:$jettyVersion" + provided "javax.servlet:servlet-api:2.5" + provided "org.eclipse.jetty:jetty-server:$jettyVersion" provided "org.eclipse.jetty:jetty-servlets:$jettyVersion" provided "org.eclipse.jetty:jetty-webapp:$jettyVersion" provided "org.eclipse.jetty:jetty-jmx:$jettyVersion" diff --git a/symmetric-assemble/common.gradle b/symmetric-assemble/common.gradle index 584b0ccc13..13dfbd8696 100644 --- a/symmetric-assemble/common.gradle +++ b/symmetric-assemble/common.gradle @@ -48,7 +48,7 @@ subprojects { subproject -> apply plugin: 'propdeps' apply plugin: 'propdeps-maven' apply plugin: 'propdeps-eclipse' - apply plugin: 'maven' + apply plugin: 'maven' configurations { deployerJars } configurations { testArtifacts.extendsFrom testRuntime } @@ -137,18 +137,18 @@ subprojects { subproject -> mockitoVersion = '1.9.5' powerMockVersion = '1.5.3' mysqlVersion = '5.1.30' - servletVersion = '3.1.0' + servletVersion = '3.0.1' springVersion = '4.0.5.RELEASE' jtdsVersion = '1.2.8' bouncyCastleVersion = '140' animalSnifferVersion = '1.10' jnaVersion = '4.1.0' - jettyVersion = '9.2.11.v20150529' + jettyVersion = '7.6.3.v20120416' env = System.getenv() } - dependencies { + dependencies { compile "org.slf4j:slf4j-api:$slf4jVersion" compile "org.slf4j:jul-to-slf4j:$slf4jVersion" compile "org.slf4j:jcl-over-slf4j:$slf4jVersion" diff --git a/symmetric-assemble/gradle.properties b/symmetric-assemble/gradle.properties index bd58e58872..7af21d68be 100644 --- a/symmetric-assemble/gradle.properties +++ b/symmetric-assemble/gradle.properties @@ -1,5 +1,5 @@ symAssembleDir=../symmetric-assemble -version=3.8.x-SNAPSHOT +version=3.7.x-SNAPSHOT scmVersion=? deployUser=? deployPassword=? @@ -9,5 +9,4 @@ publishUser=? publishPassword=? publishServer=symmetricds.org sourceforgeUser=? -sourceforgePassword=? -checkJava5Compat=false \ No newline at end of file +sourceforgePassword=? \ No newline at end of file diff --git a/symmetric-assemble/pom.xml b/symmetric-assemble/pom.xml new file mode 100644 index 0000000000..92968fe42a --- /dev/null +++ b/symmetric-assemble/pom.xml @@ -0,0 +1,464 @@ + + 4.0.0 + org.jumpmind.symmetric + symmetric-assemble + pom + 3.7.0-SNAPSHOT + assemble + + + GPL + http://www.gnu.org/licenses/gpl.txt + + + + org.jumpmind.symmetric + symmetric-parent + 3.7.0-SNAPSHOT + ../symmetric-parent/pom.xml + + + ${basedir}/src/docbook + ${basedir}/target/doc + ${basedir}/target/docbook + 1.5.0 + + + ../symmetric-parent + ../symmetric-util + ../symmetric-csv + ../symmetric-db + ../symmetric-jdbc + ../symmetric-io + ../symmetric-core + ../symmetric-client + ../symmetric-server + ../symmetric-android + ../symmetric-wrapper + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.8.1 + + ${docbook.target} + javadoc + SymmetricDS API ${project.version} + public + + + + aggregate + package + + aggregate + + + + + + maven-assembly-plugin + + + server + package + + attached + + + + ${basedir}/src/assembly/assembly-server.xml + + symmetric-${project.version} + + + + client + package + + attached + + + + ${basedir}/src/assembly/assembly-client.xml + + symmetric-${project.version} + + + + android + package + + attached + + + + ${basedir}/src/assembly/assembly-android.xml + + symmetric-${project.version} + + + + + + org.apache.db.torque + torque-maven-plugin + 3.3-RC2 + + docbook + symmetric + ${docbook.build} + ${basedir}/../symmetric-core/src/main/resources + ${basedir}/src/torque + false + + + + generate-sources + + documentation + + + + + + + + + includeDocs + + + includeDocs + true + + + + + + maven-assembly-plugin + + + docbook + package + + attached + + + + ${basedir}/src/assembly/assembly-docbook.xml + + docbook + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.2.1 + + + generate-server-parameters + generate-sources + + java + + + true + org.jumpmind.properties.DefaultParameterParser + + ${basedir}/../symmetric-server/src/main/deploy/conf/symmetric-server.properties + ${docbook.build}/server-parameters.xml + false + + + + + generate-startup-parameters + generate-sources + + java + + + true + org.jumpmind.properties.DefaultParameterParser + + classpath:/symmetric-default.properties + ${docbook.build}/startup-parameters.xml + false + + + + + generate-runtime-parameters + generate-sources + + java + + + true + org.jumpmind.properties.DefaultParameterParser + + classpath:/symmetric-default.properties + ${docbook.build}/runtime-parameters.xml + true + + + + + + + org.jumpmind.symmetric + symmetric-util + 3.7.0-SNAPSHOT + + + org.jumpmind.symmetric + symmetric-core + 3.7.0-SNAPSHOT + + + + + com.agilejava.docbkx + docbkx-maven-plugin + 2.0.6 + + + build-pdf-doc + generate-sources + + generate-pdf + + + + + + + + + + + + ${docbook.build} + ${docbook.target}/user-guide/pdf + true + user-guide.xml + ${docbook.build}/images + ${docbook.build}/resources/images/admons/ + + ${docbook.build}/resources/xsl/docbook-fopdf.xsl + + + + + + + + build-singlehtml-doc + generate-sources + + generate-html + + + ${docbook.build} + ${docbook.target}/user-guide/html-single + + true + user-guide.xml + css/docbook-style.css + ${docbook.build}/resources/xsl/docbook-html.xsl + + false + + + + + + + + + + + + + + + + + + + + + build-chunkedhtml-doc + generate-sources + + generate-html + + + ${docbook.build} + ${docbook.target}/user-guide/html + true + user-guide.xml + css/docbook-style.css + ${docbook.build}/resources/xsl/docbook-html-chunk.xsl + + true + + + + + + + + + + + + + + + + + + + + + build-quickstart-singlehtml-doc + generate-sources + + generate-html + + + ${docbook.build} + ${docbook.target}/quick-start/html-single + + true + quick-start.xml + css/docbook-style.css + ${docbook.build}/resources/xsl/docbook-html.xsl + + false + + + + + + + + + + + + + + + + + + + + + build-quickstart-pdf-doc + generate-sources + + generate-pdf + + + + + + + + + + + + ${docbook.build} + ${docbook.target}/quick-start/pdf + true + quick-start.xml + ${docbook.build}/images + ${docbook.build}/resources/images/admons/ + + ${docbook.build}/resources/xsl/docbook-fopdf.xsl + + + + + + + + + + org.docbook + docbook-xml + 4.4 + runtime + + + + + + + + includeAsciiDocs + + + includeAsciiDocs + true + + + + + + org.asciidoctor + asciidoctor-maven-plugin + ${asciidoctor.version} + + + user-guide + generate-resources + + process-asciidoc + + + ${basedir}/src/asciidoc + user-guide.ad + target/docs-asciidoc + html5 + book + + + + + + + org.asciidoctor + asciidoctor-maven-plugin + ${asciidoctor.version} + + + tutorials + generate-resources + + process-asciidoc + + + ${basedir}/src/asciidoc + tutorials/tutorials.ad + target/docs-asciidoc + html5 + book + + + + + + + + + + \ No newline at end of file diff --git a/symmetric-client/pom.xml b/symmetric-client/pom.xml new file mode 100644 index 0000000000..995f11b2c9 --- /dev/null +++ b/symmetric-client/pom.xml @@ -0,0 +1,188 @@ + + 4.0.0 + org.jumpmind.symmetric + symmetric-client + jar + 3.7.0-SNAPSHOT + client + + + org.jumpmind.symmetric + symmetric-parent + 3.7.0-SNAPSHOT + ../symmetric-parent/pom.xml + + + + + org.jumpmind.symmetric + symmetric-csv + + + org.jumpmind.symmetric + symmetric-io + + + org.jumpmind.symmetric + symmetric-io + test-jar + test + + + org.jumpmind.symmetric + symmetric-jdbc + + + org.jumpmind.symmetric + symmetric-core + + + org.jumpmind.symmetric + symmetric-core + test-jar + test + + + org.jumpmind.symmetric + symmetric-jdbc + test-jar + test + + + commons-dbcp + commons-dbcp + + + commons-io + commons-io + + + commons-cli + commons-cli + + + commons-codec + commons-codec + + + org.beanshell + bsh + + + commons-vfs + commons-vfs + 1.0 + + + com.jcraft + jsch + 0.1.48 + + + commons-net + commons-net + 3.1 + + + org.mongodb + mongo-java-driver + + + javax.annotation + jsr250-api + + + org.springframework + spring-jdbc + + + org.springframework + spring-context + + + junit + junit + test + + + log4j + log4j + provided + + + + org.apache.derby + derby + provided + + + org.apache.derby + derbytools + provided + + + mysql + mysql-connector-java + provided + + + org.mariadb.jdbc + mariadb-java-client + provided + + + org.jumpmind.symmetric.jdbc + postgresql + provided + + + org.jumpmind.symmetric.jdbc + ojdbc + provided + + + net.sourceforge.jtds + jtds + provided + + + org.hsqldb + hsqldb + jdk5 + provided + + + com.h2database + h2 + provided + + + org.xerial + sqlite-jdbc + provided + + + org.firebirdsql.jdbc + jaybird + provided + + + com.amazonaws + aws-java-sdk + provided + + + + org.apache.geronimo.specs + geronimo-j2ee-connector_1.6_spec + provided + + + org.codehaus.mojo + animal-sniffer-annotations + true + provided + + + + diff --git a/symmetric-client/src/main/java/org/jumpmind/symmetric/service/jmx/NodeManagementService.java b/symmetric-client/src/main/java/org/jumpmind/symmetric/service/jmx/NodeManagementService.java index 55865c8e5b..29c496499e 100644 --- a/symmetric-client/src/main/java/org/jumpmind/symmetric/service/jmx/NodeManagementService.java +++ b/symmetric-client/src/main/java/org/jumpmind/symmetric/service/jmx/NodeManagementService.java @@ -37,7 +37,6 @@ import org.jumpmind.extension.IBuiltInExtensionPoint; import org.jumpmind.security.SecurityConstants; import org.jumpmind.symmetric.ISymmetricEngine; -import org.jumpmind.symmetric.common.Constants; import org.jumpmind.symmetric.common.ParameterConstants; import org.jumpmind.symmetric.ext.ISymmetricEngineAware; import org.jumpmind.symmetric.model.Node; @@ -79,7 +78,6 @@ public boolean isStarted() { public boolean start() { try { if (engine != null) { - engine.getParameterService().saveParameter(ParameterConstants.AUTO_START_ENGINE, "true", Constants.SYSTEM_USER); return engine.start(); } else { return false; @@ -95,7 +93,6 @@ public void stop() { try { if (engine != null) { engine.stop(); - engine.getParameterService().saveParameter(ParameterConstants.AUTO_START_ENGINE, "false", Constants.SYSTEM_USER); } } catch (Exception ex) { log.error("", ex); diff --git a/symmetric-client/src/main/java/org/jumpmind/symmetric/util/SnapshotUtil.java b/symmetric-client/src/main/java/org/jumpmind/symmetric/util/SnapshotUtil.java index 4dbff56b87..6c5a1b018f 100644 --- a/symmetric-client/src/main/java/org/jumpmind/symmetric/util/SnapshotUtil.java +++ b/symmetric-client/src/main/java/org/jumpmind/symmetric/util/SnapshotUtil.java @@ -183,38 +183,29 @@ public static File createSnapshot(ISymmetricEngine engine) { IOUtils.closeQuietly(fos); } - String tablePrefix = engine.getTablePrefix(); - - DbExport export = new DbExport(engine.getDatabasePlatform()); - export.setFormat(Format.CSV); - export.setNoCreateInfo(true); - - extract(export, new File(tmpDir, "identity.csv"), TableConstants.getTableName(tablePrefix, TableConstants.SYM_NODE_IDENTITY)); - - extract(export, new File(tmpDir, "node.csv"), - TableConstants.getTableName(tablePrefix, TableConstants.SYM_NODE)); - - extract(export, new File(tmpDir, "nodesecurity.csv"), - TableConstants.getTableName(tablePrefix, TableConstants.SYM_NODE_SECURITY)); + fos = null; + try { + fos = new FileOutputStream(new File(tmpDir, "runtime-data.xml")); + DbExport export = new DbExport(engine.getDatabasePlatform()); + export.setFormat(Format.XML); + export.setNoCreateInfo(true); + String tablePrefix = engine.getTablePrefix(); + export.exportTables( + fos, + new String[] { + TableConstants.getTableName(tablePrefix, TableConstants.SYM_NODE_IDENTITY), + TableConstants.getTableName(tablePrefix, TableConstants.SYM_NODE), + TableConstants.getTableName(tablePrefix, TableConstants.SYM_NODE_SECURITY), + TableConstants.getTableName(tablePrefix, TableConstants.SYM_NODE_HOST), + TableConstants.getTableName(tablePrefix, TableConstants.SYM_TRIGGER_HIST), + TableConstants.getTableName(tablePrefix, TableConstants.SYM_LOCK), + TableConstants.getTableName(tablePrefix, TableConstants.SYM_NODE_COMMUNICATION)}); + } catch (IOException e) { + log.warn("Failed to export table definitions", e); + } finally { + IOUtils.closeQuietly(fos); + } - extract(export, new File(tmpDir, "nodehost.csv"), - TableConstants.getTableName(tablePrefix, TableConstants.SYM_NODE_HOST)); - - extract(export, new File(tmpDir, "triggerhist.csv"), - TableConstants.getTableName(tablePrefix, TableConstants.SYM_TRIGGER_HIST)); - - extract(export, new File(tmpDir, "lock.csv"), - TableConstants.getTableName(tablePrefix, TableConstants.SYM_LOCK)); - - extract(export, new File(tmpDir, "nodecommunication.csv"), - TableConstants.getTableName(tablePrefix, TableConstants.SYM_NODE_COMMUNICATION)); - - extract(export, 5000, new File(tmpDir, "outgoingbatch.csv"), - TableConstants.getTableName(tablePrefix, TableConstants.SYM_OUTGOING_BATCH)); - - extract(export, 5000, new File(tmpDir, "incomingbatch.csv"), - TableConstants.getTableName(tablePrefix, TableConstants.SYM_INCOMING_BATCH)); - final int THREAD_INDENT_SPACE = 50; fwriter = null; try { @@ -329,25 +320,6 @@ public static File createSnapshot(ISymmetricEngine engine) { } } - protected static void extract(DbExport export, File file, String... tables) { - extract(export, Integer.MAX_VALUE, file, tables); - } - - protected static void extract(DbExport export, int maxRows, File file, String... tables) { - FileOutputStream fos = null; - try { - fos = new FileOutputStream(file); - export.setMaxRows(maxRows); - export.exportTables( - fos, - tables); - } catch (IOException e) { - log.warn("Failed to export table definitions", e); - } finally { - IOUtils.closeQuietly(fos); - } - } - protected static void writeDirectoryListing(ISymmetricEngine engine, File tmpDir) { try { File home = new File(System.getProperty("user.dir")); diff --git a/symmetric-core/pom.xml b/symmetric-core/pom.xml new file mode 100644 index 0000000000..830715772c --- /dev/null +++ b/symmetric-core/pom.xml @@ -0,0 +1,110 @@ + + 4.0.0 + org.jumpmind.symmetric + symmetric-core + jar + 3.7.0-SNAPSHOT + core + + + org.jumpmind.symmetric + symmetric-parent + 3.7.0-SNAPSHOT + ../symmetric-parent/pom.xml + + + + + + maven-jar-plugin + 2.2 + + + + test-jar + + test-compile + + + + ${basedir}/target + + + + + + + + org.jumpmind.symmetric + symmetric-csv + + + org.jumpmind.symmetric + symmetric-io + + + org.jumpmind.symmetric + symmetric-util + + + commons-dbcp + commons-dbcp + + + commons-io + commons-io + + + commons-codec + commons-codec + + + commons-fileupload + commons-fileupload + + + org.beanshell + bsh + + + javax.annotation + jsr250-api + + + junit + junit + test + + + log4j + log4j + provided + + + org.mockito + mockito-all + test + + + org.mockito + mockito-all + test + + + org.powermock + powermock-api-mockito + test + + + org.powermock + powermock-module-junit4 + test + + + org.powermock + powermock-core + test + + + + diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/AbstractSymmetricEngine.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/AbstractSymmetricEngine.java index 90f735997a..4041e9e606 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/AbstractSymmetricEngine.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/AbstractSymmetricEngine.java @@ -570,10 +570,10 @@ public synchronized boolean start(boolean startJobs) { } else { log.error("Did not start SymmetricDS. It has not been configured properly"); } + } catch (SymmetricException ex) { + log.error(ex.getMessage()); } catch (Throwable ex) { log.error("An error occurred while starting SymmetricDS", ex); - /* Don't leave SymmetricDS in a half started state */ - stop(); } finally { starting = false; } @@ -736,7 +736,6 @@ public synchronized void stop() { started = false; starting = false; - } public synchronized void destroy() { diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/common/Constants.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/common/Constants.java index ff907b679e..b6becda022 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/common/Constants.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/common/Constants.java @@ -31,8 +31,6 @@ final public class Constants { private Constants() { } - - public static final String SYSTEM_USER = "system"; public static final long VIRTUAL_BATCH_FOR_REGISTRATION = IoConstants.IGNORE_TABLES_BATCH; diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/common/ParameterConstants.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/common/ParameterConstants.java index d0719e1e03..ae18490a3e 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/common/ParameterConstants.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/common/ParameterConstants.java @@ -41,8 +41,6 @@ final public class ParameterConstants { private ParameterConstants() { } - - public final static String AUTO_START_ENGINE = "auto.start.engine"; public final static String JDBC_EXECUTE_BATCH_SIZE = "db.jdbc.execute.batch.size"; public final static String JDBC_READ_STRINGS_AS_BYTES = "db.read.strings.as.bytes"; diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/route/ChannelRouterContext.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/route/ChannelRouterContext.java index 71a48bbdb2..73dbac8813 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/route/ChannelRouterContext.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/route/ChannelRouterContext.java @@ -64,7 +64,6 @@ public class ChannelRouterContext extends SimpleRouterContext { private Data lastDataProcessed; private List dataEventsToSend = new ArrayList(); private boolean produceCommonBatches = false; - private boolean onlyDefaultRoutersAssigned = false; private long lastLoadId = -1; private long startDataId; private long endDataId; @@ -259,13 +258,5 @@ public void addTransaction(String transactionId) { this.transactions.add(transactionId); } } - - public void setOnlyDefaultRoutersAssigned(boolean onlyDefaultRoutersAssigned) { - this.onlyDefaultRoutersAssigned = onlyDefaultRoutersAssigned; - } - - public boolean isOnlyDefaultRoutersAssigned() { - return onlyDefaultRoutersAssigned; - } } diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/route/ConfigurationChangedDataRouter.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/route/ConfigurationChangedDataRouter.java index ff1a762e49..22c6495c0e 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/route/ConfigurationChangedDataRouter.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/route/ConfigurationChangedDataRouter.java @@ -180,11 +180,6 @@ public Set routeToNodes(SimpleRouterContext routingContext, DataMetaData if (tableMatches(dataMetaData, TableConstants.SYM_PARAMETER)) { routingContext.put(CTX_KEY_FLUSH_PARAMETERS_NEEDED, Boolean.TRUE); - - if (me.getExternalId().equals(columnValues.get("EXTERNAL_ID")) - && me.getNodeGroupId().equals(columnValues.get("NODE_GROUP_ID"))) { - nodeIds.clear(); - } if (StringUtils.isBlank(dataMetaData.getData().getSourceNodeId()) && (dataMetaData.getData().getRowData() != null && dataMetaData diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/route/DataGapDetector.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/route/DataGapDetector.java index b5099be708..e15abd5140 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/route/DataGapDetector.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/route/DataGapDetector.java @@ -20,18 +20,18 @@ */ package org.jumpmind.symmetric.route; +import java.util.ArrayList; import java.util.Date; import java.util.List; import org.jumpmind.db.sql.ISqlTemplate; -import org.jumpmind.db.sql.ISqlTransaction; import org.jumpmind.db.sql.mapper.NumberMapper; import org.jumpmind.symmetric.common.ParameterConstants; import org.jumpmind.symmetric.db.ISymmetricDialect; import org.jumpmind.symmetric.model.DataGap; import org.jumpmind.symmetric.model.ProcessInfo; -import org.jumpmind.symmetric.model.ProcessInfo.Status; import org.jumpmind.symmetric.model.ProcessInfoKey; +import org.jumpmind.symmetric.model.ProcessInfo.Status; import org.jumpmind.symmetric.model.ProcessInfoKey.ProcessType; import org.jumpmind.symmetric.service.IDataService; import org.jumpmind.symmetric.service.INodeService; @@ -79,23 +79,17 @@ public DataGapDetector(IDataService dataService, IParameterService parameterServ * dual route data. */ public void beforeRouting() { - long printStats = System.currentTimeMillis(); ProcessInfo processInfo = this.statisticManager.newProcessInfo(new ProcessInfoKey( nodeService.findIdentityNodeId(), null, ProcessType.GAP_DETECT)); try { long ts = System.currentTimeMillis(); - processInfo.setStatus(Status.QUERYING); - final List gaps = dataService.findDataGaps(); + final List gaps = removeAbandonedGaps(dataService.findDataGaps()); long lastDataId = -1; final int dataIdIncrementBy = parameterService .getInt(ParameterConstants.DATA_ID_INCREMENT_BY); final long maxDataToSelect = parameterService .getInt(ParameterConstants.ROUTING_LARGEST_GAP_SIZE); long databaseTime = symmetricDialect.getDatabaseTime(); - int idsFilled = 0; - int newGapsInserted = 0; - int rangeChecked = 0; - int gapsDeleted = 0; for (final DataGap dataGap : gaps) { final boolean lastGap = dataGap.equals(gaps.get(gaps.size() - 1)); String sql = routerService.getSql("selectDistinctDataIdFromDataEventUsingGapsSql"); @@ -105,99 +99,76 @@ public void beforeRouting() { processInfo.setStatus(Status.QUERYING); List ids = sqlTemplate.query(sql, new NumberMapper(), params); processInfo.setStatus(Status.PROCESSING); - - idsFilled += ids.size(); - rangeChecked += dataGap.getEndId() - dataGap.getStartId(); - - ISqlTransaction transaction = null; - try { - transaction = sqlTemplate.startSqlTransaction(); - for (Number number : ids) { - long dataId = number.longValue(); - processInfo.incrementCurrentDataCount(); - if (lastDataId == -1 && dataGap.getStartId() + dataIdIncrementBy <= dataId) { - // there was a new gap at the start - dataService.insertDataGap(transaction, new DataGap(dataGap.getStartId(), dataId - 1)); - newGapsInserted++; - } else if (lastDataId != -1 && lastDataId + dataIdIncrementBy != dataId && lastDataId != dataId) { - // found a gap somewhere in the existing gap - dataService.insertDataGap(transaction, new DataGap(lastDataId + 1, dataId - 1)); - newGapsInserted++; - } - lastDataId = dataId; + for (Number number : ids) { + long dataId = number.longValue(); + processInfo.incrementCurrentDataCount(); + if (lastDataId == -1 && dataGap.getStartId() + dataIdIncrementBy <= dataId) { + // there was a new gap at the start + dataService.insertDataGap(new DataGap(dataGap.getStartId(), dataId - 1)); + } else if (lastDataId != -1 && lastDataId + dataIdIncrementBy != dataId + && lastDataId != dataId) { + // found a gap somewhere in the existing gap + dataService.insertDataGap(new DataGap(lastDataId + 1, dataId - 1)); } + lastDataId = dataId; + } - // if we found data in the gap - if (lastDataId != -1) { - if (!lastGap && lastDataId + dataIdIncrementBy <= dataGap.getEndId()) { - dataService.insertDataGap(transaction, new DataGap(lastDataId + dataIdIncrementBy, dataGap.getEndId())); - newGapsInserted++; - } + // if we found data in the gap + if (lastDataId != -1) { + if (!lastGap && lastDataId + dataIdIncrementBy <= dataGap.getEndId()) { + dataService.insertDataGap(new DataGap(lastDataId + dataIdIncrementBy, + dataGap.getEndId())); + } - dataService.deleteDataGap(transaction, dataGap); - gapsDeleted++; - - // if we did not find data in the gap and it was not the - // last gap - } else if (!lastGap) { - if (dataService.countDataInRange(dataGap.getStartId() - 1, dataGap.getEndId() + 1) == 0) { - if (symmetricDialect.supportsTransactionViews()) { - long transactionViewClockSyncThresholdInMs = parameterService.getLong( - ParameterConstants.DBDIALECT_ORACLE_TRANSACTION_VIEW_CLOCK_SYNC_THRESHOLD_MS, 60000); - Date createTime = dataService.findCreateTimeOfData(dataGap.getEndId() + 1); - if (createTime != null - && !symmetricDialect.areDatabaseTransactionsPendingSince(createTime.getTime() - + transactionViewClockSyncThresholdInMs)) { - if (dataService.countDataInRange(dataGap.getStartId() - 1, dataGap.getEndId() + 1) == 0) { - if (dataGap.getStartId() == dataGap.getEndId()) { - log.info( - "Found a gap in data_id at {}. Skipping it because there are no pending transactions in the database", - dataGap.getStartId()); - } else { - log.info( - "Found a gap in data_id from {} to {}. Skipping it because there are no pending transactions in the database", - dataGap.getStartId(), dataGap.getEndId()); - } - - dataService.deleteDataGap(transaction, dataGap); - gapsDeleted++; + dataService.deleteDataGap(dataGap); + + // if we did not find data in the gap and it was not the + // last gap + } else if (!lastGap) { + if (dataService.countDataInRange(dataGap.getStartId() - 1, + dataGap.getEndId() + 1) == 0) { + if (symmetricDialect.supportsTransactionViews()) { + long transactionViewClockSyncThresholdInMs = parameterService + .getLong( + ParameterConstants.DBDIALECT_ORACLE_TRANSACTION_VIEW_CLOCK_SYNC_THRESHOLD_MS, + 60000); + Date createTime = dataService + .findCreateTimeOfData(dataGap.getEndId() + 1); + if (createTime != null + && !symmetricDialect + .areDatabaseTransactionsPendingSince(createTime + .getTime() + + transactionViewClockSyncThresholdInMs)) { + if (dataService.countDataInRange(dataGap.getStartId() - 1, + dataGap.getEndId() + 1) == 0) { + if (dataGap.getStartId() == dataGap.getEndId()) { + log.info( + "Found a gap in data_id at {}. Skipping it because there are no pending transactions in the database", + dataGap.getStartId()); + } else { + log.info( + "Found a gap in data_id from {} to {}. Skipping it because there are no pending transactions in the database", + dataGap.getStartId(), dataGap.getEndId()); } + + dataService.deleteDataGap(dataGap); } - } else if (isDataGapExpired(dataGap.getEndId() + 1, databaseTime)) { - if (dataGap.getStartId() == dataGap.getEndId()) { - log.info("Found a gap in data_id at {}. Skipping it because the gap expired", dataGap.getStartId()); - } else { - log.info("Found a gap in data_id from {} to {}. Skipping it because the gap expired", - dataGap.getStartId(), dataGap.getEndId()); - } - dataService.deleteDataGap(transaction, dataGap); - gapsDeleted++; } - } - } - - if (System.currentTimeMillis() - printStats > 30000) { - log.info( - "The data gap detection process has been running for {}ms, detected {} rows that have been previously routed over a total gap range of {}, " - + "inserted {} new gaps, and deleted {} gaps", new Object[] { System.currentTimeMillis() - ts, - idsFilled, rangeChecked, newGapsInserted, gapsDeleted }); - printStats = System.currentTimeMillis(); - } - - transaction.commit(); - } catch (Error ex) { - if (transaction != null) { - transaction.rollback(); - } - throw ex; - } catch (RuntimeException ex) { - if (transaction != null) { - transaction.rollback(); - } - throw ex; - } finally { - if (transaction != null) { - transaction.close(); + } else if (isDataGapExpired(dataGap.getEndId() + 1, databaseTime)) { + if (dataGap.getStartId() == dataGap.getEndId()) { + log.info( + "Found a gap in data_id at {}. Skipping it because the gap expired", + dataGap.getStartId()); + } else { + log.info( + "Found a gap in data_id from {} to {}. Skipping it because the gap expired", + dataGap.getStartId(), dataGap.getEndId()); + } + dataService.deleteDataGap(dataGap); + } + } else { + dataService.checkForAndUpdateMissingChannelIds(dataGap.getStartId() - 1, + dataGap.getEndId() + 1); } } } @@ -219,6 +190,27 @@ public void beforeRouting() { } + /** + * If the system was shutdown in the middle of processing a large gap we + * could end up with a gap containing other gaps. + * + * @param gaps + */ + protected List removeAbandonedGaps(List gaps) { + List finalList = new ArrayList(gaps); + for (final DataGap dataGap1 : gaps) { + for (final DataGap dataGap2 : gaps) { + if (!dataGap1.equals(dataGap2) && dataGap1.contains(dataGap2)) { + finalList.remove(dataGap2); + if (dataService != null) { + dataService.deleteDataGap(dataGap2); + } + } + } + } + return finalList; + } + protected boolean isDataGapExpired(long dataId, long databaseTime) { long gapTimoutInMs = parameterService .getLong(ParameterConstants.ROUTING_STALE_DATA_ID_GAP_TIME); diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/route/DataGapRouteReader.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/route/DataGapRouteReader.java index 566e6377a9..64f9be2aaf 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/route/DataGapRouteReader.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/route/DataGapRouteReader.java @@ -121,7 +121,8 @@ public void run() { } } - protected void execute() { + protected void execute() { + long maxPeekAheadSizeInBytes = (long)(Runtime.getRuntime().maxMemory() * percentOfHeapToUse); ISymmetricDialect symmetricDialect = engine.getSymmetricDialect(); ISqlReadCursor cursor = null; @@ -364,13 +365,13 @@ protected String qualifyUsingDataGaps(List dataGaps, int numberOfGapsTo protected String getSql(String sqlName, Channel channel) { String select = engine.getRouterService().getSql(sqlName); - if (!channel.isUseOldDataToRoute() || context.isOnlyDefaultRoutersAssigned()) { + if (!channel.isUseOldDataToRoute()) { select = select.replace("d.old_data", "''"); } - if (!channel.isUseRowDataToRoute() || context.isOnlyDefaultRoutersAssigned()) { + if (!channel.isUseRowDataToRoute()) { select = select.replace("d.row_data", "''"); } - if (!channel.isUsePkDataToRoute() || context.isOnlyDefaultRoutersAssigned()) { + if (!channel.isUsePkDataToRoute()) { select = select.replace("d.pk_data", "''"); } return engine.getSymmetricDialect().massageDataExtractionSql( diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/IDataService.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/IDataService.java index aca8050031..9a38be3434 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/IDataService.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/IDataService.java @@ -133,13 +133,9 @@ public void insertScriptEvent(ISqlTransaction transaction, String channelId, public List listData(long batchId, String nodeId, long startDataId, String channelId, int maxRowsToRetrieve); - public void updateDataGap(DataGap gap, DataGap.Status status); - public void insertDataGap(DataGap gap); - - public void insertDataGap(ISqlTransaction transaction, DataGap gap); - - public void deleteDataGap(ISqlTransaction transaction, DataGap gap); + + public void updateDataGap(DataGap gap, DataGap.Status status); public void deleteDataGap(DataGap gap); diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/AbstractOfflineDetectorService.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/AbstractOfflineDetectorService.java index aeeabf1c6d..54b570c655 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/AbstractOfflineDetectorService.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/AbstractOfflineDetectorService.java @@ -38,7 +38,6 @@ import org.jumpmind.symmetric.service.RegistrationRequiredException; import org.jumpmind.symmetric.transport.AuthenticationException; import org.jumpmind.symmetric.transport.ConnectionRejectedException; -import org.jumpmind.symmetric.transport.ServiceUnavailableException; import org.jumpmind.symmetric.transport.SyncDisabledException; /** @@ -64,9 +63,6 @@ protected void fireOffline(Exception error, Node remoteNode, RemoteNodeStatus st if (isOffline(error)) { log.warn("Could not communicate with {} at {} because: {}", new Object[] {remoteNode, syncUrl, cause.getMessage()}); status.setStatus(Status.OFFLINE); - } else if (isServiceUnavailable(error)) { - log.info("{} at {} was unavailable", new Object[] {remoteNode, syncUrl}); - status.setStatus(Status.OFFLINE); } else if (isBusy(error)) { log.info("{} at {} was busy", new Object[] {remoteNode, syncUrl}); status.setStatus(Status.BUSY); @@ -146,16 +142,6 @@ protected boolean isBusy(Exception ex) { return offline; } - protected boolean isServiceUnavailable(Exception ex){ - boolean offline = false; - if (ex != null) { - Throwable cause = ExceptionUtils.getRootCause(ex); - offline = ex instanceof ServiceUnavailableException || - cause instanceof ServiceUnavailableException; - } - return offline; - } - protected boolean isSyncDisabled(Exception ex) { boolean syncDisabled = false; if (ex != null) { diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/DataLoaderService.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/DataLoaderService.java index 73e8f002ba..13f80eff42 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/DataLoaderService.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/DataLoaderService.java @@ -115,7 +115,6 @@ import org.jumpmind.symmetric.transport.ConnectionRejectedException; import org.jumpmind.symmetric.transport.IIncomingTransport; import org.jumpmind.symmetric.transport.ITransportManager; -import org.jumpmind.symmetric.transport.ServiceUnavailableException; import org.jumpmind.symmetric.transport.SyncDisabledException; import org.jumpmind.symmetric.transport.TransportException; import org.jumpmind.symmetric.transport.http.HttpTransportManager; @@ -469,8 +468,6 @@ protected void logAndRethrow(Node remoteNode, Throwable ex) throws IOException { log.warn("Registration attempt failed. Registration was not open"); } else if (ex instanceof ConnectionRejectedException) { throw (ConnectionRejectedException) ex; - } else if (ex instanceof ServiceUnavailableException) { - throw (ServiceUnavailableException) ex; } else if (ex instanceof AuthenticationException) { log.warn("Could not authenticate with node '{}'", remoteNode != null ? remoteNode.getNodeId() : "?"); diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/DataService.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/DataService.java index f27adee5e6..3a8562fd63 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/DataService.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/DataService.java @@ -1388,14 +1388,12 @@ public List findDataGaps() { .getInt(ParameterConstants.ROUTING_LARGEST_GAP_SIZE); List gaps = findDataGapsByStatus(DataGap.Status.GP); boolean lastGapExists = false; - long maxDataEventId = 0; for (DataGap dataGap : gaps) { lastGapExists |= dataGap.gapSize() >= maxDataToSelect - 1; - maxDataEventId = maxDataEventId < dataGap.getEndId() ? dataGap.getEndId() : maxDataEventId; } if (!lastGapExists) { - maxDataEventId = maxDataEventId == 0 ? findMaxDataEventDataId() : maxDataEventId; + long maxDataEventId = findMaxDataEventDataId(); long maxDataId = findMaxDataId(); if (maxDataEventId > 0) { maxDataEventId++; @@ -1410,34 +1408,19 @@ public List findDataGaps() { public long findMaxDataEventDataId() { return sqlTemplate.queryForLong(getSql("selectMaxDataEventDataIdSql")); } - + public void insertDataGap(DataGap gap) { - ISqlTransaction transaction = null; try { - transaction = sqlTemplate.startSqlTransaction(); - insertDataGap(transaction, gap); - transaction.commit(); - } catch (Error ex) { - if (transaction != null) { - transaction.rollback(); - } - throw ex; - } catch (RuntimeException ex) { - if (transaction != null) { - transaction.rollback(); - } - throw ex; - } finally { - close(transaction); + sqlTemplate.update(getSql("insertDataGapSql"), new Object[] { DataGap.Status.GP.name(), + AppUtils.getHostName(), gap.getStartId(), gap.getEndId() }, new int[] { + Types.VARCHAR, Types.VARCHAR, Types.NUMERIC, Types.NUMERIC }); + } catch (UniqueKeyException ex) { + log.warn("A gap already existed for {} to {}. Updating instead.", gap.getStartId(), + gap.getEndId()); + updateDataGap(gap, DataGap.Status.GP); } } - public void insertDataGap(ISqlTransaction transaction, DataGap gap) { - transaction.prepareAndExecute(getSql("insertDataGapSql"), - new Object[] { DataGap.Status.GP.name(), AppUtils.getHostName(), gap.getStartId(), gap.getEndId() }, new int[] { - Types.VARCHAR, Types.VARCHAR, Types.NUMERIC, Types.NUMERIC }); - } - public void updateDataGap(DataGap gap, DataGap.Status status) { sqlTemplate.update( getSql("updateDataGapSql"), @@ -1446,36 +1429,13 @@ public void updateDataGap(DataGap gap, DataGap.Status status) { symmetricDialect.getSqlTypeForIds(), symmetricDialect.getSqlTypeForIds() }); } - - @Override public void deleteDataGap(DataGap gap) { - ISqlTransaction transaction = null; - try { - transaction = sqlTemplate.startSqlTransaction(); - deleteDataGap(transaction, gap); - transaction.commit(); - } catch (Error ex) { - if (transaction != null) { - transaction.rollback(); - } - throw ex; - } catch (RuntimeException ex) { - if (transaction != null) { - transaction.rollback(); - } - throw ex; - } finally { - close(transaction); - } - } - - @Override - public void deleteDataGap(ISqlTransaction transaction, DataGap gap) { - transaction.prepareAndExecute( + sqlTemplate.update( getSql("deleteDataGapSql"), new Object[] { gap.getStartId(), gap.getEndId() }, new int[] { symmetricDialect.getSqlTypeForIds(), symmetricDialect.getSqlTypeForIds() }); + } public Date findCreateTimeOfEvent(long dataId) { diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/PullService.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/PullService.java index ec5b9aff33..8feae5541d 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/PullService.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/PullService.java @@ -45,7 +45,10 @@ import org.jumpmind.symmetric.service.IParameterService; import org.jumpmind.symmetric.service.IPullService; import org.jumpmind.symmetric.service.IRegistrationService; -import org.jumpmind.symmetric.transport.OfflineException; +import org.jumpmind.symmetric.transport.AuthenticationException; +import org.jumpmind.symmetric.transport.ConnectionRejectedException; +import org.jumpmind.symmetric.transport.SyncDisabledException; +import org.jumpmind.symmetric.transport.TransportException; /** * @see IPullService @@ -116,52 +119,68 @@ synchronized public RemoteNodeStatuses pullData(boolean force) { public void execute(NodeCommunication nodeCommunication, RemoteNodeStatus status) { Node node = nodeCommunication.getNode(); - if (StringUtils.isNotBlank(node.getSyncUrl()) || !parameterService.isRegistrationServer()) { - int pullCount = 0; - long batchesProcessedCount = 0; - do { - batchesProcessedCount = status.getBatchesProcessed(); - pullCount++; - log.debug("Pull requested for {}", node.toString()); - if (pullCount > 1) { - log.info("Immediate pull requested while in reload mode"); - } - - try { + if (StringUtils.isNotBlank(node.getSyncUrl()) || + !parameterService.isRegistrationServer()) { + try { + int pullCount = 0; + long batchesProcessedCount = 0; + do { + batchesProcessedCount = status.getBatchesProcessed(); + pullCount++; + log.debug("Pull requested for {}", node.toString()); + if (pullCount > 1) { + log.info("Immediate pull requested while in reload mode"); + } + dataLoaderService.loadDataFromPull(node, status); - } catch (ConnectException ex) { - log.warn("Failed to connect to the transport: {}", (node.getSyncUrl() == null ? parameterService.getRegistrationUrl() - : node.getSyncUrl())); - fireOffline(ex, node, status); - } catch (OfflineException ex) { - fireOffline(ex, node, status); - } catch (UnknownHostException ex) { - fireOffline(ex, node, status); - } catch (SocketException ex) { - log.warn("{}", ex.getMessage()); - fireOffline(ex, node, status); - } catch (IOException ex) { - log.error("An IO exception happened while attempting to pull data", ex); - fireOffline(ex, node, status); - } - - if (!status.failed() && (status.getDataProcessed() > 0 || status.getBatchesProcessed() > 0)) { - log.info("Pull data received from {}. {} rows and {} batches were processed", - new Object[] { node.toString(), status.getDataProcessed(), status.getBatchesProcessed() }); - - } else if (status.failed()) { - log.info("There was a failure while pulling data from {}. {} rows and {} batches were processed", - new Object[] { node.toString(), status.getDataProcessed(), status.getBatchesProcessed() }); - } - /* - * Re-pull immediately if we are in the middle of an initial - * load so that the initial load completes as quickly as - * possible. - */ - } while (nodeService.isDataLoadStarted() && !status.failed() && status.getBatchesProcessed() > batchesProcessedCount); - + + if (!status.failed() && + (status.getDataProcessed() > 0 || status.getBatchesProcessed() > 0)) { + log.info( + "Pull data received from {}. {} rows and {} batches were processed", + new Object[] { node.toString(), status.getDataProcessed(), + status.getBatchesProcessed() }); + + } else if (status.failed()) { + log.info( + "There was a failure while pulling data from {}. {} rows and {} batches were processed", + new Object[] { node.toString(), status.getDataProcessed(), + status.getBatchesProcessed() }); + } + /* + * Re-pull immediately if we are in the middle of an initial + * load so that the initial load completes as quickly as + * possible. + */ + } while (nodeService.isDataLoadStarted() && !status.failed() + && status.getBatchesProcessed() > batchesProcessedCount); + } catch (ConnectException ex) { + log.warn( + "Failed to connect to the transport: {}", + (node.getSyncUrl() == null ? parameterService.getRegistrationUrl() : node + .getSyncUrl())); + fireOffline(ex, node, status); + } catch (ConnectionRejectedException ex) { + fireOffline(ex, node, status); + } catch (AuthenticationException ex) { + fireOffline(ex, node, status); + } catch (UnknownHostException ex) { + fireOffline(ex, node, status); + } catch (SyncDisabledException ex) { + fireOffline(ex, node, status); + } catch (SocketException ex) { + log.warn("{}", ex.getMessage()); + fireOffline(ex, node, status); + } catch (TransportException ex) { + log.warn("{}", ex.getMessage()); + fireOffline(ex, node, status); + } catch (IOException ex) { + log.error("An IO exception happened while attempting to pull data", ex); + fireOffline(ex, node, status); + } } else { - log.warn("Cannot pull node '{}' in the group '{}'. The sync url is blank", node.getNodeId(), node.getNodeGroupId()); + log.warn("Cannot pull node '{}' in the group '{}'. The sync url is blank", + node.getNodeId(), node.getNodeGroupId()); } } diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/RouterService.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/RouterService.java index 4eea89e8dc..421eec2491 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/RouterService.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/RouterService.java @@ -90,10 +90,7 @@ */ public class RouterService extends AbstractService implements IRouterService { - protected Map commonBatchesLastKnownState = new HashMap(); - - - protected Map defaultRouterOnlyLastKnownState = new HashMap(); + protected Map defaultRouterOnlyLastState = new HashMap(); protected transient ExecutorService readThread = null; @@ -327,13 +324,15 @@ protected int routeDataForEachChannel(DataGapDetector gapDetector) { try { final List channels = engine.getConfigurationService().getNodeChannels( false); + for (NodeChannel nodeChannel : channels) { if (nodeChannel.isEnabled()) { processInfo.setCurrentChannelId(nodeChannel.getChannelId()); dataCount += routeDataForChannel(processInfo, nodeChannel, - sourceNode - , gapDetector); + sourceNode, + producesCommonBatches(nodeChannel.getChannel(), parameterService.getNodeGroupId(), + engine.getTriggerRouterService().getTriggerRouters(false)), gapDetector); } else { if (log.isDebugEnabled()) { log.debug( @@ -417,59 +416,26 @@ protected boolean producesCommonBatches(Channel channel, String nodeGroupId, Lis } } - if (!producesCommonBatches.equals(commonBatchesLastKnownState.get(channelId))) { + if (!producesCommonBatches.equals(defaultRouterOnlyLastState.get(channelId))) { if (producesCommonBatches) { log.info("The '{}' channel is in common batch mode", channelId); } else { log.info("The '{}' channel is NOT in common batch mode", channelId); } - commonBatchesLastKnownState.put(channelId, producesCommonBatches); + defaultRouterOnlyLastState.put(channelId, producesCommonBatches); } return producesCommonBatches; } - - protected boolean onlyDefaultRoutersAssigned(Channel channel, String nodeGroupId, List triggerRouters) { - String channelId = channel.getChannelId(); - Boolean onlyDefaultRoutersAssigned = !Constants.CHANNEL_CONFIG.equals(channelId) - && !channel.isFileSyncFlag() - && !channel.isReloadFlag() - && !Constants.CHANNEL_HEARTBEAT.equals(channelId) ? true : false; - if (onlyDefaultRoutersAssigned && triggerRouters != null) { - for (TriggerRouter triggerRouter : triggerRouters) { - if (triggerRouter.getTrigger().getChannelId().equals(channel.getChannelId()) && - triggerRouter.getRouter().getNodeGroupLink().getSourceNodeGroupId() - .equals(nodeGroupId) && !"default".equals(triggerRouter.getRouter().getRouterType())) { - onlyDefaultRoutersAssigned = false; - } - } - } - - if (!onlyDefaultRoutersAssigned.equals(defaultRouterOnlyLastKnownState.get(channelId))) { - if (onlyDefaultRoutersAssigned) { - log.info("The '{}' channel for the '{}' node group has only default routers assigned to it. Change data won't be selected during routing", channelId, nodeGroupId); - } - defaultRouterOnlyLastKnownState.put(channelId, onlyDefaultRoutersAssigned); - } - return onlyDefaultRoutersAssigned; - } protected int routeDataForChannel(ProcessInfo processInfo, final NodeChannel nodeChannel, final Node sourceNode, - DataGapDetector gapDetector) { + boolean produceCommonBatches, DataGapDetector gapDetector) { ChannelRouterContext context = null; long ts = System.currentTimeMillis(); int dataCount = -1; try { - List triggerRouters = engine.getTriggerRouterService().getTriggerRouters(false); - boolean producesCommonBatches = producesCommonBatches(nodeChannel.getChannel(), parameterService.getNodeGroupId(), - triggerRouters); - boolean onlyDefaultRoutersAssigned = onlyDefaultRoutersAssigned(nodeChannel.getChannel(), - parameterService.getNodeGroupId(), triggerRouters); - context = new ChannelRouterContext(sourceNode.getNodeId(), nodeChannel, symmetricDialect.getPlatform().getSqlTemplate().startSqlTransaction()); - context.setProduceCommonBatches(producesCommonBatches); - context.setOnlyDefaultRoutersAssigned(onlyDefaultRoutersAssigned); - + context.setProduceCommonBatches(produceCommonBatches); dataCount = selectDataAndRoute(processInfo, context); return dataCount; } catch (DelayRoutingException ex) { diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/AuthenticationException.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/AuthenticationException.java index bcbc9f3832..c3909761d3 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/AuthenticationException.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/AuthenticationException.java @@ -20,8 +20,9 @@ */ package org.jumpmind.symmetric.transport; +import org.jumpmind.exception.IoException; -public class AuthenticationException extends OfflineException { +public class AuthenticationException extends IoException { private static final long serialVersionUID = -6322765147037755510L; diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/ConnectionRejectedException.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/ConnectionRejectedException.java index eff18a6118..ff86a96bb8 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/ConnectionRejectedException.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/ConnectionRejectedException.java @@ -20,8 +20,9 @@ */ package org.jumpmind.symmetric.transport; +import org.jumpmind.exception.IoException; -public class ConnectionRejectedException extends OfflineException { +public class ConnectionRejectedException extends IoException { private static final long serialVersionUID = 3770259092569043530L; diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/OfflineException.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/OfflineException.java deleted file mode 100644 index fd2d3f5921..0000000000 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/OfflineException.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.jumpmind.symmetric.transport; - -import org.jumpmind.exception.IoException; - -public class OfflineException extends IoException { - - private static final long serialVersionUID = 1L; - - public OfflineException() { - super(); - } - - public OfflineException(Exception e) { - super(e); - } - - public OfflineException(String msg, Object... args) { - super(msg, args); - } - -} diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/ServiceUnavailableException.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/ServiceUnavailableException.java deleted file mode 100644 index a80135e5e7..0000000000 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/ServiceUnavailableException.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Licensed to JumpMind Inc under one or more contributor - * license agreements. See the NOTICE file distributed - * with this work for additional information regarding - * copyright ownership. JumpMind Inc licenses this file - * to you under the GNU General Public License, version 3.0 (GPLv3) - * (the "License"); you may not use this file except in compliance - * with the License. - * - * You should have received a copy of the GNU General Public License, - * version 3.0 (GPLv3) along with this library; if not, see - * . - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.jumpmind.symmetric.transport; - - -public class ServiceUnavailableException extends OfflineException { - - private static final long serialVersionUID = 3770259092569043530L; - -} \ No newline at end of file diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/SyncDisabledException.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/SyncDisabledException.java index 7d2c6d6fd9..d2d9e832c2 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/SyncDisabledException.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/SyncDisabledException.java @@ -20,8 +20,9 @@ */ package org.jumpmind.symmetric.transport; +import org.jumpmind.exception.IoException; -public class SyncDisabledException extends OfflineException { +public class SyncDisabledException extends IoException { private static final long serialVersionUID = 8646739179107142193L; } \ No newline at end of file diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/TransportException.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/TransportException.java index 49ea04de5b..642c700b9a 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/TransportException.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/TransportException.java @@ -22,7 +22,7 @@ import java.io.IOException; -public class TransportException extends OfflineException { +public class TransportException extends RuntimeException { private static final long serialVersionUID = -6127189404858972114L; diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpIncomingTransport.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpIncomingTransport.java index bb4786a775..d18a5f5e78 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpIncomingTransport.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpIncomingTransport.java @@ -26,7 +26,7 @@ import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; - + import org.apache.commons.io.IOUtils; import org.jumpmind.symmetric.common.ParameterConstants; import org.jumpmind.symmetric.service.IParameterService; @@ -35,7 +35,6 @@ import org.jumpmind.symmetric.transport.AuthenticationException; import org.jumpmind.symmetric.transport.ConnectionRejectedException; import org.jumpmind.symmetric.transport.IIncomingTransport; -import org.jumpmind.symmetric.transport.ServiceUnavailableException; import org.jumpmind.symmetric.transport.SyncDisabledException; import org.jumpmind.symmetric.transport.TransportUtils; import org.jumpmind.symmetric.web.WebConstants; @@ -97,11 +96,9 @@ public InputStream openStream() throws IOException { case WebConstants.REGISTRATION_REQUIRED: throw new RegistrationRequiredException(); case WebConstants.SYNC_DISABLED: - throw new SyncDisabledException(); - case WebConstants.SC_SERVICE_BUSY: + throw new SyncDisabledException(); + case WebConstants.SC_SERVICE_UNAVAILABLE: throw new ConnectionRejectedException(); - case WebConstants.SC_SERVICE_UNAVAILABLE: - throw new ServiceUnavailableException(); case WebConstants.SC_FORBIDDEN: throw new AuthenticationException(); default: diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpOutgoingTransport.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpOutgoingTransport.java index 36c96faae8..3969938278 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpOutgoingTransport.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpOutgoingTransport.java @@ -40,7 +40,6 @@ import org.jumpmind.symmetric.transport.AuthenticationException; import org.jumpmind.symmetric.transport.ConnectionRejectedException; import org.jumpmind.symmetric.transport.IOutgoingWithResponseTransport; -import org.jumpmind.symmetric.transport.ServiceUnavailableException; import org.jumpmind.symmetric.transport.SyncDisabledException; import org.jumpmind.symmetric.web.WebConstants; @@ -253,10 +252,8 @@ public BufferedWriter openWriter() { * @throws {@link AuthenticationException} */ private void analyzeResponseCode(int code) throws IOException { - if (WebConstants.SC_SERVICE_BUSY == code) { + if (WebConstants.SC_SERVICE_UNAVAILABLE == code) { throw new ConnectionRejectedException(); - } else if (WebConstants.SC_SERVICE_UNAVAILABLE == code) { - throw new ServiceUnavailableException(); } else if (WebConstants.SC_FORBIDDEN == code) { throw new AuthenticationException(); } else if (WebConstants.SYNC_DISABLED == code) { diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/web/WebConstants.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/web/WebConstants.java index 4135a58e7d..08327250b1 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/web/WebConstants.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/web/WebConstants.java @@ -53,11 +53,9 @@ public class WebConstants { public static final int SYNC_DISABLED = 658; - public static final int SC_FORBIDDEN = 659; + public static final int SC_FORBIDDEN = 403; - public static final int SC_SERVICE_UNAVAILABLE = 660; - - public static final int SC_SERVICE_BUSY = 670; + public static final int SC_SERVICE_UNAVAILABLE = 503; public static final String ACK_BATCH_NAME = "batch-"; diff --git a/symmetric-core/src/main/resources/symmetric-default.properties b/symmetric-core/src/main/resources/symmetric-default.properties index 288df2891f..e5819d25f4 100644 --- a/symmetric-core/src/main/resources/symmetric-default.properties +++ b/symmetric-core/src/main/resources/symmetric-default.properties @@ -336,13 +336,6 @@ transport.type=http # Tags: transport transport.max.bytes.to.sync=1048576 -# This indicates whether this node engine should be started when the instance is restarted -# -# DatabaseOverridable: true -# Tags: general -# Type: boolean -auto.start.engine=true - # If this is true, when symmetric starts up it will try to create the necessary tables. # # Tags: general diff --git a/symmetric-core/src/main/resources/symmetric-schema.xml b/symmetric-core/src/main/resources/symmetric-schema.xml index 5718360f9f..203328b9ab 100644 --- a/symmetric-core/src/main/resources/symmetric-schema.xml +++ b/symmetric-core/src/main/resources/symmetric-schema.xml @@ -182,12 +182,6 @@ - - - - - - diff --git a/symmetric-core/src/test/java/org/jumpmind/symmetric/VersionUnitTest.java b/symmetric-core/src/test/java/org/jumpmind/symmetric/VersionUnitTest.java index 2b3d600473..d00749c9d9 100644 --- a/symmetric-core/src/test/java/org/jumpmind/symmetric/VersionUnitTest.java +++ b/symmetric-core/src/test/java/org/jumpmind/symmetric/VersionUnitTest.java @@ -44,7 +44,7 @@ public void testIsOlderVersion() { assertTrue(Version.isOlderVersion("1.5.5")); assertTrue(Version.isOlderVersion("1.6.0")); assertTrue(Version.isOlderVersion("1.6.1")); - assertFalse(Version.isOlderVersion("3.8.1")); + assertFalse(Version.isOlderVersion("3.7.1")); } @Test diff --git a/symmetric-core/src/test/java/org/jumpmind/symmetric/route/DataGapDetectorTest.java b/symmetric-core/src/test/java/org/jumpmind/symmetric/route/DataGapDetectorTest.java index 60cd0d8d73..ba150b4cce 100644 --- a/symmetric-core/src/test/java/org/jumpmind/symmetric/route/DataGapDetectorTest.java +++ b/symmetric-core/src/test/java/org/jumpmind/symmetric/route/DataGapDetectorTest.java @@ -20,7 +20,41 @@ */ package org.jumpmind.symmetric.route; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.*; + +import org.jumpmind.symmetric.model.DataGap; +import org.junit.Test; public class DataGapDetectorTest { + @Test + public void testRemoveAbandonedGaps() { + DataGapDetector detector = new DataGapDetector(); + List gaps = new ArrayList(); + + gaps.add(new DataGap(1,1000)); + gaps.add(new DataGap(2000,3000)); + gaps.add(new DataGap(3001,3001)); + gaps.add(new DataGap(3002,3002)); + gaps.add(new DataGap(3003,3003)); + gaps.add(new DataGap(3004,3004)); + int expectedSize = gaps.size(); + + List evaluatedList = detector.removeAbandonedGaps(gaps); + assertEquals(expectedSize, evaluatedList.size()); + + gaps.add(new DataGap(2000,2001)); + gaps.add(new DataGap(2010,2022)); + gaps.add(new DataGap(2899,3000)); + + assertTrue(gaps.size() > expectedSize); + + evaluatedList = detector.removeAbandonedGaps(gaps); + assertEquals(expectedSize, evaluatedList.size()); + + + } } diff --git a/symmetric-csv/pom.xml b/symmetric-csv/pom.xml new file mode 100644 index 0000000000..975f40a20b --- /dev/null +++ b/symmetric-csv/pom.xml @@ -0,0 +1,36 @@ + + 4.0.0 + org.jumpmind.symmetric + symmetric-csv + jar + 3.7.0-SNAPSHOT + csv + 2010 + + + This library is a fork of a CSV library called CSVReader by Bruce Dunwiddie + + + + org.jumpmind.symmetric + symmetric-parent + 3.7.0-SNAPSHOT + ../symmetric-parent/pom.xml + + + + + GPL + http://www.gnu.org/licenses/gpl.txt + + + + + + junit + junit + test + + + + diff --git a/symmetric-db/pom.xml b/symmetric-db/pom.xml new file mode 100644 index 0000000000..2356be1fb3 --- /dev/null +++ b/symmetric-db/pom.xml @@ -0,0 +1,76 @@ + + 4.0.0 + org.jumpmind.symmetric + symmetric-db + jar + 3.7.0-SNAPSHOT + db + http://symmetricds.org + 2010 + + + This library is a fork of Apache DdlUtils. DdlUtils is a small, easy-to-use component for working with Database Definition (DDL) files. + + + + org.jumpmind.symmetric + symmetric-parent + 3.7.0-SNAPSHOT + ../symmetric-parent/pom.xml + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + /jdbc.properties.hsqldb + + + + + org.jumpmind.symmetric + symmetric-util + + + org.jumpmind.symmetric + symmetric-util + test-jar + test + + + junit + junit + test + + + log4j + log4j + provided + + + net.sf.kxml + kxml2 + + + commons-io + commons-io + + + commons-lang + commons-lang + + + commons-collections + commons-collections + + + commons-codec + commons-codec + + + diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDdlBuilder.java index f60badd944..b179b63704 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDdlBuilder.java @@ -130,7 +130,6 @@ public abstract class AbstractDdlBuilder implements IDdlBuilder { */ public AbstractDdlBuilder(String databaseName) { this.databaseName = databaseName; - addEscapedCharSequence("'", "''"); } /** diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/ase/AseDdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/ase/AseDdlBuilder.java index df987b5785..4b4239d4e5 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/ase/AseDdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/ase/AseDdlBuilder.java @@ -106,6 +106,7 @@ public AseDdlBuilder() { databaseInfo.setAutoIncrementUpdateAllowed(false); databaseInfo.setRequiresAutoCommitForDdl(true); + addEscapedCharSequence("'", "''"); } @Override diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/db2/Db2DdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/db2/Db2DdlBuilder.java index 1d5462c14a..317a869439 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/db2/Db2DdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/db2/Db2DdlBuilder.java @@ -81,6 +81,7 @@ public Db2DdlBuilder() { databaseInfo.setBinaryQuoteStart("blob(X'"); databaseInfo.setBinaryQuoteEnd("')"); + addEscapedCharSequence("'", "''"); } @Override diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/derby/DerbyDdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/derby/DerbyDdlBuilder.java index 410ed1962c..db4909b0c8 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/derby/DerbyDdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/derby/DerbyDdlBuilder.java @@ -76,6 +76,7 @@ public DerbyDdlBuilder() { databaseInfo.setBlankCharColumnSpacePadded(true); databaseInfo.setCharColumnSpaceTrimmed(false); databaseInfo.setEmptyStringNulled(false); + addEscapedCharSequence("'", "''"); } @Override diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/firebird/FirebirdDdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/firebird/FirebirdDdlBuilder.java index 52920e4e72..16d28f2247 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/firebird/FirebirdDdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/firebird/FirebirdDdlBuilder.java @@ -91,6 +91,7 @@ public FirebirdDdlBuilder() { databaseInfo.setMinIsolationLevelToPreventPhantomReads(Connection.TRANSACTION_REPEATABLE_READ); + addEscapedCharSequence("'", "''"); } @Override diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/h2/H2DdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/h2/H2DdlBuilder.java index a8f622ebf7..68bf04ee19 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/h2/H2DdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/h2/H2DdlBuilder.java @@ -84,7 +84,8 @@ public H2DdlBuilder() { databaseInfo.setCharColumnSpaceTrimmed(true); databaseInfo.setEmptyStringNulled(false); databaseInfo.setNullAsDefaultValueRequired(true); - + + addEscapedCharSequence("'", "''"); } @Override diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/hsqldb/HsqlDbDdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/hsqldb/HsqlDbDdlBuilder.java index de4912078c..7bbe73a0f3 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/hsqldb/HsqlDbDdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/hsqldb/HsqlDbDdlBuilder.java @@ -74,6 +74,7 @@ public HsqlDbDdlBuilder() { databaseInfo.setCharColumnSpaceTrimmed(false); databaseInfo.setEmptyStringNulled(false); + addEscapedCharSequence("'", "''"); } @Override diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/hsqldb2/HsqlDb2DdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/hsqldb2/HsqlDb2DdlBuilder.java index 2b05b18de7..5365a20a66 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/hsqldb2/HsqlDb2DdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/hsqldb2/HsqlDb2DdlBuilder.java @@ -78,6 +78,7 @@ public HsqlDb2DdlBuilder() { databaseInfo.setCharColumnSpaceTrimmed(false); databaseInfo.setEmptyStringNulled(false); + addEscapedCharSequence("'", "''"); } @Override diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/interbase/InterbaseDdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/interbase/InterbaseDdlBuilder.java index 8dcdddf553..68d9351d04 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/interbase/InterbaseDdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/interbase/InterbaseDdlBuilder.java @@ -95,6 +95,7 @@ public InterbaseDdlBuilder() { databaseInfo.setCharColumnSpaceTrimmed(false); databaseInfo.setEmptyStringNulled(false); + addEscapedCharSequence("'", "''"); } @Override diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/mssql/MsSql2000DdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/mssql/MsSql2000DdlBuilder.java index 43c61255fb..2a420363bf 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/mssql/MsSql2000DdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/mssql/MsSql2000DdlBuilder.java @@ -135,6 +135,7 @@ protected void setup() { databaseInfo.setEmptyStringNulled(false); databaseInfo.setAutoIncrementUpdateAllowed(false); + addEscapedCharSequence("'", "''"); } @Override diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/mysql/MySqlDdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/mysql/MySqlDdlBuilder.java index 5dacbf4cdb..706c77d847 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/mysql/MySqlDdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/mysql/MySqlDdlBuilder.java @@ -111,6 +111,7 @@ public MySqlDdlBuilder() { // already escaped sequences would be affected addEscapedCharSequence("\\", "\\\\"); addEscapedCharSequence("\0", "\\0"); + addEscapedCharSequence("'", "\\'"); addEscapedCharSequence("\"", "\\\""); addEscapedCharSequence("\b", "\\b"); addEscapedCharSequence("\n", "\\n"); diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/oracle/OracleDdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/oracle/OracleDdlBuilder.java index 7ce7ae2a11..c0f1d46ae4 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/oracle/OracleDdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/oracle/OracleDdlBuilder.java @@ -104,6 +104,7 @@ public OracleDdlBuilder() { databaseInfo.setCharColumnSpaceTrimmed(false); databaseInfo.setEmptyStringNulled(true); + addEscapedCharSequence("'", "''"); } @Override diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/postgresql/PostgreSqlDdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/postgresql/PostgreSqlDdlBuilder.java index d4ae63d6f5..215b7d539f 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/postgresql/PostgreSqlDdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/postgresql/PostgreSqlDdlBuilder.java @@ -96,6 +96,7 @@ public PostgreSqlDdlBuilder() { // we need to handle the backslash first otherwise the other // already escaped sequences would be affected addEscapedCharSequence("\\", "\\\\"); + addEscapedCharSequence("'", "\\'"); addEscapedCharSequence("\b", "\\b"); addEscapedCharSequence("\f", "\\f"); addEscapedCharSequence("\n", "\\n"); diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/redshift/RedshiftDdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/redshift/RedshiftDdlBuilder.java index 2af5d9849e..f1fee6154c 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/redshift/RedshiftDdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/redshift/RedshiftDdlBuilder.java @@ -54,6 +54,7 @@ public RedshiftDdlBuilder() { databaseInfo.setEmptyStringNulled(false); addEscapedCharSequence("\\", "\\\\"); + addEscapedCharSequence("'", "\\'"); addEscapedCharSequence("\b", "\\b"); addEscapedCharSequence("\f", "\\f"); addEscapedCharSequence("\n", "\\n"); diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/sqlanywhere/SqlAnywhereDdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/sqlanywhere/SqlAnywhereDdlBuilder.java index d0ce5d6ad4..55388cc7f1 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/sqlanywhere/SqlAnywhereDdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/sqlanywhere/SqlAnywhereDdlBuilder.java @@ -99,6 +99,7 @@ public SqlAnywhereDdlBuilder() { databaseInfo.setRequiresAutoCommitForDdl(true); databaseInfo.setRequiredCharColumnEmptyStringSameAsNull(true); + addEscapedCharSequence("'", "''"); } @Override diff --git a/symmetric-io/pom.xml b/symmetric-io/pom.xml new file mode 100644 index 0000000000..6ecc0ca736 --- /dev/null +++ b/symmetric-io/pom.xml @@ -0,0 +1,150 @@ + + 4.0.0 + org.jumpmind.symmetric + symmetric-io + jar + 3.7.0-SNAPSHOT + io + 2011 + + + + + + org.jumpmind.symmetric + symmetric-parent + 3.7.0-SNAPSHOT + ../symmetric-parent/pom.xml + + + + + org.jumpmind.symmetric + symmetric-db + + + org.jumpmind.symmetric + symmetric-jdbc + test + + + org.jumpmind.symmetric + symmetric-jdbc + test-jar + test + + + org.jumpmind.symmetric + symmetric-csv + + + org.beanshell + bsh + + + junit + junit + test + + + log4j + log4j + provided + + + + org.apache.derby + derby + true + + + org.apache.derby + derbytools + true + + + mysql + mysql-connector-java + provided + + + org.mariadb.jdbc + mariadb-java-client + true + + + org.jumpmind.symmetric.jdbc + postgresql + true + + + net.sourceforge.jtds + jtds + true + + + org.hsqldb + hsqldb + jdk5 + true + + + com.h2database + h2 + true + + + org.xerial + sqlite-jdbc + true + + + org.firebirdsql.jdbc + jaybird + provided + + + + org.apache.geronimo.specs + geronimo-j2ee-connector_1.6_spec + provided + + + net.sourceforge.jeval + jeval + 0.9.4 + + + org.mockito + mockito-all + test + + + org.powermock + powermock-api-mockito + test + + + org.powermock + powermock-module-junit4 + test + + + org.powermock + powermock-core + test + + + + + + + maven-surefire-plugin + 2.10 + + once + + + + + diff --git a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/DbExport.java b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/DbExport.java index 7f42191c34..54af8a9437 100644 --- a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/DbExport.java +++ b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/DbExport.java @@ -94,8 +94,6 @@ public enum Compatible { private String schema; private String dir; - - private int maxRows = Integer.MAX_VALUE; private boolean useQuotedIdentifiers = true; @@ -220,12 +218,8 @@ protected void writeTable(final WriterWrapper writerWrapper, Table table, String } platform.getSqlTemplate().query(sql, new ISqlRowMapper() { - int rows = maxRows; public Object mapRow(Row row) { - if (rows > 0) { - writerWrapper.writeRow(row); - rows--; - } + writerWrapper.writeRow(row); return Boolean.TRUE; } }); @@ -387,14 +381,6 @@ public void setUseJdbcTimestampFormat(boolean useJdbcTimestampFormat) { public boolean isUseJdbcTimestampFormat() { return useJdbcTimestampFormat; } - - public void setMaxRows(int maxRows) { - this.maxRows = maxRows; - } - - public int getMaxRows() { - return maxRows; - } class WriterWrapper { final private SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); diff --git a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/reader/SymXmlDataReader.java b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/reader/SymXmlDataReader.java index bc0b07ab6f..1d91616928 100644 --- a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/reader/SymXmlDataReader.java +++ b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/reader/SymXmlDataReader.java @@ -77,6 +77,7 @@ public void open(DataContext context) { protected Object readNext() { try { + boolean nullValue = false; Map rowData = new LinkedHashMap(); String columnName = null; Table lastTable = this.table; @@ -85,7 +86,12 @@ protected Object readNext() { switch (eventType) { case XmlPullParser.TEXT: if (columnName != null) { - rowData.put(columnName, parser.getText()); + if (!nullValue) { + rowData.put(columnName, parser.getText()); + } else { + rowData.put(columnName, null); + } + nullValue = false; columnName = null; } break; @@ -124,7 +130,6 @@ protected Object readNext() { } } } else if ("data".equalsIgnoreCase(name)) { - boolean nullValue = false; for (int i = 0; i < parser.getAttributeCount(); i++) { String attributeName = parser.getAttributeName(i); String attributeValue = parser.getAttributeValue(i); @@ -134,11 +139,6 @@ protected Object readNext() { nullValue = true; } } - - if (nullValue) { - rowData.put(columnName, null); - columnName = null; - } } else if ("batch".equalsIgnoreCase(name)) { batch = new Batch(); for (int i = 0; i < parser.getAttributeCount(); i++) { @@ -165,7 +165,6 @@ protected Object readNext() { String[] columnValues = rowData.values().toArray( new String[rowData.values().size()]); data.putParsedData(CsvData.ROW_DATA, columnValues); - rowData = new LinkedHashMap(); if (lastTable == null || !lastTable.equals(table)) { return table; } else { @@ -173,6 +172,7 @@ protected Object readNext() { } } else if ("data".equalsIgnoreCase(name)) { columnName = null; + nullValue = false; } break; diff --git a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/reader/XmlDataReader.java b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/reader/XmlDataReader.java index 1b0c0262f8..259c66a7a3 100644 --- a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/reader/XmlDataReader.java +++ b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/reader/XmlDataReader.java @@ -81,6 +81,7 @@ public void open(DataContext context) { protected void readNext() { try { + boolean nullValue = false; Map rowData = new LinkedHashMap(); String columnName = null; CsvData data = null; @@ -92,7 +93,12 @@ protected void readNext() { switch (eventType) { case XmlPullParser.TEXT: if (columnName != null) { - rowData.put(columnName, parser.getText()); + if (!nullValue) { + rowData.put(columnName, parser.getText()); + } else { + rowData.put(columnName, null); + } + nullValue = false; columnName = null; } break; @@ -107,7 +113,6 @@ protected void readNext() { } data.setDataEventType(DataEventType.INSERT); } else if ("field".equalsIgnoreCase(name)) { - boolean nullValue = false; for (int i = 0; i < parser.getAttributeCount(); i++) { String attributeName = parser.getAttributeName(i); String attributeValue = parser.getAttributeValue(i); @@ -117,11 +122,6 @@ protected void readNext() { nullValue = true; } } - - if (nullValue) { - rowData.put(columnName, null); - columnName = null; - } } else if ("table_data".equalsIgnoreCase(name)) { Batch batch = new Batch(); batch.setBinaryEncoding(BinaryEncoding.BASE64); @@ -178,13 +178,13 @@ protected void readNext() { next.add(table); } next.add(data); - rowData = new LinkedHashMap(); } else if ("table_data".equalsIgnoreCase(name)) { if (batch != null) { batch.setComplete(true); } } else if ("field".equalsIgnoreCase(name)) { columnName = null; + nullValue = false; } break; diff --git a/symmetric-io/src/test/java/org/jumpmind/symmetric/io/data/reader/TestableDataWriter.java b/symmetric-io/src/test/java/org/jumpmind/symmetric/io/data/reader/TestableDataWriter.java deleted file mode 100644 index 778cbfd44c..0000000000 --- a/symmetric-io/src/test/java/org/jumpmind/symmetric/io/data/reader/TestableDataWriter.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.jumpmind.symmetric.io.data.reader; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.jumpmind.db.model.Table; -import org.jumpmind.symmetric.io.data.Batch; -import org.jumpmind.symmetric.io.data.CsvData; -import org.jumpmind.symmetric.io.data.DataContext; -import org.jumpmind.symmetric.io.data.IDataWriter; -import org.jumpmind.util.Statistics; - -public class TestableDataWriter implements IDataWriter { - - List datas = new ArrayList(); - - Table lastTableRead; - - public List getDatas() { - return datas; - } - - public Table getLastTableRead() { - return lastTableRead; - } - - @Override - public void open(DataContext context) { - } - - @Override - public void close() { - } - - @Override - public Map getStatistics() { - return null; - } - - @Override - public void start(Batch batch) { - } - - @Override - public boolean start(Table table) { - lastTableRead = table; - return true; - } - - @Override - public void write(CsvData data) { - datas.add(data); - } - - @Override - public void end(Table table) { - } - - @Override - public void end(Batch batch, boolean inError) { - } - -} diff --git a/symmetric-io/src/test/java/org/jumpmind/symmetric/io/data/reader/XmlDataReaderTest.java b/symmetric-io/src/test/java/org/jumpmind/symmetric/io/data/reader/XmlDataReaderTest.java deleted file mode 100644 index 7385e7c763..0000000000 --- a/symmetric-io/src/test/java/org/jumpmind/symmetric/io/data/reader/XmlDataReaderTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.jumpmind.symmetric.io.data.reader; - -import static org.junit.Assert.assertEquals; - -import java.util.List; -import java.util.Map; - -import org.jumpmind.symmetric.io.data.CsvData; -import org.jumpmind.symmetric.io.data.DataProcessor; -import org.junit.Test; - -public class XmlDataReaderTest { - - @Test - public void testNilDataElement() { - XmlDataReader reader = new XmlDataReader(getClass().getResourceAsStream("xmldatareadertest1.xml")); - TestableDataWriter writer = new TestableDataWriter(); - DataProcessor processor = new DataProcessor(reader, writer, "test"); - processor.process(); - List dataRead = writer.getDatas(); - assertEquals(4, dataRead.size()); - Map data1 = dataRead.get(1).toColumnNameValuePairs(writer.getLastTableRead().getColumnNames(), CsvData.ROW_DATA); - assertEquals("1", data1.get("id")); - assertEquals("A", data1.get("my_value")); - - Map data2 = dataRead.get(2).toColumnNameValuePairs(writer.getLastTableRead().getColumnNames(), CsvData.ROW_DATA); - assertEquals("2", data2.get("id")); - assertEquals(null, data2.get("my_value")); - - } -} diff --git a/symmetric-io/src/test/resources/org/jumpmind/symmetric/io/data/reader/xmldatareadertest1.xml b/symmetric-io/src/test/resources/org/jumpmind/symmetric/io/data/reader/xmldatareadertest1.xml deleted file mode 100644 index 63a42de8d5..0000000000 --- a/symmetric-io/src/test/resources/org/jumpmind/symmetric/io/data/reader/xmldatareadertest1.xml +++ /dev/null @@ -1,20 +0,0 @@ - -
- - -
- - - 1 - A - - - 2 - - - - 3 - C - - - \ No newline at end of file diff --git a/symmetric-jdbc/pom.xml b/symmetric-jdbc/pom.xml new file mode 100644 index 0000000000..77b2eba329 --- /dev/null +++ b/symmetric-jdbc/pom.xml @@ -0,0 +1,107 @@ + + 4.0.0 + org.jumpmind.symmetric + symmetric-jdbc + jar + 3.7.0-SNAPSHOT + jdbc + http://symmetricds.org + + + org.jumpmind.symmetric + symmetric-parent + 3.7.0-SNAPSHOT + ../symmetric-parent/pom.xml + + + + + org.jumpmind.symmetric + symmetric-util + + + org.jumpmind.symmetric + symmetric-db + + + commons-dbcp + commons-dbcp + + + commons-beanutils + commons-beanutils + + + junit + junit + test + + + log4j + log4j + provided + + + org.springframework + spring-jdbc + + + + org.apache.derby + derby + true + + + org.apache.derby + derbytools + true + + + mysql + mysql-connector-java + provided + + + org.mariadb.jdbc + mariadb-java-client + true + + + org.jumpmind.symmetric.jdbc + postgresql + true + + + net.sourceforge.jtds + jtds + true + + + org.hsqldb + hsqldb + jdk5 + true + + + com.h2database + h2 + true + + + org.xerial + sqlite-jdbc + true + + + org.firebirdsql.jdbc + jaybird + provided + + + + org.apache.geronimo.specs + geronimo-j2ee-connector_1.6_spec + provided + + + diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/AbstractJdbcDdlReader.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/AbstractJdbcDdlReader.java index 40c4801fbc..5a6b902ce2 100644 --- a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/AbstractJdbcDdlReader.java +++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/AbstractJdbcDdlReader.java @@ -1305,23 +1305,24 @@ public StringBuilder appendIdentifier(StringBuilder query, String identifier) { * @return The resulting text */ protected String unescape(String text, String unescaped, String escaped) { + String result = text; // we need special handling if the single quote is escaped via a double // single quote - if (text != null && !"''".equals(text)) { + if (result != null) { if (escaped.equals("''")) { - if ((text.length() > 2) && text.startsWith("'") && text.endsWith("'")) { - text = "'" - + StringUtils.replace(text.substring(1, text.length() - 1), + if ((result.length() > 2) && result.startsWith("'") && result.endsWith("'")) { + result = "'" + + StringUtils.replace(result.substring(1, result.length() - 1), escaped, unescaped) + "'"; } else { - text = StringUtils.replace(text, escaped, unescaped); + result = StringUtils.replace(result, escaped, unescaped); } } else { - text = StringUtils.replace(text, escaped, unescaped); + result = StringUtils.replace(result, escaped, unescaped); } } - return text; + return result; } public List getTableTypes() { diff --git a/symmetric-parent/.gitignore b/symmetric-parent/.gitignore new file mode 100644 index 0000000000..0c124ba02e --- /dev/null +++ b/symmetric-parent/.gitignore @@ -0,0 +1,2 @@ +*.project +/target \ No newline at end of file diff --git a/symmetric-parent/pom.xml b/symmetric-parent/pom.xml new file mode 100644 index 0000000000..f96cda77c0 --- /dev/null +++ b/symmetric-parent/pom.xml @@ -0,0 +1,995 @@ + + 4.0.0 + org.jumpmind.symmetric + symmetric-parent + pom + 3.7.0-SNAPSHOT + parent + http://symmetricds.org + 2007 + + SymmetricDS is an open source database synchronization solution. It is platform-independent, + web-enabled, and database-agnostic. SymmetricDS was first built to replicate changes between 'retail store' + databases and ad centralized 'corporate' database. + + + JumpMind, Inc. + http://www.jumpmind.com/ + + + 4.0.5.RELEASE + 7.6.3.v20120416 + 10.10.2.0 + 2.3.2 + 1.3.176 + 3.7.15-M1 + 9.2-1002-jdbc4 + 5.1.30 + 1.1.7 + 1.7.7 + 1.5.3 + h2 + h2 + UTF-8 + 0 + DEV + + + + + dav.codehaus.org + SymmetricDS Repo + dav:https://dav.codehaus.org/repository/symmetricds/ + + + + + dav.codehaus.org + SymmetricDS Repo + dav:https://dav.codehaus.org/snapshots.repository/symmetricds/ + + false + + + + + releases + http://repository.codehaus.org + + + java.net + http://download.java.net/maven/glassfish + + + snapshot + http://snapshots.repository.codehaus.org + + + symmetric-local + symmetric-local + file://${project.basedir}/src/repository + + + + MANTIS + http://symmetricds.org/issues + + + + SymmetricDS Development Forum + http://sourceforge.net/projects/symmetricds/forums/forum/739237 + + + + SymmetricDS Help Forum + http://sourceforge.net/projects/symmetricds/forums/forum/739236 + + + + SymmetricDS Open Discussion Forum + http://sourceforge.net/projects/symmetricds/forums/forum/739235 + + + + + + chenson42 + Chris Henson + chenson42@users.sourceforge.net + + + JumpMind, Inc. + http://jumpmind.com/ + + developer + architect + + -5 + + + erilong + Eric Long + erilong@users.sourceforge.net + http://alstongrove.com/ + JumpMind, Inc. + http://jumpmind.com/ + + developer + architect + + -5 + + + eegeek + Mark Hanes + eegeek@users.sourceforge.net + JumpMind, Inc. + http://jumpmind.com/ + + developer + + -5 + + + eweimer + Eric Weimer + eweimer@users.sourceforge.net + + developer + + -5 + + + knaas + Keith Naas + knaas@users.sourceforge.net + + developer + + -5 + http://www.linkedin.com/in/keithnaas + 30xi + http://30xi.com + + + mmahawar + Manisha Mahawar + mmahawar@users.sourceforge.net + + developer + + -5 + + + + + Andrew Wilcox + andrewbwilcox@users.sourceforge.net + + developer + + -5 + + + Megha Shetty + megha_s@users.sourceforge.net + Big Lots + http://www.biglots.com/ + + developer + + -5 + + + Jon Krajewski + jkrajewski@users.sourceforge.net + + designer + + -5 + + + Dave Michels + dmichels2@users.sourceforge.net + Leading Edje + http://leadingedje.com/ + + developer + + -5 + + + Kunal Bajaj + kbajaj01@users.sourceforge.net + Big Lots + http://www.biglots.com/ + + developer + + -5 + + + Phil Marzullo + pmarzullo64@users.sourceforge.net + Abercrombie & Fitch + http://www.abercrombie.com/ + + developer + + -5 + + + Yasmany Cubela Medina + bitgandtter@users.sourceforge.net + + developer + + -5 + + + Hiro Rahandomal Gangwani + hiro.gangwani@tcs.com + http://www.linkedin.com/pub/hiro-gangwani/8/954/67a + Tata Consultancy Services Ltd + http://www.tcs.com + + designer + tester + + +4.5 + + + + + + org.apache.maven.wagon + wagon-webdav-jackrabbit + 2.2 + + + + + com.mycila.maven-license-plugin + maven-license-plugin + 1.10.b1 + +
../symmetric-assemble/HEADER
+ + **/*.vm + **/CsvReader.java + **/CsvWriter.java + **/torque/doc/docbook/datamodel.css.vm + **/torque/doc/docbook/datamodel.vm + **/torque/doc/docbook/table.vm + **/torque/doc/Control.vm + **/org/jumpmind/db/util/MultiInstanceofPredicate.java + **/org/jumpmind/db/util/CallbackClosure.java + **/org/jumpmind/db/model/TypeMap.java + **/org/jumpmind/db/model/Database.java + **/org/jumpmind/db/model/ModelException.java + **/org/jumpmind/db/model/ForeignKey.java + **/org/jumpmind/db/model/IndexImpBase.java + **/org/jumpmind/db/model/IndexColumn.java + **/org/jumpmind/db/model/UniqueIndex.java + **/org/jumpmind/db/model/IIndex.java + **/org/jumpmind/db/model/Reference.java + **/org/jumpmind/db/model/NonUniqueIndex.java + **/org/jumpmind/db/model/JdbcTypeCategoryEnum.java + **/org/jumpmind/db/model/Table.java + **/org/jumpmind/db/model/Column.java + **/org/jumpmind/db/alter/AddForeignKeyChange.java + **/org/jumpmind/db/alter/AddIndexChange.java + **/org/jumpmind/db/alter/ColumnDataTypeChange.java + **/org/jumpmind/db/alter/IModelChange.java + **/org/jumpmind/db/alter/TableChange.java + **/org/jumpmind/db/alter/RemoveColumnChange.java + **/org/jumpmind/db/alter/RemoveForeignKeyChange.java + **/org/jumpmind/db/alter/RemoveTableChange.java + **/org/jumpmind/db/alter/AddColumnChange.java + **/org/jumpmind/db/alter/AddPrimaryKeyChange.java + **/org/jumpmind/db/alter/ColumnDefaultValueChange.java + **/org/jumpmind/db/alter/ColumnRequiredChange.java + **/org/jumpmind/db/alter/AddTableChange.java + **/org/jumpmind/db/alter/ModelComparator.java + **/org/jumpmind/db/alter/ColumnSizeChange.java + **/org/jumpmind/db/alter/TableChangeImplBase.java + **/org/jumpmind/db/alter/ColumnChange.java + **/org/jumpmind/db/alter/ColumnAutoIncrementChange.java + **/org/jumpmind/db/alter/RemoveIndexChange.java + **/org/jumpmind/db/alter/RemovePrimaryKeyChange.java + **/org/jumpmind/db/alter/PrimaryKeyChange.java + **/org/jumpmind/db/platform/postgresql/PostgreSqlDdlBuilder.java + **/org/jumpmind/db/platform/sqlanywhere/SqlAnywhereDdlBuilder.java + **/org/jumpmind/db/platform/MetaDataColumnDescriptor.java + **/org/jumpmind/db/platform/ase/AseDdlBuilder.java + **/org/jumpmind/db/platform/IDatabasePlatform.java + **/org/jumpmind/db/platform/firebird/FirebirdDdlBuilder.java + **/org/jumpmind/db/platform/h2/H2DdlBuilder.java + **/org/jumpmind/db/platform/DatabaseMetaDataWrapper.java + **/org/jumpmind/db/platform/mysql/MySqlDdlBuilder.java + **/org/jumpmind/db/platform/DatabaseInfo.java + **/org/jumpmind/db/platform/interbase/InterbaseDdlBuilder.java + **/org/jumpmind/db/platform/DdlException.java + **/org/jumpmind/db/platform/AbstractDatabasePlatform.java + **/org/jumpmind/db/platform/oracle/OracleDdlBuilder.java + **/org/jumpmind/db/platform/mssql/MsSqlDdlBuilder.java + **/org/jumpmind/db/platform/derby/DerbyDdlBuilder.java + **/org/jumpmind/db/platform/AbstractDdlBuilder.java + **/org/jumpmind/db/platform/hsqldb2/HsqlDb2DdlBuilder.java + **/org/jumpmind/db/platform/db2/Db2DdlBuilder.java + **/org/jumpmind/db/platform/DefaultValueHelper.java + **/org/jumpmind/db/platform/hsqldb/HsqlDbDdlBuilder.java + **/org/jumpmind/db/io/DatabaseXmlUtil.java + **/schema/database.xsd + **/org/jumpmind/db/platform/postgresql/package.html + **/org/jumpmind/db/platform/postgresql/PostgreSqlDdlReader.java + **/org/jumpmind/db/platform/postgresql/PostgreSqlDatabasePlatform.java + **/org/jumpmind/db/platform/sqlanywhere/SqlAnywhereDatabasePlatform.java + **/org/jumpmind/db/platform/sqlanywhere/SqlAnywhereDdlReader.java + **/org/jumpmind/db/platform/JdbcDatabasePlatformFactory.java + **/org/jumpmind/db/platform/ase/package.html + **/org/jumpmind/db/platform/ase/AseDdlReader.java + **/org/jumpmind/db/platform/ase/AseDatabasePlatform.java + **/org/jumpmind/db/platform/firebird/FirebirdDdlReader.java + **/org/jumpmind/db/platform/firebird/package.html + **/org/jumpmind/db/platform/firebird/FirebirdDatabasePlatform.java + **/org/jumpmind/db/platform/h2/H2DatabasePlatform.java + **/org/jumpmind/db/platform/h2/H2DdlReader.java + **/org/jumpmind/db/platform/mysql/MySqlDdlReader.java + **/org/jumpmind/db/platform/mysql/package.html + **/org/jumpmind/db/platform/mysql/MySqlDatabasePlatform.java + **/org/jumpmind/db/platform/interbase/InterbaseDdlReader.java + **/org/jumpmind/db/platform/interbase/InterbaseDatabasePlatform.java + **/org/jumpmind/db/platform/oracle/OracleDdlReader.java + **/org/jumpmind/db/platform/oracle/package.html + **/org/jumpmind/db/platform/oracle/OracleDatabasePlatform.java + **/org/jumpmind/db/platform/mssql/MsSqlDdlReader.java + **/org/jumpmind/db/platform/mssql/MsSqlDatabasePlatform.java + **/org/jumpmind/db/platform/AbstractJdbcDdlReader.java + **/org/jumpmind/db/platform/derby/DerbyDdlReader.java + **/org/jumpmind/db/platform/derby/DerbyDatabasePlatform.java + **/org/jumpmind/db/platform/derby/package.html + **/org/jumpmind/db/platform/hsqldb2/HsqlDb2DatabasePlatform.java + **/org/jumpmind/db/platform/hsqldb2/HsqlDb2DdlReader.java + **/org/jumpmind/db/platform/db2/Db2DdlReader.java + **/org/jumpmind/db/platform/db2/package.html + **/org/jumpmind/db/platform/db2/Db2DatabasePlatform.java + **/org/jumpmind/db/platform/hsqldb/HsqlDbDatabasePlatform.java + **/org/jumpmind/db/platform/hsqldb/package.html + **/org/jumpmind/db/platform/hsqldb/HsqlDbDdlReader.java + +
+
+ + maven-eclipse-plugin + 2.9 + + true + false + 1.5 + + + + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + true + + + + org.codehaus.mojo + animal-sniffer-maven-plugin + 1.10 + + + org.codehaus.mojo.signature + java15 + 1.0 + + + + + maven-jar-plugin + 2.3.2 + + + + test-jar + + test-compile + + + + + + ${project.groupId} + ${project.artifactId} + ${maven.build.timestamp} + ${project.version} + ${BUILD_NUMBER} + ${JOB_NAME} + + + ${basedir}/target + + + + org.apache.maven.plugins + maven-source-plugin + 2.1.2 + + + attach-sources + verify + + jar + + + + + + maven-surefire-plugin + 2.10 + + always + -Xms512m -Xmx1024m -Duser.timezone=America/New_York -Dorg.sqlite.lib.path=${user.home}/.symmetricds/lib + + + test.root + ${test.root} + + + test.client + ${test.client} + + + + ${user.home}/.symmetricds/lib/ojdbc6.jar + + ${user.home}/.symmetricds/lib/ojdbc5.jar + + ${user.home}/.symmetricds/lib/ojdbc14.jar + + ${user.home}/.symmetricds/lib/db2jcc.jar + + ${user.home}/.symmetricds/lib/ifxjdbc.jar + + ${user.home}/.symmetricds/lib/ifxlang.jar + + ${user.home}/.symmetricds/lib/interclient.jar + + ${user.home}/.symmetricds/lib/sqljdbc4.jar + + ${user.home}/.symmetricds/lib/jconn4.jar + + + + +
+
+ + + + org.jumpmind.symmetric + symmetric-util + 3.7.0-SNAPSHOT + + + org.jumpmind.symmetric + symmetric-util + test-jar + 3.7.0-SNAPSHOT + + + org.jumpmind.symmetric + symmetric-db + 3.7.0-SNAPSHOT + + + stax + stax-api + + + + + org.jumpmind.symmetric + symmetric-db + test-jar + 3.7.0-SNAPSHOT + + + stax + stax-api + + + + + org.jumpmind.symmetric + symmetric-jdbc + 3.7.0-SNAPSHOT + + + org.jumpmind.symmetric + symmetric-jdbc + test-jar + 3.7.0-SNAPSHOT + + + stax + stax-api + + + + + org.jumpmind.symmetric + symmetric-io + test-jar + 3.7.0-SNAPSHOT + + + stax + stax-api + + + + + org.jumpmind.symmetric + symmetric-io + 3.7.0-SNAPSHOT + + + org.jumpmind.symmetric + symmetric-csv + 3.7.0-SNAPSHOT + + + org.jumpmind.symmetric + symmetric-core + 3.7.0-SNAPSHOT + + + org.jumpmind.symmetric + symmetric-oracle + 3.7.0-SNAPSHOT + + + org.jumpmind.symmetric + symmetric-postgres + 3.7.0-SNAPSHOT + + + org.jumpmind.symmetric + symmetric-mssql + 3.7.0-SNAPSHOT + + + org.jumpmind.symmetric + symmetric-mongo + 3.7.0-SNAPSHOT + + + org.jumpmind.symmetric + symmetric-ftp + 3.7.0-SNAPSHOT + + + org.jumpmind.symmetric + symmetric-core + test-jar + 3.7.0-SNAPSHOT + + + org.jumpmind.symmetric + symmetric-client + test-jar + 3.7.0-SNAPSHOT + + + org.jumpmind.symmetric + symmetric-client + 3.7.0-SNAPSHOT + + + org.jumpmind.symmetric + symmetric-server + 3.7.0-SNAPSHOT + + + org.jumpmind.symmetric + symmetric-wrapper + 3.7.0-SNAPSHOT + + + javax.mail + mail + 1.4.5 + + + com.google.code.gson + gson + 2.2.2 + + + net.sf.kxml + kxml2 + 2.3.0 + + + junit + junit + 4.11 + + + org.slf4j + jul-to-slf4j + ${version.slf4j} + + + org.slf4j + slf4j-api + ${version.slf4j} + + + org.slf4j + jcl-over-slf4j + ${version.slf4j} + + + org.slf4j + slf4j-log4j12 + ${version.slf4j} + + + log4j + log4j + 1.2.16 + + + com.sun.jmx + jmxri + + + com.sun.jdmk + jmxtools + + + javax.jms + jms + + + + + + org.springframework + spring-webmvc + ${version.springframwork} + + + commons-logging + commons-logging + + + + + org.springframework + spring-core + ${version.springframwork} + + + commons-logging + commons-logging + + + + + org.springframework + spring-asm + ${version.springframwork} + + + commons-logging + commons-logging + + + + + org.springframework + spring-context + ${version.springframwork} + + + org.springframework + spring-jdbc + ${version.springframwork} + + + commons-logging + commons-logging + + + + + org.springframework + spring-web + ${version.springframwork} + + + org.springframework + spring-jms + ${version.springframwork} + + + org.springframework + spring-test + ${version.springframwork} + + + org.codehaus.jackson + jackson-mapper-asl + 1.9.9 + + + javax.xml.bind + jaxb-api + 2.2.7 + + + javax.annotation + jsr250-api + 1.0 + + + + javax.servlet + servlet-api + 2.5 + + + javax.jms + jms-api + 1.1-rev-1 + + + org.apache.ant + ant + 1.8.1 + + + bouncycastle + bcprov-jdk15 + 136 + + + + commons-io + commons-io + 2.2 + + + commons-collections + commons-collections + 3.2 + + + commons-lang + commons-lang + 2.3 + + + commons-fileupload + commons-fileupload + 1.3 + + + commons-cli + commons-cli + 1.2 + + + commons-codec + commons-codec + 1.3 + + + commons-beanutils + commons-beanutils + 1.9.2 + + + commons-dbcp + commons-dbcp + 1.3 + + + + xerces + xercesImpl + + + + xml-apis + xml-apis + + + + + dom4j + dom4j + 1.4 + + + stax + stax-api + 1.0.1 + + + oro + oro + 2.0.8 + + + woodstox + wstx-asl + 3.0.2 + + + cglib + cglib-nodep + 2.2.2 + + + org.beanshell + bsh + 2.0b5 + + + + org.eclipse.jetty + jetty-server + ${version.jetty} + + + org.eclipse.jetty + jetty-servlets + ${version.jetty} + + + org.eclipse.jetty + jetty-webapp + ${version.jetty} + + + org.eclipse.jetty + jetty-servlet + ${version.jetty} + + + org.eclipse.jetty + jetty-jmx + ${version.jetty} + + + mx4j + mx4j-tools + 3.0.1 + + + org.jdom + jdom + 1.1 + + + + org.firebirdsql.jdbc + jaybird + 2.1.6 + + + geronimo-spec + geronimo-spec-j2ee + + + + + + org.apache.geronimo.specs + geronimo-j2ee-connector_1.6_spec + 1.0 + + + org.apache.derby + derby + ${version.derby} + + + org.apache.derby + derbytools + ${version.derby} + + + mysql + mysql-connector-java + ${version.mysql} + + + org.mongodb + mongo-java-driver + 2.12.3 + + + org.mariadb.jdbc + mariadb-java-client + ${version.mariadb} + + + org.jumpmind.symmetric.jdbc + postgresql + ${version.postgresql} + + + org.jumpmind.symmetric.jdbc + ojdbc + 11.2.0.3 + + + net.sourceforge.jtds + jtds + 1.2.4 + + + org.hsqldb + hsqldb + jdk5 + ${version.hsqldb} + + + com.h2database + h2 + ${version.h2} + + + org.xerial + sqlite-jdbc + ${version.sqlite} + + + com.amazonaws + aws-java-sdk + 1.8.9.1 + + + org.mockito + mockito-all + 1.9.5 + test + + + org.powermock + powermock-api-mockito + ${version.powermock} + test + + + org.powermock + powermock-module-junit4 + ${version.powermock} + test + + + org.powermock + powermock-core + ${version.powermock} + test + + + org.codehaus.mojo + animal-sniffer-annotations + 1.10 + true + test + + + +
\ No newline at end of file diff --git a/symmetric-server/pom.xml b/symmetric-server/pom.xml new file mode 100644 index 0000000000..60aa0aa556 --- /dev/null +++ b/symmetric-server/pom.xml @@ -0,0 +1,289 @@ + + 4.0.0 + org.jumpmind.symmetric + symmetric-server + jar + 3.7.0-SNAPSHOT + server + + org.jumpmind.symmetric + symmetric-parent + 3.7.0-SNAPSHOT + ../symmetric-parent/pom.xml + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + org.jumpmind.symmetric.SymmetricLauncher + + true + + + + + + + + + org.jumpmind.symmetric + symmetric-csv + + + org.jumpmind.symmetric + symmetric-db + + + org.jumpmind.symmetric + symmetric-jdbc + + + org.jumpmind.symmetric + symmetric-jdbc + test-jar + test + + + org.jumpmind.symmetric + symmetric-core + + + org.jumpmind.symmetric + symmetric-core + test-jar + test + + + org.jumpmind.symmetric + symmetric-client + + + org.jumpmind.symmetric + symmetric-client + test-jar + test + + + org.jumpmind.symmetric + symmetric-wrapper + provided + + + junit + junit + test + + + log4j + log4j + provided + + + javax.mail + mail + + + + org.springframework + spring-webmvc + + + org.springframework + spring-core + + + org.springframework + spring-context + + + org.springframework + spring-jdbc + + + org.springframework + spring-web + + + org.springframework + spring-jms + + + org.springframework + spring-test + test + + + javax.annotation + jsr250-api + + + + javax.jms + jms-api + provided + + + javax.xml.bind + jaxb-api + + + org.codehaus.jackson + jackson-mapper-asl + + + + commons-io + commons-io + + + commons-collections + commons-collections + + + commons-fileupload + commons-fileupload + + + commons-lang + commons-lang + + + commons-cli + commons-cli + + + commons-codec + commons-codec + + + commons-dbcp + commons-dbcp + + + cglib + cglib-nodep + + + org.beanshell + bsh + + + + javax.servlet + servlet-api + 2.5 + provided + + + org.eclipse.jetty + jetty-server + provided + + + org.eclipse.jetty + jetty-servlets + provided + + + org.eclipse.jetty + jetty-webapp + provided + + + org.eclipse.jetty + jetty-jmx + provided + + + mx4j + mx4j-tools + provided + + + org.jdom + jdom + + + + org.apache.derby + derby + provided + + + org.apache.derby + derbytools + provided + + + mysql + mysql-connector-java + provided + + + org.mongodb + mongo-java-driver + provided + + + org.mariadb.jdbc + mariadb-java-client + provided + + + org.jumpmind.symmetric.jdbc + postgresql + provided + + + net.sourceforge.jtds + jtds + provided + + + org.hsqldb + hsqldb + jdk5 + provided + + + com.h2database + h2 + provided + + + org.xerial + sqlite-jdbc + provided + + + org.firebirdsql.jdbc + jaybird + provided + + + com.amazonaws + aws-java-sdk + provided + + + + org.apache.geronimo.specs + geronimo-j2ee-connector_1.6_spec + provided + + + bouncycastle + bcprov-jdk15 + provided + + + com.mangofactory + swagger-springmvc + 0.6.5 + + + \ No newline at end of file diff --git a/symmetric-server/src/main/deploy/conf/sym_service.conf b/symmetric-server/src/main/deploy/conf/sym_service.conf index 5f2e99d8e6..cdb66b2060 100644 --- a/symmetric-server/src/main/deploy/conf/sym_service.conf +++ b/symmetric-server/src/main/deploy/conf/sym_service.conf @@ -31,7 +31,7 @@ wrapper.java.additional.12=-Djava.net.preferIPv4Stack=true wrapper.java.initmemory=256 # Maximum Java Heap Size (in MB) -wrapper.java.maxmemory=1024 +wrapper.java.maxmemory=256 #******************************************************************** # Wrapper Application Properties diff --git a/symmetric-server/src/main/java/org/jumpmind/symmetric/SymmetricWebServer.java b/symmetric-server/src/main/java/org/jumpmind/symmetric/SymmetricWebServer.java index 1aef27b9a2..d36e53e908 100644 --- a/symmetric-server/src/main/java/org/jumpmind/symmetric/SymmetricWebServer.java +++ b/symmetric-server/src/main/java/org/jumpmind/symmetric/SymmetricWebServer.java @@ -20,47 +20,29 @@ */ package org.jumpmind.symmetric; -import static org.apache.commons.lang.StringUtils.isNotBlank; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.EOFException; -import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.OutputStream; -import java.io.Serializable; import java.lang.management.ManagementFactory; import java.util.ArrayList; -import java.util.Enumeration; import javax.management.Attribute; import javax.management.MBeanServer; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; import mx4j.tools.adaptor.http.HttpAdaptor; import mx4j.tools.adaptor.http.XSLTProcessor; import org.apache.commons.lang.StringUtils; -import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.security.ConstraintMapping; import org.eclipse.jetty.security.ConstraintSecurityHandler; import org.eclipse.jetty.security.HashLoginService; import org.eclipse.jetty.security.authentication.BasicAuthenticator; import org.eclipse.jetty.server.Connector; -import org.eclipse.jetty.server.HttpConfiguration; -import org.eclipse.jetty.server.HttpConnectionFactory; -import org.eclipse.jetty.server.SecureRequestCustomizer; import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.server.SslConnectionFactory; -import org.eclipse.jetty.server.session.AbstractSession; -import org.eclipse.jetty.server.session.HashSessionManager; -import org.eclipse.jetty.server.session.HashedSession; +import org.eclipse.jetty.server.SessionManager; +import org.eclipse.jetty.server.bio.SocketConnector; +import org.eclipse.jetty.server.nio.SelectChannelConnector; +import org.eclipse.jetty.server.ssl.SslSocketConnector; import org.eclipse.jetty.util.security.Constraint; import org.eclipse.jetty.util.security.Password; import org.eclipse.jetty.util.ssl.SslContextFactory; @@ -92,13 +74,17 @@ public class SymmetricWebServer { protected static final Logger log = LoggerFactory.getLogger(SymmetricWebServer.class); - protected static final String DEFAULT_WEBAPP_DIR = System.getProperty(SystemConstants.SYSPROP_WEB_DIR, AppUtils.getSymHome() + "/web"); + protected static final String DEFAULT_WEBAPP_DIR = System.getProperty( + SystemConstants.SYSPROP_WEB_DIR, AppUtils.getSymHome() + "/web"); - public static final String DEFAULT_HTTP_PORT = System.getProperty(SystemConstants.SYSPROP_DEFAULT_HTTP_PORT, "31415"); + public static final String DEFAULT_HTTP_PORT = System.getProperty( + SystemConstants.SYSPROP_DEFAULT_HTTP_PORT, "31415"); - public static final String DEFAULT_JMX_PORT = System.getProperty(SystemConstants.SYSPROP_DEFAULT_JMX_PORT, "31416"); + public static final String DEFAULT_JMX_PORT = System.getProperty( + SystemConstants.SYSPROP_DEFAULT_JMX_PORT, "31416"); - public static final String DEFAULT_HTTPS_PORT = System.getProperty(SystemConstants.SYSPROP_DEFAULT_HTTPS_PORT, "31417"); + public static final String DEFAULT_HTTPS_PORT = System.getProperty( + SystemConstants.SYSPROP_DEFAULT_HTTPS_PORT, "31417"); public static final int DEFAULT_MAX_IDLE_TIME = 7200000; @@ -144,11 +130,11 @@ public enum Mode { protected boolean noDirectBuffer = false; protected String webAppDir = DEFAULT_WEBAPP_DIR; - + protected String name = "SymmetricDS"; - + protected String httpSslVerifiedServerNames = "all"; - + protected boolean allowSelfSignedCerts = true; public SymmetricWebServer() { @@ -164,7 +150,8 @@ public SymmetricWebServer(int maxIdleTime, String propertiesUrl) { this.maxIdleTime = maxIdleTime; } - public SymmetricWebServer(String webDirectory, int maxIdleTime, String propertiesUrl, boolean join, boolean noNio, boolean noDirectBuffer) { + public SymmetricWebServer(String webDirectory, int maxIdleTime, String propertiesUrl, + boolean join, boolean noNio, boolean noDirectBuffer) { this(propertiesUrl, webDirectory); this.maxIdleTime = maxIdleTime; this.join = join; @@ -179,7 +166,7 @@ public SymmetricWebServer(String propertiesUrl, String webappDir) { } protected void initFromProperties() { - + try { Class.forName(AbstractCommandLauncher.class.getName()); } catch (ClassNotFoundException e) { @@ -198,11 +185,14 @@ protected void initFromProperties() { Integer.parseInt(System.getProperty(ServerConstants.HTTPS_PORT, "" + httpsPort))); jmxPort = serverProperties.getInt(ServerConstants.JMX_HTTP_PORT, Integer.parseInt(System.getProperty(ServerConstants.JMX_HTTP_PORT, "" + jmxPort))); - host = serverProperties.get(ServerConstants.HOST_BIND_NAME, System.getProperty(ServerConstants.HOST_BIND_NAME, host)); + host = serverProperties.get(ServerConstants.HOST_BIND_NAME, + System.getProperty(ServerConstants.HOST_BIND_NAME, host)); httpSslVerifiedServerNames = serverProperties.get(ServerConstants.HTTPS_VERIFIED_SERVERS, - System.getProperty(ServerConstants.HTTPS_VERIFIED_SERVERS, httpSslVerifiedServerNames)); + System.getProperty(ServerConstants.HTTPS_VERIFIED_SERVERS, + httpSslVerifiedServerNames)); allowSelfSignedCerts = serverProperties.is(ServerConstants.HTTPS_ALLOW_SELF_SIGNED_CERTS, - Boolean.parseBoolean(System.getProperty(ServerConstants.HTTPS_ALLOW_SELF_SIGNED_CERTS, "" + allowSelfSignedCerts))); + Boolean.parseBoolean(System.getProperty( + ServerConstants.HTTPS_ALLOW_SELF_SIGNED_CERTS, "" + allowSelfSignedCerts))); } @@ -219,7 +209,8 @@ public SymmetricWebServer start() throws Exception { } else if (httpsPort > 0 && httpsEnabled) { return startSecure(httpsPort, jmxPort); } else { - throw new IllegalStateException("Either an http or https port needs to be set before starting the server."); + throw new IllegalStateException( + "Either an http or https port needs to be set before starting the server."); } } @@ -242,37 +233,32 @@ public SymmetricWebServer startMixed(int httpPort, int secureHttpPort, int jmxPo public SymmetricWebServer start(int httpPort, int securePort, int httpJmxPort, Mode mode) throws Exception { TransportManagerFactory.initHttps(httpSslVerifiedServerNames, allowSelfSignedCerts); - + // indicate to the app that we are in stand alone mode System.setProperty(SystemConstants.SYSPROP_STANDALONE_WEB, "true"); server = new Server(); - server.setConnectors(getConnectors(server, httpPort, securePort, mode)); + server.setConnectors(getConnectors(httpPort, securePort, mode)); setupBasicAuthIfNeeded(server); webapp = new WebAppContext(); webapp.setParentLoaderPriority(true); - webapp.setConfigurationDiscovered(true); webapp.setContextPath(webHome); webapp.setWar(webAppDir); - webapp.setResourceBase(webAppDir); - // webapp.addServlet(DefaultServlet.class, "/*"); - - SessionManager sm = new SessionManager(); - webapp.getSessionHandler().setSessionManager(sm); - - webapp.getServletContext().getContextHandler() - .setMaxFormContentSize(Integer.parseInt(System.getProperty("org.eclipse.jetty.server.Request.maxFormContentSize", "800000"))); - webapp.getServletContext().getContextHandler() - .setMaxFormKeys(Integer.parseInt(System.getProperty("org.eclipse.jetty.server.Request.maxFormKeys", "100000"))); + SessionManager sm = webapp.getSessionHandler().getSessionManager(); + sm.setMaxInactiveInterval(10 * 60); + sm.setSessionCookie(sm.getSessionCookie() + (httpPort > 0 ? httpPort : securePort)); + webapp.getServletContext().getContextHandler().setMaxFormContentSize(Integer.parseInt(System.getProperty("org.eclipse.jetty.server.Request.maxFormContentSize", "800000"))); + webapp.getServletContext().getContextHandler().setMaxFormKeys(Integer.parseInt(System.getProperty("org.eclipse.jetty.server.Request.maxFormKeys", "100000"))); if (propertiesFile != null) { - webapp.getServletContext().getContextHandler().setInitParameter(WebConstants.INIT_SINGLE_SERVER_PROPERTIES_FILE, propertiesFile); - webapp.getServletContext().getContextHandler() - .setInitParameter(WebConstants.INIT_PARAM_MULTI_SERVER_MODE, Boolean.toString(false)); + webapp.getServletContext().getContextHandler().setInitParameter( + WebConstants.INIT_SINGLE_SERVER_PROPERTIES_FILE, propertiesFile); + webapp.getServletContext().getContextHandler().setInitParameter(WebConstants.INIT_PARAM_MULTI_SERVER_MODE, + Boolean.toString(false)); } else { - webapp.getServletContext().getContextHandler() - .setInitParameter(WebConstants.INIT_PARAM_MULTI_SERVER_MODE, Boolean.toString(true)); + webapp.getServletContext().getContextHandler().setInitParameter(WebConstants.INIT_PARAM_MULTI_SERVER_MODE, + Boolean.toString(true)); } server.setHandler(webapp); @@ -296,7 +282,8 @@ protected ServletContext getServletContext() { public RestService getRestService() { ServletContext servletContext = getServletContext(); - WebApplicationContext rootContext = WebApplicationContextUtils.getWebApplicationContext(servletContext); + WebApplicationContext rootContext = + WebApplicationContextUtils.getWebApplicationContext(servletContext); return rootContext.getBean(RestService.class); } @@ -304,13 +291,15 @@ public ISymmetricEngine getEngine() { ISymmetricEngine engine = null; ServletContext servletContext = getServletContext(); if (servletContext != null) { - SymmetricEngineHolder engineHolder = ServletUtils.getSymmetricEngineHolder(servletContext); + SymmetricEngineHolder engineHolder = ServletUtils + .getSymmetricEngineHolder(servletContext); if (engineHolder != null) { if (engineHolder.getEngines().size() == 1) { return engineHolder.getEngines().values().iterator().next(); } else { - throw new IllegalStateException("Could not choose a single engine to return. There are " - + engineHolder.getEngines().size() + " engines configured."); + throw new IllegalStateException( + "Could not choose a single engine to return. There are " + + engineHolder.getEngines().size() + " engines configured."); } } } @@ -321,7 +310,8 @@ public void waitForEnginesToComeOnline(long maxWaitTimeInMs) throws InterruptedE long startTime = System.currentTimeMillis(); ServletContext servletContext = getServletContext(); if (servletContext != null) { - SymmetricEngineHolder engineHolder = ServletUtils.getSymmetricEngineHolder(servletContext); + SymmetricEngineHolder engineHolder = ServletUtils + .getSymmetricEngineHolder(servletContext); while (engineHolder.areEnginesStarting()) { AppUtils.sleep(500); if ((System.currentTimeMillis() - startTime) > maxWaitTimeInMs) { @@ -358,53 +348,47 @@ protected void setupBasicAuthIfNeeded(Server server) { } } - protected Connector[] getConnectors(Server server, int port, int securePort, Mode mode) { + protected Connector[] getConnectors(int port, int securePort, Mode mode) { ArrayList connectors = new ArrayList(); String keyStoreFile = System.getProperty(SecurityConstants.SYSPROP_KEYSTORE); - String keyStoreType = System.getProperty(SecurityConstants.SYSPROP_KEYSTORE_TYPE, SecurityConstants.KEYSTORE_TYPE); - - HttpConfiguration httpConfig = new HttpConfiguration(); - if (mode.equals(Mode.HTTPS) || mode.equals(Mode.MIXED)) { - httpConfig.setSecureScheme("https"); - httpConfig.setSecurePort(securePort); - } - - httpConfig.setOutputBufferSize(32768); + String keyStoreType = System.getProperty(SystemConstants.SYSPROP_KEYSTORE_TYPE, SecurityConstants.KEYSTORE_TYPE); if (mode.equals(Mode.HTTP) || mode.equals(Mode.MIXED)) { - ServerConnector http = new ServerConnector(server, new HttpConnectionFactory(httpConfig)); - http.setPort(port); - http.setHost(host); - http.setIdleTimeout(maxIdleTime); - connectors.add(http); + Connector connector = null; + if (noNio) { + connector = new SocketConnector(); + } else { + SelectChannelConnector nioConnector = new SelectChannelConnector(); + nioConnector.setUseDirectBuffers(!noDirectBuffer); + connector = nioConnector; + } + connector.setPort(port); + connector.setHost(host); + connector.setMaxIdleTime(maxIdleTime); + connectors.add(connector); log.info(String.format("About to start %s web server on host:port %s:%s", name, host == null ? "default" : host, port)); } if (mode.equals(Mode.HTTPS) || mode.equals(Mode.MIXED)) { - ISecurityService securityService = SecurityServiceFactory.create(SecurityServiceType.SERVER, - new TypedProperties(System.getProperties())); + ISecurityService securityService = SecurityServiceFactory.create(SecurityServiceType.SERVER, new TypedProperties(System.getProperties())); securityService.installDefaultSslCert(host); - String keyStorePassword = System.getProperty(SecurityConstants.SYSPROP_KEYSTORE_PASSWORD); - keyStorePassword = (keyStorePassword != null) ? keyStorePassword : SecurityConstants.KEYSTORE_PASSWORD; - SslContextFactory sslConnectorFactory = new SslContextFactory(); + Connector connector = new SslSocketConnector(); + String keyStorePassword = System + .getProperty(SecurityConstants.SYSPROP_KEYSTORE_PASSWORD); + keyStorePassword = (keyStorePassword != null) ? keyStorePassword + : SecurityConstants.KEYSTORE_PASSWORD; + SslContextFactory sslConnectorFactory = ((SslSocketConnector) connector).getSslContextFactory(); sslConnectorFactory.setKeyStorePath(keyStoreFile); sslConnectorFactory.setKeyManagerPassword(keyStorePassword); /* Prevent POODLE attack */ sslConnectorFactory.addExcludeProtocols("SSLv3"); - sslConnectorFactory.setCertAlias(System.getProperty(SecurityConstants.SYSPROP_KEYSTORE_CERT_ALIAS, - SecurityConstants.ALIAS_SYM_PRIVATE_KEY)); + sslConnectorFactory.setCertAlias(System.getProperty(SystemConstants.SYSPROP_KEYSTORE_CERT_ALIAS, SecurityConstants.ALIAS_SYM_PRIVATE_KEY)); sslConnectorFactory.setKeyStoreType(keyStoreType); - HttpConfiguration httpsConfig = new HttpConfiguration(httpConfig); - httpsConfig.addCustomizer(new SecureRequestCustomizer()); - - ServerConnector https = new ServerConnector(server, - new SslConnectionFactory(sslConnectorFactory, HttpVersion.HTTP_1_1.asString()), new HttpConnectionFactory(httpsConfig)); - https.setPort(securePort); - https.setIdleTimeout(maxIdleTime); - https.setHost(host); - connectors.add(https); - log.info(String.format("About to start %s web server on secure host:port %s:%s", name, host == null ? "default" : host, - securePort)); + ((SslSocketConnector) connector).setMaxIdleTime(maxIdleTime); + connector.setPort(securePort); + connector.setHost(host); + connectors.add(connector); + log.info(String.format("About to start %s web server on secure host:port %s:%s", name, host == null ? "default" : host, securePort)); } return connectors.toArray(new Connector[connectors.size()]); } @@ -415,7 +399,8 @@ protected void registerHttpJmxAdaptor(int jmxPort) throws Exception { MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); ObjectName name = getHttpJmxAdaptorName(); mbeanServer.createMBean(HttpAdaptor.class.getName(), name); - if (!AppUtils.isSystemPropertySet(SystemConstants.SYSPROP_JMX_HTTP_CONSOLE_LOCALHOST_ENABLED, true)) { + if (!AppUtils.isSystemPropertySet(SystemConstants.SYSPROP_JMX_HTTP_CONSOLE_LOCALHOST_ENABLED, + true)) { mbeanServer.setAttribute(name, new Attribute("Host", "0.0.0.0")); } else if (StringUtils.isNotBlank(host)) { mbeanServer.setAttribute(name, new Attribute("Host", host)); @@ -521,6 +506,7 @@ public void setNoNio(boolean noNio) { this.noNio = noNio; } + public boolean isNoNio() { return noNio; } @@ -573,128 +559,5 @@ public boolean isJmxEnabled() { return jmxEnabled; } - class SessionManager extends HashSessionManager { - - public SessionManager() { - setMaxInactiveInterval(10 * 60); - setLazyLoad(true); - setDeleteUnrestorableSessions(true); - setSessionCookie(getSessionCookie() + (httpPort > 0 ? httpPort - : httpsPort)); - } - - @Override - protected AbstractSession newSession(HttpServletRequest request) { - return new Session(this, request); - } - - @Override - protected AbstractSession newSession(long created, long accessed, String clusterId) { - return new Session(this, created, accessed, clusterId); - } - - @Override - protected synchronized HashedSession restoreSession(String idInCuster) { - if (isNotBlank(idInCuster)) { - return super.restoreSession(idInCuster); - } else { - return null; - } - } - - public HashedSession restoreSession(InputStream is, HashedSession session) throws Exception { - DataInputStream di = new DataInputStream(is); - - String clusterId = di.readUTF(); - di.readUTF(); // nodeId - - long created = di.readLong(); - long accessed = di.readLong(); - int requests = di.readInt(); - - if (session == null) - session = (HashedSession) newSession(created, accessed, clusterId); - session.setRequests(requests); - - int size = di.readInt(); - - restoreSessionAttributes(di, size, session); - - try { - int maxIdle = di.readInt(); - session.setMaxInactiveInterval(maxIdle); - } catch (EOFException e) { - log.debug("No maxInactiveInterval persisted for session " + clusterId, e); - } - - return session; - } - - private void restoreSessionAttributes(InputStream is, int size, HashedSession session) throws Exception { - if (size > 0) { - ObjectInputStream ois = new ObjectInputStream(is); - for (int i = 0; i < size; i++) { - String key = ois.readUTF(); - try { - Object value = ois.readObject(); - session.setAttribute(key, value); - } catch (Exception ex) { - if (ex instanceof ClassCastException || ex instanceof ClassNotFoundException) { - log.warn("Could not restore the '" + key - + "' session object. Code has probably changed. The error message was: " + ex.getMessage()); - } else { - log.error("Could not restore the '" + key + "' session object.", ex); - } - } - } - } - } - - } - - class Session extends HashedSession { - - protected Session(HashSessionManager hashSessionManager, HttpServletRequest request) { - super(hashSessionManager, request); - } - - protected Session(HashSessionManager hashSessionManager, long created, long accessed, String clusterId) { - super(hashSessionManager, created, accessed, clusterId); - } - - @Override - public synchronized void save(OutputStream os) throws IOException { - DataOutputStream out = new DataOutputStream(os); - out.writeUTF(getClusterId()); - out.writeUTF(getNodeId()); - out.writeLong(getCreationTime()); - out.writeLong(getAccessed()); - out.writeInt(getRequests()); - - Enumeration e = getAttributeNames(); - int count = 0; - while (e.hasMoreElements()) { - String key = e.nextElement(); - Object obj = doGet(key); - if (obj instanceof Serializable) { - count++; - } - } - out.writeInt(count); - ObjectOutputStream oos = new ObjectOutputStream(out); - e = getAttributeNames(); - while (e.hasMoreElements()) { - String key = e.nextElement(); - Object obj = doGet(key); - if (obj instanceof Serializable) { - oos.writeUTF(key); - oos.writeObject(obj); - } - } - oos.flush(); - out.writeInt(getMaxInactiveInterval()); - } - - } } diff --git a/symmetric-server/src/main/java/org/jumpmind/symmetric/web/NodeConcurrencyInterceptor.java b/symmetric-server/src/main/java/org/jumpmind/symmetric/web/NodeConcurrencyInterceptor.java index 61969a746d..a2868dd279 100644 --- a/symmetric-server/src/main/java/org/jumpmind/symmetric/web/NodeConcurrencyInterceptor.java +++ b/symmetric-server/src/main/java/org/jumpmind/symmetric/web/NodeConcurrencyInterceptor.java @@ -73,14 +73,14 @@ public boolean before(HttpServletRequest req, HttpServletResponse resp) throws I if (!concurrentConnectionManager .reserveConnection(nodeId, poolId, ReservationType.SOFT)) { statisticManager.incrementNodesRejected(1); - ServletUtils.sendError(resp, WebConstants.SC_SERVICE_BUSY); + ServletUtils.sendError(resp, WebConstants.SC_SERVICE_UNAVAILABLE); } else { try { buildSuspendIgnoreResponseHeaders(nodeId, resp); } catch (Exception ex) { concurrentConnectionManager.releaseConnection(nodeId, poolId); log.error("Error building response headers", ex); - ServletUtils.sendError(resp, WebConstants.SC_SERVICE_BUSY); + ServletUtils.sendError(resp, WebConstants.SC_SERVICE_UNAVAILABLE); } } return false; @@ -92,13 +92,13 @@ public boolean before(HttpServletRequest req, HttpServletResponse resp) throws I } catch (Exception ex) { concurrentConnectionManager.releaseConnection(nodeId, poolId); log.error("Error building response headers", ex); - ServletUtils.sendError(resp, WebConstants.SC_SERVICE_BUSY); + ServletUtils.sendError(resp, WebConstants.SC_SERVICE_UNAVAILABLE); return false; } } else { statisticManager.incrementNodesRejected(1); - ServletUtils.sendError(resp, WebConstants.SC_SERVICE_BUSY); + ServletUtils.sendError(resp, WebConstants.SC_SERVICE_UNAVAILABLE); return false; } } diff --git a/symmetric-server/src/main/java/org/jumpmind/symmetric/web/SymmetricEngineHolder.java b/symmetric-server/src/main/java/org/jumpmind/symmetric/web/SymmetricEngineHolder.java index 41c4f09000..deb2c42c1c 100644 --- a/symmetric-server/src/main/java/org/jumpmind/symmetric/web/SymmetricEngineHolder.java +++ b/symmetric-server/src/main/java/org/jumpmind/symmetric/web/SymmetricEngineHolder.java @@ -336,7 +336,7 @@ public ISymmetricEngine install(Properties passedInProperties) throws Exception } engine = create(symmetricProperties.getAbsolutePath()); - if (engine != null) { + if (engine != null && autoStart) { engineCount++; engine.start(); } else { @@ -441,8 +441,7 @@ public EngineStarter(String propertiesFile) { @Override public void run() { ISymmetricEngine engine = create(propertiesFile); - if (engine != null && autoStart && - engine.getParameterService().is(ParameterConstants.AUTO_START_ENGINE)) { + if (engine != null && autoStart) { engine.start(); } enginesStarting.remove(this); diff --git a/symmetric-server/src/main/java/org/jumpmind/symmetric/web/SymmetricServlet.java b/symmetric-server/src/main/java/org/jumpmind/symmetric/web/SymmetricServlet.java index eafad8bfa2..ab0b43a06b 100644 --- a/symmetric-server/src/main/java/org/jumpmind/symmetric/web/SymmetricServlet.java +++ b/symmetric-server/src/main/java/org/jumpmind/symmetric/web/SymmetricServlet.java @@ -82,7 +82,7 @@ protected void service(HttpServletRequest req, HttpServletResponse res) new Object[] { ServletUtils.normalizeRequestUri(req), req.getRemoteHost(), req.getRemoteAddr(), req.getQueryString() }); } - ServletUtils.sendError(res, WebConstants.SC_SERVICE_UNAVAILABLE); + ServletUtils.sendError(res, HttpServletResponse.SC_SERVICE_UNAVAILABLE); } else if (engine.isStarted()) { IUriHandler handler = findMatchingHandler(engine, req); @@ -126,19 +126,13 @@ protected void service(HttpServletRequest req, HttpServletResponse res) "The client node request is being rejected because the server node is currently starting. Please be patient. The request was {} from the host {} with an ip address of {} will not be processed. The query string was: {}", new Object[] { ServletUtils.normalizeRequestUri(req), req.getRemoteHost(), req.getRemoteAddr(), req.getQueryString() }); - ServletUtils.sendError(res, WebConstants.SC_SERVICE_UNAVAILABLE); + ServletUtils.sendError(res, HttpServletResponse.SC_SERVICE_UNAVAILABLE); } else if (!engine.isStarted() && !engine.isConfigured()) { - log.info( + log.warn( "The client node request is being rejected because the server node was not started because it is not configured properly. The request {} from the host {} with an ip address of {} will not be processed. The query string was: {}", new Object[] { ServletUtils.normalizeRequestUri(req), req.getRemoteHost(), req.getRemoteAddr(), req.getQueryString() }); - ServletUtils.sendError(res, WebConstants.SC_SERVICE_UNAVAILABLE); - } else { - log.debug( - "The client node request is being rejected because the server node is not started. The request {} from the host {} with an ip address of {} will not be processed. The query string was: {}", - new Object[] { ServletUtils.normalizeRequestUri(req), req.getRemoteHost(), - req.getRemoteAddr(), req.getQueryString() }); - ServletUtils.sendError(res, WebConstants.SC_SERVICE_UNAVAILABLE); + ServletUtils.sendError(res, HttpServletResponse.SC_SERVICE_UNAVAILABLE); } } diff --git a/symmetric-server/src/main/java/org/jumpmind/symmetric/web/compression/CompressionResponseStream.java b/symmetric-server/src/main/java/org/jumpmind/symmetric/web/compression/CompressionResponseStream.java index dabddc79a3..18da3236d7 100644 --- a/symmetric-server/src/main/java/org/jumpmind/symmetric/web/compression/CompressionResponseStream.java +++ b/symmetric-server/src/main/java/org/jumpmind/symmetric/web/compression/CompressionResponseStream.java @@ -23,11 +23,10 @@ import java.io.IOException; import java.io.OutputStream; import java.util.zip.GZIPOutputStream; - + import javax.servlet.ServletOutputStream; -import javax.servlet.WriteListener; import javax.servlet.http.HttpServletResponse; - + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -167,12 +166,6 @@ public void write(byte b[], int off, int len) throws IOException { gzipstream.write(b, off, len); } - - @Override - public boolean isReady() { - return true; - } - /** * Has this response stream been closed? @@ -181,8 +174,4 @@ public boolean closed() { return this.closed; } - @Override - public void setWriteListener(WriteListener writeListener) { - } - } \ No newline at end of file diff --git a/symmetric-server/src/main/java/org/jumpmind/symmetric/web/rest/RestService.java b/symmetric-server/src/main/java/org/jumpmind/symmetric/web/rest/RestService.java index 3fd297eaab..8a79210dd5 100644 --- a/symmetric-server/src/main/java/org/jumpmind/symmetric/web/rest/RestService.java +++ b/symmetric-server/src/main/java/org/jumpmind/symmetric/web/rest/RestService.java @@ -48,7 +48,6 @@ import org.jumpmind.db.sql.Row; import org.jumpmind.exception.IoException; import org.jumpmind.symmetric.ISymmetricEngine; -import org.jumpmind.symmetric.common.Constants; import org.jumpmind.symmetric.common.ParameterConstants; import org.jumpmind.symmetric.io.data.writer.StructureDataWriter.PayloadType; import org.jumpmind.symmetric.model.BatchAck; @@ -1255,16 +1254,13 @@ public RestError handleError(Exception ex, HttpServletRequest req) { } private void startImpl(ISymmetricEngine engine) { - engine.getParameterService().saveParameter(ParameterConstants.AUTO_START_ENGINE, "true", Constants.SYSTEM_USER); - if (engine.start()) { + if (!engine.start()) { throw new InternalServerErrorException(); } } private void stopImpl(ISymmetricEngine engine) { engine.stop(); - engine.getParameterService().saveParameter(ParameterConstants.AUTO_START_ENGINE, "false", Constants.SYSTEM_USER); - } private void syncTriggersImpl(ISymmetricEngine engine, boolean force) { diff --git a/symmetric-util/pom.xml b/symmetric-util/pom.xml new file mode 100644 index 0000000000..6de046a977 --- /dev/null +++ b/symmetric-util/pom.xml @@ -0,0 +1,76 @@ + + 4.0.0 + org.jumpmind.symmetric + symmetric-util + jar + 3.7.0-SNAPSHOT + util + 2011 + + + + + + org.jumpmind.symmetric + symmetric-parent + 3.7.0-SNAPSHOT + ../symmetric-parent/pom.xml + + + + + commons-lang + commons-lang + + + commons-codec + commons-codec + + + com.google.code.gson + gson + + + org.slf4j + slf4j-api + + + org.slf4j + slf4j-log4j12 + + + org.slf4j + jcl-over-slf4j + + + org.slf4j + jul-to-slf4j + + + log4j + log4j + provided + + + bouncycastle + bcprov-jdk15 + provided + + + junit + junit + test + + + commons-io + commons-io + + + org.codehaus.mojo + animal-sniffer-annotations + 1.10 + true + provided + + + diff --git a/symmetric-util/src/test/resources/log4j.xml b/symmetric-util/src/test/resources/log4j.xml index 4dae9b6b57..258c354b02 100644 --- a/symmetric-util/src/test/resources/log4j.xml +++ b/symmetric-util/src/test/resources/log4j.xml @@ -63,10 +63,6 @@ --> - - - - diff --git a/symmetric-wrapper/pom.xml b/symmetric-wrapper/pom.xml new file mode 100644 index 0000000000..d493f527d7 --- /dev/null +++ b/symmetric-wrapper/pom.xml @@ -0,0 +1,73 @@ + + 4.0.0 + org.jumpmind.symmetric + symmetric-wrapper + jar + 3.7.0-SNAPSHOT + wrapper + + + org.jumpmind.symmetric + symmetric-parent + 3.7.0-SNAPSHOT + ../symmetric-parent/pom.xml + + + + + net.java.dev.jna + jna + 4.1.0 + + + + net.java.dev.jna + jna-platform + 4.1.0 + + + org.codehaus.mojo + animal-sniffer-annotations + 1.10 + true + provided + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + org.jumpmind.symmetric.wrapper.Wrapper + + + + + + org.apache.maven.plugins + maven-shade-plugin + 1.2 + + + package + + shade + + + + + net.java.dev.jna:jna + net.java.dev.jna:jna-platform + + + + + + + + +