diff --git a/config/alfresco/bulk-import-context.xml b/config/alfresco/bulk-import-context.xml index 397dc1128b..eac63ba616 100644 --- a/config/alfresco/bulk-import-context.xml +++ b/config/alfresco/bulk-import-context.xml @@ -67,6 +67,7 @@ + diff --git a/source/java/org/alfresco/repo/bulkimport/BulkFilesystemImporter.java b/source/java/org/alfresco/repo/bulkimport/BulkFilesystemImporter.java index 9efee9b317..c373a5ee49 100644 --- a/source/java/org/alfresco/repo/bulkimport/BulkFilesystemImporter.java +++ b/source/java/org/alfresco/repo/bulkimport/BulkFilesystemImporter.java @@ -41,8 +41,7 @@ public interface BulkFilesystemImporter * @param source The source directory on the local filesystem to read content from (must not be null and must be a valid, readable directory on the local filesystem). * @param replaceExisting A flag indicating whether to replace (true) or skip (false) files that are already in the repository. */ -// void bulkImport(NodeRef target, NodeImporter importStrategy, boolean replaceExisting); - public void bulkImport(BulkImportParameters bulkImportParameters, NodeImporter nodeImporter); + void bulkImport(BulkImportParameters bulkImportParameters, NodeImporter nodeImporter); /** * Initiates a bulk filesystem import asynchronously i.e. in a background thread. @@ -52,8 +51,7 @@ public interface BulkFilesystemImporter * @param source The source directory on the local filesystem to read content from (must not be null and must be a valid, readable directory on the local filesystem). * @param replaceExisting A flag indicating whether to replace (true) or skip (false) files that are already in the repository. */ -// void asyncBulkImport(NodeRef target, NodeImporter nodeImporter, boolean replaceExisting); - public void asyncBulkImport(BulkImportParameters bulkImportParameters, NodeImporter nodeImporter); + void asyncBulkImport(BulkImportParameters bulkImportParameters, NodeImporter nodeImporter); /** * @return A status object that describes the current state of the bulk filesystem importer. diff --git a/source/java/org/alfresco/repo/bulkimport/BulkImportParameters.java b/source/java/org/alfresco/repo/bulkimport/BulkImportParameters.java index 0db5b19961..1770ea0baf 100644 --- a/source/java/org/alfresco/repo/bulkimport/BulkImportParameters.java +++ b/source/java/org/alfresco/repo/bulkimport/BulkImportParameters.java @@ -5,11 +5,20 @@ import org.alfresco.service.cmr.repository.NodeRef; public class BulkImportParameters { private NodeRef target; - private boolean replaceExisting; + private boolean replaceExisting = false; private Integer batchSize; private Integer numThreads; private Integer loggingInterval; + private boolean disableRulesService = false; + public boolean isDisableRulesService() + { + return disableRulesService; + } + public void setDisableRulesService(boolean disableRulesService) + { + this.disableRulesService = disableRulesService; + } public Integer getLoggingInterval() { return loggingInterval; diff --git a/source/java/org/alfresco/repo/bulkimport/impl/AbstractBulkFilesystemImporter.java b/source/java/org/alfresco/repo/bulkimport/impl/AbstractBulkFilesystemImporter.java index d3d6f29dca..1da4c9bb23 100644 --- a/source/java/org/alfresco/repo/bulkimport/impl/AbstractBulkFilesystemImporter.java +++ b/source/java/org/alfresco/repo/bulkimport/impl/AbstractBulkFilesystemImporter.java @@ -47,6 +47,7 @@ import org.alfresco.service.cmr.model.FileFolderService; import org.alfresco.service.cmr.model.FileInfo; import org.alfresco.service.cmr.model.FileNotFoundException; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.rule.RuleService; import org.alfresco.service.cmr.security.AccessStatus; import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.namespace.NamespaceService; @@ -76,6 +77,7 @@ public abstract class AbstractBulkFilesystemImporter implements BulkFilesystemIm protected TransactionService transactionService; protected PermissionService permissionService; protected RetryingTransactionHelper transactionHelper; + protected RuleService ruleService; protected BulkImportStatusImpl importStatus; protected DirectoryAnalyser directoryAnalyser = null; @@ -84,6 +86,11 @@ public abstract class AbstractBulkFilesystemImporter implements BulkFilesystemIm protected BehaviourFilter behaviourFilter; + public void setRuleService(RuleService ruleService) + { + this.ruleService = ruleService; + } + public void setBehaviourFilter(BehaviourFilter behaviourFilter) { this.behaviourFilter = behaviourFilter; diff --git a/source/java/org/alfresco/repo/bulkimport/impl/MultiThreadedBulkFilesystemImporter.java b/source/java/org/alfresco/repo/bulkimport/impl/MultiThreadedBulkFilesystemImporter.java index 97bd0fc772..928b8e24b0 100644 --- a/source/java/org/alfresco/repo/bulkimport/impl/MultiThreadedBulkFilesystemImporter.java +++ b/source/java/org/alfresco/repo/bulkimport/impl/MultiThreadedBulkFilesystemImporter.java @@ -32,6 +32,7 @@ import org.alfresco.repo.bulkimport.BulkImportParameters; import org.alfresco.repo.bulkimport.FilesystemTracker; import org.alfresco.repo.bulkimport.ImportableItem; import org.alfresco.repo.bulkimport.NodeImporter; +import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; import org.alfresco.service.cmr.repository.NodeRef; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -64,11 +65,17 @@ public abstract class MultiThreadedBulkFilesystemImporter extends AbstractBulkFi { return bulkImportParameters.getNumThreads() != null ? bulkImportParameters.getNumThreads() : defaultNumThreads; } + + protected void handleRuleService(final BulkImportParameters bulkImportParameters) + { + + } protected BatchProcessor.BatchProcessWorker getWorker(final BulkImportParameters bulkImportParameters, final String lockToken, final NodeImporter nodeImporter, final FilesystemTracker filesystemTracker) { final int batchSize = bulkImportParameters.getBatchSize() != null ? bulkImportParameters.getBatchSize() : defaultBatchSize; + final boolean rulesEnabled = ruleService.isEnabled(); BatchProcessor.BatchProcessWorker worker = new BatchProcessor.BatchProcessWorker() { @@ -80,30 +87,47 @@ public abstract class MultiThreadedBulkFilesystemImporter extends AbstractBulkFi public void beforeProcess() throws Throwable { refreshLock(lockToken, batchSize * 250L); - // TODO this throws exception txn not started?? + if(bulkImportParameters.isDisableRulesService() && rulesEnabled) + { + ruleService.disableRules(); + } + // Disable the auditable aspect's behaviours for this transaction only, to allow creation & modification dates to be set - //behaviourFilter.disableBehaviour(ContentModel.ASPECT_AUDITABLE); + transactionHelper.doInTransaction(new RetryingTransactionCallback() + { + @Override + public Void execute() throws Throwable + { + behaviourFilter.disableBehaviour(ContentModel.ASPECT_AUDITABLE); + return null; + } + }); } public void afterProcess() throws Throwable { + if(bulkImportParameters.isDisableRulesService() && rulesEnabled) + { + ruleService.enableRules(); + } + importStatus.incrementNumberOfBatchesCompleted(); - //behaviourFilter.enableBehaviour(ContentModel.ASPECT_AUDITABLE); + + transactionHelper.doInTransaction(new RetryingTransactionCallback() + { + @Override + public Void execute() throws Throwable + { + behaviourFilter.enableBehaviour(ContentModel.ASPECT_AUDITABLE); + return null; + } + }); } - + public void process(final ImportableItem importableItem) throws Throwable { - try - { - behaviourFilter.disableBehaviour(ContentModel.ASPECT_AUDITABLE); - NodeRef nodeRef = nodeImporter.importImportableItem(importableItem, bulkImportParameters.isReplaceExisting()); - filesystemTracker.itemImported(nodeRef, importableItem); -// importableItem.setNodeRef(nodeRef); - } - finally - { - behaviourFilter.enableBehaviour(ContentModel.ASPECT_AUDITABLE); - } + NodeRef nodeRef = nodeImporter.importImportableItem(importableItem, bulkImportParameters.isReplaceExisting()); + filesystemTracker.itemImported(nodeRef, importableItem); } };