org.betaconceptframework.astroboa.console.jsf.edit.SimpleCmsPropertyValueWrapper.java Source code

Java tutorial

Introduction

Here is the source code for org.betaconceptframework.astroboa.console.jsf.edit.SimpleCmsPropertyValueWrapper.java

Source

/*
 * Copyright (C) 2005-2012 BetaCONCEPT Limited
 *
 * This file is part of Astroboa.
 *
 * Astroboa is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Astroboa is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with Astroboa.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.betaconceptframework.astroboa.console.jsf.edit;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;

import org.apache.commons.lang.StringUtils;
import org.betaconceptframework.astroboa.api.model.BinaryChannel;
import org.betaconceptframework.astroboa.api.model.ComplexCmsRootProperty;
import org.betaconceptframework.astroboa.api.model.ContentObject;
import org.betaconceptframework.astroboa.api.model.SimpleCmsProperty;
import org.betaconceptframework.astroboa.api.model.StringProperty;
import org.betaconceptframework.astroboa.api.model.ValueType;
import org.betaconceptframework.astroboa.api.model.definition.BinaryPropertyDefinition;
import org.betaconceptframework.astroboa.api.model.definition.SimpleCmsPropertyDefinition;
import org.betaconceptframework.astroboa.api.model.definition.StringFormat;
import org.betaconceptframework.astroboa.api.model.definition.StringPropertyDefinition;
import org.betaconceptframework.astroboa.console.jsf.visitor.CmsPropertyValidatorVisitor;
import org.betaconceptframework.astroboa.model.factory.CmsRepositoryEntityFactory;
import org.betaconceptframework.ui.jsf.utility.JSFUtilities;
import org.betaconceptframework.utility.PdfToTextExtractor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.support.ServletContextResource;

/**
 * Wraps a value of a SimpleCmsProperty in order
 * to be successfully rendered and updated from JSF
 * @author Savvas Triantafyllou (striantafillou@betaconcept.gr)
 *
 */
/**
 * @author Gregory Chomatas (gchomatas@betaconcept.com)
 * @author Savvas Triantafyllou (striantafyllou@betaconcept.com)
 * 
 */
public class SimpleCmsPropertyValueWrapper {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    private int valueIndex = -1;

    private SimpleCmsProperty simpleCmsProperty;

    private BinaryChannel binaryChannelValue;

    private CmsRepositoryEntityFactory cmsRepositoryEntityFactory;

    private String mimeTypeIconFilePath;

    private String unmanagedBinaryChannelRelativePath;

    private PasswordVerifier passwordVerifier = null;

    private CmsPropertyValidatorVisitor cmsPropertyValidatorVisitor;

    private Object tempValue;

    private boolean valueIsNull;

    public SimpleCmsPropertyValueWrapper(SimpleCmsProperty simpleCmsProperty, int valueIndex,
            CmsRepositoryEntityFactory cmsRepositoryEntityFactory,
            CmsPropertyValidatorVisitor cmsPropertyValidatorVisitor) {
        this.simpleCmsProperty = simpleCmsProperty;
        this.valueIndex = valueIndex;

        mimeTypeIconFilePath = null;

        this.cmsRepositoryEntityFactory = cmsRepositoryEntityFactory;

        this.cmsPropertyValidatorVisitor = cmsPropertyValidatorVisitor;

        if (cmsPropertyValidatorVisitor != null && simpleCmsProperty instanceof StringProperty
                && ((StringProperty) simpleCmsProperty).getPropertyDefinition() != null
                && ((StringProperty) simpleCmsProperty).getPropertyDefinition().isPasswordType()) {

            if (this.cmsPropertyValidatorVisitor != null) {
                this.cmsPropertyValidatorVisitor.registerSimpleCmsPropertyOfPasswordType(this);
            }

            passwordVerifier = new PasswordVerifier(getLocalizedLabelOfFullPathFromCmsProperty());
        }
    }

    public void reset() {
        binaryChannelValue = null;
        mimeTypeIconFilePath = null;

        if (passwordVerifier != null) {
            passwordVerifier.resetPasswords();
        }

    }

    public Object getValue() {

        if (tempValue != null) {
            return tempValue;
        }

        if (simpleCmsProperty != null) {

            Object value = null;
            if (simpleCmsProperty.getPropertyDefinition().isMultiple()) {
                if (valueIndex >= simpleCmsProperty.getSimpleTypeValues().size()) {
                    //Probably a blank value has been inserted. Return null value
                    //This is the normal case for primitive values.
                    //When it comes for non-primitive values (Topic, Space ,etc)
                    //it is possible that a new object will be created
                    return null;
                } else
                    value = simpleCmsProperty.getSimpleTypeValues().get(valueIndex);
            } else {
                //Single value property.
                value = simpleCmsProperty.getSimpleTypeValue();
            }

            if (value != null) {
                if (value instanceof Calendar) {
                    return ((Calendar) value).getTime();
                } else if (value instanceof BinaryChannel) {
                    binaryChannelValue = (BinaryChannel) value;
                    if (simpleCmsProperty.getPropertyDefinition() != null
                            && simpleCmsProperty.getPropertyDefinition() instanceof BinaryPropertyDefinition
                            && ((BinaryPropertyDefinition) simpleCmsProperty.getPropertyDefinition())
                                    .isBinaryChannelUnmanaged()) {
                        unmanagedBinaryChannelRelativePath = binaryChannelValue.getRelativeFileSystemPath();
                    }
                }
            }
            return value;
        }

        return null;
    }

    public void setValue(Object value) {
        if (simpleCmsProperty != null) {

            if (value != null) {

                valueIsNull = false;

                if (value instanceof Date) {

                    //Special case. Must create calendar instances
                    Calendar cal = Calendar.getInstance();
                    cal.setTime((Date) value);
                    value = cal;
                } else if (value instanceof String) {

                    if (StringUtils.isBlank((String) value)) {
                        value = null;
                        valueIsNull = true;
                    } else {
                        if (ValueType.Long == simpleCmsProperty.getValueType()) {
                            try {
                                value = Long.valueOf((String) value);
                            } catch (NumberFormatException e) {
                                setTemporaryValue(value);
                                return;
                            }
                        } else if (ValueType.Double == simpleCmsProperty.getValueType()) {
                            try {
                                value = Double.valueOf((String) value);
                            } catch (NumberFormatException e) {

                                setTemporaryValue(value);

                                return;
                            }
                        }
                    }
                }

            } else {
                valueIsNull = true;
            }

            if (simpleCmsProperty.getPropertyDefinition().isMultiple()) {
                if (valueIndex >= simpleCmsProperty.getSimpleTypeValues().size()) {
                    //User has added a new value to list. Append list regardless of value index
                    //This is done to cover the following case
                    //Suppose list has already two values with indexes 0 and 1 and user
                    //adds a new value. The property value list has two values (index = 1) but 
                    //value index of the value wrapper becomes 2.
                    //If we call method list.set(index, value)
                    //it will throw an exception. Thus it is safe to just add value to the
                    //end of the list if the value is not null
                    if (value != null) {
                        simpleCmsProperty.addSimpleTypeValue(value);
                    }
                } else {
                    simpleCmsProperty.getSimpleTypeValues().set(valueIndex, value);
                }
            } else {
                //Single value. Ignore value index and replace value
                simpleCmsProperty.setSimpleTypeValue(value);
            }

            tempValue = null;
        }
    }

    private void setTemporaryValue(Object value) {

        tempValue = value;

        cmsPropertyValidatorVisitor.registerInvalidSimpleCmsPropertyWithTempValue(this);
    }

    public boolean isImageMimeType() {
        return binaryChannelValue != null && binaryChannelValue.getMimeType() != null
                && binaryChannelValue.getMimeType().startsWith("image");
    }

    // we need this in order to determine if we can show the image inline
    public boolean isJPGorPNGorGIFImage() {
        return binaryChannelValue != null && binaryChannelValue.getMimeType() != null
                && (binaryChannelValue.getMimeType().equals("image/jpeg")
                        || binaryChannelValue.getMimeType().equals("image/png")
                        || binaryChannelValue.getMimeType().equals("image/x-png")
                        || binaryChannelValue.getMimeType().equals("image/gif"));
    }

    // we need this in order to determine if we can show the text of the pdf file inline
    public boolean isPdfFile() {
        return binaryChannelValue != null && binaryChannelValue.getMimeType() != null
                && (binaryChannelValue.getMimeType().equals("application/pdf")
                        || binaryChannelValue.getMimeType().equals("application/x-pdf"));
    }

    // we need this in order to determine if we can show the text of the word file inline
    public boolean isWordFile() {
        return binaryChannelValue != null && binaryChannelValue.getMimeType() != null
                && (binaryChannelValue.getMimeType().equals("application/msword"));
    }

    public String getPlainTextPreviewOfPdfFile() {
        PdfToTextExtractor pdfToTextExtractor = new PdfToTextExtractor();
        try {
            return pdfToTextExtractor.extractPdfToText(binaryChannelValue.getContent(), 1, 0, false, false, null);
        } catch (Exception e) {
            logger.error("Error while converting pdf file to text", e);
            return null;
        }
    }

    public String getMimeTypeIconPath() {

        if (mimeTypeIconFilePath != null)
            return mimeTypeIconFilePath;

        // The Default Icon if we do not find a more appropriate one
        String mimeTypeIconPath = "images/cms-icons/text1.png";

        if (binaryChannelValue != null && binaryChannelValue.getMimeType() != null) {
            try {
                mimeTypeIconFilePath = "images/mime-type_icons/" + binaryChannelValue.getMimeType() + ".png";
                ServletContextResource mimeTypeIconResource = new ServletContextResource(
                        (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext(),
                        mimeTypeIconFilePath);
                if (mimeTypeIconResource.exists())
                    return mimeTypeIconFilePath;
                else {
                    logger.warn("No icon found for mime type " + binaryChannelValue.getMimeType() + " for file "
                            + binaryChannelValue.getSourceFilename());
                    mimeTypeIconFilePath = mimeTypeIconPath;
                }
            } catch (Exception e) {
                logger.error("No icon found for mime type " + binaryChannelValue.getMimeType() + " for file "
                        + binaryChannelValue.getSourceFilename(), e);
                mimeTypeIconFilePath = mimeTypeIconPath;
            }

        }

        return mimeTypeIconFilePath;
    }

    public boolean isRichTextCmsProperty() {
        return simpleCmsProperty != null && ValueType.String == simpleCmsProperty.getValueType()
                && StringFormat.RichText == ((StringPropertyDefinition) simpleCmsProperty.getPropertyDefinition())
                        .getStringFormat();
    }

    public String getSimpleCmsPropertyLocalizedLabelOfFullPathforLocale() {
        if (simpleCmsProperty != null)
            return simpleCmsProperty
                    .getLocalizedLabelOfFullPathforLocaleWithDelimiter(JSFUtilities.getLocaleAsString(), " > ");

        return "";
    }

    public String getFirstSentenceOfRichTextValue() {
        if (!isRichTextCmsProperty())
            return "";

        String richText = (String) getValue();
        if (StringUtils.isBlank(richText))
            return null;

        //Get first 200 characters and strip html tags
        String firstSentence = StringUtils.substring(richText.replaceAll("<(.|\n)+?>", ""), 0, 200);

        if (firstSentence != null) {
            return firstSentence + "...";
        }

        return firstSentence;
    }

    public BinaryChannel getBinaryChannelValue() {
        if (binaryChannelValue == null)
            getValue();

        return binaryChannelValue;
    }

    public boolean isContentAvailable() {

        return getBinaryChannelValue() != null //BinaryChannel value must exist 
                && (binaryChannelValue.contentExists() // BinaryChannel value has a relative system path 
                        || binaryChannelValue.isNewContentLoaded() //BinaryChannel is new and content exists
                );
    }

    public BinaryChannel getNewBinaryChannelValue() {

        binaryChannelValue = cmsRepositoryEntityFactory.newBinaryChannel();
        binaryChannelValue.setName(simpleCmsProperty.getName());
        return binaryChannelValue;
    }

    public String getLocalizedLabelForCurrentLocaleForContentObjectTypeValue() {
        if (simpleCmsProperty != null && simpleCmsProperty.getValueType() == ValueType.ObjectReference) {
            Object contentObject = getValue();

            if (contentObject != null) {
                try {
                    return ((ContentObject) contentObject).getTypeDefinition().getDisplayName()
                            .getLocalizedLabelForLocale(JSFUtilities.getLocaleAsString());
                } catch (Exception e) {
                    logger.error("", e);
                    return "";
                }
            }
        }

        return "";
    }

    public boolean isThumbnailPropertyValueWrapper() {
        return "thumbnail".equals(simpleCmsProperty.getName()) //Property should be named after 'thumbnail'
                && (simpleCmsProperty.getParentProperty() instanceof ComplexCmsRootProperty);

    }

    public void setMimeTypeIconFilePath(String mimeTypeIconFilePath) {
        this.mimeTypeIconFilePath = mimeTypeIconFilePath;
    }

    public void addDefaultValue() {

        if (simpleCmsProperty != null && simpleCmsProperty.getValueType() != null) {
            Object defaultValue = null;

            if (simpleCmsProperty.getPropertyDefinition() != null
                    && ((SimpleCmsPropertyDefinition) simpleCmsProperty.getPropertyDefinition())
                            .isSetDefaultValue()) {
                defaultValue = ((SimpleCmsPropertyDefinition) simpleCmsProperty.getPropertyDefinition())
                        .getDefaultValue();
            }

            /*if (defaultValue == null){
                
               switch (simpleCmsProperty.getValueType()) {
               case Binary:
                  defaultValue = getOrCreateNewBinaryChannelValue();
                  break;
               case Boolean:
                  defaultValue = Boolean.TRUE;
                  break;
               case Date:
                  defaultValue = Calendar.getInstance(JSFUtilities.getTimeZone(), JSFUtilities.getLocale());
                  break;
               case Double:
               case Long:
               case String:
                  break;
               case Topic:
               case ContentObject:
                  logger.warn("Try to add blank value from SimpleCmsPropertyValueWrapper where there is a specific value wrapper for "+simpleCmsProperty.getValueType());
                  break;
               case RepositoryUser:
               case Space:
                  logger.warn("Try to add blank value for unsupported simple cms property type "+simpleCmsProperty.getValueType());
                  break;
               default:
                  logger.warn("Try to add blank value for invalid simple cms property type "+simpleCmsProperty.getValueType());
                  break;
               }
            }*/

            if (defaultValue != null) {
                setValue(defaultValue);
            }
        }
    }

    public void moveUp() {
        valueIndex--;
    }

    public void moveDown() {
        valueIndex++;
    }

    /**
     * @return the unmanagedBinaryChannelRelativePath
     */
    public String getUnmanagedBinaryChannelRelativePath() {
        return unmanagedBinaryChannelRelativePath;
    }

    /**
     * @param unmanagedBinaryChannelRelativePath the unmanagedBinaryChannelRelativePath to set
     */
    public void setUnmanagedBinaryChannelRelativePath(String unmanagedBinaryChannelRelativePath) {
        this.unmanagedBinaryChannelRelativePath = unmanagedBinaryChannelRelativePath;

        binaryChannelValue = cmsRepositoryEntityFactory
                .newUnmanagedBinaryChannel(unmanagedBinaryChannelRelativePath);
        binaryChannelValue.setName(simpleCmsProperty.getName());

        setValue(binaryChannelValue);
    }

    public List<String> verifyPassword() {
        if (simpleCmsProperty instanceof StringProperty
                && ((StringProperty) simpleCmsProperty).getPropertyDefinition() != null
                && ((StringProperty) simpleCmsProperty).getPropertyDefinition().isPasswordType()) {

            if (passwordVerifier == null) {
                return Arrays.asList(JSFUtilities.getLocalizedMessage("application.unknown.error.message", null));
            } else {

                String encryptedValue = passwordVerifier.newPasswordVerified(
                        ((StringProperty) simpleCmsProperty).getPropertyDefinition().getPasswordEncryptor(),
                        (String) getValue());

                if (encryptedValue != null) {
                    setValue(encryptedValue);

                    return new ArrayList<String>();
                } else {
                    return passwordVerifier.getValidatorMessages();
                }
            }
        }

        return new ArrayList<String>();
    }

    /**
     * @return the passwordVerifier
     */
    public PasswordVerifier getPasswordVerifier() {
        return passwordVerifier;
    }

    private String getLocalizedLabelOfFullPathFromCmsProperty() {
        return (simpleCmsProperty == null ? ""
                : simpleCmsProperty.getLocalizedLabelOfFullPathforLocaleWithDelimiter(
                        JSFUtilities.getLocaleAsString(), " > "));
    }

    public String getFullPropertyPath() {
        return (simpleCmsProperty != null && simpleCmsProperty.getPropertyDefinition() != null
                ? simpleCmsProperty.getPropertyDefinition().getFullPath()
                : "");
    }

    public void clearPasswords() {
        if (passwordVerifier != null) {
            passwordVerifier.resetPasswords();
        }

    }

    public boolean isMultiple() {

        return simpleCmsProperty != null && simpleCmsProperty.getPropertyDefinition() != null
                && simpleCmsProperty.getPropertyDefinition().isMultiple();
    }

    public int getValueIndex() {
        return valueIndex;
    }

    public SimpleCmsProperty getSimpleCmsProperty() {
        return simpleCmsProperty;
    }

    public boolean hasTempValue() {
        return tempValue != null;
    }

    /**
     * @param indexOf
     */
    public void changeIndex(int index) {
        valueIndex = index;
    }

    public boolean isValueSetNull() {
        return valueIsNull;
    }

}