package com.constellio.app.modules.es.ui.pages;
import static com.constellio.app.ui.i18n.i18n.$;
import static java.util.Arrays.asList;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.constellio.app.modules.es.model.connectors.ConnectorDocument;
import com.constellio.app.modules.es.model.connectors.ConnectorInstance;
import com.constellio.app.modules.es.navigation.ESViews;
import com.constellio.app.modules.es.services.ESSchemasRecordsServices;
import com.constellio.app.ui.application.Navigation;
import com.constellio.app.ui.entities.RecordVO;
import com.constellio.app.ui.entities.RecordVO.VIEW_MODE;
import com.constellio.app.ui.framework.builders.RecordToVOBuilder;
import com.constellio.app.ui.pages.base.BasePresenter;
import com.constellio.model.entities.CorePermissions;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.RecordServicesException;
import com.constellio.model.services.users.UserServices;
public class DisplayConnectorInstancePresenter extends BasePresenter<DisplayConnectorInstanceView> {
private static Logger LOGGER = LoggerFactory.getLogger(DisplayConnectorInstancePresenter.class);
private RecordToVOBuilder voBuilder = new RecordToVOBuilder();
private RecordVO recordVO;
private ConnectorInstance connectorInstance;
private final int NUMBER_OF_DOCS = 10;
private transient ESSchemasRecordsServices esSchemasRecordsServices;
private transient UserServices userServices;
private transient RecordServices recordServices;
public DisplayConnectorInstancePresenter(DisplayConnectorInstanceView view) {
super(view);
initTransientObjects();
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject();
initTransientObjects();
}
private void initTransientObjects() {
esSchemasRecordsServices = new ESSchemasRecordsServices(collection, appLayerFactory);
recordServices = modelLayerFactory.newRecordServices();
userServices = modelLayerFactory.newUserServices();
}
@Override
protected boolean hasPageAccess(String params, User user) {
return userServices.has(user).globalPermissionInAnyCollection(CorePermissions.MANAGE_CONNECTORS);
}
public void forParams(String params) {
Record record = presenterService().getRecord(params);
this.recordVO = voBuilder.build(record, VIEW_MODE.DISPLAY, view.getSessionContext());
view.setRecord(recordVO);
connectorInstance = esSchemasRecordsServices.getConnectorInstance(recordVO.getId());
}
@Override
protected boolean hasRestrictedRecordAccess(String params, User user, Record restrictedRecord) {
return userServices.has(user).globalPermissionInAnyCollection(CorePermissions.MANAGE_CONNECTORS);
}
@Override
protected List<String> getRestrictedRecordIds(String params) {
return asList(recordVO.getId());
}
public void viewAssembled() {
updateDocumentsInfo();
}
public void backButtonClicked() {
view.navigate().to(ESViews.class).listConnectorInstances();
}
public void editConnectorInstanceButtonClicked() {
view.navigate().to(ESViews.class).editConnectorInstance(recordVO.getId());
}
public String getTitle() {
return $("DisplayConnectorInstanceView.viewTitle") + " " + recordVO.getTitle();
}
String getLastDocuments() {
StringBuilder result = new StringBuilder();
List<String> urls = new ArrayList<>();
List<ConnectorDocument<?>> documents = esSchemasRecordsServices.getConnectorManager()
.getLastFetchedDocuments(connectorInstance.getId(), NUMBER_OF_DOCS);
for (ConnectorDocument<?> document : documents) {
urls.add(document.getURL());
}
for (String url : urls) {
result.append(url);
result.append(System.getProperty("line.separator"));
}
return result.toString();
}
public boolean isStartButtonVisible() {
return !connectorInstance.isEnabled();
}
public boolean isStopButtonVisible() {
return !isStartButtonVisible();
}
public void start() {
connectorInstance.setEnabled(true);
try {
recordServices.update(connectorInstance.getWrappedRecord());
view.navigate().to(ESViews.class).displayConnectorInstance(recordVO.getId());
} catch (RecordServicesException e) {
throw new RuntimeException(e);
}
}
public void stop() {
connectorInstance.setEnabled(false);
try {
recordServices.update(connectorInstance.getWrappedRecord());
view.navigate().to(ESViews.class).displayConnectorInstance(recordVO.getId());
} catch (RecordServicesException e) {
throw new RuntimeException(e);
}
}
public RecordVO getRecordVO() {
return recordVO;
}
private long getFetchedDocumentsCount() {
return esSchemasRecordsServices.getConnectorManager().getFetchedDocumentsCount(connectorInstance.getId());
}
public void editSchemasButtonClicked() {
view.navigate().to(ESViews.class).displayConnectorMappings(recordVO.getId());
}
public void backgroundViewMonitor() {
updateDocumentsInfo();
}
private void updateDocumentsInfo() {
long fetchedDocumentsCount = getFetchedDocumentsCount();
String lastDocuments = getLastDocuments();
view.setDocumentsCount(fetchedDocumentsCount);
if (StringUtils.isNotBlank(lastDocuments)) {
view.setLastDocuments(lastDocuments);
}
}
public void indexationReportButtonClicked() {
try {
view.navigate().to(ESViews.class).connectorIndexationReport(connectorInstance.getId());
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void errorsReportButtonClicked() {
view.navigate().to(ESViews.class).connectorErrorsReport(connectorInstance.getId());
}
public void deleteDocumentsButtonClicked() {
try {
esSchemasRecordsServices.getConnectorManager()
.totallyDeleteConnectorRecordsSkippingValidation(modelLayerFactory.getDataLayerFactory().newRecordDao(),
connectorInstance);
} catch (Throwable t) {
LOGGER.warn("Error while deleting connector records", t);
}
view.navigate().to(ESViews.class).displayConnectorInstance(recordVO.getId());
}
}