View Javadoc
1   /*
2    * Copyright (c) 2002-2021, 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  package fr.paris.lutece.plugins.subscribe.web;
35  
36  import fr.paris.lutece.plugins.subscribe.business.Subscription;
37  import fr.paris.lutece.plugins.subscribe.business.SubscriptionDTO;
38  import fr.paris.lutece.plugins.subscribe.business.SubscriptionFilter;
39  import fr.paris.lutece.plugins.subscribe.service.ISubscriptionProviderService;
40  import fr.paris.lutece.plugins.subscribe.service.SubscriptionService;
41  import fr.paris.lutece.portal.service.message.SiteMessage;
42  import fr.paris.lutece.portal.service.message.SiteMessageException;
43  import fr.paris.lutece.portal.service.message.SiteMessageService;
44  import fr.paris.lutece.portal.service.security.LuteceUser;
45  import fr.paris.lutece.portal.service.security.SecurityService;
46  import fr.paris.lutece.portal.service.template.AppTemplateService;
47  import fr.paris.lutece.portal.service.util.AppLogService;
48  import fr.paris.lutece.portal.service.util.AppPathService;
49  import fr.paris.lutece.portal.service.util.AppPropertiesService;
50  import fr.paris.lutece.portal.util.mvc.commons.annotations.Action;
51  import fr.paris.lutece.portal.util.mvc.commons.annotations.View;
52  import fr.paris.lutece.portal.util.mvc.xpage.MVCApplication;
53  import fr.paris.lutece.portal.util.mvc.xpage.annotations.Controller;
54  import fr.paris.lutece.portal.web.l10n.LocaleService;
55  import fr.paris.lutece.portal.web.xpages.XPage;
56  import fr.paris.lutece.util.html.HtmlTemplate;
57  import fr.paris.lutece.util.url.UrlItem;
58  
59  import org.apache.commons.lang3.StringUtils;
60  
61  import java.io.UnsupportedEncodingException;
62  import java.net.URLEncoder;
63  import java.util.ArrayList;
64  import java.util.HashMap;
65  import java.util.List;
66  import java.util.Locale;
67  import java.util.Map;
68  
69  import javax.servlet.http.HttpServletRequest;
70  
71  /**
72   * Subscribe application
73   */
74  @Controller( xpageName = "subscribe", pageTitleI18nKey = "subscribe.viewSubscription.title", pagePathI18nKey = "subscribe.viewSubscription.title" )
75  public class SubscribeApp extends MVCApplication
76  {
77      private static final long serialVersionUID = 4082230643317543885L;
78  
79      private static final String JSP_URL_SUBSCRIBE_XPAGE = "jsp/site/Portal.jsp?page=subscribe";
80  
81      private static final String MESSAGE_CONFIRM_REMOVE_SUBSCRIPTION = "module.subscribe.mydashboard.message.confirmRemoveSubscription";
82      private static final String MESSAGE_ACCESS_DENIED = "module.subscribe.mydashboard.message.accessDenied";
83  
84      private static final String ENCODE_FROM_URL_PARAMETER = "encode.fromUrl.parameter";
85      private static final String ENABLE_FROM_URL_PARAMETER = "enable.fromUrl.parameter";
86  
87      private static final String PARAMETER_REFERER = "referer";
88      private static final String PARAMETER_ID_SUBSCRIPTION = "idSubscription";
89      private static final String PARAMETER_FROM_URL = "from_url";
90  
91      private static final String ACTION_DO_REMOVE_URL = "doRemoveSubscription";
92      private static final String ACTION_CONFIRM_REMOVE_URL = "confirmRemoveSubscription";
93  
94      private static final String VIEW_SUBSCRIPTION_LIST = "viewSubscriptionList";
95  
96      private static final String PATH_PORTAL = "jsp/site/";
97  
98      private static final String TEMPLATE_MANAGE_SUBSCRIPTION = "skin/plugins/subscribe/view_subscription_list.html";
99      private static final String MARK_LIST_SUBSCRIPTION_DTO = "list_subscription_dto";
100 
101     /**
102      * View the list of subscriptions of a user
103      * 
104      * @param request
105      *            The request
106      * @return The XPage to display
107      */
108     @View( value = VIEW_SUBSCRIPTION_LIST, defaultView = true )
109     public XPage getViewSubscriptionList( HttpServletRequest request )
110     {
111         XPage xpage = getXPage( );
112         xpage.setContent( getSubscriptionList( request ) );
113         return xpage;
114     }
115 
116     /**
117      * Get the HTML content to display the list of subscriptions of the current user
118      * 
119      * @param request
120      *            The user
121      * @return The HTML content to display, or an empty string if the user has not logged in or if the authentication is not enabled
122      */
123     public static String getSubscriptionList( HttpServletRequest request )
124     {
125         if ( SecurityService.isAuthenticationEnable( ) )
126         {
127             LuteceUser user = SecurityService.getInstance( ).getRegisteredUser( request );
128             if ( user != null )
129             {
130                 SubscriptionService subscriptionService = SubscriptionService.getInstance( );
131                 SubscriptionFilterbusiness/SubscriptionFilter.html#SubscriptionFilter">SubscriptionFilter filter = new SubscriptionFilter( );
132                 filter.setIdSubscriber( user.getName( ) );
133                 List<Subscription> listSubscription = subscriptionService.findByFilter( filter );
134                 List<SubscriptionDTO> listSubscriptionDto = new ArrayList<>( listSubscription.size( ) );
135                 for ( Subscription subscription : listSubscription )
136                 {
137                     ISubscriptionProviderService providerService = subscriptionService.getProviderService( subscription.getSubscriptionProvider( ) );
138                     SubscriptionDTOss/SubscriptionDTO.html#SubscriptionDTO">SubscriptionDTO subscriptionDTO = new SubscriptionDTO( );
139                     subscriptionDTO.setIdSubscription( subscription.getIdSubscription( ) );
140                     subscriptionDTO.setRemovable(
141                             providerService.isSubscriptionRemovable( user, subscription.getSubscriptionKey( ), subscription.getIdSubscribedResource( ) ) );
142                     subscriptionDTO.setUrlModify(
143                             providerService.getUrlModifySubscription( user, subscription.getSubscriptionKey( ), subscription.getIdSubscribedResource( ) ) );
144                     subscriptionDTO.setHtmlSubscription( providerService.getSubscriptionHtmlDescriptionBis( user, subscription.getSubscriptionKey( ),
145                             subscription.getIdSubscribedResource( ), getStaticLocale( request ), subscription.getIdSubscribedResource( ) ) );
146                     listSubscriptionDto.add( subscriptionDTO );
147                 }
148 
149                 Map<String, Object> model = new HashMap<>( );
150                 model.put( MARK_LIST_SUBSCRIPTION_DTO, listSubscriptionDto );
151 
152                 HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MANAGE_SUBSCRIPTION, getStaticLocale( request ), model );
153 
154                 return template.getHtml( );
155             }
156         }
157         return StringUtils.EMPTY;
158     }
159 
160     /**
161      * Get the confirmation message before removing a subscription
162      * 
163      * @param request
164      *            The request
165      * @return a XPage
166      * @throws SiteMessageException
167      *             A SiteMessageException to display the confirmation message
168      */
169     @Action( ACTION_CONFIRM_REMOVE_URL )
170     public XPage confirmRemoveSubscription( HttpServletRequest request ) throws SiteMessageException
171     {
172         String strReferer = request.getHeader( PARAMETER_REFERER );
173         UrlItem urlItem = new UrlItem( PATH_PORTAL + getActionUrl( ACTION_DO_REMOVE_URL ) );
174         urlItem.addParameter( PARAMETER_ID_SUBSCRIPTION, request.getParameter( PARAMETER_ID_SUBSCRIPTION ) );
175         Map<String, Object> requestParameters = new HashMap<>( );
176 
177         if ( AppPropertiesService.getPropertyBoolean( ENCODE_FROM_URL_PARAMETER, true ) )
178         {
179             try
180             {
181                 urlItem.addParameter( PARAMETER_FROM_URL, URLEncoder.encode( strReferer, "UTF-8" ) );
182             }
183             catch( UnsupportedEncodingException e )
184             {
185                 AppLogService.error( e );
186             }
187         }
188         else
189         {
190             urlItem.addParameter( PARAMETER_FROM_URL, strReferer );
191         }
192 
193         SiteMessageService.setMessage( request, MESSAGE_CONFIRM_REMOVE_SUBSCRIPTION, SiteMessage.TYPE_CONFIRMATION, urlItem.getUrl( ), requestParameters );
194 
195         return null;
196     }
197 
198     /**
199      * Do remove a subscription
200      *
201      * @param request
202      *            The request
203      * @return a XPage
204      * @throws SiteMessageException
205      *             If the user is not allow to modify the subscription
206      */
207     @Action( ACTION_DO_REMOVE_URL )
208     public XPage doRemoveSubscription( HttpServletRequest request ) throws SiteMessageException
209     {
210         String strIdSubscription = request.getParameter( PARAMETER_ID_SUBSCRIPTION );
211 
212         if ( StringUtils.isNotEmpty( strIdSubscription ) && StringUtils.isNumeric( strIdSubscription ) )
213         {
214             int nIdSubscription = Integer.parseInt( strIdSubscription );
215             LuteceUser user = SecurityService.getInstance( ).getRegisteredUser( request );
216             Subscription subscription = SubscriptionService.getInstance( ).findBySubscriptionId( nIdSubscription );
217             if ( user != null && subscription != null && StringUtils.equals( subscription.getUserId( ), user.getName( ) ) )
218             {
219                 SubscriptionService.getInstance( ).removeSubscription( nIdSubscription, true );
220             }
221             else
222             {
223                 SiteMessageService.setMessage( request, MESSAGE_ACCESS_DENIED, SiteMessage.TYPE_STOP );
224             }
225         }
226 
227         String strFromParam = request.getParameter( PARAMETER_FROM_URL );
228         String strUrl;
229         if ( StringUtils.isNotEmpty( strFromParam ) && AppPropertiesService.getPropertyBoolean( ENABLE_FROM_URL_PARAMETER, true ) )
230         {
231             strUrl = strFromParam;
232         }
233         else
234         {
235             strUrl = AppPathService.getBaseUrl( request ) + JSP_URL_SUBSCRIBE_XPAGE;
236         }
237 
238         redirect( request, strUrl );
239         return new XPage( );
240     }
241 
242     /**
243      * Default getStaticLocale() implementation. Could be overriden
244      * 
245      * @param request
246      *            The HTTP request
247      * @return The Locale
248      */
249     public static Locale getStaticLocale( HttpServletRequest request )
250     {
251         return LocaleService.getContextUserLocale( request );
252     }
253 }