Skip to content

Commit 5f63a1c

Browse files
LUT-27605: Use forms' workgroups to restrict their access (and the access to their responses) to users part of the same workgroups
1 parent 382bab3 commit 5f63a1c

17 files changed

+436
-7
lines changed

src/java/fr/paris/lutece/plugins/forms/business/form/list/FormListFacade.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
*/
3434
package fr.paris.lutece.plugins.forms.business.form.list;
3535

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

8990
_formListDAO.populateFormColumns( formPanel, listFormColumn, listFormFilter, nStartIndex, nPageSize, sortConfig );
9091
}
92+
93+
/**
94+
* Populate the given FormPanel with the information of the given FormColumns and FormFilters
95+
*
96+
* @param formPanel
97+
* The FormPanel to populate
98+
* @param listFormColumn
99+
* The list of all FormColumn to use to be populated
100+
* @param listFormFilter
101+
* The list of FormFilter to use for retrieving the data of the columns to populate
102+
* @param nStartIndex
103+
* The start index of doc
104+
* @param nPageSize
105+
* The number of docs to load for pagination purpose
106+
* @param sortConfig
107+
* The comparator config
108+
* @param user
109+
* The current user
110+
*/
111+
public void populateFormColumns( FormPanel formPanel, List<IFormColumn> listFormColumn, List<FormFilter> listFormFilter, int nStartIndex, int nPageSize,
112+
FormItemSortConfig sortConfig, User user )
113+
{
114+
listFormColumn.sort( Comparator.comparing( IFormColumn::getFormColumnPosition ) );
115+
116+
_formListDAO.populateFormColumns( formPanel, listFormColumn, listFormFilter, nStartIndex, nPageSize, sortConfig, user );
117+
}
91118
}

src/java/fr/paris/lutece/plugins/forms/business/form/list/FormListLuceneDAO.java

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141

4242
import fr.paris.lutece.plugins.forms.business.form.FormParameters;
4343
import fr.paris.lutece.plugins.forms.business.form.FormResponseItem;
44+
import fr.paris.lutece.api.user.User;
4445
import fr.paris.lutece.plugins.forms.business.form.FormItemSortConfig;
4546
import fr.paris.lutece.plugins.forms.business.form.column.FormColumnCell;
4647
import fr.paris.lutece.plugins.forms.business.form.column.IFormColumn;
@@ -85,6 +86,22 @@ public void populateFormColumns( FormPanel formPanel, List<IFormColumn> listForm
8586
formPanel.setFormResponseItemList( listFormResponseItem );
8687
}
8788

89+
@Override
90+
public void populateFormColumns( FormPanel formPanel, List<IFormColumn> listFormColumn, List<FormFilter> listFormFilter, int nStartIndex, int nPageSize,
91+
FormItemSortConfig sortConfig, User user )
92+
{
93+
// To retrieve the values to display on the table we must have a FormPanel and a list of FormColumn
94+
if ( formPanel == null || CollectionUtils.isEmpty( listFormColumn ) )
95+
{
96+
return;
97+
}
98+
99+
List<FormResponseItem> listFormResponseItem = searchFormResponseItem( formPanel, listFormColumn, listFormFilter, nStartIndex, nPageSize, sortConfig,
100+
user );
101+
102+
formPanel.setFormResponseItemList( listFormResponseItem );
103+
}
104+
88105
@Override
89106
public List<FormResponseItem> searchAllFormResponseItem( FormPanel formPanel, List<IFormColumn> listFormColumn, List<FormFilter> listFormFilter,
90107
FormItemSortConfig sortConfig )
@@ -122,6 +139,103 @@ private List<FormResponseItem> searchFormResponseItem( FormPanel formPanel, List
122139
return listFormResponseItem;
123140
}
124141

142+
private List<FormResponseItem> searchFormResponseItem( FormPanel formPanel, List<IFormColumn> listFormColumn, List<FormFilter> listFormFilter,
143+
int nStartIndex, int nPageSize, FormItemSortConfig sortConfig, User user )
144+
{
145+
// Create the list of all values of the parameter to used
146+
List<String> listQueryParametersValues = new ArrayList<>( );
147+
148+
// Build the list of query part from the formPanel, the list of columns and the list of filters
149+
List<IFormPanelInitializerQueryPart> listFormPanelInitializerQueryPart = buildFormPanelInitializerQueryPartList( formPanel, listQueryParametersValues,
150+
user );
151+
List<IFormColumnQueryPart> listFormColumnQueryPart = buildformColumnQueryPartList( listFormColumn );
152+
List<IFormFilterQueryPart> listFormFilterQueryPart = buildFormFilterQueryPartList( listFormFilter, listQueryParametersValues );
153+
154+
List<FormResponseItem> listFormResponseItem = new ArrayList<>( );
155+
156+
for ( FormResponseSearchItem formResponseSearchItem : _formSearchEngine.getSearchResults( listFormPanelInitializerQueryPart, listFormColumnQueryPart,
157+
listFormFilterQueryPart, sortConfig, nStartIndex, nPageSize, formPanel ) )
158+
{
159+
// Create a FormResponseItem for the current result line
160+
FormResponseItem formResponseItem = createFormResponseItem( formResponseSearchItem );
161+
listFormResponseItem.add( formResponseItem );
162+
163+
for ( IFormColumnQueryPart formColumnQueryPart : listFormColumnQueryPart )
164+
{
165+
FormColumnCell formColumnCell = formColumnQueryPart.getFormColumnCell( formResponseSearchItem );
166+
formResponseItem.addFormColumnCell( formColumnCell );
167+
}
168+
}
169+
return listFormResponseItem;
170+
}
171+
172+
/**
173+
* Build the list of all FormPanelInitializerQueryPart associate to all the FormPanelInitializer to retrieve from the given FormPanel
174+
*
175+
* @param formPanel
176+
* The FormPanel used to retrieve the list of all FormPanelInitializer to retrieve the list of FormPanelInitializerQueryPart
177+
* @param listQueryParametersValue
178+
* The list of all parameter values to used to fill the DAOUtil statement
179+
* @param user
180+
* The current user
181+
* @return the list of all FormPanelInitializerQueryPart associate to all the FormPanelInitializer to retrieve from the given FormPanel
182+
*/
183+
private static List<IFormPanelInitializerQueryPart> buildFormPanelInitializerQueryPartList( FormPanel formPanel, List<String> listQueryParametersValue,
184+
User user )
185+
{
186+
List<IFormPanelInitializerQueryPart> listFormPanelInitializerQueryPart = new ArrayList<>( );
187+
188+
IFormPanelConfiguration formPanelConfiguration = formPanel.getFormPanelConfiguration( );
189+
190+
if ( formPanelConfiguration != null && !CollectionUtils.isEmpty( formPanel.getListFormPanelInitializer( ) ) )
191+
{
192+
List<IFormPanelInitializer> listFormPanelInitializer = formPanel.getListFormPanelInitializer( );
193+
194+
for ( IFormPanelInitializer formPanelInitializer : listFormPanelInitializer )
195+
{
196+
IFormPanelInitializerQueryPart formPanelInitializerQueryPart = retrieveFormPanelInitializerQueryPart( formPanelInitializer,
197+
listQueryParametersValue, user );
198+
if ( formPanelInitializerQueryPart != null )
199+
{
200+
listFormPanelInitializerQueryPart.add( formPanelInitializerQueryPart );
201+
}
202+
}
203+
}
204+
return listFormPanelInitializerQueryPart;
205+
}
206+
207+
/**
208+
* Retrieve the IformPanelInitializerQueryPart associate to the givenFormPanelInitializer
209+
*
210+
* @param formPanelInitializer
211+
* The formPanelInitializer used to retrieve the associated IFormPanelInitializerQueryPart
212+
* @param listQueryParametersPositionValue
213+
* The list of all parameter values to used to fill the DAOUtil statement
214+
* @param user
215+
* The current user
216+
* @return the IFormPanelInitializerQueryPart associate to the given FormPanelInitializer or null if not found
217+
*/
218+
private static IFormPanelInitializerQueryPart retrieveFormPanelInitializerQueryPart( IFormPanelInitializer formPanelInitializer,
219+
List<String> listQueryParametersPositionValue, User user )
220+
{
221+
IFormPanelInitializerQueryPart formPanelInitializerQueryPartResult = null;
222+
223+
if ( formPanelInitializer != null )
224+
{
225+
formPanelInitializerQueryPartResult = formPanelInitializer.getIFormPanelInitializerQueryPart( user );
226+
227+
if ( formPanelInitializerQueryPartResult != null )
228+
{
229+
FormParameters formParameters = formPanelInitializer.getFormParameters( );
230+
formPanelInitializerQueryPartResult.buildFormPanelInitializerQuery( formParameters );
231+
232+
List<String> listUsedParametersValues = formParameters.getListUsedParametersValue( );
233+
listQueryParametersPositionValue.addAll( listUsedParametersValues );
234+
}
235+
}
236+
return formPanelInitializerQueryPartResult;
237+
}
238+
125239
/**
126240
* Create a FormResponseItem from a DAOUtil
127241
*

src/java/fr/paris/lutece/plugins/forms/business/form/list/IFormListDAO.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
package fr.paris.lutece.plugins.forms.business.form.list;
3535

3636
import fr.paris.lutece.plugins.forms.business.form.FormResponseItem;
37+
import fr.paris.lutece.api.user.User;
3738
import fr.paris.lutece.plugins.forms.business.form.FormItemSortConfig;
3839
import java.util.List;
3940

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

69+
/**
70+
* Populate the FormPanel with the values returned by the SQL query results
71+
*
72+
* @param formPanel
73+
* The FormPanel used to retrieve the values of the FormColumn
74+
* @param listFormColumn
75+
* The list of FormColumn to populate
76+
* @param listFormFilter
77+
* The list of FormFilter used for filtering the data to retrieve
78+
* @param nStartIndex
79+
* The start index of doc that all will become FormResponseItem
80+
* @param nPageSize
81+
* The number of doc to load for pagination purpose
82+
* @param sortConfig
83+
* The comparator config
84+
* @param user
85+
* The current user
86+
*/
87+
void populateFormColumns( FormPanel formPanel, java.util.List<IFormColumn> listFormColumn, List<FormFilter> listFormFilter, int nStartIndex, int nPageSize,
88+
FormItemSortConfig sortConfig, User user );
89+
6890
/**
6991
* Search the Lucene Index.
7092
*

src/java/fr/paris/lutece/plugins/forms/business/form/panel/initializer/IFormPanelInitializer.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
*/
3434
package fr.paris.lutece.plugins.forms.business.form.panel.initializer;
3535

36+
import fr.paris.lutece.api.user.User;
3637
import fr.paris.lutece.plugins.forms.business.form.FormParameters;
3738
import fr.paris.lutece.plugins.forms.business.form.panel.initializer.querypart.IFormPanelInitializerQueryPart;
3839
import fr.paris.lutece.plugins.forms.web.form.panel.display.initializer.IFormPanelDisplayInitializer;
@@ -64,6 +65,13 @@ public interface IFormPanelInitializer
6465
*/
6566
IFormPanelInitializerQueryPart getIFormPanelInitializerQueryPart( );
6667

68+
/**
69+
* Get an {@link IFormPanelInitializerQueryPart} associated with this IFormPanelInitializer.
70+
*
71+
* @return
72+
*/
73+
IFormPanelInitializerQueryPart getIFormPanelInitializerQueryPart( User user );
74+
6775
/**
6876
* Get an {@link IFormPanelDisplayInitializer} associated with this IFormPanelInitializer.
6977
*

src/java/fr/paris/lutece/plugins/forms/business/form/panel/initializer/impl/FormPanelFormResponseInitializer.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
*/
3434
package fr.paris.lutece.plugins.forms.business.form.panel.initializer.impl;
3535

36+
import fr.paris.lutece.api.user.User;
3637
import fr.paris.lutece.plugins.forms.business.form.panel.initializer.querypart.IFormPanelInitializerQueryPart;
3738
import fr.paris.lutece.plugins.forms.business.form.panel.initializer.querypart.impl.FormPanelFormResponseInitializerQueryPart;
3839
import fr.paris.lutece.plugins.forms.web.form.panel.display.initializer.IFormPanelDisplayInitializer;
@@ -43,6 +44,8 @@
4344
*/
4445
public class FormPanelFormResponseInitializer extends AbstractFormPanelInitializer
4546
{
47+
public User _user;
48+
4649
@Override
4750
public IFormPanelInitializerQueryPart getIFormPanelInitializerQueryPart( )
4851
{
@@ -54,4 +57,10 @@ public IFormPanelDisplayInitializer getFormPanelDisplayInitializer( )
5457
{
5558
return new FormPanelFormResponseDisplayInitializer( );
5659
}
60+
61+
@Override
62+
public IFormPanelInitializerQueryPart getIFormPanelInitializerQueryPart( User user )
63+
{
64+
return new FormPanelFormResponseInitializerQueryPart( _user );
65+
}
5766
}

src/java/fr/paris/lutece/plugins/forms/business/form/panel/initializer/impl/FormPanelFormsInitializer.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
*/
3434
package fr.paris.lutece.plugins.forms.business.form.panel.initializer.impl;
3535

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

53+
@Override
54+
public IFormPanelInitializerQueryPart getIFormPanelInitializerQueryPart( User user )
55+
{
56+
return new FormPanelFormsInitializerQueryPart( user );
57+
}
58+
5259
@Override
5360
public IFormPanelDisplayInitializer getFormPanelDisplayInitializer( )
5461
{

src/java/fr/paris/lutece/plugins/forms/business/form/panel/initializer/querypart/impl/FormPanelFormResponseInitializerQueryPart.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,24 @@
3333
*/
3434
package fr.paris.lutece.plugins.forms.business.form.panel.initializer.querypart.impl;
3535

36+
import fr.paris.lutece.api.user.User;
3637
import fr.paris.lutece.plugins.forms.business.form.FormParameters;
3738

3839
/**
3940
* Implementation of the IFormFilterQueryPart for a FormFilterPanelFormResponse filter
4041
*/
4142
public class FormPanelFormResponseInitializerQueryPart extends AbstractFormPanelInitializerQueryPart
4243
{
44+
public FormPanelFormResponseInitializerQueryPart( User user )
45+
{
46+
super( );
47+
}
48+
49+
public FormPanelFormResponseInitializerQueryPart( )
50+
{
51+
super( );
52+
}
53+
4354
/**
4455
* {@inheritDoc}
4556
*/

src/java/fr/paris/lutece/plugins/forms/business/form/panel/initializer/querypart/impl/FormPanelFormsInitializerQueryPart.java

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,23 @@
3333
*/
3434
package fr.paris.lutece.plugins.forms.business.form.panel.initializer.querypart.impl;
3535

36+
import fr.paris.lutece.api.user.User;
37+
import fr.paris.lutece.plugins.forms.business.Form;
38+
import fr.paris.lutece.plugins.forms.business.FormHome;
3639
import fr.paris.lutece.plugins.forms.business.form.FormParameters;
40+
import fr.paris.lutece.plugins.forms.util.FormsConstants;
41+
import fr.paris.lutece.portal.service.workgroup.AdminWorkgroupService;
42+
43+
import java.util.ArrayList;
44+
import java.util.Collections;
45+
import java.util.List;
46+
47+
import org.apache.lucene.document.IntPoint;
48+
import org.apache.lucene.search.BooleanClause;
49+
import org.apache.lucene.search.BooleanQuery;
50+
import org.apache.lucene.search.BooleanQuery.Builder;
3751
import org.apache.lucene.search.MatchAllDocsQuery;
52+
import org.apache.lucene.search.Query;
3853

3954
/**
4055
* Implementation of the FormPanelInitializerQueryPart associate to the FormPanelFormsInitializer
@@ -50,6 +65,60 @@ public FormPanelFormsInitializerQueryPart( )
5065
setFormPanelInitializerSelectQuery( new MatchAllDocsQuery( ) );
5166
}
5267

68+
/**
69+
* Constructor used to build a query that selects the Forms that the user can access
70+
*
71+
* @param user
72+
* The HTTP user
73+
*/
74+
public FormPanelFormsInitializerQueryPart( User user )
75+
{
76+
super( );
77+
List<Form> listForms = FormHome.getFormList( );
78+
listForms = (List<Form>) AdminWorkgroupService.getAuthorizedCollection( listForms, user );
79+
List<Integer> listIds = new ArrayList<>( );
80+
for ( Form form : listForms )
81+
{
82+
listIds.add( form.getId( ) );
83+
}
84+
// sort the list
85+
Collections.sort( listIds );
86+
List<List<Integer>> listIdsList = new ArrayList<>( );
87+
for ( int i = 0; i < listIds.size( ); i++ )
88+
{
89+
// if there is a gap between the current id and the previous we create a new list
90+
if ( i == 0 || listIds.get( i ) != listIds.get( i - 1 ) + 1 )
91+
{
92+
listIdsList.add( new ArrayList<>( ) );
93+
}
94+
listIdsList.get( listIdsList.size( ) - 1 ).add( listIds.get( i ) );
95+
}
96+
List<Query> queries = new ArrayList<>( );
97+
if ( !listIdsList.isEmpty( ) && listIdsList.get( 0 ) != null && !listIdsList.get( 0 ).isEmpty( ) )
98+
{
99+
for ( int i = 0; i < listIdsList.size( ); i++ )
100+
{
101+
if ( listIdsList.get( i ).size( ) == 1 )
102+
{
103+
queries.add( IntPoint.newExactQuery( FormsConstants.PARAMETER_ID_FORM, listIdsList.get( i ).get( 0 ) ) );
104+
}
105+
else
106+
{
107+
queries.add( IntPoint.newRangeQuery( FormsConstants.PARAMETER_ID_FORM, listIdsList.get( i ).get( 0 ),
108+
listIdsList.get( i ).get( listIdsList.get( i ).size( ) - 1 ) ) );
109+
}
110+
}
111+
}
112+
Builder builder = new BooleanQuery.Builder( );
113+
for ( Query query : queries )
114+
{
115+
builder.add( query, BooleanClause.Occur.SHOULD );
116+
}
117+
Query queryForms = builder.build( );
118+
119+
setFormPanelInitializerSelectQuery( queryForms );
120+
}
121+
53122
/**
54123
* {@inheritDoc}
55124
*/

0 commit comments

Comments
 (0)