package com.constellio.app.ui.framework.components.resource;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.UUID;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import com.constellio.app.services.factories.ConstellioFactories;
import com.constellio.app.ui.entities.UserVO;
import com.constellio.app.ui.pages.base.VaadinSessionContext;
import com.constellio.app.ui.params.ParamUtils;
import com.constellio.model.entities.records.Content;
import com.constellio.model.entities.records.ContentVersion;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.services.contents.ContentManager;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import com.constellio.model.services.users.UserServices;
import com.vaadin.server.ExternalResource;
import com.vaadin.server.RequestHandler;
import com.vaadin.server.Resource;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinResponse;
import com.vaadin.server.VaadinServletRequest;
import com.vaadin.server.VaadinSession;
import com.vaadin.util.FileTypeResolver;
public class ConstellioResourceHandler implements RequestHandler {
private static final long serialVersionUID = 1L;
private static final String PATH = UUID.randomUUID().toString();
@Override
public boolean handleRequest(VaadinSession session, VaadinRequest request, VaadinResponse response)
throws IOException {
String sep = "/" + PATH + "/";
String requestURI = ((VaadinServletRequest) request).getRequestURI();
if (requestURI.indexOf(sep) != -1) {
String params = StringUtils.substringAfter(requestURI, sep);
Map<String, String> paramsMap = ParamUtils.getParamsMap(params);
String recordId = paramsMap.get("recordId");
String metadataCode = paramsMap.get("metadataCode");
String version = paramsMap.get("version");
String preview = paramsMap.get("preview");
String filePath = paramsMap.get("file");
String filename;
InputStream in = null;
if (recordId != null) {
ConstellioFactories constellioFactories = ConstellioFactories.getInstance();
ModelLayerFactory modelLayerFactory = constellioFactories.getModelLayerFactory();
UserServices userServices = modelLayerFactory.newUserServices();
RecordServices recordServices = modelLayerFactory.newRecordServices();
ContentManager contentManager = modelLayerFactory.getContentManager();
MetadataSchemasManager metadataSchemasManager = modelLayerFactory.getMetadataSchemasManager();
VaadinSession vaadinSession = VaadinSession.getCurrent();
UserVO userVO = (UserVO) vaadinSession.getSession().getAttribute(VaadinSessionContext.CURRENT_USER_ATTRIBUTE);
String collection = (String) vaadinSession.getSession().getAttribute(VaadinSessionContext.CURRENT_COLLECTION_ATTRIBUTE);
MetadataSchemaTypes types = metadataSchemasManager.getSchemaTypes(collection);
User user = userServices.getUserInCollection(userVO.getUsername(), collection);
Record record = recordServices.getDocumentById(recordId);
if (user.hasReadAccess().on(record)) {
String schemaCode = record.getSchemaCode();
Metadata metadata = types.getMetadata(schemaCode + "_" + metadataCode);
Content content = (Content) record.get(metadata);
ContentVersion contentVersion = content.getVersion(version);
String hash = contentVersion.getHash();
filename = contentVersion.getFilename();
if ("true".equals(preview)) {
if (contentManager.hasContentPreview(hash)) {
in = contentManager.getContentPreviewInputStream(hash, getClass().getSimpleName() + ".handleRequest");
} else {
in = null;
}
} else {
in = contentManager.getContentInputStream(hash, getClass().getSimpleName() + ".handleRequest");
}
} else {
filename = null;
in = null;
}
} else if (filePath != null) {
File file = new File(filePath);
filename = file.getName();
in = new FileInputStream(file);
} else {
filename = null;
in = null;
}
if (in != null) {
String mimeType = FileTypeResolver.getMIMEType(filename);
response.setContentType(mimeType);
OutputStream out = null;
try {
out = response.getOutputStream();
IOUtils.copy(in, out);
} finally {
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
}
}
return true;
}
return false;
}
public static Resource createResource(String recordId, String metadataCode, String version, String filename) {
return createResource(recordId, metadataCode, version, filename, false);
}
public static Resource createResource(String recordId, String metadataCode, String version, String filename, boolean preview) {
Map<String, String> params = new LinkedHashMap<>();
params.put("recordId", recordId);
params.put("metadataCode", metadataCode);
params.put("preview", "" + preview);
params.put("version", version);
params.put("z-filename", filename);
String resourcePath = ParamUtils.addParams(PATH , params);
return new ExternalResource(resourcePath);
}
public static Resource createResource(File file) {
Map<String, String> params = new LinkedHashMap<>();
params.put("file", file.getAbsolutePath());
String resourcePath = ParamUtils.addParams(PATH, params);
return new ExternalResource(resourcePath);
}
public static boolean hasContentPreview(String recordId, String metadataCode, String version) {
boolean contentPreview;
ConstellioFactories constellioFactories = ConstellioFactories.getInstance();
ModelLayerFactory modelLayerFactory = constellioFactories.getModelLayerFactory();
UserServices userServices = modelLayerFactory.newUserServices();
RecordServices recordServices = modelLayerFactory.newRecordServices();
ContentManager contentManager = modelLayerFactory.getContentManager();
MetadataSchemasManager metadataSchemasManager = modelLayerFactory.getMetadataSchemasManager();
VaadinSession vaadinSession = VaadinSession.getCurrent();
UserVO userVO = (UserVO) vaadinSession.getSession().getAttribute(VaadinSessionContext.CURRENT_USER_ATTRIBUTE);
String collection = (String) vaadinSession.getSession().getAttribute(VaadinSessionContext.CURRENT_COLLECTION_ATTRIBUTE);
MetadataSchemaTypes types = metadataSchemasManager.getSchemaTypes(collection);
User user = userServices.getUserInCollection(userVO.getUsername(), collection);
Record record = recordServices.getDocumentById(recordId);
if (user.hasReadAccess().on(record)) {
String schemaCode = record.getSchemaCode();
Metadata metadata = types.getMetadata(schemaCode + "_" + metadataCode);
Content content = (Content) record.get(metadata);
ContentVersion contentVersion = content.getVersion(version);
String hash = contentVersion.getHash();
contentPreview = contentManager.hasContentPreview(hash);
} else {
contentPreview = false;
}
return contentPreview;
}
}