diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/harvester/DataSetRegistrationTask.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/harvester/DataSetRegistrationTask.java index 5a9e34c0e75348fb59c0c619a9fc27dbbe27fafe..869b06a73306821b0a3e9fb1a39137ad6a449c8d 100644 --- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/harvester/DataSetRegistrationTask.java +++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/harvester/DataSetRegistrationTask.java @@ -31,9 +31,11 @@ import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Properties; +import java.util.Set; import javax.activation.DataHandler; import javax.activation.DataSource; @@ -67,7 +69,7 @@ public class DataSetRegistrationTask<T extends DataSetInformation> implements IM protected static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, DataSetRegistrationTask.class); - final DateFormat formater = new SimpleDateFormat("dd-MM-yy HH-mm-ss", Locale.ENGLISH); + final DateFormat formatter = new SimpleDateFormat("dd-MM-yy HH-mm-ss", Locale.ENGLISH); private static final String HARVESTER_CONFIG_FILE_PROPERTY_NAME = "harvester-config-file"; @@ -85,10 +87,6 @@ public class DataSetRegistrationTask<T extends DataSetInformation> implements IM private IMailClient mailClient; - File lastSyncTimestampFile; - - File newLastSyncTimeStampFile; - private String dataStoreCode; @Override @@ -141,34 +139,21 @@ public class DataSetRegistrationTask<T extends DataSetInformation> implements IM .info("Start synchronization from data source: " + config.getDataSourceOpenbisURL() + " for user " + config.getUser()); String fileName = config.getLastSyncTimestampFileName(); - lastSyncTimestampFile = new File(fileName); - newLastSyncTimeStampFile = new File(fileName + ".new"); - - if (lastSyncTimestampFile.exists()) - { - String timeStr = FileUtilities.loadToString(lastSyncTimestampFile).trim(); - try - { - lastSyncTimestamp = formater.parse(timeStr); - } catch (ParseException e) - { - operationLog.error("Cannot parse value as time:" + timeStr); - return; - } - } - else - { - lastSyncTimestamp = new Date(0L); - } + File lastSyncTimestampFile = new File(fileName); + lastSyncTimestamp = getLastSyncTimeStamp(lastSyncTimestampFile); // save the current time into a temp file as last sync time - FileUtilities.writeToFile(newLastSyncTimeStampFile, formater.format(new Date())); + File newLastSyncTimeStampFile = new File(fileName + ".new"); + FileUtilities.writeToFile(newLastSyncTimeStampFile, formatter.format(new Date())); + + Set<String> notSyncedDataSetCodes = getNotSyncedDataSetCodes(config.getNotSyncedDataSetsFileName()); EntitySynchronizer synchronizer = - new EntitySynchronizer(service, dataStoreCode, storeRoot, lastSyncTimestamp, context, config, operationLog); + new EntitySynchronizer(service, dataStoreCode, storeRoot, lastSyncTimestamp, notSyncedDataSetCodes, context, config, + operationLog); synchronizer.syncronizeEntities(); operationLog.info("Saving the timestamp of sync start to file"); - saveSyncTimestamp(); + saveSyncTimestamp(newLastSyncTimeStampFile, lastSyncTimestampFile); operationLog.info(this.getClass() + " finished executing."); @@ -180,6 +165,32 @@ public class DataSetRegistrationTask<T extends DataSetInformation> implements IM } } + private Date getLastSyncTimeStamp(File lastSyncTimestampFile) throws ParseException + { + if (lastSyncTimestampFile.exists()) + { + String timeStr = FileUtilities.loadToString(lastSyncTimestampFile).trim(); + return formatter.parse(timeStr); + } + else + { + return new Date(0L); + } + } + + private Set<String> getNotSyncedDataSetCodes(String fileName) + { + File notSyncedDataSetsFile = new File(fileName); + if (notSyncedDataSetsFile.exists()) + { + List<String> list = FileUtilities.loadToStringList(notSyncedDataSetsFile); + return new LinkedHashSet<String>(list); + } + else + { + return new LinkedHashSet<String>(); + } + } private void sendErrorEmail(SyncConfig config, String subject) { if (config.getLogFilePath() != null) @@ -215,7 +226,7 @@ public class DataSetRegistrationTask<T extends DataSetInformation> implements IM } } - private void saveSyncTimestamp() + private void saveSyncTimestamp(File newLastSyncTimeStampFile, File lastSyncTimestampFile) { newLastSyncTimeStampFile.renameTo(lastSyncTimestampFile); } diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/harvester/synchronizer/EntitySynchronizer.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/harvester/synchronizer/EntitySynchronizer.java index 4463dab5e53e0ea4fe57caf8f7d9ac6a33f714d0..b113cbb0af50ec58e5e56c2531261fb6673f3a13 100644 --- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/harvester/synchronizer/EntitySynchronizer.java +++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/harvester/synchronizer/EntitySynchronizer.java @@ -40,6 +40,7 @@ import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPathExpressionException; import org.apache.commons.codec.binary.Hex; +import org.apache.commons.io.FileUtils; import org.apache.commons.lang.ArrayUtils; import org.apache.log4j.Logger; import org.w3c.dom.Document; @@ -143,18 +144,21 @@ public class EntitySynchronizer private final Date lastSyncTimestamp; + private final Set<String> dataSetsCodesToRetry; + private final SyncConfig config; private final Logger operationLog; public EntitySynchronizer(IEncapsulatedOpenBISService service, String dataStoreCode, File storeRoot, Date lastSyncTimestamp, - DataSetProcessingContext context, + Set<String> dataSetsCodesToRetry, DataSetProcessingContext context, SyncConfig config, Logger operationLog) { this.service = service; this.dataStoreCode = dataStoreCode; this.storeRoot = storeRoot; this.lastSyncTimestamp = lastSyncTimestamp; + this.dataSetsCodesToRetry = dataSetsCodesToRetry; this.context = context; this.config = config; this.operationLog = operationLog; @@ -340,7 +344,7 @@ public class EntitySynchronizer operationLog.info("entity operation result: " + operationResult); } - private void registerPhysicalDataSets(Map<String, DataSetWithConnections> physicalDSMap) + private void registerPhysicalDataSets(Map<String, DataSetWithConnections> physicalDSMap) throws IOException { List<DataSetWithConnections> dsList = new ArrayList<DataSetWithConnections>(physicalDSMap.values()); List<String> notSyncedDataSetCodes = Collections.synchronizedList(new ArrayList<String>()); @@ -350,7 +354,12 @@ public class EntitySynchronizer // parallelized ParallelizedExecutor.process(dsList, new DataSetRegistrationTaskExecutor(notSyncedDataSetCodes), 0.5, 10, "register data sets", 0, false); + // backup the current not synced data set codes file, delete the original file File notSyncedDataSetsFile = new File(config.getNotSyncedDataSetsFileName()); + File backupLastSyncTimeStampFile = new File(config.getNotSyncedDataSetsFileName() + ".bk"); + FileUtils.copyFile(notSyncedDataSetsFile, backupLastSyncTimeStampFile); + FileUtilities.delete(notSyncedDataSetsFile); + for (String dsCode : notSyncedDataSetCodes) { FileUtilities.appendToFile(notSyncedDataSetsFile, dsCode, true);