mirror of
				https://github.com/Alfresco/alfresco-community-repo.git
				synced 2025-10-29 15:21:53 +00:00 
			
		
		
		
	Compare commits
	
		
			6 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | becabb3a41 | ||
|  | 033157800b | ||
|  | b9c8ff91e4 | ||
|  | c54d46ab67 | ||
|  | dec514c5c2 | ||
|  | 7c5a8a1963 | 
| @@ -7,7 +7,7 @@ | |||||||
|    <parent> |    <parent> | ||||||
|       <groupId>org.alfresco</groupId> |       <groupId>org.alfresco</groupId> | ||||||
|       <artifactId>alfresco-community-repo-amps</artifactId> |       <artifactId>alfresco-community-repo-amps</artifactId> | ||||||
|       <version>11.141-SNAPSHOT</version> |       <version>12.1</version> | ||||||
|    </parent> |    </parent> | ||||||
|  |  | ||||||
|    <modules> |    <modules> | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
|    <parent> |    <parent> | ||||||
|       <groupId>org.alfresco</groupId> |       <groupId>org.alfresco</groupId> | ||||||
|       <artifactId>alfresco-governance-services-community-parent</artifactId> |       <artifactId>alfresco-governance-services-community-parent</artifactId> | ||||||
|       <version>11.141-SNAPSHOT</version> |       <version>12.1</version> | ||||||
|    </parent> |    </parent> | ||||||
|  |  | ||||||
|    <modules> |    <modules> | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
|    <parent> |    <parent> | ||||||
|       <groupId>org.alfresco</groupId> |       <groupId>org.alfresco</groupId> | ||||||
|       <artifactId>alfresco-governance-services-automation-community-repo</artifactId> |       <artifactId>alfresco-governance-services-automation-community-repo</artifactId> | ||||||
|       <version>11.141-SNAPSHOT</version> |       <version>12.1</version> | ||||||
|    </parent> |    </parent> | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
|    <parent> |    <parent> | ||||||
|       <groupId>org.alfresco</groupId> |       <groupId>org.alfresco</groupId> | ||||||
|       <artifactId>alfresco-governance-services-community-parent</artifactId> |       <artifactId>alfresco-governance-services-community-parent</artifactId> | ||||||
|       <version>11.141-SNAPSHOT</version> |       <version>12.1</version> | ||||||
|    </parent> |    </parent> | ||||||
|  |  | ||||||
|    <modules> |    <modules> | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ | |||||||
|    <parent> |    <parent> | ||||||
|       <groupId>org.alfresco</groupId> |       <groupId>org.alfresco</groupId> | ||||||
|       <artifactId>alfresco-governance-services-community-repo-parent</artifactId> |       <artifactId>alfresco-governance-services-community-repo-parent</artifactId> | ||||||
|       <version>11.141-SNAPSHOT</version> |       <version>12.1</version> | ||||||
|    </parent> |    </parent> | ||||||
|  |  | ||||||
|    <properties> |    <properties> | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
|     <parent> |     <parent> | ||||||
|         <groupId>org.alfresco</groupId> |         <groupId>org.alfresco</groupId> | ||||||
|         <artifactId>alfresco-governance-services-community-repo-parent</artifactId> |         <artifactId>alfresco-governance-services-community-repo-parent</artifactId> | ||||||
|         <version>11.141-SNAPSHOT</version> |         <version>12.1</version> | ||||||
|     </parent> |     </parent> | ||||||
|  |  | ||||||
|     <build> |     <build> | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
|     <parent> |     <parent> | ||||||
|         <groupId>org.alfresco</groupId> |         <groupId>org.alfresco</groupId> | ||||||
|         <artifactId>alfresco-community-repo</artifactId> |         <artifactId>alfresco-community-repo</artifactId> | ||||||
|         <version>11.141-SNAPSHOT</version> |         <version>12.1</version> | ||||||
|     </parent> |     </parent> | ||||||
|  |  | ||||||
|     <modules> |     <modules> | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ | |||||||
|     <parent> |     <parent> | ||||||
|         <groupId>org.alfresco</groupId> |         <groupId>org.alfresco</groupId> | ||||||
|         <artifactId>alfresco-community-repo-amps</artifactId> |         <artifactId>alfresco-community-repo-amps</artifactId> | ||||||
|         <version>11.141-SNAPSHOT</version> |         <version>12.1</version> | ||||||
|     </parent> |     </parent> | ||||||
|  |  | ||||||
|     <properties> |     <properties> | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
|    <parent> |    <parent> | ||||||
|       <groupId>org.alfresco</groupId> |       <groupId>org.alfresco</groupId> | ||||||
|       <artifactId>alfresco-community-repo</artifactId> |       <artifactId>alfresco-community-repo</artifactId> | ||||||
|       <version>11.141-SNAPSHOT</version> |       <version>12.1</version> | ||||||
|    </parent> |    </parent> | ||||||
|  |  | ||||||
|    <dependencies> |    <dependencies> | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
|     <parent> |     <parent> | ||||||
|         <groupId>org.alfresco</groupId> |         <groupId>org.alfresco</groupId> | ||||||
|         <artifactId>alfresco-community-repo</artifactId> |         <artifactId>alfresco-community-repo</artifactId> | ||||||
|         <version>11.141-SNAPSHOT</version> |         <version>12.1</version> | ||||||
|     </parent> |     </parent> | ||||||
|  |  | ||||||
|     <properties> |     <properties> | ||||||
|   | |||||||
| @@ -9,6 +9,6 @@ | |||||||
|     <parent> |     <parent> | ||||||
|         <groupId>org.alfresco</groupId> |         <groupId>org.alfresco</groupId> | ||||||
|         <artifactId>alfresco-community-repo-packaging</artifactId> |         <artifactId>alfresco-community-repo-packaging</artifactId> | ||||||
|         <version>11.141-SNAPSHOT</version> |         <version>12.1</version> | ||||||
|     </parent> |     </parent> | ||||||
| </project> | </project> | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
|     <parent> |     <parent> | ||||||
|         <groupId>org.alfresco</groupId> |         <groupId>org.alfresco</groupId> | ||||||
|         <artifactId>alfresco-community-repo-packaging</artifactId> |         <artifactId>alfresco-community-repo-packaging</artifactId> | ||||||
|         <version>11.141-SNAPSHOT</version> |         <version>12.1</version> | ||||||
|     </parent> |     </parent> | ||||||
|  |  | ||||||
|     <properties> |     <properties> | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
|     <parent> |     <parent> | ||||||
|         <groupId>org.alfresco</groupId> |         <groupId>org.alfresco</groupId> | ||||||
|         <artifactId>alfresco-community-repo</artifactId> |         <artifactId>alfresco-community-repo</artifactId> | ||||||
|         <version>11.141-SNAPSHOT</version> |         <version>12.1</version> | ||||||
|     </parent> |     </parent> | ||||||
|  |  | ||||||
|     <modules> |     <modules> | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ | |||||||
|     <parent> |     <parent> | ||||||
|         <groupId>org.alfresco</groupId> |         <groupId>org.alfresco</groupId> | ||||||
|         <artifactId>alfresco-community-repo-packaging</artifactId> |         <artifactId>alfresco-community-repo-packaging</artifactId> | ||||||
|         <version>11.141-SNAPSHOT</version> |         <version>12.1</version> | ||||||
|     </parent> |     </parent> | ||||||
|  |  | ||||||
|     <modules> |     <modules> | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ | |||||||
|     <parent> |     <parent> | ||||||
|         <groupId>org.alfresco</groupId> |         <groupId>org.alfresco</groupId> | ||||||
|         <artifactId>alfresco-community-repo-tests</artifactId> |         <artifactId>alfresco-community-repo-tests</artifactId> | ||||||
|         <version>11.141-SNAPSHOT</version> |         <version>12.1</version> | ||||||
|     </parent> |     </parent> | ||||||
|  |  | ||||||
|     <developers> |     <developers> | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ | |||||||
|     <parent> |     <parent> | ||||||
|         <groupId>org.alfresco</groupId> |         <groupId>org.alfresco</groupId> | ||||||
|         <artifactId>alfresco-community-repo-tests</artifactId> |         <artifactId>alfresco-community-repo-tests</artifactId> | ||||||
|         <version>11.141-SNAPSHOT</version> |         <version>12.1</version> | ||||||
|     </parent> |     </parent> | ||||||
|  |  | ||||||
|     <developers> |     <developers> | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ | |||||||
|     <parent> |     <parent> | ||||||
|         <groupId>org.alfresco</groupId> |         <groupId>org.alfresco</groupId> | ||||||
|         <artifactId>alfresco-community-repo-tests</artifactId> |         <artifactId>alfresco-community-repo-tests</artifactId> | ||||||
|         <version>11.141-SNAPSHOT</version> |         <version>12.1</version> | ||||||
|     </parent> |     </parent> | ||||||
|  |  | ||||||
|     <developers> |     <developers> | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ | |||||||
|     <parent> |     <parent> | ||||||
|         <groupId>org.alfresco</groupId> |         <groupId>org.alfresco</groupId> | ||||||
|         <artifactId>alfresco-community-repo-tests</artifactId> |         <artifactId>alfresco-community-repo-tests</artifactId> | ||||||
|         <version>11.141-SNAPSHOT</version> |         <version>12.1</version> | ||||||
|     </parent> |     </parent> | ||||||
|  |  | ||||||
|     <developers> |     <developers> | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ | |||||||
|     <parent> |     <parent> | ||||||
|         <groupId>org.alfresco</groupId> |         <groupId>org.alfresco</groupId> | ||||||
|         <artifactId>alfresco-community-repo-tests</artifactId> |         <artifactId>alfresco-community-repo-tests</artifactId> | ||||||
|         <version>11.141-SNAPSHOT</version> |         <version>12.1</version> | ||||||
|     </parent> |     </parent> | ||||||
|  |  | ||||||
|     <developers> |     <developers> | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
|     <parent> |     <parent> | ||||||
|         <groupId>org.alfresco</groupId> |         <groupId>org.alfresco</groupId> | ||||||
|         <artifactId>alfresco-community-repo-packaging</artifactId> |         <artifactId>alfresco-community-repo-packaging</artifactId> | ||||||
|         <version>11.141-SNAPSHOT</version> |         <version>12.1</version> | ||||||
|     </parent> |     </parent> | ||||||
|  |  | ||||||
|     <properties> |     <properties> | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								pom.xml
									
									
									
									
									
								
							| @@ -2,7 +2,7 @@ | |||||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||||
|     <modelVersion>4.0.0</modelVersion> |     <modelVersion>4.0.0</modelVersion> | ||||||
|     <artifactId>alfresco-community-repo</artifactId> |     <artifactId>alfresco-community-repo</artifactId> | ||||||
|     <version>11.141-SNAPSHOT</version> |     <version>12.1</version> | ||||||
|     <packaging>pom</packaging> |     <packaging>pom</packaging> | ||||||
|     <name>Alfresco Community Repo Parent</name> |     <name>Alfresco Community Repo Parent</name> | ||||||
|  |  | ||||||
| @@ -24,7 +24,7 @@ | |||||||
|     <properties> |     <properties> | ||||||
|         <acs.version.major>7</acs.version.major> |         <acs.version.major>7</acs.version.major> | ||||||
|         <acs.version.minor>1</acs.version.minor> |         <acs.version.minor>1</acs.version.minor> | ||||||
|         <acs.version.revision>0</acs.version.revision> |         <acs.version.revision>1</acs.version.revision> | ||||||
|         <acs.version.label /> |         <acs.version.label /> | ||||||
|         <amp.min.version>${acs.version.major}.0.0</amp.min.version> |         <amp.min.version>${acs.version.major}.0.0</amp.min.version> | ||||||
|  |  | ||||||
| @@ -142,7 +142,7 @@ | |||||||
|         <connection>scm:git:https://github.com/Alfresco/alfresco-community-repo.git</connection> |         <connection>scm:git:https://github.com/Alfresco/alfresco-community-repo.git</connection> | ||||||
|         <developerConnection>scm:git:https://github.com/Alfresco/alfresco-community-repo.git</developerConnection> |         <developerConnection>scm:git:https://github.com/Alfresco/alfresco-community-repo.git</developerConnection> | ||||||
|         <url>https://github.com/Alfresco/alfresco-community-repo</url> |         <url>https://github.com/Alfresco/alfresco-community-repo</url> | ||||||
|         <tag>HEAD</tag> |         <tag>12.1</tag> | ||||||
|     </scm> |     </scm> | ||||||
|  |  | ||||||
|     <distributionManagement> |     <distributionManagement> | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
|     <parent> |     <parent> | ||||||
|         <groupId>org.alfresco</groupId> |         <groupId>org.alfresco</groupId> | ||||||
|         <artifactId>alfresco-community-repo</artifactId> |         <artifactId>alfresco-community-repo</artifactId> | ||||||
|         <version>11.141-SNAPSHOT</version> |         <version>12.1</version> | ||||||
|     </parent> |     </parent> | ||||||
|  |  | ||||||
|     <dependencies> |     <dependencies> | ||||||
|   | |||||||
| @@ -30,8 +30,19 @@ import java.net.InetAddress; | |||||||
| import java.net.UnknownHostException; | import java.net.UnknownHostException; | ||||||
| import java.util.Arrays; | import java.util.Arrays; | ||||||
| import java.util.Date; | import java.util.Date; | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.Map; | ||||||
|  | import java.util.Objects; | ||||||
|  | import java.util.OptionalInt; | ||||||
|  | import java.util.function.Function; | ||||||
|  | import java.util.function.Supplier; | ||||||
|  |  | ||||||
|  | import com.google.common.primitives.Ints; | ||||||
|  |  | ||||||
| import org.alfresco.repo.bulkimport.BulkFilesystemImporter; | import org.alfresco.repo.bulkimport.BulkFilesystemImporter; | ||||||
|  | import org.alfresco.repo.bulkimport.BulkImportParameters; | ||||||
|  | import org.alfresco.repo.bulkimport.NodeImporter; | ||||||
|  | import org.alfresco.repo.bulkimport.impl.MultiThreadedBulkFilesystemImporter; | ||||||
| import org.alfresco.repo.model.Repository; | import org.alfresco.repo.model.Repository; | ||||||
| import org.alfresco.service.cmr.model.FileFolderService; | import org.alfresco.service.cmr.model.FileFolderService; | ||||||
| import org.alfresco.service.cmr.model.FileInfo; | import org.alfresco.service.cmr.model.FileInfo; | ||||||
| @@ -39,8 +50,12 @@ import org.alfresco.service.cmr.model.FileNotFoundException; | |||||||
| import org.alfresco.service.cmr.repository.NodeRef; | import org.alfresco.service.cmr.repository.NodeRef; | ||||||
| import org.apache.commons.logging.Log; | import org.apache.commons.logging.Log; | ||||||
| import org.apache.commons.logging.LogFactory; | import org.apache.commons.logging.LogFactory; | ||||||
|  | import org.springframework.extensions.surf.util.I18NUtil; | ||||||
|  | import org.springframework.extensions.webscripts.Cache; | ||||||
| import org.springframework.extensions.webscripts.DeclarativeWebScript; | import org.springframework.extensions.webscripts.DeclarativeWebScript; | ||||||
|  | import org.springframework.extensions.webscripts.Status; | ||||||
| import org.springframework.extensions.webscripts.WebScriptException; | import org.springframework.extensions.webscripts.WebScriptException; | ||||||
|  | import org.springframework.extensions.webscripts.WebScriptRequest; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * contains common fields and methods for the import web scripts. |  * contains common fields and methods for the import web scripts. | ||||||
| @@ -60,10 +75,10 @@ public class AbstractBulkFileSystemImportWebScript extends DeclarativeWebScript | |||||||
|     // Web scripts parameters (common) |     // Web scripts parameters (common) | ||||||
| 	protected static final String PARAMETER_REPLACE_EXISTING        = "replaceExisting"; | 	protected static final String PARAMETER_REPLACE_EXISTING        = "replaceExisting"; | ||||||
| 	protected static final String PARAMETER_EXISTING_FILE_MODE      = "existingFileMode"; | 	protected static final String PARAMETER_EXISTING_FILE_MODE      = "existingFileMode"; | ||||||
| 	protected static final String PARAMETER_VALUE_REPLACE_EXISTING 	= "replaceExisting"; | 	protected static final String PARAMETER_VALUE_REPLACE_EXISTING 	= "true"; | ||||||
| 	protected static final String PARAMETER_SOURCE_DIRECTORY       	= "sourceDirectory"; | 	protected static final String PARAMETER_SOURCE_DIRECTORY       	= "sourceDirectory"; | ||||||
| 	protected static final String PARAMETER_DISABLE_RULES		    = "disableRules"; | 	protected static final String PARAMETER_DISABLE_RULES		    = "disableRules"; | ||||||
| 	protected static final String PARAMETER_VALUE_DISABLE_RULES		= "disableRules"; | 	protected static final String PARAMETER_VALUE_DISABLE_RULES		= "true"; | ||||||
|  |  | ||||||
| 	protected static final String IMPORT_ALREADY_IN_PROGRESS_MODEL_KEY = "importInProgress"; | 	protected static final String IMPORT_ALREADY_IN_PROGRESS_MODEL_KEY = "importInProgress"; | ||||||
| 	protected static final String IMPORT_ALREADY_IN_PROGRESS_ERROR_KEY ="bfsit.error.importAlreadyInProgress"; | 	protected static final String IMPORT_ALREADY_IN_PROGRESS_ERROR_KEY ="bfsit.error.importAlreadyInProgress"; | ||||||
| @@ -219,4 +234,198 @@ public class AbstractBulkFileSystemImportWebScript extends DeclarativeWebScript | |||||||
| 		this.repository = repository; | 		this.repository = repository; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	protected class MultithreadedImportWebScriptLogic | ||||||
|  | 	{ | ||||||
|  | 		private final MultiThreadedBulkFilesystemImporter bulkImporter; | ||||||
|  | 		private final Supplier<NodeImporter> nodeImporterFactory; | ||||||
|  | 		private final WebScriptRequest request; | ||||||
|  | 		private final Status status; | ||||||
|  | 		private final Cache cache; | ||||||
|  |  | ||||||
|  | 		public MultithreadedImportWebScriptLogic(MultiThreadedBulkFilesystemImporter bulkImporter, Supplier<NodeImporter> nodeImporterFactory, WebScriptRequest request, Status status, Cache cache) | ||||||
|  | 		{ | ||||||
|  | 			this.bulkImporter = Objects.requireNonNull(bulkImporter); | ||||||
|  | 			this.nodeImporterFactory = Objects.requireNonNull(nodeImporterFactory); | ||||||
|  | 			this.request = Objects.requireNonNull(request); | ||||||
|  | 			this.status = Objects.requireNonNull(status); | ||||||
|  | 			this.cache = Objects.requireNonNull(cache); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		public Map<String, Object> executeImport() | ||||||
|  | 		{ | ||||||
|  | 			Map<String, Object> model  = new HashMap<>(); | ||||||
|  | 			cache.setNeverCache(true); | ||||||
|  | 			String targetPath = null; | ||||||
|  |  | ||||||
|  | 			try | ||||||
|  | 			{ | ||||||
|  | 				targetPath = request.getParameter(PARAMETER_TARGET_PATH); | ||||||
|  | 				if (isRunning()) | ||||||
|  | 				{ | ||||||
|  | 					model.put(IMPORT_ALREADY_IN_PROGRESS_MODEL_KEY, I18NUtil.getMessage(IMPORT_ALREADY_IN_PROGRESS_ERROR_KEY)); | ||||||
|  | 					return model; | ||||||
|  | 				} | ||||||
|  |  | ||||||
|  | 				final BulkImportParameters bulkImportParameters = getBulkImportParameters(); | ||||||
|  | 				final NodeImporter nodeImporter = nodeImporterFactory.get(); | ||||||
|  |  | ||||||
|  | 				bulkImporter.asyncBulkImport(bulkImportParameters, nodeImporter); | ||||||
|  |  | ||||||
|  | 				waitForImportToBegin(); | ||||||
|  |  | ||||||
|  | 				// redirect to the status Web Script | ||||||
|  | 				status.setCode(Status.STATUS_MOVED_TEMPORARILY); | ||||||
|  | 				status.setRedirect(true); | ||||||
|  | 				status.setLocation(request.getServiceContextPath() + WEB_SCRIPT_URI_BULK_FILESYSTEM_IMPORT_STATUS); | ||||||
|  | 			} | ||||||
|  | 			catch (WebScriptException | IllegalArgumentException e) | ||||||
|  | 			{ | ||||||
|  | 				status.setCode(Status.STATUS_BAD_REQUEST, e.getMessage()); | ||||||
|  | 				status.setRedirect(true); | ||||||
|  | 			} | ||||||
|  | 			catch (FileNotFoundException fnfe) | ||||||
|  | 			{ | ||||||
|  | 				status.setCode(Status.STATUS_BAD_REQUEST,"The repository path '" + targetPath + "' does not exist !"); | ||||||
|  | 				status.setRedirect(true); | ||||||
|  | 			} | ||||||
|  | 			catch (Throwable t) | ||||||
|  | 			{ | ||||||
|  | 				throw new WebScriptException(Status.STATUS_INTERNAL_SERVER_ERROR, buildTextMessage(t), t); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			return model; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		private void waitForImportToBegin() throws InterruptedException | ||||||
|  | 		{ | ||||||
|  | 			// ACE-3047 fix, since bulk import is started asynchronously there is a chance that client | ||||||
|  | 			// will get into the status page before import is actually started. | ||||||
|  | 			// In this case wrong information (for previous import) will be displayed. | ||||||
|  | 			// So lets ensure that import started before redirecting client to status page. | ||||||
|  | 			int i = 0; | ||||||
|  | 			while (!bulkImporter.getStatus().inProgress() && i < 10) | ||||||
|  | 			{ | ||||||
|  | 				Thread.sleep(100); | ||||||
|  | 				i++; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		private BulkImportParameters getBulkImportParameters() throws FileNotFoundException | ||||||
|  | 		{ | ||||||
|  | 			final BulkImportParametersExtractor extractor = new BulkImportParametersExtractor(request::getParameter, | ||||||
|  | 					AbstractBulkFileSystemImportWebScript.this::getTargetNodeRef, | ||||||
|  | 					bulkImporter.getDefaultBatchSize(), | ||||||
|  | 					bulkImporter.getDefaultNumThreads()); | ||||||
|  | 			return extractor.extract(); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		private boolean isRunning() | ||||||
|  | 		{ | ||||||
|  | 			return bulkImporter.getStatus().inProgress(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	protected static class BulkImportParametersExtractor | ||||||
|  | 	{ | ||||||
|  | 		private final Function<String, String> paramsProvider; | ||||||
|  | 		private final NodeRefCreator nodeRefCreator; | ||||||
|  | 		private final int defaultBatchSize; | ||||||
|  | 		private final int defaultNumThreads; | ||||||
|  |  | ||||||
|  | 		public BulkImportParametersExtractor(final Function<String, String> paramsProvider, final NodeRefCreator nodeRefCreator, | ||||||
|  | 											 final int defaultBatchSize, final int defaultNumThreads) | ||||||
|  | 		{ | ||||||
|  | 			this.paramsProvider = Objects.requireNonNull(paramsProvider); | ||||||
|  | 			this.nodeRefCreator = Objects.requireNonNull(nodeRefCreator); | ||||||
|  | 			this.defaultBatchSize = defaultBatchSize; | ||||||
|  | 			this.defaultNumThreads = defaultNumThreads; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		public BulkImportParameters extract() throws FileNotFoundException | ||||||
|  | 		{ | ||||||
|  | 			BulkImportParameters result = new BulkImportParameters(); | ||||||
|  |  | ||||||
|  | 			result.setTarget(getTargetNodeRef()); | ||||||
|  | 			setExistingFileMode(result); | ||||||
|  | 			result.setNumThreads(getOptionalPositiveInteger(PARAMETER_NUM_THREADS).orElse(defaultNumThreads)); | ||||||
|  | 			result.setBatchSize(getOptionalPositiveInteger(PARAMETER_BATCH_SIZE).orElse(defaultBatchSize)); | ||||||
|  | 			setDisableRules(result); | ||||||
|  |  | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		private void setExistingFileMode(BulkImportParameters params) | ||||||
|  | 		{ | ||||||
|  | 			String replaceExistingStr = getParamStringValue(PARAMETER_REPLACE_EXISTING); | ||||||
|  | 			String existingFileModeStr = getParamStringValue(PARAMETER_EXISTING_FILE_MODE); | ||||||
|  |  | ||||||
|  | 			if (!isNullOrEmpty(replaceExistingStr) && !isNullOrEmpty(existingFileModeStr)) | ||||||
|  | 			{ | ||||||
|  | 				// Check that we haven't had both the deprecated and new (existingFileMode) | ||||||
|  | 				// parameters supplied. | ||||||
|  | 				throw new IllegalStateException( | ||||||
|  | 						String.format("Only one of these parameters may be used, not both: %s, %s", | ||||||
|  | 								PARAMETER_REPLACE_EXISTING, | ||||||
|  | 								PARAMETER_EXISTING_FILE_MODE)); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			if (!isNullOrEmpty(existingFileModeStr)) | ||||||
|  | 			{ | ||||||
|  | 				params.setExistingFileMode(BulkImportParameters.ExistingFileMode.valueOf(existingFileModeStr)); | ||||||
|  | 			} | ||||||
|  | 			else | ||||||
|  | 			{ | ||||||
|  | 				params.setReplaceExisting(PARAMETER_VALUE_REPLACE_EXISTING.equals(replaceExistingStr)); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		private void setDisableRules(final BulkImportParameters params) | ||||||
|  | 		{ | ||||||
|  | 			final String disableRulesStr = getParamStringValue(PARAMETER_DISABLE_RULES); | ||||||
|  | 			params.setDisableRulesService(!isNullOrEmpty(disableRulesStr) && PARAMETER_VALUE_DISABLE_RULES.equals(disableRulesStr)); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		private NodeRef getTargetNodeRef() throws FileNotFoundException | ||||||
|  | 		{ | ||||||
|  | 			String targetNodeRefStr = getParamStringValue(PARAMETER_TARGET_NODEREF); | ||||||
|  | 			String targetPath = getParamStringValue(PARAMETER_TARGET_PATH); | ||||||
|  | 			return nodeRefCreator.fromNodeRefAndPath(targetNodeRefStr, targetPath); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		private OptionalInt getOptionalPositiveInteger(final String paramName) | ||||||
|  | 		{ | ||||||
|  | 			final String strValue = getParamStringValue(paramName); | ||||||
|  | 			if (isNullOrEmpty(strValue)) | ||||||
|  | 			{ | ||||||
|  | 				return OptionalInt.empty(); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			final Integer asInt = Ints.tryParse(strValue); | ||||||
|  | 			if (asInt == null || asInt < 1) | ||||||
|  | 			{ | ||||||
|  | 				throw new WebScriptException("Error: parameter '" + paramName + "' must be an integer > 0."); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			return OptionalInt.of(asInt); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		private String getParamStringValue(String paramName) | ||||||
|  | 		{ | ||||||
|  | 			Objects.requireNonNull(paramName); | ||||||
|  |  | ||||||
|  | 			return paramsProvider.apply(paramName); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		private boolean isNullOrEmpty(String str) | ||||||
|  | 		{ | ||||||
|  | 			return str == null || str.trim().length() == 0; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		@FunctionalInterface | ||||||
|  | 		protected interface NodeRefCreator | ||||||
|  | 		{ | ||||||
|  | 			NodeRef fromNodeRefAndPath(String nodeRef, String path) throws FileNotFoundException; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| } | } | ||||||
| @@ -27,17 +27,12 @@ | |||||||
| package org.alfresco.repo.web.scripts.bulkimport.copy; | package org.alfresco.repo.web.scripts.bulkimport.copy; | ||||||
|  |  | ||||||
| import java.io.File; | import java.io.File; | ||||||
| import java.util.HashMap; |  | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
|  |  | ||||||
| import org.alfresco.repo.bulkimport.BulkImportParameters; |  | ||||||
| import org.alfresco.repo.bulkimport.NodeImporter; | import org.alfresco.repo.bulkimport.NodeImporter; | ||||||
| import org.alfresco.repo.bulkimport.impl.MultiThreadedBulkFilesystemImporter; | import org.alfresco.repo.bulkimport.impl.MultiThreadedBulkFilesystemImporter; | ||||||
| import org.alfresco.repo.bulkimport.impl.StreamingNodeImporterFactory; | import org.alfresco.repo.bulkimport.impl.StreamingNodeImporterFactory; | ||||||
| import org.alfresco.repo.web.scripts.bulkimport.AbstractBulkFileSystemImportWebScript; | import org.alfresco.repo.web.scripts.bulkimport.AbstractBulkFileSystemImportWebScript; | ||||||
| import org.alfresco.service.cmr.model.FileNotFoundException; |  | ||||||
| import org.alfresco.service.cmr.repository.NodeRef; |  | ||||||
| import org.springframework.extensions.surf.util.I18NUtil; |  | ||||||
| import org.springframework.extensions.webscripts.Cache; | import org.springframework.extensions.webscripts.Cache; | ||||||
| import org.springframework.extensions.webscripts.Status; | import org.springframework.extensions.webscripts.Status; | ||||||
| import org.springframework.extensions.webscripts.WebScriptException; | import org.springframework.extensions.webscripts.WebScriptException; | ||||||
| @@ -69,170 +64,22 @@ public class BulkFilesystemImportWebScript extends AbstractBulkFileSystemImportW | |||||||
|     @Override |     @Override | ||||||
|     protected Map<String, Object> executeImpl(final WebScriptRequest request, final Status status, final Cache cache) |     protected Map<String, Object> executeImpl(final WebScriptRequest request, final Status status, final Cache cache) | ||||||
|     { |     { | ||||||
|         Map<String, Object> model  = new HashMap<String, Object>(); |         final MultithreadedImportWebScriptLogic importLogic = new MultithreadedImportWebScriptLogic(bulkImporter, | ||||||
|         String targetNodeRefStr = null; |                 () -> createNodeImporter(request), request, status, cache); | ||||||
|         String targetPath = null; |         return importLogic.executeImport(); | ||||||
|         String sourceDirectoryStr = null; |     } | ||||||
|         @Deprecated String replaceExistingStr = null; |  | ||||||
|         String existingFileModeStr = null; |  | ||||||
|         String batchSizeStr = null; |  | ||||||
|         String numThreadsStr = null; |  | ||||||
|         String disableRulesStr = null; |  | ||||||
|  |  | ||||||
|         cache.setNeverCache(true); |     private NodeImporter createNodeImporter(WebScriptRequest request) | ||||||
|          |     { | ||||||
|         try |         final String sourceDirectoryStr = request.getParameter(PARAMETER_SOURCE_DIRECTORY); | ||||||
|  |         if (sourceDirectoryStr == null || sourceDirectoryStr.trim().length() == 0) | ||||||
|         { |         { | ||||||
|             if(!bulkImporter.getStatus().inProgress()) |             throw new WebScriptException("Error: mandatory parameter '" + PARAMETER_SOURCE_DIRECTORY + "' was not provided."); | ||||||
|             { |  | ||||||
|                 NodeRef targetNodeRef = null; |  | ||||||
|                 File sourceDirectory = null; |  | ||||||
|                 boolean replaceExisting = false; |  | ||||||
|                 BulkImportParameters.ExistingFileMode existingFileMode = null; |  | ||||||
|                 int batchSize = bulkImporter.getDefaultBatchSize(); |  | ||||||
|                 int numThreads = bulkImporter.getDefaultNumThreads(); |  | ||||||
|                 boolean disableRules = false; |  | ||||||
|                  |  | ||||||
|                 // Retrieve, validate and convert parameters |  | ||||||
|                 targetNodeRefStr = request.getParameter(PARAMETER_TARGET_NODEREF); |  | ||||||
|                 targetPath = request.getParameter(PARAMETER_TARGET_PATH); |  | ||||||
|                 sourceDirectoryStr = request.getParameter(PARAMETER_SOURCE_DIRECTORY); |  | ||||||
|                 replaceExistingStr = request.getParameter(PARAMETER_REPLACE_EXISTING); |  | ||||||
|                 existingFileModeStr = request.getParameter(PARAMETER_EXISTING_FILE_MODE); |  | ||||||
|  |  | ||||||
|                 batchSizeStr = request.getParameter(PARAMETER_BATCH_SIZE); |  | ||||||
|                 numThreadsStr = request.getParameter(PARAMETER_NUM_THREADS); |  | ||||||
|                 disableRulesStr = request.getParameter(PARAMETER_DISABLE_RULES); |  | ||||||
|  |  | ||||||
|                 targetNodeRef = getTargetNodeRef(targetNodeRefStr, targetPath); |  | ||||||
|                  |  | ||||||
|                 if (sourceDirectoryStr == null || sourceDirectoryStr.trim().length() == 0) |  | ||||||
|                 { |  | ||||||
|                     throw new RuntimeException("Error: mandatory parameter '" + PARAMETER_SOURCE_DIRECTORY + "' was not provided."); |  | ||||||
|                 } |  | ||||||
|                  |  | ||||||
|                 sourceDirectory = new File(sourceDirectoryStr.trim()); |  | ||||||
|  |  | ||||||
|                 if (replaceExistingStr != null && existingFileModeStr != null) |  | ||||||
|                 { |  | ||||||
|                     // Check that we haven't had both the deprecated and new (existingFileMode) |  | ||||||
|                     // parameters supplied. |  | ||||||
|                     throw new IllegalStateException( |  | ||||||
|                             String.format("Only one of these parameters may be used, not both: %s, %s", |  | ||||||
|                                     PARAMETER_REPLACE_EXISTING, |  | ||||||
|                                     PARAMETER_EXISTING_FILE_MODE)); |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 if (replaceExistingStr != null && replaceExistingStr.trim().length() > 0) |  | ||||||
|                 { |  | ||||||
|                     replaceExisting = PARAMETER_VALUE_REPLACE_EXISTING.equals(replaceExistingStr); |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 if (existingFileModeStr != null && existingFileModeStr.trim().length() > 0) |  | ||||||
|                 { |  | ||||||
|                     existingFileMode = BulkImportParameters.ExistingFileMode.valueOf(existingFileModeStr); |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 if (disableRulesStr != null && disableRulesStr.trim().length() > 0) |  | ||||||
|                 { |  | ||||||
|                     disableRules = PARAMETER_VALUE_DISABLE_RULES.equals(disableRulesStr); |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 // Initiate the import |  | ||||||
|                 NodeImporter nodeImporter = nodeImporterFactory.getNodeImporter(sourceDirectory); |  | ||||||
|                 BulkImportParameters bulkImportParameters = new BulkImportParameters(); |  | ||||||
|                  |  | ||||||
|                 if (numThreadsStr != null && numThreadsStr.trim().length() > 0) |  | ||||||
|                 { |  | ||||||
|                 	try |  | ||||||
|                 	{ |  | ||||||
|                 		numThreads = Integer.parseInt(numThreadsStr); |  | ||||||
|                 		if(numThreads < 1) |  | ||||||
|                 		{ |  | ||||||
|                             throw new RuntimeException("Error: parameter '" + PARAMETER_NUM_THREADS + "' must be an integer > 0."); |  | ||||||
|                 		} |  | ||||||
|                         bulkImportParameters.setNumThreads(numThreads); |  | ||||||
|                 	} |  | ||||||
|                 	catch(NumberFormatException e) |  | ||||||
|                 	{ |  | ||||||
|                         throw new RuntimeException("Error: parameter '" + PARAMETER_NUM_THREADS + "' must be an integer > 0."); |  | ||||||
|                 	} |  | ||||||
|                 } |  | ||||||
|                  |  | ||||||
|                 if (batchSizeStr != null && batchSizeStr.trim().length() > 0) |  | ||||||
|                 { |  | ||||||
|                 	try |  | ||||||
|                 	{ |  | ||||||
|                 		batchSize = Integer.parseInt(batchSizeStr); |  | ||||||
|                 		if(batchSize < 1) |  | ||||||
|                 		{ |  | ||||||
|                             throw new RuntimeException("Error: parameter '" + PARAMETER_BATCH_SIZE + "' must be an integer > 0."); |  | ||||||
|                 		} |  | ||||||
|                         bulkImportParameters.setBatchSize(batchSize); |  | ||||||
|                 	} |  | ||||||
|                 	catch(NumberFormatException e) |  | ||||||
|                 	{ |  | ||||||
|                         throw new RuntimeException("Error: parameter '" + PARAMETER_BATCH_SIZE + "' must be an integer > 0."); |  | ||||||
|                 	} |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 if (existingFileMode != null) |  | ||||||
|                 { |  | ||||||
|                     bulkImportParameters.setExistingFileMode(existingFileMode); |  | ||||||
|                 } |  | ||||||
|                 else |  | ||||||
|                 { |  | ||||||
|                     // Fall back to the old/deprecated way. |  | ||||||
|                     bulkImportParameters.setReplaceExisting(replaceExisting); |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 bulkImportParameters.setTarget(targetNodeRef); |  | ||||||
|                 bulkImportParameters.setDisableRulesService(disableRules); |  | ||||||
|  |  | ||||||
|                 bulkImporter.asyncBulkImport(bulkImportParameters, nodeImporter); |  | ||||||
|  |  | ||||||
|                 // ACE-3047 fix, since bulk import is started asynchronously there is a chance that client  |  | ||||||
|                 // will get into the status page before import is actually started. |  | ||||||
|                 // In this case wrong information (for previous import) will be displayed. |  | ||||||
|                 // So lets ensure that import started before redirecting client to status page. |  | ||||||
|                 int i = 0; |  | ||||||
|                 while (!bulkImporter.getStatus().inProgress() && i < 10) |  | ||||||
|                 { |  | ||||||
|                 	Thread.sleep(100); |  | ||||||
|                 	i++; |  | ||||||
|                 } |  | ||||||
|                  |  | ||||||
|                 // redirect to the status Web Script |  | ||||||
|                 status.setCode(Status.STATUS_MOVED_TEMPORARILY); |  | ||||||
|                 status.setRedirect(true); |  | ||||||
|                 status.setLocation(request.getServiceContextPath() + WEB_SCRIPT_URI_BULK_FILESYSTEM_IMPORT_STATUS); |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|             	model.put(IMPORT_ALREADY_IN_PROGRESS_MODEL_KEY, I18NUtil.getMessage(IMPORT_ALREADY_IN_PROGRESS_ERROR_KEY)); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         catch (WebScriptException wse) |  | ||||||
|         { |  | ||||||
|         	status.setCode(Status.STATUS_BAD_REQUEST, wse.getMessage()); |  | ||||||
|         	status.setRedirect(true); |  | ||||||
|         } |  | ||||||
|         catch (FileNotFoundException fnfe) |  | ||||||
|         { |  | ||||||
|         	status.setCode(Status.STATUS_BAD_REQUEST,"The repository path '" + targetPath + "' does not exist !"); |  | ||||||
|         	status.setRedirect(true); |  | ||||||
|         } |  | ||||||
|         catch(IllegalArgumentException iae) |  | ||||||
|         { |  | ||||||
|         	status.setCode(Status.STATUS_BAD_REQUEST,iae.getMessage()); |  | ||||||
|         	status.setRedirect(true); |  | ||||||
|         } |  | ||||||
|         catch (Throwable t) |  | ||||||
|         { |  | ||||||
|             throw new WebScriptException(Status.STATUS_INTERNAL_SERVER_ERROR, buildTextMessage(t), t); |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return model; |         final File sourceDirectory = new File(sourceDirectoryStr.trim()); | ||||||
|  |  | ||||||
|  |         return nodeImporterFactory.getNodeImporter(sourceDirectory); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -42,6 +42,7 @@ import org.junit.runners.Suite; | |||||||
|     org.alfresco.rest.api.tests.TestPublicApiAtomPub10TCK.class, |     org.alfresco.rest.api.tests.TestPublicApiAtomPub10TCK.class, | ||||||
|     org.alfresco.rest.api.tests.TestPublicApiAtomPub11TCK.class, |     org.alfresco.rest.api.tests.TestPublicApiAtomPub11TCK.class, | ||||||
|     org.alfresco.rest.api.tests.TestPublicApiBrowser11TCK.class, |     org.alfresco.rest.api.tests.TestPublicApiBrowser11TCK.class, | ||||||
|  |     org.alfresco.repo.web.scripts.bulkimport.BulkImportParametersExtractorTest.class | ||||||
| }) | }) | ||||||
| public class AppContext01TestSuite | public class AppContext01TestSuite | ||||||
| { | { | ||||||
|   | |||||||
| @@ -0,0 +1,252 @@ | |||||||
|  | /* | ||||||
|  |  * #%L | ||||||
|  |  * Alfresco Remote API | ||||||
|  |  * %% | ||||||
|  |  * Copyright (C) 2005 - 2021 Alfresco Software Limited | ||||||
|  |  * %% | ||||||
|  |  * This file is part of the Alfresco software. | ||||||
|  |  * If the software was purchased under a paid Alfresco license, the terms of | ||||||
|  |  * the paid license agreement will prevail.  Otherwise, the software is | ||||||
|  |  * provided under the following open source license terms: | ||||||
|  |  * | ||||||
|  |  * Alfresco is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU Lesser General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * Alfresco is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU Lesser General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Lesser General Public License | ||||||
|  |  * along with Alfresco. If not, see <http://www.gnu.org/licenses/>. | ||||||
|  |  * #L% | ||||||
|  |  */ | ||||||
|  | package org.alfresco.repo.web.scripts.bulkimport; | ||||||
|  |  | ||||||
|  | import static org.alfresco.repo.web.scripts.bulkimport.AbstractBulkFileSystemImportWebScript.PARAMETER_BATCH_SIZE; | ||||||
|  | import static org.alfresco.repo.web.scripts.bulkimport.AbstractBulkFileSystemImportWebScript.PARAMETER_DISABLE_RULES; | ||||||
|  | import static org.alfresco.repo.web.scripts.bulkimport.AbstractBulkFileSystemImportWebScript.PARAMETER_NUM_THREADS; | ||||||
|  | import static org.alfresco.repo.web.scripts.bulkimport.AbstractBulkFileSystemImportWebScript.PARAMETER_TARGET_NODEREF; | ||||||
|  | import static org.junit.Assert.assertEquals; | ||||||
|  | import static org.junit.Assert.assertFalse; | ||||||
|  | import static org.junit.Assert.assertNotNull; | ||||||
|  | import static org.junit.Assert.assertNull; | ||||||
|  | import static org.junit.Assert.assertThrows; | ||||||
|  | import static org.junit.Assert.assertTrue; | ||||||
|  | import static org.junit.Assert.fail; | ||||||
|  |  | ||||||
|  | import java.util.Map; | ||||||
|  |  | ||||||
|  | import org.alfresco.repo.bulkimport.BulkImportParameters; | ||||||
|  | import org.alfresco.repo.bulkimport.BulkImportParameters.ExistingFileMode; | ||||||
|  | import org.alfresco.repo.web.scripts.bulkimport.AbstractBulkFileSystemImportWebScript.BulkImportParametersExtractor; | ||||||
|  | import org.alfresco.service.cmr.model.FileNotFoundException; | ||||||
|  | import org.alfresco.service.cmr.repository.NodeRef; | ||||||
|  | import org.junit.Test; | ||||||
|  | import org.springframework.extensions.webscripts.WebScriptException; | ||||||
|  |  | ||||||
|  | public class BulkImportParametersExtractorTest | ||||||
|  | { | ||||||
|  |     private static final String TEST_NODE_REF = "workspace://SpacesStore/this-is-just-a-test-ref"; | ||||||
|  |     private static final String TEST_MISSING_NODE_REF = "workspace://SpacesStore/this-is-just-a-not-existing-test-ref"; | ||||||
|  |     private static final Integer DEFAULT_BATCH_SIZE = 1234; | ||||||
|  |     private static final Integer DEFAULT_NUMBER_OF_THREADS = 4321; | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void shouldExtractTargetRef() throws FileNotFoundException | ||||||
|  |     { | ||||||
|  |         final BulkImportParametersExtractor extractor = givenExtractor(Map.of( | ||||||
|  |                 PARAMETER_TARGET_NODEREF, TEST_NODE_REF)); | ||||||
|  |  | ||||||
|  |         final BulkImportParameters params = extractor.extract(); | ||||||
|  |  | ||||||
|  |         assertNotNull(params); | ||||||
|  |         assertNotNull(params.getTarget()); | ||||||
|  |         assertEquals(TEST_NODE_REF, params.getTarget().toString()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void shouldFallbackToDefaultValues() throws FileNotFoundException | ||||||
|  |     { | ||||||
|  |         final BulkImportParametersExtractor extractor = givenExtractor(Map.of( | ||||||
|  |                 PARAMETER_TARGET_NODEREF, TEST_NODE_REF)); | ||||||
|  |  | ||||||
|  |         final BulkImportParameters params = extractor.extract(); | ||||||
|  |  | ||||||
|  |         assertEquals(DEFAULT_BATCH_SIZE, params.getBatchSize()); | ||||||
|  |         assertEquals(DEFAULT_NUMBER_OF_THREADS, params.getNumThreads()); | ||||||
|  |         assertFalse(params.isDisableRulesService()); | ||||||
|  |         assertEquals(ExistingFileMode.SKIP, params.getExistingFileMode()); | ||||||
|  |         assertNull(params.getLoggingInterval()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void shouldExtractDisableFolderRulesFlagWhenSetToTrue() throws FileNotFoundException | ||||||
|  |     { | ||||||
|  |         final BulkImportParametersExtractor extractor = givenExtractor(Map.of( | ||||||
|  |                 PARAMETER_TARGET_NODEREF, TEST_NODE_REF, | ||||||
|  |                 PARAMETER_DISABLE_RULES, "true" | ||||||
|  |                                                                              )); | ||||||
|  |  | ||||||
|  |         final BulkImportParameters params = extractor.extract(); | ||||||
|  |  | ||||||
|  |         assertTrue(params.isDisableRulesService()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void shouldExtractDisableFolderRulesFlagWhenSetToFalse() throws FileNotFoundException | ||||||
|  |     { | ||||||
|  |         final BulkImportParametersExtractor extractor = givenExtractor(Map.of( | ||||||
|  |                 PARAMETER_TARGET_NODEREF, TEST_NODE_REF, | ||||||
|  |                 PARAMETER_DISABLE_RULES, "false" | ||||||
|  |                                                                              )); | ||||||
|  |  | ||||||
|  |         final BulkImportParameters params = extractor.extract(); | ||||||
|  |  | ||||||
|  |         assertFalse(params.isDisableRulesService()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void shouldExtractDisableFolderRulesFlagWhenSetToNotBooleanValue() throws FileNotFoundException | ||||||
|  |     { | ||||||
|  |         final BulkImportParametersExtractor extractor = givenExtractor(Map.of( | ||||||
|  |                 PARAMETER_TARGET_NODEREF, TEST_NODE_REF, | ||||||
|  |                 PARAMETER_DISABLE_RULES, "unknown" | ||||||
|  |                                                                              )); | ||||||
|  |  | ||||||
|  |         final BulkImportParameters params = extractor.extract(); | ||||||
|  |  | ||||||
|  |         assertFalse(params.isDisableRulesService()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void shouldPropagateFileNotFoundExceptionWhenTargetIsNotFound() | ||||||
|  |     { | ||||||
|  |         final BulkImportParametersExtractor extractor = givenExtractor(Map.of( | ||||||
|  |                 PARAMETER_TARGET_NODEREF, TEST_MISSING_NODE_REF)); | ||||||
|  |  | ||||||
|  |         assertThrows(FileNotFoundException.class, extractor::extract); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void shouldExtractValidBatchSize() throws FileNotFoundException | ||||||
|  |     { | ||||||
|  |         final BulkImportParametersExtractor extractor = givenExtractor(Map.of( | ||||||
|  |                 PARAMETER_TARGET_NODEREF, TEST_NODE_REF, | ||||||
|  |                 PARAMETER_BATCH_SIZE, "1")); | ||||||
|  |  | ||||||
|  |         final BulkImportParameters params = extractor.extract(); | ||||||
|  |  | ||||||
|  |         assertEquals(Integer.valueOf(1), params.getBatchSize()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void shouldFailWithWebScriptExceptionWhenInvalidBatchSizeIsRequested() throws FileNotFoundException | ||||||
|  |     { | ||||||
|  |         final BulkImportParametersExtractor extractor = givenExtractor(Map.of( | ||||||
|  |                 PARAMETER_TARGET_NODEREF, TEST_NODE_REF, | ||||||
|  |                 PARAMETER_BATCH_SIZE, "not-a-number")); | ||||||
|  |  | ||||||
|  |         try | ||||||
|  |         { | ||||||
|  |             extractor.extract(); | ||||||
|  |         } catch (WebScriptException e) | ||||||
|  |         { | ||||||
|  |             assertNotNull(e.getMessage()); | ||||||
|  |             assertTrue(e.getMessage().contains(PARAMETER_BATCH_SIZE)); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         fail("Expected exception to be thrown."); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void shouldFailWithWebScriptExceptionWhenNegativeBatchSizeIsRequested() throws FileNotFoundException | ||||||
|  |     { | ||||||
|  |         final BulkImportParametersExtractor extractor = givenExtractor(Map.of( | ||||||
|  |                 PARAMETER_TARGET_NODEREF, TEST_NODE_REF, | ||||||
|  |                 PARAMETER_BATCH_SIZE, "-1")); | ||||||
|  |  | ||||||
|  |         try | ||||||
|  |         { | ||||||
|  |             extractor.extract(); | ||||||
|  |         } catch (WebScriptException e) | ||||||
|  |         { | ||||||
|  |             assertNotNull(e.getMessage()); | ||||||
|  |             assertTrue(e.getMessage().contains(PARAMETER_BATCH_SIZE)); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         fail("Expected exception to be thrown."); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void shouldExtractValidNumberOfThreads() throws FileNotFoundException | ||||||
|  |     { | ||||||
|  |         final BulkImportParametersExtractor extractor = givenExtractor(Map.of( | ||||||
|  |                 PARAMETER_TARGET_NODEREF, TEST_NODE_REF, | ||||||
|  |                 PARAMETER_NUM_THREADS, "1")); | ||||||
|  |  | ||||||
|  |         final BulkImportParameters params = extractor.extract(); | ||||||
|  |  | ||||||
|  |         assertEquals(Integer.valueOf(1), params.getNumThreads()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void shouldFailWithWebScriptExceptionWhenInvalidNumberOfThreadsIsRequested() throws FileNotFoundException | ||||||
|  |     { | ||||||
|  |         final BulkImportParametersExtractor extractor = givenExtractor(Map.of( | ||||||
|  |                 PARAMETER_TARGET_NODEREF, TEST_NODE_REF, | ||||||
|  |                 PARAMETER_NUM_THREADS, "not-a-number")); | ||||||
|  |  | ||||||
|  |         try | ||||||
|  |         { | ||||||
|  |             extractor.extract(); | ||||||
|  |         } catch (WebScriptException e) | ||||||
|  |         { | ||||||
|  |             assertNotNull(e.getMessage()); | ||||||
|  |             assertTrue(e.getMessage().contains(PARAMETER_NUM_THREADS)); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         fail("Expected exception to be thrown."); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void shouldFailWithWebScriptExceptionWhenNegativeNumberOfThreadsIsRequested() throws FileNotFoundException | ||||||
|  |     { | ||||||
|  |         final BulkImportParametersExtractor extractor = givenExtractor(Map.of( | ||||||
|  |                 PARAMETER_TARGET_NODEREF, TEST_NODE_REF, | ||||||
|  |                 PARAMETER_NUM_THREADS, "-1")); | ||||||
|  |  | ||||||
|  |         try | ||||||
|  |         { | ||||||
|  |             extractor.extract(); | ||||||
|  |         } catch (WebScriptException e) | ||||||
|  |         { | ||||||
|  |             assertNotNull(e.getMessage()); | ||||||
|  |             assertTrue(e.getMessage().contains(PARAMETER_NUM_THREADS)); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         fail("Expected exception to be thrown."); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private BulkImportParametersExtractor givenExtractor(Map<String, String> params) | ||||||
|  |     { | ||||||
|  |  | ||||||
|  |         return new BulkImportParametersExtractor(params::get, this::testRefCreator, DEFAULT_BATCH_SIZE, DEFAULT_NUMBER_OF_THREADS); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private NodeRef testRefCreator(String nodeRef, String path) throws FileNotFoundException | ||||||
|  |     { | ||||||
|  |         if (TEST_MISSING_NODE_REF.equals(nodeRef)) | ||||||
|  |         { | ||||||
|  |             throw new FileNotFoundException(new NodeRef(nodeRef)); | ||||||
|  |         } | ||||||
|  |         return new NodeRef(nodeRef); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -7,7 +7,7 @@ | |||||||
|     <parent> |     <parent> | ||||||
|         <groupId>org.alfresco</groupId> |         <groupId>org.alfresco</groupId> | ||||||
|         <artifactId>alfresco-community-repo</artifactId> |         <artifactId>alfresco-community-repo</artifactId> | ||||||
|         <version>11.141-SNAPSHOT</version> |         <version>12.1</version> | ||||||
|     </parent> |     </parent> | ||||||
|  |  | ||||||
|     <dependencies> |     <dependencies> | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ | |||||||
| repository.name=Main Repository | repository.name=Main Repository | ||||||
|  |  | ||||||
| # Schema number | # Schema number | ||||||
| version.schema=15002 | version.schema=15100 | ||||||
|  |  | ||||||
| # Directory configuration | # Directory configuration | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user