Skip to content

Commit

Permalink
Merge branch '3.9' of https://github.com/JumpMind/symmetric-ds.git in…
Browse files Browse the repository at this point in the history
…to 3.9
  • Loading branch information
jumpmind-josh committed Jun 20, 2018
2 parents ae87fc6 + d0916be commit abb0abb
Show file tree
Hide file tree
Showing 21 changed files with 375 additions and 89 deletions.
Expand Up @@ -555,4 +555,7 @@ value will be used. If no value is provided null will be used as a default repl

This transformation checks to see if the source value is null and if so replaces it with the provided value.

===== Deleted Columns Transform

For an update, this transform returns a comma-separated list of columns names that were set to null and previously not null.

Expand Up @@ -79,6 +79,7 @@
import org.jumpmind.symmetric.statistic.StatisticManager;
import org.jumpmind.symmetric.util.LogSummaryAppenderUtils;
import org.jumpmind.symmetric.util.SnapshotUtil;
import org.jumpmind.symmetric.util.SymmetricUtils;
import org.jumpmind.symmetric.util.TypedPropertiesFactory;
import org.jumpmind.util.AppUtils;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
Expand Down Expand Up @@ -200,7 +201,10 @@ protected SecurityServiceType getSecurityServiceType() {
protected void init() {
try {
LogSummaryAppenderUtils.registerLogSummaryAppender();


if (getSecurityServiceType().equals(SecurityServiceType.CLIENT)) {
SymmetricUtils.logNotices();
}
super.init();

this.monitorService = new MonitorService(parameterService, symmetricDialect, nodeService, extensionService,
Expand Down
Expand Up @@ -32,13 +32,14 @@
import org.jumpmind.extension.IBuiltInExtensionPoint;
import org.jumpmind.symmetric.common.Constants;
import org.jumpmind.symmetric.io.data.DataContext;
import org.jumpmind.symmetric.io.data.DataEventType;
import org.jumpmind.symmetric.model.Data;
import org.jumpmind.util.FormatUtils;
import org.jumpmind.util.LinkedCaseInsensitiveMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LookupColumnTransform implements ISingleValueColumnTransform, IBuiltInExtensionPoint {
public class LookupColumnTransform implements ISingleNewAndOldValueColumnTransform, IBuiltInExtensionPoint {

protected final Logger log = LoggerFactory.getLogger(getClass());

Expand All @@ -58,7 +59,8 @@ public boolean isLoadColumnTransform() {
return true;
}

public String transform(IDatabasePlatform platform, DataContext context,
public NewAndOldValue transform(IDatabasePlatform platform,
DataContext context,
TransformColumn column, TransformedData data, Map<String, String> sourceValues,
String newValue, String oldValue) throws IgnoreColumnException, IgnoreRowException {

Expand Down Expand Up @@ -105,7 +107,12 @@ public String transform(IDatabasePlatform platform, DataContext context,
"Expected SQL expression for lookup transform, but no expression was found for target column {} on transform {}",
column.getTargetColumnName(), column.getTransformId());
}
return lookupValue;

if (data.getSourceDmlType().equals(DataEventType.DELETE)) {
return new NewAndOldValue(null, lookupValue);
} else {
return new NewAndOldValue(lookupValue, null);
}
}

protected String doTokenReplacementOnSql(DataContext context, String sql) {
Expand Down
Expand Up @@ -25,9 +25,10 @@
import org.jumpmind.db.platform.IDatabasePlatform;
import org.jumpmind.extension.IBuiltInExtensionPoint;
import org.jumpmind.symmetric.io.data.DataContext;
import org.jumpmind.symmetric.io.data.DataEventType;
import org.jumpmind.symmetric.service.IParameterService;

public class ParameterColumnTransform implements ISingleValueColumnTransform, IBuiltInExtensionPoint {
public class ParameterColumnTransform implements ISingleNewAndOldValueColumnTransform, IBuiltInExtensionPoint {

public static final String NAME = "parameter";

Expand All @@ -49,15 +50,20 @@ public boolean isLoadColumnTransform() {
return true;
}

public String transform(IDatabasePlatform platform,
public NewAndOldValue transform(IDatabasePlatform platform,
DataContext context,
TransformColumn column, TransformedData data, Map<String, String> sourceValues,
String newValue, String oldValue) throws IgnoreColumnException, IgnoreRowException {
String paramName = column.getTransformExpression();
String value = null;
if (paramName != null) {
return parameterService.getString(paramName);
value = parameterService.getString(paramName);
}

if (data.getSourceDmlType().equals(DataEventType.DELETE)) {
return new NewAndOldValue(null, value);
} else {
return null;
return new NewAndOldValue(value, null);
}
}

Expand Down
Expand Up @@ -28,9 +28,10 @@
import org.jumpmind.extension.IBuiltInExtensionPoint;
import org.jumpmind.symmetric.common.Constants;
import org.jumpmind.symmetric.io.data.DataContext;
import org.jumpmind.symmetric.io.data.DataEventType;
import org.jumpmind.symmetric.model.Data;

public class VariableColumnTransform implements ISingleValueColumnTransform, IBuiltInExtensionPoint {
public class VariableColumnTransform implements ISingleNewAndOldValueColumnTransform, IBuiltInExtensionPoint {

public static final String NAME = "variable";

Expand Down Expand Up @@ -59,10 +60,19 @@ public class VariableColumnTransform implements ISingleValueColumnTransform, IBu
protected static final String OPTION_SOURCE_CATALOG_NAME = "source_catalog_name";

protected static final String OPTION_SOURCE_SCHEMA_NAME = "source_schema_name";

protected static final String OPTION_SOURCE_DML_TYPE = "source_dml_type";

protected static final String OPTION_BATCH_ID = "batch_id";

protected static final String OPTION_BATCH_START_TIME = "batch_start_time";

protected static final String OPTION_DELETE_INDICATOR_FLAG = "delete_indicator_flag";

private static final String[] OPTIONS = new String[] { OPTION_TIMESTAMP, OPTION_TIMESTAMP_UTC, OPTION_DATE,
OPTION_SOURCE_NODE_ID, OPTION_TARGET_NODE_ID, OPTION_NULL, OPTION_OLD_VALUE, OPTION_SOURCE_CATALOG_NAME,
OPTION_SOURCE_SCHEMA_NAME, OPTION_SOURCE_TABLE_NAME };
OPTION_SOURCE_SCHEMA_NAME, OPTION_SOURCE_TABLE_NAME, OPTION_SOURCE_DML_TYPE, OPTION_BATCH_ID, OPTION_BATCH_START_TIME,
OPTION_DELETE_INDICATOR_FLAG };

public String getName() {
return NAME;
Expand All @@ -80,45 +90,58 @@ public static String[] getOptions() {
return OPTIONS;
}

public String transform(IDatabasePlatform platform,
public NewAndOldValue transform(IDatabasePlatform platform,
DataContext context,
TransformColumn column, TransformedData data, Map<String, String> sourceValues,
String newValue, String oldValue) throws IgnoreColumnException, IgnoreRowException {
String varName = column.getTransformExpression();
String value = null;
if (varName != null) {
if (varName.equalsIgnoreCase(OPTION_TIMESTAMP)) {
return DateFormatUtils.format(System.currentTimeMillis(), TS_PATTERN);
value = DateFormatUtils.format(System.currentTimeMillis(), TS_PATTERN);
} else if (varName.equalsIgnoreCase(OPTION_TIMESTAMP_UTC)) {
return DateFormatUtils.format(System.currentTimeMillis(), TS_PATTERN, TimeZone.getTimeZone("GMT"));
value = DateFormatUtils.format(System.currentTimeMillis(), TS_PATTERN, TimeZone.getTimeZone("GMT"));
} else if (varName.equalsIgnoreCase(OPTION_DATE)) {
return DateFormatUtils.format(System.currentTimeMillis(), DATE_PATTERN);
value = DateFormatUtils.format(System.currentTimeMillis(), DATE_PATTERN);
} else if (varName.equalsIgnoreCase(OPTION_SOURCE_NODE_ID)) {
return context.getBatch().getSourceNodeId();
value = context.getBatch().getSourceNodeId();
} else if (varName.equalsIgnoreCase(OPTION_TARGET_NODE_ID)) {
return context.getBatch().getTargetNodeId();
value = context.getBatch().getTargetNodeId();
} else if (varName.equalsIgnoreCase(OPTION_OLD_VALUE)) {
return oldValue;
value = oldValue;
} else if (varName.equals(OPTION_NULL)) {
return null;
value = null;
} else if (varName.equals(OPTION_SOURCE_TABLE_NAME)) {
Data csvData = (Data)context.get(Constants.DATA_CONTEXT_CURRENT_CSV_DATA);
if (csvData != null && csvData.getTriggerHistory() != null) {
return csvData.getTriggerHistory().getSourceTableName();
value = csvData.getTriggerHistory().getSourceTableName();
}
} else if (varName.equals(OPTION_SOURCE_CATALOG_NAME)) {
Data csvData = (Data)context.get(Constants.DATA_CONTEXT_CURRENT_CSV_DATA);
if (csvData != null && csvData.getTriggerHistory() != null) {
return csvData.getTriggerHistory().getSourceCatalogName();
value = csvData.getTriggerHistory().getSourceCatalogName();
}

} else if (varName.equals(OPTION_SOURCE_SCHEMA_NAME)) {
Data csvData = (Data)context.get(Constants.DATA_CONTEXT_CURRENT_CSV_DATA);
if (csvData != null && csvData.getTriggerHistory() != null) {
return csvData.getTriggerHistory().getSourceSchemaName();
value = csvData.getTriggerHistory().getSourceSchemaName();
}
} else if (varName.equals(OPTION_SOURCE_DML_TYPE)) {
value = data.getSourceDmlType().toString();
} else if (varName.equals(OPTION_BATCH_ID)) {
value = String.valueOf(context.getBatch().getBatchId());
} else if (varName.equals(OPTION_BATCH_START_TIME)) {
value = DateFormatUtils.format(context.getBatch().getStartTime(), TS_PATTERN);
} else if (varName.equals(OPTION_DELETE_INDICATOR_FLAG)) {
value = data.getSourceDmlType().equals(DataEventType.DELETE) ? "Y" : "N";
}
}
return null;

if (data.getSourceDmlType().equals(DataEventType.DELETE)) {
return new NewAndOldValue(null, value);
} else {
return new NewAndOldValue(value, null);
}
}

}
Expand Up @@ -44,6 +44,7 @@
import org.jumpmind.symmetric.io.data.transform.ConstantColumnTransform;
import org.jumpmind.symmetric.io.data.transform.CopyColumnTransform;
import org.jumpmind.symmetric.io.data.transform.CopyIfChangedColumnTransform;
import org.jumpmind.symmetric.io.data.transform.DeletedColumnListColumnTransform;
import org.jumpmind.symmetric.io.data.transform.IColumnTransform;
import org.jumpmind.symmetric.io.data.transform.IdentityColumnTransform;
import org.jumpmind.symmetric.io.data.transform.IsBlankTransform;
Expand Down Expand Up @@ -117,6 +118,7 @@ public TransformService(IParameterService parameterService, ISymmetricDialect sy
addColumnTransform(IsEmptyTransform.NAME, new IsEmptyTransform());
addColumnTransform(IsNullTransform.NAME, new IsNullTransform());
addColumnTransform(IsBlankTransform.NAME, new IsBlankTransform());
addColumnTransform(DeletedColumnListColumnTransform.NAME, new DeletedColumnListColumnTransform());

setSqlMap(new TransformServiceSqlMap(symmetricDialect.getPlatform(),
createSqlReplacementTokens()));
Expand Down
Expand Up @@ -24,30 +24,41 @@

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.jumpmind.symmetric.Version;
import org.jumpmind.symmetric.common.ParameterConstants;
import org.jumpmind.symmetric.db.ISymmetricDialect;
import org.jumpmind.util.AppUtils;
import org.jumpmind.util.CollectionUtils;
import org.jumpmind.util.FormatUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

final public class SymmetricUtils {

protected static final Logger log = LoggerFactory.getLogger(SymmetricUtils.class);

protected static boolean isJava7 = true;

protected static Method copyMethod;

protected static Method fileMethod;

protected static Object optionArray;

protected static boolean isNoticeLogged;

private SymmetricUtils() {
}
Expand Down Expand Up @@ -125,6 +136,59 @@ public static final void replaceSystemAndEnvironmentVariables(Properties propert
properties.put(object, value);
}
}
}
}

public static void logNotices() {
synchronized (SymmetricUtils.class) {
if (isNoticeLogged) {
return;
}
isNoticeLogged = true;
}

String notices = null;
try {
notices = String.format("%n%s%n", IOUtils.toString(Thread.currentThread().getContextClassLoader().getResource("symmetricds.asciiart")));
} catch (Exception ex) {
notices = String.format("SymmetricDS Start%n");
}

String buildTime = Long.toString(Version.getBuildTime());
String year = null;
if (buildTime.length() >= 4) {
year = buildTime.substring(0, 4);
} else {
year = new SimpleDateFormat("yyyy").format(new Date());
}

int pad = 65;
notices += String.format(
"+" + StringUtils.repeat("-", pad) + "+%n" +
"|" + StringUtils.rightPad(" Copyright (C) 2007-" + year + " JumpMind, Inc.", pad) + "|%n" +
"|" + StringUtils.repeat(" ", pad) + "|%n");

InputStream in = null;
try {
in = AppUtils.class.getResourceAsStream("/symmetric-console-default.properties");
if (in != null) {
in.close();
}
} catch (Exception e) {
}

if (in != null) {
notices += String.format(
"|" + StringUtils.rightPad(" Licensed under one or more agreements from JumpMind, Inc.", pad) + "|%n" +
"|" + StringUtils.rightPad(" See doc/license.html", pad) + "|%n");
} else {
notices += String.format(
"|" + StringUtils.rightPad(" Licensed under the GNU General Public License version 3.", pad) + "|%n" +
"|" + StringUtils.rightPad(" This software comes with ABSOLUTELY NO WARRANTY.", pad) + "|%n" +
"|" + StringUtils.rightPad(" See http://www.gnu.org/licenses/gpl.html", pad) + "|%n");
}

notices += "+" + StringUtils.repeat("-", pad) + "+";
log.info(notices);
}

}
Expand Up @@ -793,7 +793,7 @@ public ForeignKey getSelfReferencingForeignKey() {
for (int idx = 0; idx < getForeignKeyCount(); idx++) {
ForeignKey fk = getForeignKey(idx);

if (this.getName().equals(fk.getForeignTableName())) {
if (this.getName().equalsIgnoreCase(fk.getForeignTableName())) {
return fk;
}
}
Expand Down
Expand Up @@ -26,16 +26,16 @@
import org.jumpmind.db.platform.IDatabasePlatform;
import org.jumpmind.extension.IBuiltInExtensionPoint;
import org.jumpmind.symmetric.io.data.DataContext;
import org.jumpmind.symmetric.io.data.DataEventType;

public class BinaryLeftColumnTransform implements ISingleValueColumnTransform, IBuiltInExtensionPoint {
public class BinaryLeftColumnTransform implements ISingleNewAndOldValueColumnTransform, IBuiltInExtensionPoint {

public static final String NAME = "bleft";

public String getName() {
return NAME;
}


public boolean isExtractColumnTransform() {
return true;
}
Expand All @@ -44,17 +44,24 @@ public boolean isLoadColumnTransform() {
return true;
}

public String transform(IDatabasePlatform platform, DataContext context,
public NewAndOldValue transform(IDatabasePlatform platform,
DataContext context,
TransformColumn column, TransformedData data, Map<String, String> sourceValues,
String newValue, String oldValue) throws IgnoreColumnException, IgnoreRowException {

if (StringUtils.isNotBlank(newValue)) {
String expression = column.getTransformExpression();
if (StringUtils.isNotBlank(expression)) {
expression = expression.trim();
return bleft(newValue, Integer.parseInt(expression));
newValue = bleft(newValue, Integer.parseInt(expression));
}
}
return newValue;

if (data.getSourceDmlType().equals(DataEventType.DELETE)) {
return new NewAndOldValue(null, newValue);
} else {
return new NewAndOldValue(newValue, null);
}
}

public String bleft(String value, int maxBytes) {
Expand Down

0 comments on commit abb0abb

Please sign in to comment.