Skip to content

Commit

Permalink
LUT-27605: Use forms' workgroups to restrict their access (and the ac…
Browse files Browse the repository at this point in the history
…cess to their responses) to users part of the same workgroups
  • Loading branch information
atos-mohamed-b committed Feb 10, 2025
1 parent 382bab3 commit 5f63a1c
Show file tree
Hide file tree
Showing 17 changed files with 436 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
*/
package fr.paris.lutece.plugins.forms.business.form.list;

import fr.paris.lutece.api.user.User;
import fr.paris.lutece.plugins.forms.business.form.FormItemSortConfig;
import java.util.Comparator;
import java.util.List;
Expand Down Expand Up @@ -88,4 +89,30 @@ public void populateFormColumns( FormPanel formPanel, List<IFormColumn> listForm

_formListDAO.populateFormColumns( formPanel, listFormColumn, listFormFilter, nStartIndex, nPageSize, sortConfig );
}

/**
* Populate the given FormPanel with the information of the given FormColumns and FormFilters
*
* @param formPanel
* The FormPanel to populate
* @param listFormColumn
* The list of all FormColumn to use to be populated
* @param listFormFilter
* The list of FormFilter to use for retrieving the data of the columns to populate
* @param nStartIndex
* The start index of doc
* @param nPageSize
* The number of docs to load for pagination purpose
* @param sortConfig
* The comparator config
* @param user
* The current user
*/
public void populateFormColumns( FormPanel formPanel, List<IFormColumn> listFormColumn, List<FormFilter> listFormFilter, int nStartIndex, int nPageSize,
FormItemSortConfig sortConfig, User user )
{
listFormColumn.sort( Comparator.comparing( IFormColumn::getFormColumnPosition ) );

_formListDAO.populateFormColumns( formPanel, listFormColumn, listFormFilter, nStartIndex, nPageSize, sortConfig, user );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@

import fr.paris.lutece.plugins.forms.business.form.FormParameters;
import fr.paris.lutece.plugins.forms.business.form.FormResponseItem;
import fr.paris.lutece.api.user.User;
import fr.paris.lutece.plugins.forms.business.form.FormItemSortConfig;
import fr.paris.lutece.plugins.forms.business.form.column.FormColumnCell;
import fr.paris.lutece.plugins.forms.business.form.column.IFormColumn;
Expand Down Expand Up @@ -85,6 +86,22 @@ public void populateFormColumns( FormPanel formPanel, List<IFormColumn> listForm
formPanel.setFormResponseItemList( listFormResponseItem );
}

@Override
public void populateFormColumns( FormPanel formPanel, List<IFormColumn> listFormColumn, List<FormFilter> listFormFilter, int nStartIndex, int nPageSize,
FormItemSortConfig sortConfig, User user )
{
// To retrieve the values to display on the table we must have a FormPanel and a list of FormColumn
if ( formPanel == null || CollectionUtils.isEmpty( listFormColumn ) )
{
return;
}

List<FormResponseItem> listFormResponseItem = searchFormResponseItem( formPanel, listFormColumn, listFormFilter, nStartIndex, nPageSize, sortConfig,
user );

formPanel.setFormResponseItemList( listFormResponseItem );
}

@Override
public List<FormResponseItem> searchAllFormResponseItem( FormPanel formPanel, List<IFormColumn> listFormColumn, List<FormFilter> listFormFilter,
FormItemSortConfig sortConfig )
Expand Down Expand Up @@ -122,6 +139,103 @@ private List<FormResponseItem> searchFormResponseItem( FormPanel formPanel, List
return listFormResponseItem;
}

private List<FormResponseItem> searchFormResponseItem( FormPanel formPanel, List<IFormColumn> listFormColumn, List<FormFilter> listFormFilter,
int nStartIndex, int nPageSize, FormItemSortConfig sortConfig, User user )
{
// Create the list of all values of the parameter to used
List<String> listQueryParametersValues = new ArrayList<>( );

// Build the list of query part from the formPanel, the list of columns and the list of filters
List<IFormPanelInitializerQueryPart> listFormPanelInitializerQueryPart = buildFormPanelInitializerQueryPartList( formPanel, listQueryParametersValues,
user );
List<IFormColumnQueryPart> listFormColumnQueryPart = buildformColumnQueryPartList( listFormColumn );
List<IFormFilterQueryPart> listFormFilterQueryPart = buildFormFilterQueryPartList( listFormFilter, listQueryParametersValues );

List<FormResponseItem> listFormResponseItem = new ArrayList<>( );

for ( FormResponseSearchItem formResponseSearchItem : _formSearchEngine.getSearchResults( listFormPanelInitializerQueryPart, listFormColumnQueryPart,
listFormFilterQueryPart, sortConfig, nStartIndex, nPageSize, formPanel ) )
{
// Create a FormResponseItem for the current result line
FormResponseItem formResponseItem = createFormResponseItem( formResponseSearchItem );
listFormResponseItem.add( formResponseItem );

for ( IFormColumnQueryPart formColumnQueryPart : listFormColumnQueryPart )
{
FormColumnCell formColumnCell = formColumnQueryPart.getFormColumnCell( formResponseSearchItem );
formResponseItem.addFormColumnCell( formColumnCell );
}
}
return listFormResponseItem;
}

/**
* Build the list of all FormPanelInitializerQueryPart associate to all the FormPanelInitializer to retrieve from the given FormPanel
*
* @param formPanel
* The FormPanel used to retrieve the list of all FormPanelInitializer to retrieve the list of FormPanelInitializerQueryPart
* @param listQueryParametersValue
* The list of all parameter values to used to fill the DAOUtil statement
* @param user
* The current user
* @return the list of all FormPanelInitializerQueryPart associate to all the FormPanelInitializer to retrieve from the given FormPanel
*/
private static List<IFormPanelInitializerQueryPart> buildFormPanelInitializerQueryPartList( FormPanel formPanel, List<String> listQueryParametersValue,
User user )
{
List<IFormPanelInitializerQueryPart> listFormPanelInitializerQueryPart = new ArrayList<>( );

IFormPanelConfiguration formPanelConfiguration = formPanel.getFormPanelConfiguration( );

if ( formPanelConfiguration != null && !CollectionUtils.isEmpty( formPanel.getListFormPanelInitializer( ) ) )
{
List<IFormPanelInitializer> listFormPanelInitializer = formPanel.getListFormPanelInitializer( );

for ( IFormPanelInitializer formPanelInitializer : listFormPanelInitializer )
{
IFormPanelInitializerQueryPart formPanelInitializerQueryPart = retrieveFormPanelInitializerQueryPart( formPanelInitializer,
listQueryParametersValue, user );
if ( formPanelInitializerQueryPart != null )
{
listFormPanelInitializerQueryPart.add( formPanelInitializerQueryPart );
}
}
}
return listFormPanelInitializerQueryPart;
}

/**
* Retrieve the IformPanelInitializerQueryPart associate to the givenFormPanelInitializer
*
* @param formPanelInitializer
* The formPanelInitializer used to retrieve the associated IFormPanelInitializerQueryPart
* @param listQueryParametersPositionValue
* The list of all parameter values to used to fill the DAOUtil statement
* @param user
* The current user
* @return the IFormPanelInitializerQueryPart associate to the given FormPanelInitializer or null if not found
*/
private static IFormPanelInitializerQueryPart retrieveFormPanelInitializerQueryPart( IFormPanelInitializer formPanelInitializer,
List<String> listQueryParametersPositionValue, User user )
{
IFormPanelInitializerQueryPart formPanelInitializerQueryPartResult = null;

if ( formPanelInitializer != null )
{
formPanelInitializerQueryPartResult = formPanelInitializer.getIFormPanelInitializerQueryPart( user );

if ( formPanelInitializerQueryPartResult != null )
{
FormParameters formParameters = formPanelInitializer.getFormParameters( );
formPanelInitializerQueryPartResult.buildFormPanelInitializerQuery( formParameters );

List<String> listUsedParametersValues = formParameters.getListUsedParametersValue( );
listQueryParametersPositionValue.addAll( listUsedParametersValues );
}
}
return formPanelInitializerQueryPartResult;
}

/**
* Create a FormResponseItem from a DAOUtil
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
package fr.paris.lutece.plugins.forms.business.form.list;

import fr.paris.lutece.plugins.forms.business.form.FormResponseItem;
import fr.paris.lutece.api.user.User;
import fr.paris.lutece.plugins.forms.business.form.FormItemSortConfig;
import java.util.List;

Expand Down Expand Up @@ -65,6 +66,27 @@ public interface IFormListDAO
void populateFormColumns( FormPanel formPanel, List<IFormColumn> listFormColumn, List<FormFilter> listFormFilter, int nStartIndex, int nPageSize,
FormItemSortConfig sortConfig );

/**
* Populate the FormPanel with the values returned by the SQL query results
*
* @param formPanel
* The FormPanel used to retrieve the values of the FormColumn
* @param listFormColumn
* The list of FormColumn to populate
* @param listFormFilter
* The list of FormFilter used for filtering the data to retrieve
* @param nStartIndex
* The start index of doc that all will become FormResponseItem
* @param nPageSize
* The number of doc to load for pagination purpose
* @param sortConfig
* The comparator config
* @param user
* The current user
*/
void populateFormColumns( FormPanel formPanel, java.util.List<IFormColumn> listFormColumn, List<FormFilter> listFormFilter, int nStartIndex, int nPageSize,
FormItemSortConfig sortConfig, User user );

/**
* Search the Lucene Index.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
*/
package fr.paris.lutece.plugins.forms.business.form.panel.initializer;

import fr.paris.lutece.api.user.User;
import fr.paris.lutece.plugins.forms.business.form.FormParameters;
import fr.paris.lutece.plugins.forms.business.form.panel.initializer.querypart.IFormPanelInitializerQueryPart;
import fr.paris.lutece.plugins.forms.web.form.panel.display.initializer.IFormPanelDisplayInitializer;
Expand Down Expand Up @@ -64,6 +65,13 @@ public interface IFormPanelInitializer
*/
IFormPanelInitializerQueryPart getIFormPanelInitializerQueryPart( );

/**
* Get an {@link IFormPanelInitializerQueryPart} associated with this IFormPanelInitializer.
*
* @return
*/
IFormPanelInitializerQueryPart getIFormPanelInitializerQueryPart( User user );

/**
* Get an {@link IFormPanelDisplayInitializer} associated with this IFormPanelInitializer.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
*/
package fr.paris.lutece.plugins.forms.business.form.panel.initializer.impl;

import fr.paris.lutece.api.user.User;
import fr.paris.lutece.plugins.forms.business.form.panel.initializer.querypart.IFormPanelInitializerQueryPart;
import fr.paris.lutece.plugins.forms.business.form.panel.initializer.querypart.impl.FormPanelFormResponseInitializerQueryPart;
import fr.paris.lutece.plugins.forms.web.form.panel.display.initializer.IFormPanelDisplayInitializer;
Expand All @@ -43,6 +44,8 @@
*/
public class FormPanelFormResponseInitializer extends AbstractFormPanelInitializer
{
public User _user;

@Override
public IFormPanelInitializerQueryPart getIFormPanelInitializerQueryPart( )
{
Expand All @@ -54,4 +57,10 @@ public IFormPanelDisplayInitializer getFormPanelDisplayInitializer( )
{
return new FormPanelFormResponseDisplayInitializer( );
}

@Override
public IFormPanelInitializerQueryPart getIFormPanelInitializerQueryPart( User user )
{
return new FormPanelFormResponseInitializerQueryPart( _user );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
*/
package fr.paris.lutece.plugins.forms.business.form.panel.initializer.impl;

import fr.paris.lutece.api.user.User;
import fr.paris.lutece.plugins.forms.business.form.panel.initializer.querypart.IFormPanelInitializerQueryPart;
import fr.paris.lutece.plugins.forms.business.form.panel.initializer.querypart.impl.FormPanelFormsInitializerQueryPart;
import fr.paris.lutece.plugins.forms.web.form.panel.display.initializer.IFormPanelDisplayInitializer;
Expand All @@ -49,6 +50,12 @@ public IFormPanelInitializerQueryPart getIFormPanelInitializerQueryPart( )
return new FormPanelFormsInitializerQueryPart( );
}

@Override
public IFormPanelInitializerQueryPart getIFormPanelInitializerQueryPart( User user )
{
return new FormPanelFormsInitializerQueryPart( user );
}

@Override
public IFormPanelDisplayInitializer getFormPanelDisplayInitializer( )
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,24 @@
*/
package fr.paris.lutece.plugins.forms.business.form.panel.initializer.querypart.impl;

import fr.paris.lutece.api.user.User;
import fr.paris.lutece.plugins.forms.business.form.FormParameters;

/**
* Implementation of the IFormFilterQueryPart for a FormFilterPanelFormResponse filter
*/
public class FormPanelFormResponseInitializerQueryPart extends AbstractFormPanelInitializerQueryPart
{
public FormPanelFormResponseInitializerQueryPart( User user )
{
super( );
}

public FormPanelFormResponseInitializerQueryPart( )
{
super( );
}

/**
* {@inheritDoc}
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,23 @@
*/
package fr.paris.lutece.plugins.forms.business.form.panel.initializer.querypart.impl;

import fr.paris.lutece.api.user.User;
import fr.paris.lutece.plugins.forms.business.Form;
import fr.paris.lutece.plugins.forms.business.FormHome;
import fr.paris.lutece.plugins.forms.business.form.FormParameters;
import fr.paris.lutece.plugins.forms.util.FormsConstants;
import fr.paris.lutece.portal.service.workgroup.AdminWorkgroupService;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.apache.lucene.document.IntPoint;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.BooleanQuery.Builder;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.search.Query;

/**
* Implementation of the FormPanelInitializerQueryPart associate to the FormPanelFormsInitializer
Expand All @@ -50,6 +65,60 @@ public FormPanelFormsInitializerQueryPart( )
setFormPanelInitializerSelectQuery( new MatchAllDocsQuery( ) );
}

/**
* Constructor used to build a query that selects the Forms that the user can access
*
* @param user
* The HTTP user
*/
public FormPanelFormsInitializerQueryPart( User user )
{
super( );
List<Form> listForms = FormHome.getFormList( );
listForms = (List<Form>) AdminWorkgroupService.getAuthorizedCollection( listForms, user );
List<Integer> listIds = new ArrayList<>( );
for ( Form form : listForms )
{
listIds.add( form.getId( ) );
}
// sort the list
Collections.sort( listIds );
List<List<Integer>> listIdsList = new ArrayList<>( );
for ( int i = 0; i < listIds.size( ); i++ )
{
// if there is a gap between the current id and the previous we create a new list
if ( i == 0 || listIds.get( i ) != listIds.get( i - 1 ) + 1 )
{
listIdsList.add( new ArrayList<>( ) );
}
listIdsList.get( listIdsList.size( ) - 1 ).add( listIds.get( i ) );
}
List<Query> queries = new ArrayList<>( );
if ( !listIdsList.isEmpty( ) && listIdsList.get( 0 ) != null && !listIdsList.get( 0 ).isEmpty( ) )
{
for ( int i = 0; i < listIdsList.size( ); i++ )
{
if ( listIdsList.get( i ).size( ) == 1 )
{
queries.add( IntPoint.newExactQuery( FormsConstants.PARAMETER_ID_FORM, listIdsList.get( i ).get( 0 ) ) );
}
else
{
queries.add( IntPoint.newRangeQuery( FormsConstants.PARAMETER_ID_FORM, listIdsList.get( i ).get( 0 ),
listIdsList.get( i ).get( listIdsList.get( i ).size( ) - 1 ) ) );
}
}
}
Builder builder = new BooleanQuery.Builder( );
for ( Query query : queries )
{
builder.add( query, BooleanClause.Occur.SHOULD );
}
Query queryForms = builder.build( );

setFormPanelInitializerSelectQuery( queryForms );
}

/**
* {@inheritDoc}
*/
Expand Down
Loading

0 comments on commit 5f63a1c

Please sign in to comment.