IdentitiesHistoryJspBean.java

package fr.paris.lutece.plugins.identitystore.web;


import fr.paris.lutece.plugins.identitystore.business.identity.IdentityHome;
import fr.paris.lutece.plugins.identitystore.service.history.IdentityHistoryService;
import fr.paris.lutece.plugins.identitystore.utils.Batch;
import fr.paris.lutece.plugins.identitystore.v3.csv.CsvIdentityService;
import fr.paris.lutece.plugins.identitystore.v3.web.rs.dto.common.IdentityDto;
import fr.paris.lutece.plugins.identitystore.v3.web.rs.dto.history.IdentityChange;
import fr.paris.lutece.plugins.identitystore.v3.web.rs.dto.history.IdentityChangeType;
import fr.paris.lutece.portal.service.admin.AccessDeniedException;
import fr.paris.lutece.portal.service.util.AppPropertiesService;
import fr.paris.lutece.portal.util.mvc.admin.annotations.Controller;
import fr.paris.lutece.portal.util.mvc.commons.annotations.Action;
import fr.paris.lutece.portal.util.mvc.commons.annotations.View;
import org.apache.commons.lang3.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayOutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

@Controller( controllerJsp = "IdentitiesHistory.jsp", controllerPath = "jsp/admin/plugins/identitystore/", right = "IDENTITYSTORE_MANAGEMENT" )
public class IdentitiesHistoryJspBean extends ManageIdentitiesJspBean
{
    //Templates
    private static final String TEMPLATE_IDENTITIES_HISTORY = "/admin/plugins/identitystore/identities_history.html";
    //Parameters
    private static final Integer DAYS_FROM_HYSTORY = 0;
    //Properties
    private static final String PROPERTY_PAGE_TITLE_IDENTITIES_HISTORY = "";
    private static final String PROPERTY_FEATURE_HISTORY_SEARCH = "historySearch";
    //Markers
    private static final String MARK_IDENTITY_CHANGE_LIST = "identity_change_list";
    private static final String JSP_IDENTITIES_HISTORY = "jsp/admin/plugins/identitystore/IdentitiesHistory.jsp";

    //Views
    private static final String VIEW_IDENTITIES_HISTORY = "viewIdentitiesHistory";

    //Actions
    private static final String ACTION_EXPORT_IDENTITIES = "exportIdentities";

    //Infos
    private static final int BATCH_PARTITION_SIZE = AppPropertiesService.getPropertyInt( "identitystore.export.batch.size", 100 );

    // Session variable to store working values
    private final List<IdentityDto> _identities = new ArrayList<>( );
    List<IdentityChange> _historyList = new ArrayList<>();
    private List<String> _listQuery = new ArrayList<>( );

    @View( value = VIEW_IDENTITIES_HISTORY, defaultView = true )
    public String getIdentitiesHistory( HttpServletRequest request )
    {
        _identities.clear( );
        _historyList.clear();
        final Map<String, String> queryParameters = this.getQueryParameters( request );
        final String cuid = queryParameters.get( QUERY_PARAM_CUID ) != null ?
                queryParameters.get( QUERY_PARAM_CUID ) : "";
        final String type = queryParameters.get( QUERY_PARAM_TYPE ) != null ?
                StringUtils.replace(queryParameters.get( QUERY_PARAM_TYPE ).toUpperCase(), " ", "_") : "";
        final String status = queryParameters.get( QUERY_PARAM_STATUS ) != null ?
                queryParameters.get( QUERY_PARAM_STATUS ) : "";
        final String author_type = queryParameters.get( QUERY_PARAM_AUTHOR_TYPE ) != null ?
                queryParameters.get( QUERY_PARAM_AUTHOR_TYPE ) : "";
        final String author_name = queryParameters.get( QUERY_PARAM_AUTHOR_NAME ) != null ?
                queryParameters.get( QUERY_PARAM_AUTHOR_NAME ) : "";
        final String client_code = queryParameters.get( QUERY_PARAM_CLIENT_CODE ) != null ?
                queryParameters.get( QUERY_PARAM_CLIENT_CODE ) : "";
        final String date = queryParameters.get( QUERY_PARAM_DATE ) != null ?
                queryParameters.get( QUERY_PARAM_DATE ) : "";
        Date modificationDate = null;
        if(StringUtils.isNotBlank(date))
        {
            try
            {
                List<String> listDate = Arrays.asList(date.replaceAll("-","/").split("/"));
                String dateFormated = listDate.get(2) + "/" + listDate.get(1) + "/" + listDate.get(0);
                modificationDate = new SimpleDateFormat("dd/MM/yyyy").parse(dateFormated);
            } catch (ParseException e)
            {
                addError(e.getMessage());
                return redirectView(request, VIEW_IDENTITIES_HISTORY);
            }
        }

        List<String> typeList = new ArrayList<>();
        List<String> statusList = IdentityHistoryService.instance().getStatusList();
        try
        {
            if( StringUtils.isNotBlank( cuid ) || StringUtils.isNotBlank( type ) ||
                    StringUtils.isNotBlank( date ) || StringUtils.isNotBlank( author_type ) || StringUtils.isNotBlank( author_name ) ||
                    StringUtils.isNotBlank( client_code ) || StringUtils.isNotBlank(status))
            {
                if(StringUtils.isNotBlank( type ))
                {
                    _historyList.addAll(IdentityHome.findHistoryBySearchParameters(cuid, client_code, author_name,
                            IdentityChangeType.valueOf(type), status, author_type, modificationDate, null, DAYS_FROM_HYSTORY, null, 0));
                }
                else
                {
                    _historyList.addAll(IdentityHome.findHistoryBySearchParameters(cuid, client_code, author_name,
                            null, status, author_type, modificationDate, null, DAYS_FROM_HYSTORY, null, 0));
                }
            }
        }
        catch( Exception e )
        {
            addError( e.getMessage( ) );
            this.clearParameters( request );
            return redirectView( request, VIEW_IDENTITIES_HISTORY );
        }

        for( IdentityChangeType value : IdentityChangeType.values())
        {
            typeList.add(value.toString());
        }

        Map<String, Object> model = getPaginatedListModel(request, MARK_IDENTITY_CHANGE_LIST, _historyList, JSP_IDENTITIES_HISTORY);

        model.put(QUERY_PARAM_CUID, cuid);
        model.put(QUERY_PARAM_TYPE, type);
        model.put(QUERY_PARAM_STATUS, status);
        model.put(QUERY_PARAM_DATE, date);
        model.put(QUERY_PARAM_AUTHOR_TYPE, author_type);
        model.put(QUERY_PARAM_AUTHOR_NAME, author_name);
        model.put(QUERY_PARAM_CLIENT_CODE, client_code);
        model.put(QUERY_PARAM_TYPE_LIST, typeList);
        model.put(QUERY_PARAM_STATUS_LIST, statusList);

        return getPage( PROPERTY_PAGE_TITLE_IDENTITIES_HISTORY, TEMPLATE_IDENTITIES_HISTORY, model );
    }

    /**
     * Process the data capture form of a new suspiciousidentity
     *
     * @param request
     *            The Http Request
     * @return The Jsp URL of the process result
     * @throws AccessDeniedException
     */
    @Action( ACTION_EXPORT_IDENTITIES )
    public void doExportIdentities( HttpServletRequest request )
    {
        try
        {
            final Batch<IdentityChange> batches = Batch.ofSize( _historyList, BATCH_PARTITION_SIZE );

            final ByteArrayOutputStream outputStream = new ByteArrayOutputStream( );
            final ZipOutputStream zipOut = new ZipOutputStream( outputStream );

            int i = 0;
            for ( final List<IdentityChange> batch : batches )
            {
                final byte [ ] bytes = CsvIdentityService.instance( ).writeChange( batch );
                final ZipEntry zipEntry = new ZipEntry( "identities-" + ++i + ".csv" );
                zipEntry.setSize( bytes.length );
                zipOut.putNextEntry( zipEntry );
                zipOut.write( bytes );
            }
            zipOut.closeEntry( );
            zipOut.close( );
            this.download( outputStream.toByteArray( ), "identitiesHistory.zip", "application/zip" );
        }
        catch( Exception e )
        {
            addError( e.getMessage( ) );
            redirectView( request, VIEW_IDENTITIES_HISTORY );
        }
    }

    private Map<String, String> getHisotryQueryParameters(HttpServletRequest request )
    {
        Map<String, String> queryParameters = new HashMap<>();

        _listQuery.forEach(queryParameter -> {
            final String param = request.getParameter( queryParameter );
            if ( param != null )
            {
                queryParameters.put( queryParameter, param );
            }
        });

        return queryParameters;
    }


}