package com.constellio.app.modules.es.connectors.smb; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.fail; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import jcifs.smb.NtlmPasswordAuthentication; import jcifs.smb.SmbFile; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import com.constellio.app.modules.es.connectors.smb.service.SmbFileFactory; import com.constellio.app.modules.es.connectors.smb.service.SmbFileFactoryImpl; 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.model.connectors.smb.ConnectorSmbInstance; import com.constellio.app.modules.es.services.ConnectorManager; import com.constellio.app.modules.es.services.ESSchemasRecordsServices; import com.constellio.data.io.services.facades.IOServices; import com.constellio.data.io.streamFactories.StreamFactory; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.schemas.Metadata; import com.constellio.model.entities.schemas.Schemas; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.RecordServicesException; import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition; import com.constellio.sdk.SDKPasswords; import com.constellio.sdk.tests.ConstellioTest; import com.constellio.sdk.tests.annotations.SlowTest; public class DeleteConnectorSmbRealTest extends ConstellioTest { private ConnectorManager connectorManager; private RecordServices recordServices; private ESSchemasRecordsServices es; private IOServices ioServices; private ConnectorSmbInstance connectorInstance; ConnectorSmbDocument connectorSmbDocument; ConnectorSmbFolder connectorSmbFolder; private String share; private String domain; private String username; private String password; @Before public void setUp() throws Exception { givenBackgroundThreadsEnabled(); givenTransactionLogIsEnabled(); prepareSystem(withZeCollection().withConstellioESModule().withAllTestUsers()); es = new ESSchemasRecordsServices(zeCollection, getAppLayerFactory()); recordServices = getModelLayerFactory().newRecordServices(); connectorManager = es.getConnectorManager(); ioServices = getModelLayerFactory().getIOServicesFactory().newIOServices(); share = SDKPasswords.testSmbShare(); domain = SDKPasswords.testSmbDomain(); username = SDKPasswords.testSmbUsername(); password = SDKPasswords.testSmbPassword(); createConnector(share); createHierarchyInSmb(); } @Test @Ignore @SlowTest public void givenConnectorSmbHierarchyWhenDeleteThenOk() throws Exception { ConnectorSmb connectorSmb = (ConnectorSmb) es.getConnectorManager().instanciate(connectorInstance); connectorSmb.setEs(es); configureConnectorSmbDocument(); configureConnectorSmbFolder(); assertThat(connectorSmb.exists(connectorSmbFolder)).isTrue(); assertThat(connectorSmb.exists(connectorSmbDocument)).isTrue(); assertThat(recordServices.getDocumentById(connectorSmbFolder.getId())).isNotNull(); assertThat(recordServices.getDocumentById(connectorSmbDocument.getId())).isNotNull(); connectorSmb.deleteFile(connectorSmbDocument); assertThat(connectorSmb.exists(connectorSmbDocument)).isFalse(); connectorSmb.deleteFile(connectorSmbFolder); assertThat(connectorSmb.exists(connectorSmbFolder)).isFalse(); es.getRecordServices().flush(); assertThat(recordServices.getDocumentById(connectorSmbDocument.getId()).get(Schemas.LOGICALLY_DELETED_STATUS)) .isEqualTo( true); assertThat(recordServices.getDocumentById(connectorSmbFolder.getId()).get(Schemas.LOGICALLY_DELETED_STATUS)) .isEqualTo( true); } private void createHierarchyInSmb() throws IOException { SmbFileFactory smbFactory = new SmbFileFactoryImpl(); NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication( connectorInstance.getDomain(), connectorInstance.getUsername(), connectorInstance.getPassword()); InputStream inputStream1 = null; InputStream inputStream2 = null; OutputStream outputStream1 = null; OutputStream outputStream2 = null; try { StreamFactory<InputStream> streamFactory = getTestResourceInputStreamFactory("smbFile.txt"); smbFactory.createSmbFolder(share + "test", auth); SmbFile smbFile2 = smbFactory.createSmbFile(share + "test/smbFile2.txt", auth); smbFactory.createSmbFolder(share + "test/test1", auth); SmbFile smbFile3 = smbFactory.createSmbFile(share + "test/test1/smbFile3.txt", auth); smbFactory.createSmbFolder(share + "test/test2", auth); outputStream1 = smbFile2.getOutputStream(); outputStream2 = smbFile3.getOutputStream(); inputStream1 = streamFactory.create("smbFileInputStream2"); inputStream2 = streamFactory.create("smbFileInputStream3"); ioServices.copy(inputStream1, outputStream1); ioServices.copy(inputStream2, outputStream2); } catch (MalformedURLException e) { throw new RuntimeException(e); } finally { ioServices.closeQuietly(inputStream1); ioServices.closeQuietly(inputStream2); ioServices.closeQuietly(outputStream1); ioServices.closeQuietly(outputStream2); } } private ConnectorSmbInstance createConnector(String... seeds) { connectorInstance = connectorManager.createConnector(es.newConnectorSmbInstance() .setCode("zeConnectorCode") .setEnabled(true) .setSeeds(asList(seeds)) .setUsername(username) .setPassword(password) .setDomain(domain) .setInclusions(Arrays.asList(share)) .setExclusions(new ArrayList<String>()) .setTitle("zeConnectorTitle")); flushRecord(connectorInstance.getWrappedRecord()); return connectorInstance; } private void configureConnectorSmbFolder() { boolean ok = false; int tryCount = 0; while (!ok) { Metadata metadata = getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(zeCollection) .getMetadata(ConnectorSmbFolder.SCHEMA_TYPE + "_" + connectorInstance.getId() + "_" + ConnectorSmbFolder.URL); LogicalSearchCondition condition = from(es.schemaType(ConnectorSmbFolder.SCHEMA_TYPE)) .where(metadata).is(share + "test/"); List<ConnectorSmbFolder> indexedFolders = es .searchConnectorSmbFolders(condition); if (!indexedFolders.isEmpty()) { for (ConnectorSmbFolder indexedFolder : indexedFolders) { if (indexedFolder.getUrl().endsWith("test/")) { connectorSmbFolder = indexedFolder; ok = true; break; } } } if (tryCount++ > 5000) { fail("File not found"); } } } private void configureConnectorSmbDocument() { boolean ok = false; int tryCount = 0; while (!ok) { List<ConnectorSmbDocument> indexedDocuments = es .searchConnectorSmbDocuments(es.fromAllDocumentsOf(connectorInstance.getId())); if (!indexedDocuments.isEmpty()) { for (ConnectorSmbDocument indexedDocument : indexedDocuments) { if (indexedDocument.getUrl().endsWith("smbFile2.txt")) { System.out.println(indexedDocument.getParent()); connectorSmbDocument = indexedDocument; ok = true; break; } } } if (tryCount++ > 5000) { fail("File not found"); } } } private void flushRecord(Record record) { try { es.getRecordServices() .update(record); } catch (RecordServicesException e) { throw new RuntimeException(e); } } }