com.alkacon.opencms.formgenerator.CmsFileUploadField.java Source code

Java tutorial

Introduction

Here is the source code for com.alkacon.opencms.formgenerator.CmsFileUploadField.java

Source

/*
 * File   : $Source: /alkacon/cvs/alkacon/com.alkacon.opencms.formgenerator/src/com/alkacon/opencms/formgenerator/CmsFileUploadField.java,v $
 * Date   : $Date: 2011/03/09 15:14:35 $
 * Version: $Revision: 1.8 $
 *
 * This file is part of the Alkacon OpenCms Add-On Module Package
 *
 * Copyright (c) 2010 Alkacon Software GmbH (http://www.alkacon.com)
 *
 * The Alkacon OpenCms Add-On Module Package is free software: 
 * you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * The Alkacon OpenCms Add-On Module Package 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 General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with the Alkacon OpenCms Add-On Module Package.  
 * If not, see http://www.gnu.org/licenses/.
 *
 * For further information about Alkacon Software GmbH, please see the
 * company website: http://www.alkacon.com.
 *
 * For further information about OpenCms, please see the
 * project website: http://www.opencms.org.
 */

package com.alkacon.opencms.formgenerator;

import org.opencms.i18n.CmsMessages;
import org.opencms.main.CmsLog;
import org.opencms.util.CmsStringUtil;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.fileupload.FileItem;

/**
 * Represents a file upload field.<p>
 * 
 * @author Jan Baudisch
 * 
 * @version $Revision: 1.8 $
 * 
 * @since 7.0.4 
 */
public class CmsFileUploadField extends A_CmsField {

    /** HTML field type: file. */
    private static final String TYPE = "file";

    /** The size of the uploaded file. */
    private int m_fileSize;

    /**
     * Returns the type of the input field, e.g. "text" or "select".<p>
     * 
     * @return the type of the input field
     */
    public static String getStaticType() {

        return TYPE;
    }

    /**
     * @see com.alkacon.opencms.formgenerator.I_CmsField#buildHtml(CmsFormHandler, CmsMessages, String, boolean, String)
     */
    @Override
    public String buildHtml(CmsFormHandler formHandler, CmsMessages messages, String errorKey,
            boolean showMandatory, String infoKey) {

        StringBuffer buf = new StringBuffer(256);
        String infoMessage = null;
        String errorMessage = createStandardErrorMessage(errorKey, messages);

        // info message
        if (CmsStringUtil.isNotEmpty(infoKey)) {
            if (CmsFormHandler.INFO_UPLOAD_FIELD_MANDATORY_FILLED_OUT.equals(infoKey)) {
                // try to read the file name of the upload field
                String value = getValue();
                if (CmsStringUtil.isEmptyOrWhitespaceOnly(value)) {
                    // try to read the file name from the session attribute
                    FileItem fileItem = formHandler.getUploadFile(this);
                    if (fileItem != null) {
                        value = fileItem.getName();
                    }
                }
                if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(value)) {
                    value = CmsFormHandler.getTruncatedFileItemName(value);
                    infoMessage = messages.key("form.html.info.fileuploadname", value);
                }
            } else if (CmsStringUtil.isNotEmpty(getErrorMessage())) {
                infoMessage = getInfoMessage();
            }
        }

        Map<String, Object> stAttributes = new HashMap<String, Object>();
        // set info message as additional attribute
        stAttributes.put("infomessage", infoMessage);

        buf.append(createHtml(formHandler, messages, stAttributes, getType(), null, errorMessage, showMandatory));
        return buf.toString();
    }

    /**
     * @see com.alkacon.opencms.formgenerator.I_CmsField#getType()
     */
    public String getType() {

        return TYPE;
    }

    /**
     * Sets the size of the uploaded file.<p>
     * 
     * @param fileSize the file size
     */
    public void setFileSize(int fileSize) {

        m_fileSize = fileSize;
    }

    /**
     * @see com.alkacon.opencms.formgenerator.I_CmsField#validateForInfo(CmsFormHandler)
     */
    @Override
    public String validateForInfo(CmsFormHandler formHandler) {

        String validationInfo = "";
        // check the request parameter  
        String param = formHandler.getParameter(getName());
        // check the session attribute
        FileItem fileItem = formHandler.getUploadFile(this);

        if (CmsStringUtil.isNotEmpty(param) || (fileItem != null)) {
            // set the info message, if the upload field is found as parameter or in the session attribute
            validationInfo = CmsFormHandler.INFO_UPLOAD_FIELD_MANDATORY_FILLED_OUT;
        }
        return validationInfo;
    }

    /**
     * Validates the input value of this field.<p>
     * 
     * @return {@link CmsFormHandler#ERROR_VALIDATION} if validation of the input value failed
     */
    @Override
    protected String validateValue() {

        // validate non-empty values with given regular expression
        if (CmsStringUtil.isNotEmpty(getValue()) && CmsStringUtil.isNotEmpty(getValidationExpression())) {

            // get the validation expressions for document type and file size
            String valExpDocType = "";
            String valExpFileSize = "";
            // check if there are validations for document type and file size
            if (getValidationExpression().contains("|")) {
                // validation expression for document type and file size
                int indexPipe = getValidationExpression().indexOf("|");
                valExpFileSize = getValidationExpression().substring(0, indexPipe);
                valExpDocType = getValidationExpression().substring(indexPipe + 1);
            } else {
                // only validation expression for file size
                valExpFileSize = getValidationExpression();
            }

            // document type
            if (CmsStringUtil.isNotEmpty(valExpDocType)) {
                boolean docTypeOk = false;
                // get the type of the file to upload
                String selDocType = "";
                if (getValue().contains(".")) {
                    int indType = getValue().lastIndexOf(".") + 1;
                    if (getValue().length() >= indType) {
                        selDocType = getValue().substring(indType).toUpperCase();
                    }
                }
                // get the allowed document types
                int confDocStart = getValidationExpression().indexOf("|") + 1;
                // check that there are entries after the pipe symbol
                if (getValidationExpression().length() >= confDocStart) {
                    String allowedDocTypes = getValidationExpression().substring(confDocStart);
                    // make the document type string to a list
                    List<String> listDocTypes = CmsStringUtil.splitAsList(allowedDocTypes, ",");
                    // iterate over all allowed document types and check if on eof them is the selected one
                    if (listDocTypes != null) {
                        Iterator<String> iter = listDocTypes.iterator();
                        while (iter.hasNext()) {
                            // get the next allowed document type
                            String nextDocType = iter.next();
                            nextDocType = nextDocType.toUpperCase().trim();
                            // check the next allowed document type to the type of the file to upload
                            if (nextDocType.equals(selDocType)) {
                                docTypeOk = true;
                            }
                        }
                    }
                }
                // the document type is not allowed
                if (!docTypeOk) {
                    return CmsFormHandler.ERROR_VALIDATION;
                }
            }

            // file upload size
            if (CmsStringUtil.isNotEmpty(valExpFileSize)) {
                Map<String, String> substitutions = new HashMap<String, String>();
                substitutions.put("<", "");
                substitutions.put("kb", "");
                try {
                    int maxSize = Integer
                            .parseInt(CmsStringUtil.substitute(valExpFileSize.toLowerCase(), substitutions)) * 1024;
                    if (m_fileSize > maxSize) {
                        return CmsFormHandler.ERROR_VALIDATION;
                    }
                } catch (Exception e) {
                    // syntax error in regular expression, log to opencms.log
                    CmsLog.getLog(CmsFileUploadField.class)
                            .error(Messages.get().getBundle().key(Messages.LOG_ERR_PATTERN_SYNTAX_0), e);
                }
            }
        }
        return "";
    }
}