package com.constellio.app.modules.es.connectors.smb.jobmanagement; import com.constellio.app.modules.es.connectors.smb.ConnectorSmb; import com.constellio.app.modules.es.connectors.smb.cache.SmbConnectorContext; import com.constellio.app.modules.es.connectors.smb.jobs.*; import com.constellio.app.modules.es.connectors.smb.service.SmbModificationIndicator; import com.constellio.app.modules.es.connectors.smb.service.SmbRecordService; import com.constellio.app.modules.es.connectors.smb.service.SmbShareService; import com.constellio.app.modules.es.connectors.smb.utils.ConnectorSmbUtils; import com.constellio.app.modules.es.connectors.smb.utils.SmbUrlComparator; import com.constellio.app.modules.es.connectors.spi.ConnectorEventObserver; import com.constellio.app.modules.es.connectors.spi.ConnectorJob; import com.constellio.app.modules.es.model.connectors.smb.ConnectorSmbInstance; import java.util.Collections; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; public class SmbJobFactoryImpl implements SmbJobFactory { public static enum SmbJobCategory { SEED, DISPATCH, RETRIEVAL, DELETE } public enum SmbJobType { SEED_JOB, NEW_DOCUMENT_JOB, NEW_FOLDER_JOB, DISPATCH_JOB, UNMODIFIED_JOB, DELETE_JOB, NULL_JOB; } private final ConnectorSmb connector; private final ConnectorSmbInstance connectorInstance; private final ConnectorEventObserver eventObserver; private final ConnectorSmbUtils smbUtils; private final SmbShareService smbShareService; private final SmbRecordService smbRecordService; private final SmbDocumentOrFolderUpdater updater; private final SmbUrlComparator urlComparator; public SmbJobFactoryImpl(ConnectorSmb connector, ConnectorSmbInstance connectorInstance, ConnectorEventObserver eventObserver, SmbShareService smbShareService, ConnectorSmbUtils smbUtils, SmbRecordService smbRecordService, SmbDocumentOrFolderUpdater updater) { this.connector = connector; this.connectorInstance = connectorInstance; this.eventObserver = eventObserver; this.smbShareService = smbShareService; this.smbUtils = smbUtils; this.smbRecordService = smbRecordService; this.updater = updater; this.urlComparator = new SmbUrlComparator(); } @Override public SmbConnectorJob get(SmbJobCategory jobType, String url, String parentUrl) { JobParams params = new JobParams(connector, eventObserver, smbUtils, connectorInstance, smbShareService, smbRecordService, updater, this, url, parentUrl); SmbConnectorJob job = new SmbNullJob(params); if (smbUtils.isAccepted(url, connectorInstance)) { switch (jobType) { case SEED: job = new SmbSeedJob(params); break; case DISPATCH: job = new SmbDispatchJob(params); break; case RETRIEVAL: SmbConnectorContext context = this.connector.getContext(); SmbModificationIndicator contextIndicator = context.getModificationIndicator(url); if (smbUtils.isFolder(url)) { if (contextIndicator == null) { job = new SmbNewFolderRetrievalJob(params); } else { SmbModificationIndicator shareIndicator = smbShareService.getModificationIndicator(url); if (shareIndicator == null) { job = new SmbDeleteJob(params); } else if (contextIndicator.getParentId() == null || !contextIndicator.equals(shareIndicator)) { job = new SmbNewFolderRetrievalJob(params); } } } else { if (contextIndicator == null) { job = new SmbNewDocumentRetrievalJob(params); } else { SmbModificationIndicator shareIndicator = smbShareService.getModificationIndicator(url); if (shareIndicator == null) { job = new SmbDeleteJob(params); } else if (contextIndicator.getParentId() == null || !contextIndicator.equals(shareIndicator)) { job = new SmbNewDocumentRetrievalJob(params); } } } if (job instanceof SmbNullJob) { job = new SmbUnmodifiedRetrievalJob(params); } break; case DELETE: job = new SmbDeleteJob(params); break; default: break; } } else { job = new SmbDeleteJob(params); } return job; } }