package com.constellio.app.modules.es.connectors.smb;
import static com.constellio.app.ui.pages.search.criteria.Criterion.BooleanOperator.OR;
import static com.constellio.model.entities.records.Record.PUBLIC_TOKEN;
import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import org.apache.tools.ant.filters.StringInputStream;
import org.junit.Before;
import org.junit.Test;
import com.constellio.app.modules.complementary.esRmRobots.actions.ClassifyConnectorFolderInTaxonomyActionExecutor;
import com.constellio.app.modules.complementary.esRmRobots.model.ClassifyConnectorFolderInTaxonomyActionParameters;
import com.constellio.app.modules.complementary.esRmRobots.model.enums.ActionAfterClassification;
import com.constellio.app.modules.es.connectors.spi.Connector;
import com.constellio.app.modules.es.connectors.spi.ConnectorInstanciator;
import com.constellio.app.modules.es.model.connectors.ConnectorInstance;
import com.constellio.app.modules.es.model.connectors.smb.ConnectorSmbDocument;
import com.constellio.app.modules.es.model.connectors.smb.ConnectorSmbFolder;
import com.constellio.app.modules.es.services.ConnectorManager;
import com.constellio.app.modules.es.services.ESSchemasRecordsServices;
import com.constellio.app.modules.rm.RMTestRecords;
import com.constellio.app.modules.rm.constants.RMTaxonomies;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.app.modules.robots.services.RobotSchemaRecordServices;
import com.constellio.app.ui.pages.search.criteria.CriterionBuilder;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.Transaction;
import com.constellio.model.services.records.BulkRecordTransactionHandler;
import com.constellio.model.services.records.BulkRecordTransactionHandlerOptions;
import com.constellio.model.services.records.RecordServices;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.annotations.InDevelopmentTest;
import com.constellio.sdk.tests.annotations.UiTest;
import com.constellio.sdk.tests.setups.Users;
@UiTest
public class ClassifySmbDocumentActionLoadAcceptTest extends ConstellioTest {
public static final String SMB = "smb://";
Users users = new Users();
RMTestRecords records = new RMTestRecords(zeCollection);
RecordServices recordServices;
private ConnectorInstance<?> connectorInstance;
private ConnectorManager connectorManager;
private ESSchemasRecordsServices es;
private RobotSchemaRecordServices robotsSchemas;
@Before
public void setUp()
throws Exception {
prepareSystem(withZeCollection().withConstellioRMModule().withConstellioESModule().withRobotsModule().withAllTest(users)
.withRMTest(records).withFoldersAndContainersOfEveryStatus());
es = new ESSchemasRecordsServices(zeCollection, getAppLayerFactory());
es.getConnectorManager().setConnectorInstanciator(new ConnectorInstanciator() {
@Override
public Connector instanciate(ConnectorInstance connectorInstance) {
return new ConnectorSmb() {
@Override
public InputStream getInputStream(ConnectorSmbDocument document, String resourceName) {
return new StringInputStream("Test!");
}
};
}
});
robotsSchemas = new RobotSchemaRecordServices(zeCollection, getAppLayerFactory());
recordServices = getModelLayerFactory().newRecordServices();
connectorManager = es.getConnectorManager();
connectorInstance = connectorManager.createConnector(es.newConnectorSmbInstance().setCode("zeConnector").setEnabled(false)
.setTitle("ze connector").setSeeds(asList("share")).setUsername("username").setPassword("password").setDomain(
"domain")
.setTraversalCode("zeTraversal"));
}
@Test
@InDevelopmentTest
public void testName()
throws Exception {
List<Integer> numberOfFolders = asList(10, 10, 10, 10);
int numberOfDocumentsInEachFolders = 5;
createLevel(numberOfFolders, numberOfDocumentsInEachFolders);
ClassifyConnectorFolderInTaxonomyActionParameters parameters = ClassifyConnectorFolderInTaxonomyActionParameters
.wrap(robotsSchemas.newActionParameters(ClassifyConnectorFolderInTaxonomyActionParameters.SCHEMA_LOCAL_CODE));
parameters.setInTaxonomy(RMTaxonomies.CLASSIFICATION_PLAN);
parameters.setActionAfterClassification(ActionAfterClassification.DO_NOTHING);
//TODO Default value
parameters.setDelimiter(" ");
recordServices.add(parameters);
recordServices.add(robotsSchemas.newRobot().setActionParameters(parameters)
.setSchemaFilter(ConnectorSmbFolder.SCHEMA_TYPE).setSearchCriteria(asList(
new CriterionBuilder(ConnectorSmbFolder.SCHEMA_TYPE).booleanOperator(OR)
.where(es.connectorSmbFolder.url()).isContainingText("smb").build()
)).setAction(ClassifyConnectorFolderInTaxonomyActionExecutor.ID).setCode("robocop").setTitle("robocop"));
robotsSchemas.getRobotsManager().startAllRobotsExecution();
waitForBatchProcess();
newWebDriver();
waitUntilICloseTheBrowsers();
}
public void createLevel(List<Integer> numberOfFoldersForEachLevel, int numberOfDocuments)
throws Exception {
Stack<Integer> numberOfFoldersForEachLevelStack = new Stack<>();
for (int i = numberOfFoldersForEachLevel.size() - 1; i >= 0; i--) {
numberOfFoldersForEachLevelStack.add(numberOfFoldersForEachLevel.get(i));
}
ConnectorSmbFolder x = (ConnectorSmbFolder) es.newConnectorSmbFolder(connectorInstance)
.setTitle("X")
.setUrl(SMB + "X/")
.setFetched(true)
.setManualTokens(PUBLIC_TOKEN);
ConnectorSmbFolder x100 = (ConnectorSmbFolder) es.newConnectorSmbFolder(connectorInstance)
.setTitle("X100")
.setUrl(SMB + "X/X100/")
.setFetched(true)
.setParent(x)
.setManualTokens(PUBLIC_TOKEN);
ConnectorSmbFolder x110 = (ConnectorSmbFolder) es.newConnectorSmbFolder(connectorInstance)
.setTitle("X110")
.setUrl(SMB + "X/X100/X110/")
.setFetched(true)
.setParent(x100)
.setManualTokens(PUBLIC_TOKEN);
ConnectorSmbFolder baleine = (ConnectorSmbFolder) es.newConnectorSmbFolder(connectorInstance)
.setTitle("Baleine")
.setUrl(SMB + "X/X100/X110/Baleine/")
.setFetched(true)
.setParent(x110)
.setManualTokens(PUBLIC_TOKEN);
Folder baleineRMFolder = (Folder) records.getFolder_A04().setLegacyId("smb://X/X100/X110/Baleine/");
recordServices.execute(new Transaction().addAll(x, x100, x110, baleine, baleineRMFolder));
createLevel(singletonList(baleine), numberOfFoldersForEachLevelStack,
numberOfDocuments);
}
public void createLevel(List<ConnectorSmbFolder> parents,
Stack<Integer> numberOfFoldersForEachLevel, int numberOfDocuments) {
BulkRecordTransactionHandlerOptions options = new BulkRecordTransactionHandlerOptions().withRecordsPerBatch(5000);
BulkRecordTransactionHandler bulkTransactionsHandler = new BulkRecordTransactionHandler(recordServices,
"SmbRecordLoad", options);
int numberOfFolders = 0;
if (!numberOfFoldersForEachLevel.isEmpty()) {
numberOfFolders = numberOfFoldersForEachLevel.pop();
}
List<ConnectorSmbFolder> folders = new ArrayList<>();
List<Record> recordsToPush = new ArrayList<>();
for (ConnectorSmbFolder parent : parents) {
for (int i = 1; i <= numberOfFolders; i++) {
ConnectorSmbFolder folder = createFolder(parent, i);
recordsToPush.add(folder.getWrappedRecord());
if (numberOfFoldersForEachLevel.isEmpty()) {
for (int j = 1; j <= numberOfDocuments; j++) {
ConnectorSmbDocument document = createDocument(folder, j);
recordsToPush.add(document.getWrappedRecord());
}
} else {
folders.add(folder);
}
bulkTransactionsHandler.append(recordsToPush, singletonList(parent.getWrappedRecord()));
recordsToPush.clear();
}
if (parent != null) {
for (int i = 1; i <= numberOfDocuments; i++) {
ConnectorSmbDocument document = createDocument(parent, i);
bulkTransactionsHandler.append(
singletonList(document.getWrappedRecord()),
singletonList(parent.getWrappedRecord()));
}
}
}
bulkTransactionsHandler.closeAndJoin();
if (!folders.isEmpty()) {
createLevel(folders, numberOfFoldersForEachLevel, numberOfDocuments);
}
}
private ConnectorSmbDocument createDocument(ConnectorSmbFolder parent, int position) {
return (ConnectorSmbDocument) es.newConnectorSmbDocument(connectorInstance)
.setTitle("Document #" + parent.getTitle() + "-" + position)
.setUrl(parent.getUrl() + position + ".txt")
.setParent(parent)
.setFetched(true)
.setSearchable(true)
.setManualTokens(PUBLIC_TOKEN);
}
private ConnectorSmbFolder createFolder(ConnectorSmbFolder parent, int position) {
if (parent == null) {
return (ConnectorSmbFolder) es.newConnectorSmbFolder(connectorInstance)
.setTitle("Root folder #" + position)
.setUrl(SMB + position + "/")
.setFetched(true)
.setSearchable(true)
.setManualTokens(PUBLIC_TOKEN);
} else {
return (ConnectorSmbFolder) es.newConnectorSmbFolder(connectorInstance)
.setTitle("Folder #" + parent.getTitle() + "-" + position)
.setUrl(parent.getUrl() + position + "/")
.setParent(parent)
.setFetched(true)
.setSearchable(true)
.setManualTokens(PUBLIC_TOKEN);
}
}
}