Skip to content

Commit

Permalink
0003627: File conflict resolve extension point
Browse files Browse the repository at this point in the history
  • Loading branch information
jumpmind-josh committed Jul 12, 2018
1 parent 284b60a commit 2df85b3
Show file tree
Hide file tree
Showing 7 changed files with 64 additions and 10 deletions.
6 changes: 6 additions & 0 deletions symmetric-assemble/src/asciidoc/configuration/file-routing.ad
Expand Up @@ -86,6 +86,12 @@ Conflict Strategy:: The strategy to employ when a file has been modified at both

|manual|If a conflict occurs the batch will be put in ER (error) status and require manual intervention to resolve the issue.

ifdef::pro[]
|newer_wins|If a conflict occurs, a comparison between last modified date of the file incoming and the file currently on disk will be compared and the newest will win. This assumes the system clocks on each machine are in sync to perform an accurate comparison.

|older_wins|If a conflict occurs, a comparison between last modified date of the file incoming and the file currently on disk will be compared and the oldest will win. This assumes the system clocks on each machine are in sync to perform an accurate comparison.
endif::pro[]

|===

ifdef::pro[]
Expand Down
Expand Up @@ -30,9 +30,16 @@
import org.jumpmind.symmetric.model.FileSnapshot.LastEventType;
import org.jumpmind.symmetric.model.FileTrigger;
import org.jumpmind.symmetric.model.FileTriggerRouter;
import org.jumpmind.symmetric.service.IExtensionService;

public class BeanShellFileSyncZipScript extends FileSyncZipScript {

protected IExtensionService extensionService;

public BeanShellFileSyncZipScript(IExtensionService extensionService) {
this.extensionService = extensionService;
}

@Override
public String getScriptFileName(Batch batch) {
return "sync.bsh";
Expand Down Expand Up @@ -118,7 +125,15 @@ public void buildScriptFileSnapshot(Batch batch, FileSnapshot snapshot, FileTrig
}
command.append(" }\n");
command.append(" }\n");
}
} else {
if (triggerRouter.getConflictStrategyString() != null) {
for (IFileConflictResolver resolver : extensionService.getExtensionPointList(IFileConflictResolver.class)) {
if (triggerRouter.getConflictStrategyString().equals(resolver.getName())) {
command.append(resolver.getResolveCommand(snapshot));
}
}
}
}

command.append(" if (processFile) {\n");
command.append(" if (sourceFile.isDirectory()) {\n");
Expand Down
Expand Up @@ -48,6 +48,7 @@
import org.jumpmind.symmetric.model.FileTrigger;
import org.jumpmind.symmetric.model.FileTriggerRouter;
import org.jumpmind.symmetric.model.Node;
import org.jumpmind.symmetric.service.IExtensionService;
import org.jumpmind.symmetric.service.IFileSyncService;
import org.jumpmind.symmetric.service.INodeService;
import org.jumpmind.util.Statistics;
Expand All @@ -69,13 +70,15 @@ public class FileSyncZipDataWriter implements IDataWriter {
protected List<FileSnapshot> snapshotEvents;
protected DataContext context;
protected INodeService nodeService;

protected IExtensionService extensionService;

public FileSyncZipDataWriter(long maxBytesToSync, IFileSyncService fileSyncService,
INodeService nodeService, IStagedResource stagedResource) {
INodeService nodeService, IStagedResource stagedResource, IExtensionService extensionService) {
this.maxBytesToSync = maxBytesToSync;
this.fileSyncService = fileSyncService;
this.stagedResource = stagedResource;
this.nodeService = nodeService;
this.extensionService = extensionService;
}

public void open(DataContext context) {
Expand Down Expand Up @@ -290,7 +293,7 @@ protected FileSyncZipScript createFileSyncZipScript(String targetNodeId) {
if (isCClient(targetNodeId)) {
return new BashFileSyncZipScript();
} else {
return new BeanShellFileSyncZipScript();
return new BeanShellFileSyncZipScript(extensionService);
}
}

Expand Down
@@ -0,0 +1,11 @@
package org.jumpmind.symmetric.file;

import org.jumpmind.extension.IExtensionPoint;
import org.jumpmind.symmetric.model.FileSnapshot;

public interface IFileConflictResolver extends IExtensionPoint {

public String getName();

public String getResolveCommand(FileSnapshot snapshot);
}
Expand Up @@ -39,6 +39,8 @@ public class FileTriggerRouter implements Serializable {

private FileConflictStrategy conflictStrategy = FileConflictStrategy.SOURCE_WINS;

private String conflictStrategyString;

private Date createTime = new Date();

private String lastUpdateBy;
Expand Down Expand Up @@ -125,6 +127,14 @@ public void setLastUpdateTime(Date lastUpdateTime) {
this.lastUpdateTime = lastUpdateTime;
}

public String getConflictStrategyString() {
return conflictStrategyString;
}

public void setConflictStrategyString(String conflictStrategyString) {
this.conflictStrategyString = conflictStrategyString;
}

@Override
public int hashCode() {
final int prime = 31;
Expand Down
Expand Up @@ -41,6 +41,7 @@
import org.jumpmind.symmetric.model.RemoteNodeStatuses;
import org.jumpmind.symmetric.model.Trigger;
import org.jumpmind.symmetric.service.IConfigurationService;
import org.jumpmind.symmetric.service.IExtensionService;
import org.jumpmind.symmetric.service.IFileSyncService;
import org.jumpmind.symmetric.service.INodeCommunicationService;
import org.jumpmind.symmetric.service.INodeService;
Expand All @@ -54,7 +55,8 @@ public class FileSyncExtractorService extends DataExtractorService {
private IConfigurationService configurationService;
private INodeCommunicationService nodeCommunicationService;
private ITriggerRouterService triggerRouterService;

private IExtensionService extensionService;

public FileSyncExtractorService(ISymmetricEngine engine) {
super(engine);
this.fileSyncService = engine.getFileSyncService();
Expand All @@ -63,6 +65,7 @@ public FileSyncExtractorService(ISymmetricEngine engine) {
this.configurationService = engine.getConfigurationService();
this.nodeCommunicationService = engine.getNodeCommunicationService();
this.triggerRouterService = engine.getTriggerRouterService();
this.extensionService = engine.getExtensionService();
}

@Override
Expand Down Expand Up @@ -125,7 +128,7 @@ protected IDataWriter buildWriter(long memoryThresholdInBytes) {
.getLong(ParameterConstants.TRANSPORT_MAX_BYTES_TO_SYNC);

FileSyncZipDataWriter fileSyncWriter = new FileSyncZipDataWriter(maxBytesToSync, fileSyncService,
nodeService, stagedResource) {
nodeService, stagedResource, extensionService) {
@Override
public void close() {
super.finish();
Expand Down
Expand Up @@ -393,7 +393,7 @@ public void saveFileTriggerRouter(FileTriggerRouter fileTriggerRouter) {
new Object[] { fileTriggerRouter.isEnabled() ? 1 : 0,
fileTriggerRouter.isInitialLoadEnabled() ? 1 : 0,
fileTriggerRouter.getTargetBaseDir(),
fileTriggerRouter.getConflictStrategy().name(),
fileTriggerRouter.getConflictStrategyString(),
fileTriggerRouter.getLastUpdateBy(), fileTriggerRouter.getLastUpdateTime(),
fileTriggerRouter.getFileTrigger().getTriggerId(),
fileTriggerRouter.getRouter().getRouterId() }, new int[] { Types.SMALLINT,
Expand All @@ -405,7 +405,7 @@ public void saveFileTriggerRouter(FileTriggerRouter fileTriggerRouter) {
new Object[] { fileTriggerRouter.isEnabled() ? 1 : 0,
fileTriggerRouter.isInitialLoadEnabled() ? 1 : 0,
fileTriggerRouter.getTargetBaseDir(),
fileTriggerRouter.getConflictStrategy().name(),
fileTriggerRouter.getConflictStrategyString(),
fileTriggerRouter.getCreateTime(), fileTriggerRouter.getLastUpdateBy(),
fileTriggerRouter.getLastUpdateTime(),
fileTriggerRouter.getFileTrigger().getTriggerId(),
Expand Down Expand Up @@ -588,7 +588,7 @@ public List<OutgoingBatch> sendFiles(ProcessInfo processInfo, Node targetNode,
Constants.STAGING_CATEGORY_OUTGOING, processInfo.getSourceNodeId(),
targetNode.getNodeId(), "filesync.zip");
dataWriter = new FileSyncZipDataWriter(maxBytesToSync, this,
engine.getNodeService(), stagedResource);
engine.getNodeService(), stagedResource, engine.getExtensionService());
}
log.debug("Extracting batch {} for filesync.", currentBatch.getNodeBatchId());

Expand Down Expand Up @@ -1223,8 +1223,14 @@ public FileTriggerRouter mapRow(Row rs) {
String triggerId = rs.getString("trigger_id");
FileTrigger fileTrigger = getFileTrigger(triggerId);
fileTriggerRouter.setFileTrigger(fileTrigger);
fileTriggerRouter.setConflictStrategy(FileConflictStrategy.valueOf(rs.getString(
try {
fileTriggerRouter.setConflictStrategy(FileConflictStrategy.valueOf(rs.getString(
"conflict_strategy").toUpperCase()));
}
catch (Exception e) {
}
fileTriggerRouter.setConflictStrategyString(rs.getString(
"conflict_strategy").toUpperCase());
fileTriggerRouter.setCreateTime(rs.getDateTime("create_time"));
fileTriggerRouter.setLastUpdateBy(rs.getString("last_update_by"));
fileTriggerRouter.setLastUpdateTime(rs.getDateTime("last_update_time"));
Expand Down

0 comments on commit 2df85b3

Please sign in to comment.