/**
* 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.load;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.jumpmind.db.platform.IDatabasePlatform;
import org.jumpmind.db.sql.ISqlTransaction;
import org.jumpmind.extension.IBuiltInExtensionPoint;
import org.jumpmind.symmetric.common.ParameterConstants;
import org.jumpmind.symmetric.db.ISymmetricDialect;
import org.jumpmind.symmetric.io.data.IDataWriter;
import org.jumpmind.symmetric.io.data.writer.Conflict;
import org.jumpmind.symmetric.io.data.writer.DefaultDatabaseWriter;
import org.jumpmind.symmetric.io.data.writer.DatabaseWriterSettings;
import org.jumpmind.symmetric.io.data.writer.DefaultTransformWriterConflictResolver;
import org.jumpmind.symmetric.io.data.writer.IDatabaseWriterErrorHandler;
import org.jumpmind.symmetric.io.data.writer.IDatabaseWriterFilter;
import org.jumpmind.symmetric.io.data.writer.ResolvedData;
import org.jumpmind.symmetric.io.data.writer.TransformWriter;
import org.jumpmind.symmetric.io.data.writer.Conflict.PingBack;
import org.jumpmind.symmetric.service.IParameterService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DefaultDataLoaderFactory implements IDataLoaderFactory, IBuiltInExtensionPoint {
protected final Logger log = LoggerFactory.getLogger(getClass());
protected IParameterService parameterService;
public DefaultDataLoaderFactory() {
}
public DefaultDataLoaderFactory(IParameterService parameterService) {
this.parameterService = parameterService;
}
public String getTypeName() {
return "default";
}
public IDataWriter getDataWriter(final String sourceNodeId,
final ISymmetricDialect symmetricDialect, TransformWriter transformWriter,
List<IDatabaseWriterFilter> filters, List<IDatabaseWriterErrorHandler> errorHandlers,
List<? extends Conflict> conflictSettings, List<ResolvedData> resolvedData) {
DefaultDatabaseWriter writer = new DefaultDatabaseWriter(symmetricDialect.getPlatform(),
new DefaultTransformWriterConflictResolver(transformWriter) {
@Override
protected void beforeResolutionAttempt(Conflict conflict) {
if (conflict.getPingBack() != PingBack.OFF) {
DefaultDatabaseWriter writer = transformWriter
.getNestedWriterOfType(DefaultDatabaseWriter.class);
ISqlTransaction transaction = writer.getTransaction();
if (transaction != null) {
symmetricDialect.enableSyncTriggers(transaction);
}
}
}
@Override
protected void afterResolutionAttempt(Conflict conflict) {
if (conflict.getPingBack() == PingBack.SINGLE_ROW) {
DefaultDatabaseWriter writer = transformWriter
.getNestedWriterOfType(DefaultDatabaseWriter.class);
ISqlTransaction transaction = writer.getTransaction();
if (transaction != null) {
symmetricDialect.disableSyncTriggers(transaction, sourceNodeId);
}
}
}
}, buildDatabaseWriterSettings(filters, errorHandlers, conflictSettings,
resolvedData));
return writer;
}
public boolean isPlatformSupported(IDatabasePlatform platform) {
return true;
}
protected DatabaseWriterSettings buildDatabaseWriterSettings(
List<IDatabaseWriterFilter> filters, List<IDatabaseWriterErrorHandler> errorHandlers,
List<? extends Conflict> conflictSettings, List<ResolvedData> resolvedDatas) {
DatabaseWriterSettings settings = new DatabaseWriterSettings();
settings.setDatabaseWriterFilters(filters);
settings.setDatabaseWriterErrorHandlers(errorHandlers);
settings.setCreateTableAlterCaseToMatchDatabaseDefault(parameterService
.is(ParameterConstants.DATA_LOADER_CREATE_TABLE_ALTER_TO_MATCH_DB_CASE, true));
settings.setMaxRowsBeforeCommit(parameterService
.getLong(ParameterConstants.DATA_LOADER_MAX_ROWS_BEFORE_COMMIT));
settings.setCommitSleepInterval(parameterService
.getLong(ParameterConstants.DATA_LOADER_SLEEP_TIME_AFTER_EARLY_COMMIT));
settings.setIgnoreMissingTables(parameterService
.is(ParameterConstants.DATA_LOADER_IGNORE_MISSING_TABLES));
settings.setTreatDateTimeFieldsAsVarchar(parameterService
.is(ParameterConstants.DATA_LOADER_TREAT_DATETIME_AS_VARCHAR));
settings.setSaveCurrentValueOnError(parameterService.is(
ParameterConstants.DATA_LOADER_ERROR_RECORD_CUR_VAL, false));
settings.setFitToColumn(parameterService.is(ParameterConstants.DATA_LOADER_FIT_TO_COLUMN, false));
settings.setTextColumnExpression(parameterService.getString(
ParameterConstants.DATA_LOADER_TEXT_COLUMN_EXPRESSION));
settings.setApplyChangesOnly(parameterService.is(ParameterConstants.DATA_LOADER_APPLY_CHANGES_ONLY, true));
settings.setUsePrimaryKeysFromSource(parameterService.is(ParameterConstants.DATA_LOADER_USE_PRIMARY_KEYS_FROM_SOURCE));
Map<String, Conflict> byChannel = new HashMap<String, Conflict>();
Map<String, Conflict> byTable = new HashMap<String, Conflict>();
boolean multipleDefaultSettingsFound = false;
if (conflictSettings != null) {
for (Conflict conflictSetting : conflictSettings) {
String qualifiedTableName = conflictSetting.toQualifiedTableName();
if (StringUtils.isNotBlank(qualifiedTableName)) {
byTable.put(qualifiedTableName, conflictSetting);
} else if (StringUtils.isNotBlank(conflictSetting.getTargetChannelId())) {
byChannel.put(conflictSetting.getTargetChannelId(), conflictSetting);
} else {
if (settings.getDefaultConflictSetting() != null) {
multipleDefaultSettingsFound = true;
}
settings.setDefaultConflictSetting(conflictSetting);
}
}
}
if (multipleDefaultSettingsFound) {
log.warn(
"There were multiple default conflict settings found. Using '{}' as the default",
settings.getDefaultConflictSetting().getConflictId());
}
settings.setConflictSettingsByChannel(byChannel);
settings.setConflictSettingsByTable(byTable);
settings.setResolvedData(resolvedDatas);
return settings;
}
}