package com.constellio.app.modules.es.extensions;
import java.io.InputStream;
import org.apache.commons.lang3.StringUtils;
import com.constellio.app.extensions.records.RecordNavigationExtension;
import com.constellio.app.extensions.records.params.NavigationParams;
import com.constellio.app.modules.es.connectors.ConnectorServicesFactory;
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.RegisteredConnector;
import com.constellio.app.modules.es.model.connectors.smb.ConnectorSmbDocument;
import com.constellio.app.modules.es.services.ConnectorManager;
import com.constellio.app.modules.es.services.ESSchemasRecordsServices;
import com.constellio.app.services.factories.AppLayerFactory;
import com.constellio.app.services.factories.ConstellioFactories;
import com.constellio.app.ui.entities.RecordVO;
import com.constellio.app.ui.framework.components.SearchResultDisplay;
import com.constellio.app.ui.framework.components.display.ReferenceDisplay;
import com.vaadin.server.FileDownloader;
import com.vaadin.server.Page;
import com.vaadin.server.Resource;
import com.vaadin.server.StreamResource;
import com.vaadin.server.StreamResource.StreamSource;
import com.vaadin.ui.Component;
import com.vaadin.ui.Table;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
public class ESRecordNavigationExtension implements RecordNavigationExtension {
private static final String DOWNLOAD_DOCUMENT = "ESRecordNavigationExtension-DownloadDocument";
final String collection;
final AppLayerFactory appLayerFactory;
public ESRecordNavigationExtension(
String collection, AppLayerFactory appLayerFactory) {
this.collection = collection;
this.appLayerFactory = appLayerFactory;
}
@Override
public void navigateToEdit(NavigationParams navigationParams) {
}
@Override
public void navigateToView(NavigationParams navigationParams) {
RecordVO recordVO = navigationParams.getRecordVO();
if (recordVO != null) {
Page page = navigationParams.getPage();
String schemaTypeCode = navigationParams.getSchemaTypeCode();
ESSchemasRecordsServices es = new ESSchemasRecordsServices(collection, appLayerFactory);
ConnectorManager connectorManager = es.getConnectorManager();
for (RegisteredConnector connector : connectorManager.getRegisteredConnectors()) {
ConnectorUtilsServices<?> services = connector.getServices();
for (String type : services.getConnectorDocumentTypes()) {
if (schemaTypeCode.equals(type)) {
String url = services.getRecordExternalUrl(recordVO);
if (url != null) {
page.open(url, null);
}
return;
}
}
}
throw new UnsupportedOperationException("No navigation for schema type code " + schemaTypeCode);
}
}
@Override
public boolean isViewForSchemaTypeCode(String documentSchemaTypeCode) {
ESSchemasRecordsServices es = new ESSchemasRecordsServices(collection, appLayerFactory);
ConnectorManager connectorManager = es.getConnectorManager();
for (RegisteredConnector connector : connectorManager.getRegisteredConnectors()) {
ConnectorUtilsServices<?> services = connector.getServices();
for (String type : services.getConnectorDocumentTypes()) {
if (documentSchemaTypeCode.equals(type)) {
return true;
}
}
}
return false;
}
@Override
public void prepareLinkToView(final NavigationParams navigationParams) {
if (isViewForSchemaTypeCode(navigationParams.getSchemaTypeCode())) {
ClickListener clickListener = null;
RecordVO recordVO = navigationParams.getRecordVO();
String schemaTypeCode = navigationParams.getSchemaTypeCode();
String schemaCode = recordVO.getSchema().getCode();
final String url = recordVO.get(schemaCode + "_url");
String title = recordVO.get(schemaCode + "_title");
String id = recordVO.getId();
String collection = recordVO.getSchema().getCollection();
Component component = navigationParams.getComponent();
if (component instanceof ReferenceDisplay) {
ReferenceDisplay referenceDisplay = (ReferenceDisplay) component;
//if (ConnectorSmbDocument.SCHEMA_TYPE.equals(schemaTypeCode)) {
// final String filename = StringUtils
// .substringAfterLast(url, "/");
// clickListener = prepareFileDownloader(url, title, id, collection, referenceDisplay, filename);
//} else {
ESSchemasRecordsServices es = new ESSchemasRecordsServices(collection, appLayerFactory);
ConnectorManager connectorManager = es.getConnectorManager();
for (RegisteredConnector connector : connectorManager.getRegisteredConnectors()) {
ConnectorUtilsServices<?> services = connector.getServices();
for (String type : services.getConnectorDocumentTypes()) {
if (schemaTypeCode.equals(type)) {
String connectorUrl = services.getRecordExternalUrl(recordVO);
if (connectorUrl != null) {
clickListener = new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
navigateToView(navigationParams);
}
};
referenceDisplay.setCaption(title == null ? url : title);
break;
}
}
}
}
//}
referenceDisplay.addStyleName(SearchResultDisplay.TITLE_STYLE);
referenceDisplay.setEnabled(true);
if (clickListener == null) {
//to fix null titles
if (StringUtils.isBlank(title)) {
title = url;
}
clickListener = prepareFileDownloader(url, title, id, collection, referenceDisplay, title);
}
referenceDisplay.addClickListener(clickListener);
} else if (component instanceof Table) {
// TODO Implement for table
}
}
}
private ClickListener prepareFileDownloader(String url, String title, String id, String collection,
ReferenceDisplay component, String filename) {
ClickListener clickListener;
FileDownloader downloader = new FileDownloader(getResourceStream(collection, id, filename));
downloader.extend(component);
clickListener = new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
//Important
}
};
component.setCaption(title == null ? url : title);
return clickListener;
}
private static Resource getResourceStream(final String collection, final String id, String fileName) {
return new StreamResource(new StreamSource() {
@Override
public InputStream getStream() {
try {
AppLayerFactory appLayerFactory = ConstellioFactories.getInstance().getAppLayerFactory();
ESSchemasRecordsServices es = new ESSchemasRecordsServices(collection, appLayerFactory);
ConnectorDocument<?> document = es.getConnectorDocument(id);
ConnectorUtilsServices services = ConnectorServicesFactory
.forConnectorDocument(appLayerFactory, document);
InputStream inputStream = services.newContentInputStream(document, DOWNLOAD_DOCUMENT);
return inputStream;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}, fileName);
}
}