View Javadoc
1   /*
2    * Copyright (c) 2002-2023, 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.broadcastproxy.web;
37  
38  import java.util.ArrayList;
39  import java.util.Comparator;
40  import java.util.List;
41  import java.util.Map;
42  import java.util.Optional;
43  import java.util.stream.Collectors;
44  
45  import javax.servlet.http.HttpServletRequest;
46  
47  import org.apache.commons.fileupload.FileItem;
48  import org.apache.commons.lang3.StringUtils;
49  
50  import fr.paris.lutece.plugins.broadcastproxy.business.SubscriptionLink;
51  import fr.paris.lutece.plugins.broadcastproxy.business.SubscriptionLinkHome;
52  import fr.paris.lutece.portal.service.admin.AccessDeniedException;
53  import fr.paris.lutece.portal.service.file.FileService;
54  import fr.paris.lutece.portal.service.fileimage.FileImagePublicService;
55  import fr.paris.lutece.portal.service.message.AdminMessage;
56  import fr.paris.lutece.portal.service.message.AdminMessageService;
57  import fr.paris.lutece.portal.service.security.SecurityTokenService;
58  import fr.paris.lutece.portal.service.util.AppException;
59  import fr.paris.lutece.portal.util.mvc.admin.annotations.Controller;
60  import fr.paris.lutece.portal.util.mvc.commons.annotations.Action;
61  import fr.paris.lutece.portal.util.mvc.commons.annotations.View;
62  import fr.paris.lutece.portal.web.upload.MultipartHttpServletRequest;
63  import fr.paris.lutece.util.html.AbstractPaginator;
64  import fr.paris.lutece.util.url.UrlItem;
65  
66  /**
67   * This class provides the user interface to manage SubscriptionLink features ( manage, create, modify, remove )
68   */
69  @Controller( controllerJsp = "ManageSubscriptionLinks.jsp", controllerPath = "jsp/admin/plugins/broadcastproxy/", right = "BROADCASTPROXY_MANAGEMENT_NEWSLETTERS" )
70  public class SubscriptionLinkJspBean extends AbstractManageSubscriptionJspBean <Integer, SubscriptionLink>
71  {
72      // Templates
73      private static final String TEMPLATE_MANAGE_SUBSCRIPTIONLINKS = "/admin/plugins/broadcastproxy/manage_subscriptionlinks.html";
74      private static final String TEMPLATE_CREATE_SUBSCRIPTIONLINK = "/admin/plugins/broadcastproxy/create_subscriptionlink.html";
75      private static final String TEMPLATE_MODIFY_SUBSCRIPTIONLINK = "/admin/plugins/broadcastproxy/modify_subscriptionlink.html";
76  
77      // Parameters
78      private static final String PARAMETER_ID_SUBSCRIPTIONLINK = "id";
79  
80      // Properties for page titles
81      private static final String PROPERTY_PAGE_TITLE_MANAGE_SUBSCRIPTIONLINKS = "broadcastproxy.manage_subscriptionlinks.pageTitle";
82      private static final String PROPERTY_PAGE_TITLE_MODIFY_SUBSCRIPTIONLINK = "broadcastproxy.modify_subscriptionlink.pageTitle";
83      private static final String PROPERTY_PAGE_TITLE_CREATE_SUBSCRIPTIONLINK = "broadcastproxy.create_subscriptionlink.pageTitle";
84  
85      // Markers
86      private static final String MARK_SUBSCRIPTIONLINK_LIST = "subscriptionlink_list";
87      private static final String MARK_SUBSCRIPTIONLINK = "subscriptionlink";
88      private static final String MARK_PICTOGRAMME = "pictogramme";
89      
90      private static final String JSP_MANAGE_SUBSCRIPTIONLINKS = "jsp/admin/plugins/broadcastproxy/ManageSubscriptionLinks.jsp";
91  
92      // Properties
93      private static final String MESSAGE_CONFIRM_REMOVE_SUBSCRIPTIONLINK = "broadcastproxy.message.confirmRemoveSubscriptionLink";
94  
95      // Validations
96      private static final String VALIDATION_ATTRIBUTES_PREFIX = "broadcastproxy.model.entity.subscriptionlink.attribute.";
97  
98      // Views
99      private static final String VIEW_MANAGE_SUBSCRIPTIONLINKS = "manageSubscriptionLinks";
100     private static final String VIEW_CREATE_SUBSCRIPTIONLINK = "createSubscriptionLink";
101     private static final String VIEW_MODIFY_SUBSCRIPTIONLINK = "modifySubscriptionLink";
102 
103     // Actions
104     private static final String ACTION_CREATE_SUBSCRIPTIONLINK = "createSubscriptionLink";
105     private static final String ACTION_MODIFY_SUBSCRIPTIONLINK = "modifySubscriptionLink";
106     private static final String ACTION_REMOVE_SUBSCRIPTIONLINK = "removeSubscriptionLink";
107     private static final String ACTION_CONFIRM_REMOVE_SUBSCRIPTIONLINK = "confirmRemoveSubscriptionLink";
108     private static final String ACTION_DELETE_PICTOGRAMME = "deletePictogramme";
109   
110 
111     // Infos
112     private static final String INFO_SUBSCRIPTIONLINK_CREATED = "broadcastproxy.info.subscriptionlink.created";
113     private static final String INFO_SUBSCRIPTIONLINK_UPDATED = "broadcastproxy.info.subscriptionlink.updated";
114     private static final String INFO_SUBSCRIPTIONLINK_REMOVED = "broadcastproxy.info.subscriptionlink.removed";
115     
116     // Warnings
117     private static final String WARNING_SUBSCRIPTIONLINK_ENABLED = "broadcastproxy.warning.subscriptionlink.enabled";
118     
119     // Errors
120     private static final String ERROR_RESOURCE_NOT_FOUND = "Resource not found";
121 
122     
123     // Session variable to store working values
124     private SubscriptionLink _subscriptionlink;
125     private List<Integer> _listIdSubscriptionLinks;
126     
127     /**
128      * Build the Manage View
129      * @param request The HTTP request
130      * @return The page
131      */
132     @View( value = VIEW_MANAGE_SUBSCRIPTIONLINKS, defaultView = true )
133     public String getManageSubscriptionLinks( HttpServletRequest request )
134     {
135         _subscriptionlink = null;
136         
137         if ( request.getParameter( AbstractPaginator.PARAMETER_PAGE_INDEX) == null || _listIdSubscriptionLinks.isEmpty( ) )
138         {
139         	_listIdSubscriptionLinks = SubscriptionLinkHome.getIdSubscriptionLinksList(  );
140         }
141         
142         Map<String, Object> model = getPaginatedListModel( request, MARK_SUBSCRIPTIONLINK_LIST, _listIdSubscriptionLinks, JSP_MANAGE_SUBSCRIPTIONLINKS );
143         
144         if ( SubscriptionLinkHome.existDisabledNewsletter( ) )  
145         {
146             addWarning( WARNING_SUBSCRIPTIONLINK_ENABLED, getLocale( ) );
147         }
148         return getPage( PROPERTY_PAGE_TITLE_MANAGE_SUBSCRIPTIONLINKS, TEMPLATE_MANAGE_SUBSCRIPTIONLINKS, model );
149     }
150 
151 	/**
152      * Get Items from Ids list
153      * @param listIds
154      * @return the populated list of items corresponding to the id List
155      */
156 	@Override
157 	List<SubscriptionLink> getItemsFromIds( List<Integer> listIds ) 
158 	{
159 		List<SubscriptionLink> listSubscriptionLink = SubscriptionLinkHome.getSubscriptionLinksListByIds( listIds );
160 		
161 		// keep original order
162         return listSubscriptionLink.stream()
163                  .sorted(Comparator.comparingInt( notif -> listIds.indexOf( notif.getId())))
164                  .collect(Collectors.toList());
165 	}
166     
167     /**
168     * reset the _listIdSubscriptionLinks list
169     */
170     public void resetListId( )
171     {
172     	_listIdSubscriptionLinks = new ArrayList<>( );
173     }
174 
175     /**
176      * Returns the form to create a subscriptionlink
177      *
178      * @param request The Http request
179      * @return the html code of the subscriptionlink form
180      */
181     @View( VIEW_CREATE_SUBSCRIPTIONLINK )
182     public String getCreateSubscriptionLink( HttpServletRequest request )
183     {
184         _subscriptionlink = ( _subscriptionlink != null ) ? _subscriptionlink : new SubscriptionLink(  );
185 
186         Map<String, Object> model = getModel(  );
187         model.put( MARK_SUBSCRIPTIONLINK, _subscriptionlink );
188         model.put( SecurityTokenService.MARK_TOKEN, SecurityTokenService.getInstance( ).getToken( request, ACTION_CREATE_SUBSCRIPTIONLINK ) );
189 
190         return getPage( PROPERTY_PAGE_TITLE_CREATE_SUBSCRIPTIONLINK, TEMPLATE_CREATE_SUBSCRIPTIONLINK, model );
191     }
192 
193     /**
194      * Process the data capture form of a new subscriptionlink
195      *
196      * @param request The Http Request
197      * @return The Jsp URL of the process result
198      * @throws AccessDeniedException
199      */
200     @Action( ACTION_CREATE_SUBSCRIPTIONLINK )
201     public String doCreateSubscriptionLink( HttpServletRequest request ) throws AccessDeniedException
202     {
203         populate( _subscriptionlink, request, getLocale( ) );
204         
205         if ( !SecurityTokenService.getInstance( ).validate( request, ACTION_CREATE_SUBSCRIPTIONLINK ) )
206         {
207             throw new AccessDeniedException ( "Invalid security token" );
208         }
209         // Check constraints
210         if ( !validateBean( _subscriptionlink, VALIDATION_ATTRIBUTES_PREFIX ) )
211         {
212             return redirectView( request, VIEW_CREATE_SUBSCRIPTIONLINK );
213         }
214         
215         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
216 
217         FileItem fileParameterBinaryValue = multipartRequest.getFile( "pictogramme" );
218 
219         FileImagePublicService.init( );
220         if( fileParameterBinaryValue.getSize( ) > 0 )
221         {
222             _subscriptionlink.setPictogramme( FileImagePublicService.getInstance( ).addImageResource( fileParameterBinaryValue ));
223         }
224         
225         SubscriptionLinkHome.create( _subscriptionlink );
226         addInfo( INFO_SUBSCRIPTIONLINK_CREATED, getLocale(  ) );
227         resetListId( );
228 
229         return redirectView( request, VIEW_MANAGE_SUBSCRIPTIONLINKS );
230     }
231 
232     /**
233      * Manages the removal form of a subscriptionlink whose identifier is in the http
234      * request
235      *
236      * @param request The Http request
237      * @return the html code to confirm
238      */
239     @Action( ACTION_CONFIRM_REMOVE_SUBSCRIPTIONLINK )
240     public String getConfirmRemoveSubscriptionLink( HttpServletRequest request )
241     {
242         int nId = Integer.parseInt( request.getParameter( PARAMETER_ID_SUBSCRIPTIONLINK ) );
243         UrlItem url = new UrlItem( getActionUrl( ACTION_REMOVE_SUBSCRIPTIONLINK ) );
244         url.addParameter( PARAMETER_ID_SUBSCRIPTIONLINK, nId );
245 
246         String strMessageUrl = AdminMessageService.getMessageUrl( request, MESSAGE_CONFIRM_REMOVE_SUBSCRIPTIONLINK, url.getUrl(  ), AdminMessage.TYPE_CONFIRMATION );
247 
248         return redirect( request, strMessageUrl );
249     }
250 
251     /**
252      * Handles the removal form of a subscriptionlink
253      *
254      * @param request The Http request
255      * @return the jsp URL to display the form to manage subscriptionlinks
256      */
257     @Action( ACTION_REMOVE_SUBSCRIPTIONLINK )
258     public String doRemoveSubscriptionLink( HttpServletRequest request )
259     {
260         int nId = Integer.parseInt( request.getParameter( PARAMETER_ID_SUBSCRIPTIONLINK ) );
261         
262         if ( _subscriptionlink == null || ( _subscriptionlink.getId(  ) != nId ) )
263         {
264             Optional<SubscriptionLink> optSubscriptionLink = SubscriptionLinkHome.findByPrimaryKey( nId );
265             _subscriptionlink = optSubscriptionLink.orElseThrow( ( ) -> new AppException(ERROR_RESOURCE_NOT_FOUND ) );
266         }
267         
268         if ( StringUtils.isNumeric( _subscriptionlink.getPictogramme( ) ) )
269         {
270             FileService.getInstance( ).getFileStoreServiceProvider( ).delete( _subscriptionlink.getPictogramme( ) );
271         }
272         
273         SubscriptionLinkHome.remove( nId );
274         addInfo( INFO_SUBSCRIPTIONLINK_REMOVED, getLocale(  ) );
275         resetListId( );
276 
277         return redirectView( request, VIEW_MANAGE_SUBSCRIPTIONLINKS );
278     }
279 
280     /**
281      * Returns the form to update info about a subscriptionlink
282      *
283      * @param request The Http request
284      * @return The HTML form to update info
285      */
286     @View( VIEW_MODIFY_SUBSCRIPTIONLINK )
287     public String getModifySubscriptionLink( HttpServletRequest request )
288     {
289         int nId = Integer.parseInt( request.getParameter( PARAMETER_ID_SUBSCRIPTIONLINK ) );
290 
291         if ( _subscriptionlink == null || ( _subscriptionlink.getId(  ) != nId ) )
292         {
293             Optional<SubscriptionLink> optSubscriptionLink = SubscriptionLinkHome.findByPrimaryKey( nId );
294             _subscriptionlink = optSubscriptionLink.orElseThrow( ( ) -> new AppException(ERROR_RESOURCE_NOT_FOUND ) );
295         }
296 
297         FileImagePublicService.init( );
298         Map<String, Object> model = getModel(  );
299         model.put( MARK_SUBSCRIPTIONLINK, _subscriptionlink );
300         model.put( SecurityTokenService.MARK_TOKEN, SecurityTokenService.getInstance( ).getToken( request, ACTION_MODIFY_SUBSCRIPTIONLINK ) );
301 
302         return getPage( PROPERTY_PAGE_TITLE_MODIFY_SUBSCRIPTIONLINK, TEMPLATE_MODIFY_SUBSCRIPTIONLINK, model );
303     }
304 
305     /**
306      * Process the change form of a subscriptionlink
307      *
308      * @param request The Http request
309      * @return The Jsp URL of the process result
310      * @throws AccessDeniedException
311      */
312     @Action( ACTION_MODIFY_SUBSCRIPTIONLINK )
313     public String doModifySubscriptionLink( HttpServletRequest request ) throws AccessDeniedException
314     {   
315         populate( _subscriptionlink, request, getLocale( ) );
316 		
317 		
318         if ( !SecurityTokenService.getInstance( ).validate( request, ACTION_MODIFY_SUBSCRIPTIONLINK ) )
319         {
320             throw new AccessDeniedException ( "Invalid security token" );
321         }
322 
323         // Check constraints
324         if ( !validateBean( _subscriptionlink, VALIDATION_ATTRIBUTES_PREFIX ) )
325         {
326             return redirect( request, VIEW_MODIFY_SUBSCRIPTIONLINK, PARAMETER_ID_SUBSCRIPTIONLINK, _subscriptionlink.getId( ) );
327         }
328         
329         FileImagePublicService.init( );
330         if( StringUtils.isEmpty( _subscriptionlink.getPictogramme( ) ) 
331                 || FileImagePublicService.getInstance( ).getImageResource( Integer.parseInt( _subscriptionlink.getPictogramme( ) ) ) == null  )
332         {
333             MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;   
334             FileItem fileParameterBinaryValue = multipartRequest.getFile( "pictogramme" );
335             
336             if( fileParameterBinaryValue.getSize( ) > 0 )
337             {
338                 _subscriptionlink.setPictogramme( FileImagePublicService.getInstance( ).addImageResource( fileParameterBinaryValue ));
339             }
340         }
341 
342         SubscriptionLinkHome.update( _subscriptionlink );
343         addInfo( INFO_SUBSCRIPTIONLINK_UPDATED, getLocale(  ) );
344         resetListId( );
345 
346         return redirectView( request, VIEW_MANAGE_SUBSCRIPTIONLINKS );
347     }
348     
349     @Action( ACTION_DELETE_PICTOGRAMME )
350     public String doDeletePictogramme( HttpServletRequest request )
351     {
352         String strIdPictogramme = request.getParameter( MARK_PICTOGRAMME );
353         int nId = Integer.parseInt( request.getParameter( PARAMETER_ID_SUBSCRIPTIONLINK ) );
354 
355         if ( _subscriptionlink == null || ( _subscriptionlink.getId(  ) != nId ) )
356         {
357             Optional<SubscriptionLink> optSubscriptionLink = SubscriptionLinkHome.findByPrimaryKey( nId );
358             _subscriptionlink = optSubscriptionLink.orElseThrow( ( ) -> new AppException(ERROR_RESOURCE_NOT_FOUND ) );
359         }
360 
361         if ( StringUtils.isNumeric( strIdPictogramme ) )
362         {
363             FileService.getInstance( ).getFileStoreServiceProvider( ).delete( strIdPictogramme );
364             _subscriptionlink.setPictogramme( StringUtils.EMPTY );
365             SubscriptionLinkHome.update( _subscriptionlink );
366         }
367 
368         return "{\"status\":\"success\"}";
369     }
370     
371 }