/** * 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; } }