View Javadoc
1   /*
2    * Copyright (c) 2002-2014, Mairie de Paris
3    * All rights reserved.
4    *
5    * Redistribution and use in source and binary forms, with or without
6    * modification, are permitted provided that the following conditions
7    * are met:
8    *
9    *  1. Redistributions of source code must retain the above copyright notice
10   *     and the following disclaimer.
11   *
12   *  2. Redistributions in binary form must reproduce the above copyright notice
13   *     and the following disclaimer in the documentation and/or other materials
14   *     provided with the distribution.
15   *
16   *  3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
17   *     contributors may be used to endorse or promote products derived from
18   *     this software without specific prior written permission.
19   *
20   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
24   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30   * POSSIBILITY OF SUCH DAMAGE.
31   *
32   * License 1.0
33   */
34  package fr.paris.lutece.portal.web.features;
35  
36  import fr.paris.lutece.portal.business.right.FeatureGroup;
37  import fr.paris.lutece.portal.business.right.FeatureGroupHome;
38  import fr.paris.lutece.portal.business.right.Right;
39  import fr.paris.lutece.portal.business.right.RightHome;
40  import fr.paris.lutece.portal.service.i18n.I18nService;
41  import fr.paris.lutece.portal.service.message.AdminMessage;
42  import fr.paris.lutece.portal.service.message.AdminMessageService;
43  import fr.paris.lutece.portal.service.template.AppTemplateService;
44  import fr.paris.lutece.portal.web.admin.AdminFeaturesPageJspBean;
45  import fr.paris.lutece.portal.web.constants.Messages;
46  import fr.paris.lutece.util.ReferenceList;
47  import fr.paris.lutece.util.html.HtmlTemplate;
48  import fr.paris.lutece.util.url.UrlItem;
49  
50  import java.io.Serializable;
51  
52  import java.util.ArrayList;
53  import java.util.Collection;
54  import java.util.HashMap;
55  import java.util.List;
56  import java.util.Locale;
57  import java.util.Map;
58  
59  import javax.servlet.http.HttpServletRequest;
60  
61  
62  /**
63   * FeaturesGroupJspBean
64   */
65  public class FeaturesGroupJspBean extends AdminFeaturesPageJspBean
66  {
67      public static final String RIGHT_FEATURES_MANAGEMENT = "CORE_FEATURES_MANAGEMENT";
68      private static final long serialVersionUID = -8573499137269541850L;
69      private static final String TEMPLATE_MANAGE_FEATURES = "admin/features/manage_features.html";
70      private static final String TEMPLATE_MANAGE_GROUPS = "admin/features/manage_groups.html";
71      private static final String TEMPLATE_DISPATCH_FEATURES = "admin/features/dispatch_features.html";
72      private static final String TEMPLATE_CREATE_GROUP = "admin/features/create_group.html";
73      private static final String TEMPLATE_MODIFY_GROUP = "admin/features/modify_group.html";
74      private static final String PARAMETER_GROUP_ID = "group_id";
75      private static final String PARAMETER_GROUP_NAME = "group_name";
76      private static final String PARAMETER_GROUP_DESCRIPTION = "group_description";
77      private static final String PARAMETER_GROUP_ORDER = "group_order";
78      private static final String PARAMETER_ORDER_ID = "order_id";
79      private static final String PARAMETER_RIGHT_ID = "right_id";
80      private static final String JSP_DISPATCH_FEATURES = "DispatchFeatures.jsp";
81      private static final String JSP_MANAGE_GROUPS = "ManageGroups.jsp";
82      private static final String MESSAGE_CONFIRM_DELETE = "portal.features.message.confirmDeleteGroup";
83      private static final String MESSAGE_RIGHT_ALREADY_ASSIGN = "portal.features.message.rightAlreadyAssign";
84      private static final String MARK_GROUPS_LIST = "groups_list";
85      private static final String MARK_RIGHT_LIST = "feature_list";
86      private static final String MARK_ORDER_IS_OK = "order_list_state";
87      private static final String MARK_FEATURE_NO_GROUP = "no_group";
88      private static final String MARK_FEATURE_GROUP_LIST = "feature_group_list";
89      private static final String MARK_ORDER_LIST = "order_list";
90      private static final String MARK_FEATURE_GROUP = "feature_group";
91      private static final String MARK_DEFAULT_ORDER = "order_default";
92      private static final String NO_GROUP_DESCRIPTION = "portal.features.nogroup.description";
93      private static final String NO_GROUP_LABEL = "portal.features.nogroup.label";
94      private static final int NO_GROUP_ORDER = 0;
95      private static final String NO_GROUP_ID = null;
96      private static final String REGEX_ID = "^[\\d]+$";
97  
98      /**
99       * Returns the Manage Features page
100      * @param request The HTTP request
101      * @return The HTML page
102      */
103     public String getManageFeatures( HttpServletRequest request )
104     {
105         HtmlTemplate t = AppTemplateService.getTemplate( TEMPLATE_MANAGE_FEATURES );
106 
107         return getAdminPage( t.getHtml(  ) );
108     }
109 
110     /**
111      * Returns the Manage Groups page
112      * @param request The HTTP request
113      * @return The HTML page
114      */
115     public String getManageGroups( HttpServletRequest request )
116     {
117         List<FeatureGroup> listGroups = FeatureGroupHome.getFeatureGroupsList(  );
118         Map<String, Object> model = new HashMap<String, Object>(  );
119         model.put( MARK_ORDER_LIST, getOrderRefList(  ) );
120         model.put( MARK_GROUPS_LIST, listGroups );
121 
122         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MANAGE_GROUPS, getLocale(  ), model );
123 
124         return getAdminPage( template.getHtml(  ) );
125     }
126 
127     /**
128      * Returns the Dispatch Features page
129      * @param request The HTTP request
130      * @return The HTML page
131      */
132     public String getDispatchFeatures( HttpServletRequest request )
133     {
134         Locale locale = getLocale(  );
135 
136         Map<String, Object> model = new HashMap<String, Object>(  );
137         model.put( MARK_FEATURE_NO_GROUP, getNoGroup( locale ) );
138         model.put( MARK_FEATURE_GROUP_LIST, getRefListFeatureGroups( locale ) );
139 
140         HtmlTemplate tPage = AppTemplateService.getTemplate( TEMPLATE_DISPATCH_FEATURES, locale, model );
141 
142         return getAdminPage( tPage.getHtml(  ) );
143     }
144 
145     /**
146      * Generate a combo containing all available groups
147      *
148      * @param locale The locale
149      * @return the reference list of feature groups
150      */
151     private Map<String, Object> getNoGroup( Locale locale )
152     {
153         FeatureGroup noGroup = new FeatureGroup(  );
154         noGroup.setLocale( locale );
155         noGroup.setId( NO_GROUP_ID );
156         noGroup.setOrder( NO_GROUP_ORDER );
157         noGroup.setDescriptionKey( NO_GROUP_DESCRIPTION );
158         noGroup.setLabelKey( NO_GROUP_LABEL );
159 
160         Map<String, Object> groupMap = new HashMap<String, Object>(  );
161         groupMap.put( MARK_FEATURE_GROUP, noGroup );
162         groupMap.put( MARK_RIGHT_LIST,
163             I18nService.localizeCollection( RightHome.getRightsList( noGroup.getId(  ) ), locale ) );
164         groupMap.put( MARK_ORDER_IS_OK, RightHome.checkFeatureOrders( noGroup.getId(  ) ) );
165 
166         return groupMap;
167     }
168 
169     /**
170      * Generate a combo containing all available groups
171      *
172      * @param locale The locale
173      * @return the reference list of feature groups
174      */
175     private Collection<HashMap<String, Object>> getRefListFeatureGroups( Locale locale )
176     {
177         Collection<HashMap<String, Object>> colGroupMap = new ArrayList<HashMap<String, Object>>(  );
178         Collection<FeatureGroup> colGroups = FeatureGroupHome.getFeatureGroupsList(  );
179 
180         for ( FeatureGroup fg : colGroups )
181         {
182             HashMap<String, Object> groupMap = new HashMap<String, Object>(  );
183             groupMap.put( MARK_FEATURE_GROUP, fg );
184             groupMap.put( MARK_RIGHT_LIST,
185                 I18nService.localizeCollection( RightHome.getRightsList( fg.getId(  ) ), locale ) );
186             groupMap.put( MARK_ORDER_IS_OK, RightHome.checkFeatureOrders( fg.getId(  ) ) );
187             colGroupMap.add( groupMap );
188         }
189 
190         return colGroupMap;
191     }
192 
193     /**
194      * Dispatch a feature to a given group
195      * @param request The HTTP request
196      * @return The next URL to redirect after processing
197      */
198     public String doDispatchFeature( HttpServletRequest request )
199     {
200         String strRightId = request.getParameter( PARAMETER_RIGHT_ID );
201         String strGroupName = request.getParameter( PARAMETER_GROUP_NAME );
202         String strOrderId = request.getParameter( PARAMETER_ORDER_ID );
203         Right right = RightHome.findByPrimaryKey( strRightId );
204         UrlItem url = new UrlItem( JSP_DISPATCH_FEATURES );
205 
206         if ( ( strGroupName != null ) )
207         {
208             //Set the old group as anchor
209             url.setAnchor( right.getFeatureGroup(  ) );
210             right.setFeatureGroup( strGroupName.equals( "" ) ? null : strGroupName );
211         }
212 
213         if ( ( strOrderId != null ) && strOrderId.matches( REGEX_ID ) )
214         {
215             right.setOrder( Integer.parseInt( strOrderId ) );
216         }
217 
218         RightHome.update( right );
219 
220         return url.getUrl(  );
221     }
222 
223     /**
224      * Dispatch a feature group
225      *
226      * @param request The HTTP request
227      * @return The next URL to redirect after processing
228      */
229     public String doDispatchFeatureGroup( HttpServletRequest request )
230     {
231         String strGroupId = request.getParameter( PARAMETER_GROUP_ID );
232         String strOrderId = request.getParameter( PARAMETER_ORDER_ID );
233         FeatureGroup featureGroup = FeatureGroupHome.findByPrimaryKey( strGroupId );
234         UrlItem url = new UrlItem( JSP_MANAGE_GROUPS );
235 
236         if ( ( strOrderId != null ) && strOrderId.matches( REGEX_ID ) )
237         {
238             featureGroup.setOrder( Integer.parseInt( strOrderId ) );
239         }
240 
241         FeatureGroupHome.update( featureGroup );
242 
243         return url.getUrl(  );
244     }
245 
246     /**
247      * Reinitialize feature orders
248      * @param request The {@link HttpServletRequest}
249      * @return The next URL to redirect after processing
250      */
251     public String doReinitFeatures( HttpServletRequest request )
252     {
253         String strGroupId = request.getParameter( PARAMETER_GROUP_ID );
254         RightHome.reinitFeatureOrders( strGroupId );
255 
256         UrlItem url = new UrlItem( JSP_DISPATCH_FEATURES );
257 
258         if ( ( strGroupId != null ) )
259         {
260             url.setAnchor( strGroupId );
261         }
262 
263         return url.getUrl(  );
264     }
265 
266     /**
267      * Returns the Create Group page
268      * @param request The HTTP request
269      * @return The HTML page
270      */
271     public String getCreateGroup( HttpServletRequest request )
272     {
273         int nCount = FeatureGroupHome.getFeatureGroupsCount(  ) + 1;
274 
275         Map<String, Serializable> model = new HashMap<String, Serializable>(  );
276         model.put( MARK_ORDER_LIST, getOrderRefList(  ) );
277         model.put( MARK_DEFAULT_ORDER, String.valueOf( nCount ) );
278 
279         HtmlTemplate t = AppTemplateService.getTemplate( TEMPLATE_CREATE_GROUP, getLocale(  ), model );
280 
281         return getAdminPage( t.getHtml(  ) );
282     }
283 
284     /**
285      * Returns the Modify Group page
286      * @param request The HTTP request
287      * @return The HTML page
288      */
289     public String getModifyGroup( HttpServletRequest request )
290     {
291         String strGroupId = request.getParameter( PARAMETER_GROUP_ID );
292 
293         FeatureGroup group = FeatureGroupHome.findByPrimaryKey( strGroupId );
294 
295         if ( group == null )
296         {
297             return getManageGroups( request );
298         }
299 
300         Map<String, Object> model = new HashMap<String, Object>(  );
301         model.put( MARK_ORDER_LIST, getOrderRefList(  ) );
302         model.put( MARK_FEATURE_GROUP, group );
303 
304         HtmlTemplate t = AppTemplateService.getTemplate( TEMPLATE_MODIFY_GROUP, getLocale(  ), model );
305 
306         return getAdminPage( t.getHtml(  ) );
307     }
308 
309     /**
310      * Create the group
311      * @param request The HTTP request
312      * @return The next URL to redirect after processing
313      */
314     public String doCreateGroup( HttpServletRequest request )
315     {
316         String strGroupId = request.getParameter( PARAMETER_GROUP_ID );
317         String strGroupName = request.getParameter( PARAMETER_GROUP_NAME );
318         String strGroupDescription = request.getParameter( PARAMETER_GROUP_DESCRIPTION );
319         String strGroupOrder = request.getParameter( PARAMETER_GROUP_ORDER );
320 
321         // Mandatory fields
322         if ( strGroupId.equals( "" ) || strGroupName.equals( "" ) || strGroupDescription.equals( "" ) )
323         {
324             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
325         }
326 
327         FeatureGroup group = new FeatureGroup(  );
328         group.setId( strGroupId );
329         group.setLabelKey( strGroupName );
330         group.setDescriptionKey( strGroupDescription );
331 
332         FeatureGroupHome.create( group );
333         group.setOrder( Integer.parseInt( strGroupOrder ) );
334         FeatureGroupHome.update( group );
335 
336         return JSP_MANAGE_GROUPS;
337     }
338 
339     /**
340      * Modify the group
341      * @param request The HTTP request
342      * @return The next URL to redirect after processing
343      */
344     public String doModifyGroup( HttpServletRequest request )
345     {
346         String strGroupId = request.getParameter( PARAMETER_GROUP_ID );
347         String strGroupName = request.getParameter( PARAMETER_GROUP_NAME );
348         String strGroupDescription = request.getParameter( PARAMETER_GROUP_DESCRIPTION );
349         String strGroupOrder = request.getParameter( PARAMETER_GROUP_ORDER );
350 
351         // Mandatory fields
352         if ( strGroupId.equals( "" ) || strGroupName.equals( "" ) || strGroupDescription.equals( "" ) )
353         {
354             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
355         }
356 
357         FeatureGroup group = FeatureGroupHome.findByPrimaryKey( strGroupId );
358         group.setLabelKey( strGroupName );
359         group.setDescriptionKey( strGroupDescription );
360         group.setOrder( Integer.parseInt( strGroupOrder ) );
361         FeatureGroupHome.update( group );
362 
363         return JSP_MANAGE_GROUPS;
364     }
365 
366     /**
367      * Generate an HTML combo of available group order
368      * @return The reference list of orders
369      */
370     private ReferenceList getOrderRefList(  )
371     {
372         int nGroupsCount = FeatureGroupHome.getFeatureGroupsCount(  );
373         ReferenceList listOrders = new ReferenceList(  );
374 
375         for ( int i = 0; i < nGroupsCount; i++ )
376         {
377             listOrders.addItem( i + 1, Integer.toString( i + 1 ) );
378         }
379 
380         return listOrders;
381     }
382 
383     /**
384      * Returns the Remove page
385      * @param request The HTTP request
386      * @return The HTML page
387      */
388     public String getRemoveGroup( HttpServletRequest request )
389     {
390         String strGroupId = request.getParameter( PARAMETER_GROUP_ID );
391 
392         String strUrl = "jsp/admin/features/DoRemoveGroup.jsp?" + PARAMETER_GROUP_ID + "=" + strGroupId;
393         FeatureGroup group = FeatureGroupHome.findByPrimaryKey( strGroupId );
394         group.setLocale( getUser(  ).getLocale(  ) );
395 
396         Object[] messageArgs = { group.getLabel(  ) };
397 
398         return AdminMessageService.getMessageUrl( request, MESSAGE_CONFIRM_DELETE, messageArgs, null, strUrl, "",
399             AdminMessage.TYPE_CONFIRMATION );
400     }
401 
402     /**
403      * Remove the group
404      * @param request The HTTP request
405      * @return The next URL to redirect after processing
406      */
407     public String doRemoveGroup( HttpServletRequest request )
408     {
409         String strGroupId = request.getParameter( PARAMETER_GROUP_ID );
410 
411         if ( RightHome.getRightsList( strGroupId ).size(  ) > 0 )
412         {
413             return AdminMessageService.getMessageUrl( request, MESSAGE_RIGHT_ALREADY_ASSIGN, AdminMessage.TYPE_STOP );
414         }
415 
416         FeatureGroupHome.remove( strGroupId );
417 
418         return JSP_MANAGE_GROUPS;
419     }
420 }