View Javadoc
1   /*
2    * Copyright (c) 2002-2022, City of 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   	
35   
36  package fr.paris.lutece.plugins.termofservice.web;
37  
38  import fr.paris.lutece.portal.service.message.AdminMessage;
39  import fr.paris.lutece.portal.service.message.AdminMessageService;
40  import fr.paris.lutece.portal.service.security.SecurityTokenService;
41  import fr.paris.lutece.portal.service.admin.AccessDeniedException;
42  import fr.paris.lutece.portal.service.util.AppException;
43  import fr.paris.lutece.portal.util.mvc.admin.annotations.Controller;
44  import fr.paris.lutece.portal.util.mvc.commons.annotations.Action;
45  import fr.paris.lutece.portal.util.mvc.commons.annotations.View;
46  import fr.paris.lutece.util.url.UrlItem;
47  import fr.paris.lutece.util.html.AbstractPaginator;
48  
49  import java.util.Comparator;
50  import java.util.ArrayList;
51  import java.util.List;
52  import java.util.Map;
53  import java.util.Optional;
54  import java.util.stream.Collectors;
55  import javax.servlet.http.HttpServletRequest;
56  
57  import org.apache.commons.lang3.StringUtils;
58  
59  import fr.paris.lutece.plugins.termofservice.business.Entry;
60  import fr.paris.lutece.plugins.termofservice.business.EntryHome;
61  import fr.paris.lutece.plugins.termofservice.util.TOSConstants;
62  
63  /**
64   * This class provides the user interface to manage Entry features ( manage, create, modify, remove )
65   */
66  @Controller( controllerJsp = "ManageEntrys.jsp", controllerPath = "jsp/admin/plugins/termofservice/", right = "TERMOFSERVICE_MANAGEMENT" )
67  public class EntryJspBean extends AbstractManageTOSJspBean <Integer, Entry>
68  {
69      // Templates
70      private static final String TEMPLATE_MANAGE_ENTRYS = "/admin/plugins/termofservice/manage_entrys.html";
71      private static final String TEMPLATE_CREATE_ENTRY = "/admin/plugins/termofservice/create_entry.html";
72      private static final String TEMPLATE_MODIFY_ENTRY = "/admin/plugins/termofservice/modify_entry.html";
73  
74      // Parameters
75      private static final String PARAMETER_ID_ENTRY = "id";
76  
77      // Properties for page titles
78      private static final String PROPERTY_PAGE_TITLE_MANAGE_ENTRYS = "termofservice.manage_entrys.pageTitle";
79      private static final String PROPERTY_PAGE_TITLE_MODIFY_ENTRY = "termofservice.modify_entry.pageTitle";
80      private static final String PROPERTY_PAGE_TITLE_CREATE_ENTRY = "termofservice.create_entry.pageTitle";
81  
82      // Markers
83      private static final String MARK_ENTRY_LIST = "entry_list";
84      private static final String MARK_ENTRY = "entry";
85      private static final String MARK_FEATURE_TOS_PUBLICATION = "featureTOSPublication";
86  
87      private static final String JSP_MANAGE_ENTRYS = "jsp/admin/plugins/termofservice/ManageEntrys.jsp";
88  
89      // Properties
90      private static final String MESSAGE_CONFIRM_REMOVE_ENTRY = "termofservice.message.confirmRemoveEntry";
91  
92      // Validations
93      private static final String VALIDATION_ATTRIBUTES_PREFIX = "termofservice.model.entity.entry.attribute.";
94  
95      // Views
96      private static final String VIEW_MANAGE_ENTRYS = "manageEntrys";
97      private static final String VIEW_CREATE_ENTRY = "createEntry";
98      private static final String VIEW_MODIFY_ENTRY = "modifyEntry";
99  
100     // Actions
101     private static final String ACTION_CREATE_ENTRY = "createEntry";
102     private static final String ACTION_MODIFY_ENTRY = "modifyEntry";
103     private static final String ACTION_REMOVE_ENTRY = "removeEntry";
104     private static final String ACTION_CONFIRM_REMOVE_ENTRY = "confirmRemoveEntry";
105     private static final String ACTION_PUBLISH_ENTRY = "publishEntry";
106 
107     // Infos
108     private static final String INFO_ENTRY_CREATED = "termofservice.info.entry.created";
109     private static final String INFO_ENTRY_UPDATED = "termofservice.info.entry.updated";
110     private static final String INFO_ENTRY_REMOVED = "termofservice.info.entry.removed";
111     private static final String INFO_ENTRY_PUBLISHED = "termofservice.info.entry.published";
112 
113     
114     // Errors
115     private static final String ERROR_RESOURCE_NOT_FOUND = "Resource not found";
116     
117     // Session variable to store working values
118     private Entry _entry;
119     private List<Integer> _listIdEntrys;
120     
121     /**
122      * Build the Manage View
123      * @param request The HTTP request
124      * @return The page
125      */
126     @View( value = VIEW_MANAGE_ENTRYS, defaultView = true )
127     public String getManageEntrys( HttpServletRequest request )
128     {
129         _entry = null;
130         
131         if ( request.getParameter( AbstractPaginator.PARAMETER_PAGE_INDEX) == null || _listIdEntrys.isEmpty( ) )
132         {
133         	_listIdEntrys = EntryHome.getIdEntrysList(  );
134         }
135         
136         Map<String, Object> model = getPaginatedListModel( request, MARK_ENTRY_LIST, _listIdEntrys, JSP_MANAGE_ENTRYS );
137         model.put( MARK_FEATURE_TOS_PUBLICATION, TOSConstants.PROPERTY_FEATURE_TOS_PUBLICATION_ENABLED );
138 
139         return getPage( PROPERTY_PAGE_TITLE_MANAGE_ENTRYS, TEMPLATE_MANAGE_ENTRYS, model );
140     }
141 
142 	/**
143      * Get Items from Ids list
144      * @param listIds
145      * @return the populated list of items corresponding to the id List
146      */
147 	@Override
148 	List<Entry> getItemsFromIds( List<Integer> listIds ) 
149 	{
150 		List<Entry> listEntry = EntryHome.getEntrysListByIds( listIds );
151 		
152 		// keep original order
153         return listEntry.stream()
154                  .sorted(Comparator.comparingInt( notif -> listIds.indexOf( notif.getId())))
155                  .collect(Collectors.toList());
156 	}
157     
158     /**
159     * reset the _listIdEntrys list
160     */
161     public void resetListId( )
162     {
163     	_listIdEntrys = new ArrayList<>( );
164     }
165 
166     /**
167      * Returns the form to create a entry
168      *
169      * @param request The Http request
170      * @return the html code of the entry form
171      */
172     @View( VIEW_CREATE_ENTRY )
173     public String getCreateEntry( HttpServletRequest request )
174     {
175         _entry = ( _entry != null ) ? _entry : new Entry(  );
176 
177         Map<String, Object> model = getModel(  );
178         model.put( MARK_ENTRY, _entry );
179         model.put( SecurityTokenService.MARK_TOKEN, SecurityTokenService.getInstance( ).getToken( request, ACTION_CREATE_ENTRY ) );
180 
181         return getPage( PROPERTY_PAGE_TITLE_CREATE_ENTRY, TEMPLATE_CREATE_ENTRY, model );
182     }
183 
184     /**
185      * Process the data capture form of a new entry
186      *
187      * @param request The Http Request
188      * @return The Jsp URL of the process result
189      * @throws AccessDeniedException
190      */
191     @Action( ACTION_CREATE_ENTRY )
192     public String doCreateEntry( HttpServletRequest request ) throws AccessDeniedException
193     {
194         populate( _entry, request, getLocale( ) );
195         
196 
197         if ( !SecurityTokenService.getInstance( ).validate( request, ACTION_CREATE_ENTRY ) )
198         {
199             throw new AccessDeniedException ( "Invalid security token" );
200         }
201 
202         // Check constraints
203         if ( !validateBean( _entry, VALIDATION_ATTRIBUTES_PREFIX ) )
204         {
205             return redirectView( request, VIEW_CREATE_ENTRY );
206         }
207 
208         EntryHome.create( _entry );
209         addInfo( INFO_ENTRY_CREATED, getLocale(  ) );
210         resetListId( );
211 
212         return redirectView( request, VIEW_MANAGE_ENTRYS );
213     }
214 
215     /**
216      * Manages the removal form of a entry whose identifier is in the http
217      * request
218      *
219      * @param request The Http request
220      * @return the html code to confirm
221      */
222     @Action( ACTION_CONFIRM_REMOVE_ENTRY )
223     public String getConfirmRemoveEntry( HttpServletRequest request )
224     {
225         int nId = Integer.parseInt( request.getParameter( PARAMETER_ID_ENTRY ) );
226         UrlItem url = new UrlItem( getActionUrl( ACTION_REMOVE_ENTRY ) );
227         url.addParameter( PARAMETER_ID_ENTRY, nId );
228 
229         String strMessageUrl = AdminMessageService.getMessageUrl( request, MESSAGE_CONFIRM_REMOVE_ENTRY, url.getUrl(  ), AdminMessage.TYPE_CONFIRMATION );
230 
231         return redirect( request, strMessageUrl );
232     }
233 
234     /**
235      * Handles the removal form of a entry
236      *
237      * @param request The Http request
238      * @return the jsp URL to display the form to manage entrys
239      */
240     @Action( ACTION_REMOVE_ENTRY )
241     public String doRemoveEntry( HttpServletRequest request )
242     {
243         int nId = Integer.parseInt( request.getParameter( PARAMETER_ID_ENTRY ) );
244         
245         
246         EntryHome.remove( nId );
247         addInfo( INFO_ENTRY_REMOVED, getLocale(  ) );
248         resetListId( );
249 
250         return redirectView( request, VIEW_MANAGE_ENTRYS );
251     }
252 
253     /**
254      * Returns the form to update info about a entry
255      *
256      * @param request The Http request
257      * @return The HTML form to update info
258      */
259     @View( VIEW_MODIFY_ENTRY )
260     public String getModifyEntry( HttpServletRequest request )
261     {
262         int nId = Integer.parseInt( request.getParameter( PARAMETER_ID_ENTRY ) );
263 
264         if ( _entry == null || ( _entry.getId(  ) != nId ) )
265         {
266             Optional<Entry> optEntry = EntryHome.findByPrimaryKey( nId );
267             _entry = optEntry.orElseThrow( ( ) -> new AppException(ERROR_RESOURCE_NOT_FOUND ) );
268         }
269 
270 
271         Map<String, Object> model = getModel(  );
272         model.put( MARK_ENTRY, _entry );
273         model.put( SecurityTokenService.MARK_TOKEN, SecurityTokenService.getInstance( ).getToken( request, ACTION_MODIFY_ENTRY ) );
274 
275         return getPage( PROPERTY_PAGE_TITLE_MODIFY_ENTRY, TEMPLATE_MODIFY_ENTRY, model );
276     }
277 
278     /**
279      * Process the change form of a entry
280      *
281      * @param request The Http request
282      * @return The Jsp URL of the process result
283      * @throws AccessDeniedException
284      */
285     @Action( ACTION_MODIFY_ENTRY )
286     public String doModifyEntry( HttpServletRequest request ) throws AccessDeniedException
287     {   
288         populate( _entry, request, getLocale( ) );
289 		
290 		
291         if ( !SecurityTokenService.getInstance( ).validate( request, ACTION_MODIFY_ENTRY ) )
292         {
293             throw new AccessDeniedException ( "Invalid security token" );
294         }
295 
296         // Check constraints
297         if ( !validateBean( _entry, VALIDATION_ATTRIBUTES_PREFIX ) )
298         {
299             return redirect( request, VIEW_MODIFY_ENTRY, PARAMETER_ID_ENTRY, _entry.getId( ) );
300         }
301 
302         EntryHome.update( _entry );
303         addInfo( INFO_ENTRY_UPDATED, getLocale(  ) );
304         resetListId( );
305 
306         return redirectView( request, VIEW_MANAGE_ENTRYS );
307     }
308     
309     
310     @Action( ACTION_PUBLISH_ENTRY )
311     public String doPublishEntry( HttpServletRequest request )
312     {
313         if( TOSConstants.PROPERTY_FEATURE_TOS_PUBLICATION_ENABLED )
314         {
315             String strIdEntry = request.getParameter( PARAMETER_ID_ENTRY );
316             
317             if( StringUtils.isNumeric( strIdEntry ) )
318             {
319                 EntryHome.unpublishAllEntries( );
320                 EntryHome.publishEntry( Integer.parseInt( strIdEntry ) );
321             }
322             
323             addInfo( INFO_ENTRY_PUBLISHED, getLocale(  ) );
324             resetListId( );
325         }
326         return redirectView( request, VIEW_MANAGE_ENTRYS );
327     }
328 }