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 java.io.InputStream; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import com.constellio.app.modules.es.connectors.ConnectorServicesRuntimeException.ConnectorServicesRuntimeException_CannotDownloadDocument; import com.constellio.app.modules.es.connectors.ConnectorUtilsServices; import com.constellio.app.modules.es.model.connectors.ConnectorDocument; 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.model.connectors.smb.ConnectorSmbInstance; import com.constellio.app.modules.es.services.ESSchemaRecordsServicesRuntimeException.ESSchemaRecordsServicesRuntimeException_RecordIsNotAConnectorDocument; import com.constellio.app.modules.es.services.ESSchemasRecordsServices; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.app.ui.entities.RecordVO; import com.constellio.model.entities.records.Record; import com.constellio.model.services.search.SearchServices; import com.constellio.model.services.search.query.logical.LogicalSearchQuery; import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition; import org.apache.commons.lang.StringUtils; public class SMBConnectorUtilsServices implements ConnectorUtilsServices<ConnectorSmb> { SearchServices searchServices; ESSchemasRecordsServices es; AppLayerFactory appLayerFactory; String collection; public SMBConnectorUtilsServices(String collection, AppLayerFactory appLayerFactory) { this.appLayerFactory = appLayerFactory; this.collection = collection; this.searchServices = appLayerFactory.getModelLayerFactory().newSearchServices(); this.es = new ESSchemasRecordsServices(collection, appLayerFactory); } @Override public void addExcludedUrlsTo(List<String> newUrls, ConnectorInstance instance) { ConnectorSmbInstance smbInstance = es.wrapConnectorSmbInstance(instance.getWrappedRecord()); Set<String> urls = new HashSet<>(smbInstance.getExclusions()); urls.addAll(newUrls); smbInstance.setExclusions(new ArrayList<>(urls)); } @Override public void deleteDocumentOnRemoteComponent(ConnectorDocument<?> connectorDocument) { ConnectorSmbInstance instance = es.getConnectorSmbInstance(connectorDocument.getConnector()); instantiateConnector(instance).deleteFile(connectorDocument); } @Override public InputStream newContentInputStream(ConnectorDocument<?> connectorDocument, String resourceName) { try { ConnectorSmbInstance instance = es.getConnectorSmbInstance(connectorDocument.getConnector()); return instantiateConnector(instance).getInputStream((ConnectorSmbDocument) connectorDocument, resourceName); } catch (ConnectorSmbRuntimeException e) { throw new ConnectorServicesRuntimeException_CannotDownloadDocument(connectorDocument, e); } } @Override public List<ConnectorDocument<?>> getChildren(ConnectorDocument<?> connectorDocument) { LogicalSearchCondition condition = from(es.connectorSmbDocument.schemaType()) .where(es.connectorSmbDocument.parent()).isEqualTo(connectorDocument.getId()); return es.searchConnectorDocuments(new LogicalSearchQuery(condition)); } @Override public boolean isExcludable(ConnectorDocument<?> connectorDocument) { return connectorDocument.getSchemaCode().startsWith(es.connectorSmbDocument.schemaType() + "_"); } @Override public ConnectorSmb instantiateConnector(ConnectorInstance instance) { ConnectorSmb connectorSmb = (ConnectorSmb) es.getConnectorManager().instanciate(instance); connectorSmb.setEs(es); return connectorSmb; } @Override public List<String> getConnectorDocumentTypes() { return asList(ConnectorSmbDocument.SCHEMA_TYPE, ConnectorSmbFolder.SCHEMA_TYPE); } @Override public ConnectorDocument<?> wrapConnectorDocument(Record record) { if (record.getSchemaCode().startsWith(ConnectorSmbFolder.SCHEMA_TYPE)) { return es.wrapConnectorSmbFolder(record); } else if (record.getSchemaCode().startsWith(ConnectorSmbDocument.SCHEMA_TYPE)) { return es.wrapConnectorSmbDocument(record); } throw new ESSchemaRecordsServicesRuntimeException_RecordIsNotAConnectorDocument(record.getSchemaCode()); } @Override public ConnectorInstance wrapConnectorInstance(Record record) { return es.wrapConnectorSmbInstance(record); } @Override public ConnectorInstance<?> newConnectorInstance() { return es.newConnectorSmbInstance(); } @Override public String getRecordExternalUrl(RecordVO recordVO) { String url = recordVO.get(ConnectorDocument.URL); if (StringUtils.startsWith(url, "smb://")) { url = "file://" + StringUtils.removeStart(url, "smb://"); } return url; } @Override public InputStream newContentInputStream(ConnectorDocument connectorDocument, String classifyDocument, String availableVersion) { throw new UnsupportedOperationException("TODO"); } @Override public List<String> getAvailableVersions(String connectorID, ConnectorDocument document) { throw new UnsupportedOperationException("TODO"); } }