package com.revolsys.gis.parallel;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import com.revolsys.collection.map.Maps;
import com.revolsys.io.PathName;
import com.revolsys.io.map.MapObjectFactory;
import com.revolsys.logging.Logs;
import com.revolsys.parallel.process.AbstractMultipleProcess;
import com.revolsys.parallel.process.Parallel;
import com.revolsys.parallel.process.Process;
import com.revolsys.parallel.process.ProcessNetwork;
import com.revolsys.parallel.process.Sequential;
import com.revolsys.process.CopyRecords;
import com.revolsys.record.io.format.json.Json;
import com.revolsys.record.schema.RecordStore;
import com.revolsys.spring.resource.Resource;
import com.revolsys.util.Property;
public class MultiCopyRecords implements Process {
private String name;
private Process process;
private Map<String, Object> processDefinition;
private ProcessNetwork processNetwork;
private RecordStore sourceRecordStore;
private RecordStore targetRecordStore;
@Override
public String getBeanName() {
return this.name;
}
@Override
public ProcessNetwork getProcessNetwork() {
return this.processNetwork;
}
public RecordStore getSourceRecordStore() {
return this.sourceRecordStore;
}
public RecordStore getTargetRecordStore() {
return this.targetRecordStore;
}
@SuppressWarnings("unchecked")
protected Process newProcess(final Map<String, Object> processDefinition) {
if (processDefinition == null) {
return null;
} else {
final String type = MapObjectFactory.getType(processDefinition);
if ("copyRecords".equals(type)) {
final PathName typePath = PathName.newPathName(processDefinition.get("typePath"));
if (Property.hasValue(typePath)) {
final boolean hasSequence = Maps.getBool(processDefinition, "hasSequence");
final Map<String, Boolean> orderBy = Maps.get(processDefinition, "orderBy",
Collections.<String, Boolean> emptyMap());
final CopyRecords copy = new CopyRecords(this.sourceRecordStore, typePath, orderBy,
this.targetRecordStore, hasSequence);
return copy;
} else {
Logs.error(this, "Parameter 'typePath' required for type='copyRecords'");
}
} else if ("sequential".equals(type)) {
final List<Map<String, Object>> processList = (List<Map<String, Object>>)processDefinition
.get("processes");
if (processList == null) {
Logs.error(this, "Parameter 'processes' required for type='sequential'");
} else {
final Sequential processes = new Sequential();
newProcesses(processes, processList);
return processes;
}
} else if ("parallel".equals(type)) {
final List<Map<String, Object>> processList = (List<Map<String, Object>>)processDefinition
.get("processes");
if (processList == null) {
Logs.error(this, "Parameter 'processes' required for type='parallel'");
} else {
final Parallel processes = new Parallel();
newProcesses(processes, processList);
return processes;
}
} else {
Logs.error(this,
"Parameter type=" + type + " not in 'copyRecords', 'sequential', 'copyRecords'");
}
return null;
}
}
private void newProcesses(final AbstractMultipleProcess processes,
final List<Map<String, Object>> processDefinitions) {
for (final Map<String, Object> processDefinition : processDefinitions) {
final Process process = newProcess(processDefinition);
if (process != null) {
processes.addProcess(process);
}
}
}
@Override
public void run() {
this.process = newProcess(this.processDefinition);
if (this.process != null) {
if (this.processNetwork != null) {
this.processNetwork.addProcess(this.process);
} else {
this.process.run();
}
}
}
@Override
public void setBeanName(final String name) {
this.name = name;
}
public void setProcessDefinition(final Map<String, Object> processDefinition) {
this.processDefinition = processDefinition;
}
public void setProcessDefinitionResource(final Resource resource) {
final Map<String, Object> processDefinition = Json.toMap(resource);
setProcessDefinition(processDefinition);
}
@Override
public void setProcessNetwork(final ProcessNetwork processNetwork) {
this.processNetwork = processNetwork;
if (processNetwork != null) {
processNetwork.addProcess(this);
}
}
public void setSourceRecordStore(final RecordStore sourceRecordStore) {
this.sourceRecordStore = sourceRecordStore;
}
public void setTargetRecordStore(final RecordStore targetRecordStore) {
this.targetRecordStore = targetRecordStore;
}
}