gov.anl.aps.cdb.portal.controllers.ItemDomainMAARCController.java Source code

Java tutorial

Introduction

Here is the source code for gov.anl.aps.cdb.portal.controllers.ItemDomainMAARCController.java

Source

/*
 * Copyright (c) UChicago Argonne, LLC. All rights reserved.
 * See LICENSE file.
 */
package gov.anl.aps.cdb.portal.controllers;

import gov.anl.aps.cdb.common.constants.CdbPropertyValue;
import gov.anl.aps.cdb.common.exceptions.CdbException;
import gov.anl.aps.cdb.common.exceptions.ExternalServiceError;
import gov.anl.aps.cdb.portal.constants.ItemDomainName;
import gov.anl.aps.cdb.portal.controllers.settings.ItemDomainMAARCSettings;
import gov.anl.aps.cdb.portal.model.db.beans.ItemDomainMAARCFacade;
import gov.anl.aps.cdb.portal.model.db.beans.PropertyMetadataFacade;
import gov.anl.aps.cdb.portal.model.db.beans.PropertyTypeFacade;
import gov.anl.aps.cdb.portal.model.db.entities.EntityType;
import gov.anl.aps.cdb.portal.model.db.entities.Item;
import gov.anl.aps.cdb.portal.model.db.entities.ItemDomainMAARC;
import gov.anl.aps.cdb.portal.model.db.entities.ItemElement;
import gov.anl.aps.cdb.portal.model.db.entities.ItemElementRelationship;
import gov.anl.aps.cdb.portal.model.db.entities.PropertyMetadata;
import gov.anl.aps.cdb.portal.model.db.entities.PropertyType;
import gov.anl.aps.cdb.portal.model.db.entities.PropertyValue;
import gov.anl.aps.cdb.portal.model.jsf.handlers.PropertyTypeHandlerFactory;
import gov.anl.aps.cdb.portal.model.jsf.handlers.PropertyTypeHandlerInterface;
import gov.anl.aps.cdb.portal.utilities.GalleryUtility;
import gov.anl.aps.cdb.portal.utilities.SessionUtility;
import gov.anl.aps.cdb.portal.utilities.StorageUtility;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.apache.pdfbox.io.IOUtils;
import org.primefaces.model.StreamedContent;

/**
 *
 * @author djarosz
 */
@Named("itemDomainMAARCController")
@SessionScoped
public class ItemDomainMAARCController
        extends ItemController<ItemDomainMAARC, ItemDomainMAARCFacade, ItemDomainMAARCSettings> {

    protected final String FILE_ENTITY_TYPE_NAME = "File";
    public static final String MAARC_CONNECTION_RELATIONSHIP_TYPE_NAME = "MAARC Connection";
    protected final String FILE_PROPERTY_TYPE_NAME = "File";

    protected final String FILE_PROPERTY_VIEWABLE_UUID_METADATA_KEY = "cdbViewableUUID";

    private final String VIEWABLE_UUID_REMOTE_COMMAND_KEY = "imageUUID";

    private static final Logger logger = Logger.getLogger(ItemDomainMAARCController.class.getName());

    private Integer filePropertyTypeId = null;
    private boolean attemptedFetchFilePropertyType = false;

    private Boolean loadGallery = null;
    private String currentViewableUUIDToDownload = null;

    private List<ItemElementRelationship> relatedRelationshipsForCurrent = null;

    @EJB
    ItemDomainMAARCFacade itemDomainMAARCFacade;

    @EJB
    PropertyTypeFacade propertyTypeFacade;

    @EJB
    PropertyMetadataFacade propertyMetadataFacade;

    @Override
    protected ItemDomainMAARC instenciateNewItemDomainEntity() {
        return new ItemDomainMAARC();
    }

    @Override
    protected ItemDomainMAARCSettings createNewSettingObject() {
        return new ItemDomainMAARCSettings(this);
    }

    @Override
    protected ItemDomainMAARCFacade getEntityDbFacade() {
        return itemDomainMAARCFacade;
    }

    @Override
    public String getEntityTypeName() {
        return "itemMAARC";
    }

    @Override
    public String getDefaultDomainName() {
        return ItemDomainName.maarc.getValue();
    }

    @Override
    public String getDisplayEntityTypeName() {
        return "MAARC Item";
    }

    @Override
    public boolean getEntityDisplayItemConnectors() {
        return false;
    }

    @Override
    public boolean getEntityDisplayItemName() {
        return true;
    }

    @Override
    public boolean getEntityDisplayDerivedFromItem() {
        return false;
    }

    @Override
    public boolean getEntityDisplayQrId() {
        return false;
    }

    @Override
    public boolean getEntityDisplayItemGallery() {
        return false;
    }

    @Override
    public boolean getEntityDisplayItemLogs() {
        return true;
    }

    @Override
    public boolean getEntityDisplayItemSources() {
        return false;
    }

    @Override
    public boolean getEntityDisplayItemProperties() {
        return true;
    }

    @Override
    public boolean getEntityDisplayItemElements() {
        return true;
    }

    @Override
    public boolean getEntityDisplayItemsDerivedFromItem() {
        return false;
    }

    @Override
    public boolean getEntityDisplayItemMemberships() {
        return true;
    }

    @Override
    public boolean getEntityDisplayItemProject() {
        return false;
    }

    @Override
    public boolean getEntityDisplayItemEntityTypes() {
        return true;
    }

    /**
     * Used to fetch a list of relationships for items that are related to maarc
     * item.
     *
     * @param item
     * @return
     */
    public static List<ItemElementRelationship> getRelatedMAARCRelationshipsForItem(Item item) {
        List<ItemElementRelationship> relatedMAARCRelationshipsForItem = new ArrayList<>();

        List<ItemElementRelationship> itemElementRelationshipList = item.getSelfElement()
                .getItemElementRelationshipList();

        for (ItemElementRelationship ier : itemElementRelationshipList) {
            if (ier.getRelationshipType().getName().equals(MAARC_CONNECTION_RELATIONSHIP_TYPE_NAME)) {
                relatedMAARCRelationshipsForItem.add(ier);
            }
        }

        return relatedMAARCRelationshipsForItem;
    }

    public boolean isCollapsedRelatedItemsForCurrent() {
        return getRelatedRelationshipsForCurrent().size() < 1;
    }

    public void destroyRelationship(ItemElementRelationship ier) {
        ItemElementRelationshipController ierc = ItemElementRelationshipController.getInstance();
        ierc.destroy(ier);

        relatedRelationshipsForCurrent.remove(ier);
    }

    /**
     * Destroys a full file reference from a study
     *
     * @param itemElement
     */
    public void destroyFile(ItemElement itemElement) {
        ItemDomainMAARC containedItem = (ItemDomainMAARC) itemElement.getContainedItem();

        ItemElementController instance = ItemElementController.getInstance();
        instance.destroy(itemElement);

        ItemDomainMAARC currentItem = getCurrent();
        destroy(containedItem);
        current = currentItem;
    }

    @Override
    protected void prepareEntityDestroy(ItemDomainMAARC item) throws CdbException {
        if (isEntityTypeFile(item)) {
            List<ItemElement> itemElementMemberList = item.getItemElementMemberList();

            // A file should be a member of 1 Study 
            if (itemElementMemberList.size() == 1) {
                // Destroy the element before proceeding to destroy the file. 
                ItemElement itemElement = itemElementMemberList.get(0);
                ItemElementController instance = ItemElementController.getInstance();
                instance.destroy(itemElement);
                itemElementMemberList.clear();
            } else if (itemElementMemberList.size() == 0) {
                // Do Nothing. 
            } else {
                throw new CdbException(
                        "File should be a member of one study. Something went wrong! please notify Admin of this error.");
            }
        } else {
            // Study
            List<ItemElement> itemElementDisplayList = item.getItemElementDisplayList();
            while (itemElementDisplayList.size() > 0) {
                ItemElement ie = itemElementDisplayList.get(0);
                itemElementDisplayList.remove(0);

                destroyFile(ie);
            }

            // Clear Relationships
            List<ItemElementRelationship> ierList = item.getItemElementRelationshipList1();
            if (ierList.size() > 0) {
                ItemElementRelationshipController ierc = ItemElementRelationshipController.getInstance();

                while (ierList.size() > 0) {
                    ItemElementRelationship ier = ierList.get(0);
                    ierList.remove(0);

                    ierc.destroy(ier);
                }

            }
        }
        super.prepareEntityDestroy(item);
    }

    public List<ItemElementRelationship> getRelatedRelationshipsForCurrent() {
        if (relatedRelationshipsForCurrent == null) {
            List<ItemElementRelationship> itemElementRelationshipList1 = getCurrent().getSelfElement()
                    .getItemElementRelationshipList1();
            relatedRelationshipsForCurrent = new ArrayList<>();

            for (ItemElementRelationship ier : itemElementRelationshipList1) {
                if (ier.getRelationshipType().getName().equals(MAARC_CONNECTION_RELATIONSHIP_TYPE_NAME)) {
                    relatedRelationshipsForCurrent.add(ier);
                }
            }
        }

        return relatedRelationshipsForCurrent;
    }

    @Override
    protected void resetVariablesForCurrent() {
        super.resetVariablesForCurrent();
        relatedRelationshipsForCurrent = null;
        loadGallery = null;
    }

    @Override
    public boolean getEntityDisplayItemElementsForCurrent() {
        boolean result = super.getEntityDisplayItemElementsForCurrent();
        if (getCurrent() == null || getCurrent().getEntityTypeList() == null
                || getCurrent().getEntityTypeList().isEmpty()) {
            return result;
        }
        if (isCurrentEntityTypeFile()) {
            result = false;
        }

        return result;
    }

    public boolean isCurrentEntityTypeFile() {
        return isEntityTypeFile(getCurrent());
    }

    public boolean isEntityTypeFile(ItemDomainMAARC item) {
        List<EntityType> entityTypeList = item.getEntityTypeList();
        for (EntityType entityType : entityTypeList) {
            if (entityType.getName().equals(FILE_ENTITY_TYPE_NAME)) {
                return true;

            }
        }

        return false;
    }

    public Integer getFilePropertyTypeId() {
        if (filePropertyTypeId == null && !attemptedFetchFilePropertyType) {
            PropertyType filePropertyType = propertyTypeFacade.findByName(FILE_PROPERTY_TYPE_NAME);
            if (filePropertyType != null) {
                filePropertyTypeId = filePropertyType.getId();
            }
            attemptedFetchFilePropertyType = true;
        }
        return filePropertyTypeId;
    }

    public boolean getCollapsedFilePreview() {
        return collapsedPreviewPanelForItem(getCurrent());
    }

    public boolean getCollapsedStudyGallery() {
        for (ItemElement itemElement : getCurrent().getItemElementDisplayList()) {
            Item containedItem = itemElement.getContainedItem();
            if (!collapsedPreviewPanelForItem(containedItem)) {
                return false;
            }
        }

        return true;
    }

    private boolean collapsedPreviewPanelForItem(Item item) {
        PropertyValue maarcFilePropertyValueFromItem = getMAARCFilePropertyValueFromItem(item);

        if (maarcFilePropertyValueFromItem != null) {
            if (GalleryUtility.viewableFileName(maarcFilePropertyValueFromItem.getValue())) {
                return false;
            }
        }

        return true;
    }

    /*/ Used to delete viewableUUID key from each item in a study. Not used in production. 
    public void deletePreviewKey() {
    for (ItemElement itemElement : getCurrent().getItemElementDisplayList()) {
        Item file = itemElement.getContainedItem();
        
        PropertyValue pv = getMAARCFilePropertyValueFromItem(file);
        if (pv != null) {
            PropertyMetadata propertyMetadataForKey = pv.getPropertyMetadataForKey(FILE_PROPERTY_VIEWABLE_UUID_METADATA_KEY);
            if (propertyMetadataForKey != null) {
                propertyMetadataFacade.remove(propertyMetadataForKey);
            }
        }
        
    }
    }
    //*/
    public List<String> getPreviewsForAllElements() {
        if (isCurrentEntityTypeFile()) {
            return null;
        }

        List<String> streamedContentsList = new ArrayList<>();
        for (ItemElement itemElement : getCurrent().getItemElementDisplayList()) {
            Item file = itemElement.getContainedItem();

            String viewableFileName = getPreviewPath((ItemDomainMAARC) file);
            if (viewableFileName != null) {
                streamedContentsList.add(viewableFileName);
            }
        }

        return streamedContentsList;

    }

    public String getPreviewPath() {
        return getPreviewPath(getCurrent(), false);
    }

    public String getPreviewPath(ItemDomainMAARC item) {
        return getPreviewPath(item, false);
    }

    public String getPreviewPath(ItemDomainMAARC item, boolean storedOnly) {
        if (!isEntityTypeFile(item)) {
            return null;
        }

        PropertyValue pv = getMAARCFilePropertyValueFromItem(item);

        if (pv == null) {
            return null;
        }

        if (!GalleryUtility.viewableFileName(pv.getValue())) {
            return null;
        }

        PropertyMetadata metadata = pv.getPropertyMetadataForKey(FILE_PROPERTY_VIEWABLE_UUID_METADATA_KEY);

        if (metadata != null) {
            String metadataValue = metadata.getMetadataValue();
            return metadataValue;
        }

        if (storedOnly) {
            return null;
        }

        try {
            // Prepare storage directory 
            String basePath = StorageUtility.getFileSystemMAARCPreviewsDirectory();
            Path uploadPath = Paths.get(basePath);
            if (Files.notExists(uploadPath)) {
                logger.debug("Creating inidial maarc previews directory: " + basePath);
                Files.createDirectory(uploadPath);
            }

            PropertyTypeHandlerInterface handler = PropertyTypeHandlerFactory.getHandler(pv);

            StreamedContent contentStream;
            try {
                contentStream = handler.fileDownloadActionCommand(pv);
            } catch (ExternalServiceError ex) {
                SessionUtility.addErrorMessage("Error Download File", ex.getMessage());
                return null;
            }

            InputStream stream = contentStream.getStream();

            byte[] originalData = IOUtils.toByteArray(stream);

            String fileName = pv.getValue();
            int extStart = fileName.lastIndexOf(".") + 1;
            String imageFormat = fileName.substring(extStart);

            if (imageFormat.equalsIgnoreCase("pdf")) {
                imageFormat = "png";
                originalData = GalleryUtility.createPNGFromPDF(originalData);
                if (originalData == null) {
                    return null;
                }
            }

            UUID randomUUID = UUID.randomUUID();
            String uniqueFileName = randomUUID.toString();
            uniqueFileName += "." + imageFormat;

            GalleryUtility.storePreviewsFromViewableData(originalData, imageFormat, basePath, uniqueFileName);

            pv.setPropertyMetadataValue(FILE_PROPERTY_VIEWABLE_UUID_METADATA_KEY, uniqueFileName);

            // System save the metadata value
            PropertyMetadata viewableKeyMetadata = pv
                    .getPropertyMetadataForKey(FILE_PROPERTY_VIEWABLE_UUID_METADATA_KEY);
            propertyMetadataFacade.create(viewableKeyMetadata);
            logger.debug("Created cdb viewable metadata id: " + viewableKeyMetadata.getId());

            return uniqueFileName;
        } catch (IOException ex) {
            logger.error(ex);
            SessionUtility.addErrorMessage("Error", ex.getMessage());
            return null;
        }
    }

    public String getScaledPreviewPath(String uuidPreviewPath) {
        String scaledImage = StorageUtility.getMAARCPreviewsPath(uuidPreviewPath)
                + CdbPropertyValue.SCALED_IMAGE_EXTENSION;

        if (StorageUtility.isFileExist(scaledImage)) {
            return scaledImage;
        }

        return StorageUtility.getMissingImageDefaultPreview(uuidPreviewPath, scaledImage,
                CdbPropertyValue.SCALED_IMAGE_EXTENSION);
    }

    @Override
    public String getThumbnailImageForDownloadablePropertyValue(PropertyValue propertyValue) {
        String uuidPreviewPath = propertyValue
                .getPropertyMetadataValueForKey(FILE_PROPERTY_VIEWABLE_UUID_METADATA_KEY);
        String thumbnailImage = StorageUtility.getMAARCPreviewsPath(uuidPreviewPath)
                + CdbPropertyValue.THUMBNAIL_IMAGE_EXTENSION;

        if (StorageUtility.isFileExist(thumbnailImage)) {
            return thumbnailImage;
        }

        return super.getThumbnailImageForDownloadablePropertyValue(propertyValue);
    }

    private PropertyValue getMAARCFilePropertyValueFromItem(Item item) {
        List<PropertyValue> propertyValueList = item.getPropertyValueList();
        if (propertyValueList.size() > 0) {
            for (PropertyValue propertyValue : propertyValueList) {
                PropertyType propertyType = propertyValue.getPropertyType();
                if (propertyType != null) {
                    if (propertyType.getName().equals(FILE_PROPERTY_TYPE_NAME)) {
                        return propertyValue;
                    }
                }
            }
        }

        return null;
    }

    /**
     * Do not render gallery if it is not yet ready. The view will activate
     * loading screen.
     *
     * @return
     */
    public boolean isLoadGallery() {
        if (loadGallery == null) {
            if (isEntityTypeFile(getCurrent())) {
                // File
                loadGallery = loadGalleryForItemNeeded(getCurrent());
            } else {
                // Study                 
                for (ItemElement itemElement : getCurrent().getItemElementDisplayList()) {
                    ItemDomainMAARC containedItem = (ItemDomainMAARC) itemElement.getContainedItem();
                    if (loadGalleryForItemNeeded(containedItem)) {
                        loadGallery = true;
                        return true;
                    }
                }

                loadGallery = false;
            }
        }
        return loadGallery;
    }

    public void setLoadGallery(boolean renderGallery) {
        this.loadGallery = renderGallery;
    }

    private boolean loadGalleryForItemNeeded(ItemDomainMAARC item) {
        PropertyValue maarcFilePropertyValueFromItem = getMAARCFilePropertyValueFromItem(item);
        if (maarcFilePropertyValueFromItem != null) {
            String value = maarcFilePropertyValueFromItem.getValue();
            if (GalleryUtility.viewableFileName(value)) {
                String res = getPreviewPath(item, true);
                return (res == null);
            }
        }

        return false;
    }

    public void updateCurrentViewableUUIDToDownload() {
        currentViewableUUIDToDownload = SessionUtility.getRequestParameterValue(VIEWABLE_UUID_REMOTE_COMMAND_KEY);
    }

    public StreamedContent downloadCurrentViewableUUIDToDownload() {
        PropertyValue pv = null;
        if (isCurrentEntityTypeFile()) {
            pv = getMAARCFilePropertyValueFromItem(getCurrent());
        } else {
            for (ItemElement itemElement : getCurrent().getItemElementDisplayList()) {
                ItemDomainMAARC containedItem = (ItemDomainMAARC) itemElement.getContainedItem();
                PropertyValue pvCheck = getMAARCFilePropertyValueFromItem(containedItem);
                if (pvCheck != null) {
                    if (GalleryUtility.viewableFileName(pvCheck.getValue())) {
                        String metadataKey = pvCheck
                                .getPropertyMetadataValueForKey(FILE_PROPERTY_VIEWABLE_UUID_METADATA_KEY);
                        if (metadataKey != null) {
                            if (metadataKey.equals(currentViewableUUIDToDownload)) {
                                pv = pvCheck;
                                break;
                            }
                        }
                    }
                }
            }
        }

        if (pv != null) {
            PropertyTypeHandlerInterface handler = PropertyTypeHandlerFactory.getHandler(pv);
            try {
                return handler.fileDownloadActionCommand(pv);
            } catch (ExternalServiceError ex) {
                SessionUtility.addErrorMessage("Error Download File", ex.getMessage());
            }
        }

        return null;
    }

    @Override
    public String getItemEntityTypeTitle() {
        return "MAARC Type";
    }

    @Override
    public String getItemElementsListTitle() {
        return "Files";
    }

    @Override
    public boolean getRenderItemElementList() {
        return !isCurrentEntityTypeFile();
    }

    @Override
    public String getItemsDerivedFromItemTitle() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public String getDerivedFromItemTitle() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public String getStyleName() {
        return "maarc";
    }

    @Override
    public String getDefaultDomainDerivedFromDomainName() {
        return null;
    }

    @Override
    public String getDefaultDomainDerivedToDomainName() {
        return null;
    }

}