package com.constellio.app.modules.rm.extensions; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; import com.constellio.app.extensions.records.RecordAppExtension; import com.constellio.app.extensions.records.params.BuildRecordVOParams; import com.constellio.app.extensions.records.params.GetIconPathParams; import com.constellio.app.modules.rm.model.enums.FolderStatus; import com.constellio.app.modules.rm.wrappers.ContainerRecord; import com.constellio.app.modules.rm.wrappers.Document; import com.constellio.app.modules.rm.wrappers.Folder; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.app.ui.entities.ContentVersionVO; import com.constellio.app.ui.entities.RecordVO; import com.constellio.app.ui.util.FileIconUtils; import com.constellio.app.ui.util.ThemeUtils; import com.constellio.model.entities.records.Content; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.records.wrappers.UserDocument; import com.constellio.model.entities.records.wrappers.UserFolder; import com.constellio.model.entities.schemas.Metadata; import com.constellio.model.entities.schemas.MetadataSchemaTypes; import com.constellio.model.services.schemas.MetadataSchemasManager; import com.constellio.model.services.schemas.SchemaUtils; public class RMRecordAppExtension extends RecordAppExtension { private static final String IMAGES_DIR = "images"; private final String collection; private final MetadataSchemasManager manager; public RMRecordAppExtension(String collection, AppLayerFactory appLayerFactory) { this.collection = collection; manager = appLayerFactory.getModelLayerFactory().getMetadataSchemasManager(); } @Override public void buildRecordVO(BuildRecordVOParams params) { String resourceKey = null; String extension = null; RecordVO recordVO = params.getBuiltRecordVO(); String schemaCode = recordVO.getSchema().getCode(); String schemaTypeCode = SchemaUtils.getSchemaTypeCode(schemaCode); if (schemaTypeCode.equals(Document.SCHEMA_TYPE)) { ContentVersionVO contentVersion = recordVO.getMetadataValue(recordVO.getMetadata(Document.CONTENT)).getValue(); if (contentVersion != null) { resourceKey = contentVersion.getFileName(); extension = StringUtils.lowerCase(FilenameUtils.getExtension(resourceKey)); } else { resourceKey = getDocumentIconPath(); extension = "document"; } setNiceTitle(recordVO, params.getRecord(), schemaTypeCode, schemaCode, Document.DESCRIPTION); } else if (schemaTypeCode.equals(UserDocument.SCHEMA_TYPE)) { ContentVersionVO contentVersion = recordVO.getMetadataValue(recordVO.getMetadata(UserDocument.CONTENT)).getValue(); if (contentVersion != null) { resourceKey = contentVersion.getFileName(); extension = StringUtils.lowerCase(FilenameUtils.getExtension(resourceKey)); } else { resourceKey = getDocumentIconPath(); extension = "document"; } } else if (schemaTypeCode.equals(Folder.SCHEMA_TYPE)) { resourceKey = getFolderIconPath(recordVO, false); extension = getFolderExtension(recordVO, false); setNiceTitle(recordVO, params.getRecord(), schemaTypeCode, schemaCode, Folder.DESCRIPTION); } else if (schemaTypeCode.equals(UserFolder.SCHEMA_TYPE)) { resourceKey = IMAGES_DIR + "/icons/folder/folder.png"; extension = "folder"; } else if (schemaTypeCode.equals(ContainerRecord.SCHEMA_TYPE)) { resourceKey = getContainerIconPath(); setNiceTitle(recordVO, params.getRecord(), schemaTypeCode, schemaCode, ContainerRecord.DESCRIPTION); } if (resourceKey != null) { recordVO.setResourceKey(resourceKey); } if (extension != null) { recordVO.setExtension(extension); } } private void setNiceTitle(RecordVO recordVO, Record record, String schemaTypeCode, String schemaCode, String metadataCode) { Metadata metadata = types().getSchemaType(schemaTypeCode).getSchema(schemaCode).getMetadata(metadataCode); String niceTitle = record.get(metadata); if (niceTitle != null) { recordVO.setNiceTitle(niceTitle); } } @Override public String getIconPathForRecord(GetIconPathParams params) { String fileName = null; Record record = params.getRecord(); String schemaCode = record.getSchemaCode(); String schemaTypeCode = SchemaUtils.getSchemaTypeCode(schemaCode); if (schemaTypeCode.equals(Document.SCHEMA_TYPE)) { Document document = new Document(record, types()); Content content = document.getContent(); if (content != null) { fileName = content.getCurrentVersion().getFilename(); } else { fileName = "document"; } if (fileName == null || !isIcon(fileName)) { String mimeType = document.getMimeType(); if (mimeType != null && !mimeType.isEmpty()) { try { fileName = FileIconUtils.getIconPathForMimeType(mimeType); } catch (Exception e) { fileName = "document"; } } else { fileName = "document"; } } } else if (schemaTypeCode.equals(UserDocument.SCHEMA_TYPE)) { UserDocument userDocument = new UserDocument(record, types()); Content content = userDocument.getContent(); if (content != null && content.getCurrentVersion() != null) { fileName = content.getCurrentVersion().getFilename(); } else { fileName = "document"; } } else if (schemaTypeCode.equals(Folder.SCHEMA_TYPE)) { Folder folder = new Folder(record, types()); fileName = getFolderIconPath(folder, params.isExpanded()); } else if (schemaTypeCode.equals(UserFolder.SCHEMA_TYPE)) { fileName = getFolderIconPath(); } else if (schemaTypeCode.equals(ContainerRecord.SCHEMA_TYPE)) { fileName = getContainerIconPath(); } return fileName != null ? fileName : null; } private String getContainerIconPath() { return IMAGES_DIR + "/icons/container/box.png"; } private String getDocumentIconPath() { return IMAGES_DIR + "/icons/ext/document.gif"; } private String getFolderIconPath() { return IMAGES_DIR + "/icons/folder/folder.png"; } private boolean isIcon(String filename) { String extension = FilenameUtils.getExtension(filename); String path = IMAGES_DIR + "/icons/ext/mantis/" + extension + ".gif"; return ThemeUtils.resourceExists(path); } private String getFolderIconPath(Folder folder, boolean expanded) { String imgName = getFolderExtension(folder, expanded); return IMAGES_DIR + "/icons/folder/" + imgName + ".png"; } private String getFolderIconPath(RecordVO recordVO, boolean expanded) { String imgName = getFolderExtension(recordVO, expanded); return IMAGES_DIR + "/icons/folder/" + imgName + ".png"; } private String getFolderExtension(RecordVO recordVO, boolean expanded) { FolderStatus archivisticStatus = recordVO.getMetadataValue(recordVO.getMetadata(Folder.ARCHIVISTIC_STATUS)).getValue(); return getArchivisticStatusFilename(expanded, archivisticStatus); } private String getFolderExtension(Folder folder, boolean expanded) { FolderStatus archivisticStatus = folder.getArchivisticStatus(); return getArchivisticStatusFilename(expanded, archivisticStatus); } private String getArchivisticStatusFilename(boolean expanded, FolderStatus archivisticStatus) { String imgName; if (archivisticStatus != null) { if (archivisticStatus.isDestroyed()) { imgName = expanded ? "folder_open_grey" : "folder_grey"; } else if (archivisticStatus.isDeposited()) { imgName = expanded ? "folder_open_purple" : "folder_purple"; } else if (archivisticStatus.isSemiActive()) { imgName = expanded ? "folder_open_orange" : "folder_orange"; } else { imgName = expanded ? "folder_open" : "folder"; } } else { imgName = expanded ? "folder_open" : "folder"; } return imgName; } private MetadataSchemaTypes types() { return manager.getSchemaTypes(collection); } }