Skip to content

Commit

Permalink
shorten columnsToRows name and add clarionDateTime
Browse files Browse the repository at this point in the history
  • Loading branch information
erilong committed Jun 14, 2014
1 parent 805aab5 commit d70db97
Show file tree
Hide file tree
Showing 4 changed files with 198 additions and 91 deletions.
@@ -0,0 +1,86 @@
/**
* 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
* <http://www.gnu.org/licenses/>.
*
* 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.io.data.transform;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.jumpmind.db.platform.IDatabasePlatform;
import org.jumpmind.extension.IBuiltInExtensionPoint;
import org.jumpmind.symmetric.io.data.DataContext;
import org.jumpmind.symmetric.io.data.transform.ISingleValueColumnTransform;
import org.jumpmind.symmetric.io.data.transform.IgnoreColumnException;
import org.jumpmind.symmetric.io.data.transform.IgnoreRowException;
import org.jumpmind.symmetric.io.data.transform.TransformColumn;
import org.jumpmind.symmetric.io.data.transform.TransformedData;

public class ClarionDateTimeColumnTransform implements ISingleValueColumnTransform, IBuiltInExtensionPoint {

public final static String NAME = "clarionDateTime";

public final static String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.S";

public String getName() {
return NAME;
}

public boolean isExtractColumnTransform() {
return true;
}

public boolean isLoadColumnTransform() {
return true;
}

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

String clarionTimeStr = null;
String columnName = column.getTransformExpression();
if (columnName != null && !StringUtils.isEmpty(columnName)) {
clarionTimeStr = sourceValues.get(columnName);
}
return convertClarionDate(newValue, clarionTimeStr);
}

public String convertClarionDate(String clarionDate, String clarionTime) {
if (clarionDate != null && !StringUtils.isEmpty(clarionDate)) {
Integer date = Integer.parseInt(clarionDate);
Calendar cal = Calendar.getInstance();
cal.set(1800, Calendar.DECEMBER, 28, 0, 0, 0);
cal.add(Calendar.DATE, date);
cal.set(Calendar.MILLISECOND, 0);

if (clarionTime != null && !StringUtils.isEmpty(clarionTime)) {
Integer time = Integer.parseInt(clarionTime);
if (time > 0) {
cal.add(Calendar.MILLISECOND, (time - 1) * 10);
}
}
return new SimpleDateFormat(DATE_FORMAT).format(cal.getTime());
}
return null;
}

}
Expand Up @@ -32,60 +32,58 @@

public class ColumnsToRowsKeyColumnTransform implements IMultipleValueColumnTransform {

public final static String NAME = "columnsToRowsKeyColumnTransform";
public final static String NAME = "columnsToRowsKey";

public final static String CONTEXT_MAP="Map";
public final static String CONTEXT_PK_COLUMN="PKColumn";
public String getName() {
return NAME;
}
public static String getContextBase(String transformId) {
return NAME + ":" + transformId + ":";
}
public boolean isExtractColumnTransform() {
return true;
}
public final static String CONTEXT_MAP = "Map";
public final static String CONTEXT_PK_COLUMN = "PKColumn";

public String getName() {
return NAME;
}

public static String getContextBase(String transformId) {
return NAME + ":" + transformId + ":";
}

public boolean isExtractColumnTransform() {
return true;
}

public boolean isLoadColumnTransform() {
return true;
public boolean isLoadColumnTransform() {
return true;
}

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

if (StringUtils.trimToNull(column.getTransformExpression()) == null) {
throw new RuntimeException(
"Transform configured incorrectly. A map representing PK and column names must be defined as part of the transform expression");
}
String mapAsString = StringUtils.trimToEmpty(column.getTransformExpression());

// Build reverse map, while also building up array to return

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

if (StringUtils.trimToNull(column.getTransformExpression()) == null) {
throw new RuntimeException("Transform configured incorrectly. A map represnting PK and column names must be defined as part of the transform expression");
}
String mapAsString = StringUtils.trimToEmpty(column.getTransformExpression());

// Build reverse map, while also building up array to return

List<String> result = new ArrayList<String>();
Map<String,String> reverseMap = new HashMap<String,String>();

StringTokenizer tokens = new StringTokenizer(mapAsString);

while (tokens.hasMoreElements()) {
String keyValue = (String) tokens.nextElement();
int equalIndex = keyValue.indexOf("=");
if (equalIndex != -1) {
reverseMap.put(keyValue.substring(equalIndex+1),keyValue.substring(0, equalIndex));
result.add(keyValue.substring(equalIndex+1));
} else {
throw new RuntimeException("Map string for "+column.getTransformExpression()+" is invalid format: "+mapAsString);
}

}

context.put(getContextBase(column.getTransformId())+CONTEXT_MAP, reverseMap);
context.put(getContextBase(column.getTransformId())+CONTEXT_PK_COLUMN, column.getTargetColumnName());

return result;
List<String> result = new ArrayList<String>();
Map<String, String> reverseMap = new HashMap<String, String>();

StringTokenizer tokens = new StringTokenizer(mapAsString);

while (tokens.hasMoreElements()) {
String keyValue = (String) tokens.nextElement();
int equalIndex = keyValue.indexOf("=");
if (equalIndex != -1) {
reverseMap.put(keyValue.substring(equalIndex + 1), keyValue.substring(0, equalIndex));
result.add(keyValue.substring(equalIndex + 1));
} else {
throw new RuntimeException("Map string for " + column.getTransformExpression() + " is invalid format: " + mapAsString);
}
}

context.put(getContextBase(column.getTransformId()) + CONTEXT_MAP, reverseMap);
context.put(getContextBase(column.getTransformId()) + CONTEXT_PK_COLUMN, column.getTargetColumnName());

return result;
}

}
Expand Up @@ -22,59 +22,80 @@

import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.jumpmind.db.platform.IDatabasePlatform;
import org.jumpmind.symmetric.io.data.DataContext;
import org.jumpmind.symmetric.io.data.DataEventType;

public class ColumnsToRowsValueColumnTransform implements ISingleValueColumnTransform {
public class ColumnsToRowsValueColumnTransform implements ISingleValueColumnTransform {

public final static String NAME = "columnsToRowsValueColumnTransform";
public String getName() {
return NAME;
}
public final static String NAME = "columnsToRowsValue";

protected final static String OPTION_CHANGES_ONLY = "changesOnly";

protected final static String OPTION_IGNORE_NULLS = "ignoreNulls";

public boolean isExtractColumnTransform() {
return true;
}
public String getName() {
return NAME;
}

public boolean isExtractColumnTransform() {
return true;
}

public boolean isLoadColumnTransform() {
return true;
}

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

public boolean isLoadColumnTransform() {
return true;
String contextBase = ColumnsToRowsKeyColumnTransform.getContextBase(column.getTransformId());

@SuppressWarnings("unchecked")
Map<String, String> reverseMap = (Map<String, String>) context.get(contextBase + ColumnsToRowsKeyColumnTransform.CONTEXT_MAP);
String pkColumnName = (String) context.get(contextBase + ColumnsToRowsKeyColumnTransform.CONTEXT_PK_COLUMN);

if (reverseMap == null) {
throw new RuntimeException("Reverse map not found in context as key " + contextBase
+ ColumnsToRowsKeyColumnTransform.CONTEXT_MAP + " Unable to transform.");
}
if (pkColumnName == null) {
throw new RuntimeException("Primary key column name not found in context as key " + contextBase
+ ColumnsToRowsKeyColumnTransform.CONTEXT_PK_COLUMN + " Unable to transform.");
}

protected String processColumn(TransformedData data, String newValue, String oldValue) throws IgnoreRowException, IgnoreColumnException {
return newValue;
String expr = column.getTransformExpression();
boolean isChangesOnly = false;
boolean isIgnoreNulls = false;
if (expr != null) {
isChangesOnly = expr.indexOf(OPTION_CHANGES_ONLY + "=true") != -1;
isIgnoreNulls = expr.indexOf(OPTION_IGNORE_NULLS + "=true") != -1;
}

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

String contextBase = ColumnsToRowsKeyColumnTransform.getContextBase(column.getTransformId());


@SuppressWarnings("unchecked")
Map<String, String> reverseMap = (Map<String, String>) context.get(contextBase+ColumnsToRowsKeyColumnTransform.CONTEXT_MAP);
String pkColumnName = (String) context.get(contextBase+ColumnsToRowsKeyColumnTransform.CONTEXT_PK_COLUMN);

if (reverseMap == null) {
throw new RuntimeException("Reverse map not found in context as key " + contextBase+ColumnsToRowsKeyColumnTransform.CONTEXT_MAP+ " Unable to transform.");
}
if (pkColumnName == null) {
throw new RuntimeException("Primary key column name not found in context as key " + contextBase+ColumnsToRowsKeyColumnTransform.CONTEXT_PK_COLUMN+" Unable to transform.");
}
String pkValue = data.getTargetKeyValues().get(pkColumnName);
String value = null;

String pkValue = data.getTargetKeyValues().get(pkColumnName);
String value = null;

if (pkValue!=null) {
value = reverseMap.get(pkValue);
if (value!=null) {
return processColumn(data,data.getSourceValues().get(value),data.getOldSourceValues().get(value));
} else {
throw new RuntimeException("Unable to locate column name for pk value "+pkValue);
}
} else {
throw new RuntimeException("Unable to locate column with pk name "+pkColumnName+" in target values.");
if (pkValue != null) {
value = reverseMap.get(pkValue);
if (value != null) {
String srcNewValue = data.getSourceValues().get(value);
String srcOldValue = data.getOldSourceValues().get(value);
if (isIgnoreNulls && DataEventType.INSERT.equals(data.getSourceDmlType()) && (StringUtils.trimToNull(srcNewValue) == null)) {
throw new IgnoreRowException();
} else if (DataEventType.UPDATE.equals(data.getSourceDmlType())) {
if (isChangesOnly && StringUtils.trimToEmpty(srcNewValue).equals(StringUtils.trimToEmpty(srcOldValue))) {
throw new IgnoreRowException();
} else if (isIgnoreNulls && StringUtils.trimToNull(srcNewValue) == null) {
data.setTargetDmlType(DataEventType.DELETE);
}
}
return srcNewValue;
} else {
throw new RuntimeException("Unable to locate column name for pk value " + pkValue);
}
} else {
throw new RuntimeException("Unable to locate column with pk name " + pkColumnName + " in target values. Did you mark it as PK?");
}
}
}
Expand Up @@ -36,6 +36,7 @@
import org.jumpmind.symmetric.io.data.IDataWriter;
import org.jumpmind.symmetric.io.data.transform.AdditiveColumnTransform;
import org.jumpmind.symmetric.io.data.transform.BshColumnTransform;
import org.jumpmind.symmetric.io.data.transform.ClarionDateTimeColumnTransform;
import org.jumpmind.symmetric.io.data.transform.ColumnsToRowsKeyColumnTransform;
import org.jumpmind.symmetric.io.data.transform.ColumnsToRowsValueColumnTransform;
import org.jumpmind.symmetric.io.data.transform.ConstantColumnTransform;
Expand Down Expand Up @@ -106,6 +107,7 @@ public static Map<String, IColumnTransform<?>> buildDefaultColumnTransforms() {
addColumnTransform(columnTransforms, new CopyIfChangedColumnTransform());
addColumnTransform(columnTransforms, new ColumnsToRowsKeyColumnTransform());
addColumnTransform(columnTransforms, new ColumnsToRowsValueColumnTransform());
addColumnTransform(columnTransforms, new ClarionDateTimeColumnTransform());
return columnTransforms;
}

Expand Down

0 comments on commit d70db97

Please sign in to comment.