DateManager.java

/*
 * Copyright (c) 2002-2023, City of Paris
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  1. Redistributions of source code must retain the above copyright notice
 *     and the following disclaimer.
 *
 *  2. Redistributions in binary form must reproduce the above copyright notice
 *     and the following disclaimer in the documentation and/or other materials
 *     provided with the distribution.
 *
 *  3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
 *     contributors may be used to endorse or promote products derived from
 *     this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * License 1.0
 */
package fr.paris.lutece.plugins.document.service.attributes;

import fr.paris.lutece.plugins.document.business.attributes.AttributeTypeParameter;
import fr.paris.lutece.portal.service.i18n.I18nService;
import fr.paris.lutece.portal.service.util.AppLogService;
import fr.paris.lutece.util.date.DateUtil;

import java.text.ParseException;
import java.text.SimpleDateFormat;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Locale;


/**
 * Manager for Date Attribute
 */
public class DateManager extends DefaultManager
{
    private static final String TEMPLATE_CREATE_ATTRIBUTE = "admin/plugins/document/attributes/create_date.html";
    private static final String TEMPLATE_MODIFY_ATTRIBUTE = "admin/plugins/document/attributes/modify_date.html";
    private static final String TEMPLATE_CREATE_PARAMETERS_ATTRIBUTE = "admin/plugins/document/attributes/create_parameters_date.html";
    private static final String TEMPLATE_MODIFY_PARAMETERS_ATTRIBUTE = "admin/plugins/document/attributes/modify_parameters_date.html";
    private static final String PROPERTY_MESSAGE_ERROR_FORMAT_DATE = "document.message.errorDateFormat";
    private static final String[] DATE_FORMAT = {"yyyy-MM-dd HH:mm:ss", "yyyy", "MM", "MM/yyyy", "dd/MM/yyyy" };
    private static final String CHECK_ON = "on";

    /**
     * Gets the template to enter the attribute value
     * @return The template to enter the attribute value
     */
    protected String getCreateTemplate(  )
    {
        return TEMPLATE_CREATE_ATTRIBUTE;
    }

    /**
     * Gets the template to modify the attribute value
     * @return The template to modify the attribute value
     */
    protected String getModifyTemplate(  )
    {
        return TEMPLATE_MODIFY_ATTRIBUTE;
    }

    /**
     * Gets the template to enter the parameters of the attribute value
     * @return The template to enter the parameters of the attribute value
     */
    protected String getCreateParametersTemplate(  )
    {
        return TEMPLATE_CREATE_PARAMETERS_ATTRIBUTE;
    }

    /**
     * Gets the template to modify the parameters of the attribute value
     * @return The template to modify the parameters of the attribute value
     */
    protected String getModifyParametersTemplate(  )
    {
        return TEMPLATE_MODIFY_PARAMETERS_ATTRIBUTE;
    }

    /**
     * Validate the value for the attribute
     * @param nAttributeId The attribute identifier
     * @param strValue The value to check
     * @param locale The current Locale
     * @return null if valid, otherwise error message
     */
    public String validateValue( int nAttributeId, String strValue, Locale locale )
    {
        String strValidateValue = super.validateValue( nAttributeId, strValue, locale );

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

        String strValidateDate = validateDate( strValue, locale );

        if ( strValidateDate != null )
        {
            return I18nService.getLocalizedString( strValidateDate, locale );
        }

        return null;
    }

    /**
     * Validate the value for the parameters
     * @param listParameters The list of parameters to check
     * @param locale The current Locale
     * @return null if valid, otherwise message property
     */
    public String validateValueParameters( List<AttributeTypeParameter> listParameters, Locale locale )
    {
        String strValue;
        String strReturn = null;

        for ( AttributeTypeParameter parameter : listParameters )
        {
            strValue = parameter.getValueList(  ).iterator(  ).hasNext(  )
                ? parameter.getValueList(  ).iterator(  ).next(  ) : "";

            // if current date is checked, return null
            if ( strValue.equals( CHECK_ON ) )
            {
                strReturn = null;
            }
            else
            {
                // if validation failed, fill strReturn
                String strValidate = validateDate( strValue, locale );

                if ( strValidate != null )
                {
                    strReturn = strValidate;
                }
            }
        }

        return strReturn;
    }

    /**
     * Gets parameters values for the attribute
     * @param nAttributeId The attribute Id
     * @param locale The current Locale
     * @return The collection of attribute type parameters
     */
    public Collection<AttributeTypeParameter> getAttributeParametersValues( int nAttributeId, Locale locale )
    {
        Collection<AttributeTypeParameter> listParameters = super.getAttributeParametersValues( nAttributeId, locale );

        for ( AttributeTypeParameter parameter : listParameters )
        {
            if ( parameter.getValueList(  ).iterator(  ).hasNext(  ) &&
                    parameter.getValueList(  ).iterator(  ).next(  ).equals( CHECK_ON ) )
            {
                //replace CHECK_ON by current date
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat( DATE_FORMAT[3] );
                Date date = new Date(  );
                ArrayList<String> listValues = new ArrayList<String>(  );
                listValues.add( simpleDateFormat.format( date ) );
                parameter.setValueList( listValues );
            }
        }

        return listParameters;
    }

    /**
     * Validate the date for the attribute
     * @param strDate The date to check
     * @param locale The current Locale
     * @return null if valid, otherwise error message
     */
    private String validateDate( String strDate, Locale locale )
    {
        Date date = null;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(  );
        int i = 0;

        if ( ( strDate == null ) || strDate.equals( "" ) )
        {
            return null;
        }

        while ( ( date == null ) && ( i < DATE_FORMAT.length ) )
        {
            simpleDateFormat.applyPattern( DATE_FORMAT[i] );

            if ( strDate.length(  ) == DATE_FORMAT[i].length(  ) )
            {
                try
                {
                    date = simpleDateFormat.parse( strDate );
                }
                catch ( ParseException e )
                {
                    AppLogService.debug( "Bad date format" );
                }
            }

            i++;
        }

        if ( date == null )
        {
            date = DateUtil.formatDate( strDate, locale );
        }
        else if ( !simpleDateFormat.format( date ).equals( strDate ) )
        {
            return PROPERTY_MESSAGE_ERROR_FORMAT_DATE;
        }

        if ( date == null )
        {
            return PROPERTY_MESSAGE_ERROR_FORMAT_DATE;
        }

        return null;
    }
}