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.plugins.digglike.web.action;
35  
36  import fr.paris.lutece.plugins.digglike.business.CommentSubmit;
37  import fr.paris.lutece.plugins.digglike.business.Digg;
38  import fr.paris.lutece.plugins.digglike.business.DiggHome;
39  import fr.paris.lutece.plugins.digglike.business.DiggSubmit;
40  import fr.paris.lutece.plugins.digglike.business.EntryFilter;
41  import fr.paris.lutece.plugins.digglike.business.EntryHome;
42  import fr.paris.lutece.plugins.digglike.business.ExportFormat;
43  import fr.paris.lutece.plugins.digglike.business.ExportFormatHome;
44  import fr.paris.lutece.plugins.digglike.business.SubmitFilter;
45  import fr.paris.lutece.plugins.digglike.service.CommentSubmitService;
46  import fr.paris.lutece.plugins.digglike.service.DiggSubmitService;
47  import fr.paris.lutece.plugins.digglike.service.DigglikePlugin;
48  import fr.paris.lutece.plugins.digglike.service.DigglikeResourceIdService;
49  import fr.paris.lutece.plugins.digglike.utils.DiggUtils;
50  import fr.paris.lutece.portal.business.user.AdminUser;
51  import fr.paris.lutece.portal.service.admin.AccessDeniedException;
52  import fr.paris.lutece.portal.service.html.XmlTransformerService;
53  import fr.paris.lutece.portal.service.i18n.I18nService;
54  import fr.paris.lutece.portal.service.message.AdminMessage;
55  import fr.paris.lutece.portal.service.message.AdminMessageService;
56  import fr.paris.lutece.portal.service.plugin.Plugin;
57  import fr.paris.lutece.portal.service.plugin.PluginService;
58  import fr.paris.lutece.portal.service.rbac.RBACService;
59  import fr.paris.lutece.portal.service.util.AppLogService;
60  import fr.paris.lutece.portal.service.util.AppPropertiesService;
61  import fr.paris.lutece.portal.web.pluginaction.AbstractPluginAction;
62  import fr.paris.lutece.portal.web.pluginaction.DefaultPluginActionResult;
63  import fr.paris.lutece.portal.web.pluginaction.IPluginActionResult;
64  import fr.paris.lutece.util.UniqueIDGenerator;
65  import fr.paris.lutece.util.filesystem.FileSystemUtil;
66  import fr.paris.lutece.util.xml.XmlUtil;
67  
68  import java.io.IOException;
69  import java.io.OutputStream;
70  
71  import java.util.List;
72  import java.util.Map;
73  
74  import javax.servlet.http.HttpServletRequest;
75  import javax.servlet.http.HttpServletResponse;
76  
77  
78  /**
79   *
80   * Exports records (search records or all records)
81   *
82   */
83  public class ExportDiggSubmitAction extends AbstractPluginAction<DigglikeAdminSearchFields> implements IDigglikeAction
84  {
85      private static final String ACTION_NAME = "Export Digglike XSL";
86      private static final String MESSAGE_YOU_ARE_NOT_ALLOWED_TO_DOWLOAD_THIS_FILE = "digglike.message.youAreNotAllowedToDownloadFile";
87      private static final String MESSAGE_YOU_MUST_SELECT_EXPORT_FORMAT = "digglike.message.youMustSelectExportFormat";
88      private static final String MESSAGE_ERROR_DURING_DOWNLOAD_FILE = "digglike.message.errorDuringDownloadFile";
89      private static final String MARK_EXPORT_FORMAT_REF_LIST = "export_format_list";
90      private static final String PARAMETER_BUTTON_EXPORT_ALL = "export_search_all";
91      private static final String PARAMETER_BUTTON_EXPORT_SEARCH = "export_search_result";
92      private static final String PARAMETER_ID_DIGG = "id_digg";
93      private static final String XSL_UNIQUE_PREFIX_ID = UniqueIDGenerator.getNewId(  ) + "digg-";
94      private static final String PARAMETER_ID_EXPORT_FORMAT = "id_export_format";
95      private static final String EXPORT_CSV_EXT = "csv";
96      private static final String DEAFULT_ENCODING = "UTF-8";
97      private static final String CONSTANT_MIME_TYPE_CSV = "application/csv";
98      private static final String CONSTANT_MIME_TYPE_OCTETSTREAM = "application/octet-stream";
99  
100     //PROPERTY
101     private static final String PROPERTY_EXPORT_ENCODING_CSV = "digglike.exportFileEncoding.csv";
102     private static final String PROPERTY_EXPORT_ENCODING_XML = "digglike.exportFileEncoding.xml";
103 
104     /**
105      * {@inheritDoc}
106      */
107     @Override
108     public void fillModel( HttpServletRequest request, AdminUser adminUser, Map<String, Object> model )
109     {
110         model.put( MARK_EXPORT_FORMAT_REF_LIST, ExportFormatHome.getListExport( getPlugin(  ) ) );
111     }
112 
113     /**
114      * {@inheritDoc}
115      */
116     @Override
117     public String getName(  )
118     {
119         return ACTION_NAME;
120     }
121 
122     /**
123      * {@inheritDoc}
124      */
125     @Override
126     public String getButtonTemplate(  )
127     {
128         return null;
129     }
130 
131     /**
132      * {@inheritDoc}
133      */
134     @Override
135     public boolean isInvoked( HttpServletRequest request )
136     {
137         return ( request.getParameter( PARAMETER_BUTTON_EXPORT_SEARCH ) != null ) ||
138         ( request.getParameter( PARAMETER_BUTTON_EXPORT_ALL ) != null );
139     }
140 
141     /**
142      * {@inheritDoc}
143      */
144     @Override
145     public IPluginActionResult process( HttpServletRequest request, HttpServletResponse response, AdminUser adminUser,
146         DigglikeAdminSearchFields searchFields ) throws AccessDeniedException
147     {
148         Plugin plugin = getPlugin(  );
149         IPluginActionResult result = new DefaultPluginActionResult(  );
150 
151         String strIdExportFormat = request.getParameter( PARAMETER_ID_EXPORT_FORMAT );
152         String strIdDigg = request.getParameter( PARAMETER_ID_DIGG );
153         int nIdExportFormat = DiggUtils.getIntegerParameter( strIdExportFormat );
154         int nIdDigg = DiggUtils.getIntegerParameter( strIdDigg );
155 
156         Digg digg = DiggHome.findByPrimaryKey( nIdDigg, plugin );
157 
158         if ( ( digg == null ) ||
159                 !RBACService.isAuthorized( Digg.RESOURCE_TYPE, Integer.toString( digg.getIdDigg(  ) ),
160                     DigglikeResourceIdService.PERMISSION_MANAGE_DIGG_SUBMIT, adminUser ) )
161         {
162             throw new AccessDeniedException( I18nService.getLocalizedString( 
163                     MESSAGE_YOU_ARE_NOT_ALLOWED_TO_DOWLOAD_THIS_FILE, request.getLocale(  ) ) );
164         }
165 
166         ExportFormat exportFormat;
167         exportFormat = ExportFormatHome.findByPrimaryKey( nIdExportFormat, plugin );
168 
169         if ( exportFormat == null )
170         {
171             result.setRedirect( AdminMessageService.getMessageUrl( request, MESSAGE_YOU_MUST_SELECT_EXPORT_FORMAT,
172                     AdminMessage.TYPE_STOP ) );
173         }
174         else
175         {
176             EntryFilter entryfilter = new EntryFilter(  );
177             entryfilter.setIdDigg( digg.getIdDigg(  ) );
178             //set digg entries
179             digg.setEntries( EntryHome.getEntryList( entryfilter, plugin ) );
180 
181             SubmitFilter filter = DiggUtils.getDiggSubmitFilter( searchFields );
182             List<Integer> listIdDiggSubmit = DiggSubmitService.getService(  ).getDiggSubmitListId( filter, plugin );
183 
184             StringBuffer strBufferListDiggSubmitXml = new StringBuffer(  );
185             DiggSubmit diggSubmit = null;
186             List<CommentSubmit> listCommentSubmit;
187             //reinit filter for comment
188             filter = new SubmitFilter(  );
189 
190             for ( Integer nIdDiggSubmit : listIdDiggSubmit )
191             {
192                 diggSubmit = DiggSubmitService.getService(  ).findByPrimaryKey( nIdDiggSubmit, false, true, plugin );
193                 filter.setIdDiggSubmit( nIdDiggSubmit );
194                 listCommentSubmit = CommentSubmitService.getService(  ).getCommentSubmitList( filter, plugin );
195                 diggSubmit.setComments( listCommentSubmit );
196                 diggSubmit.setDigg( digg );
197                 strBufferListDiggSubmitXml.append( diggSubmit.getXml( request, adminUser.getLocale(  ) ) );
198             }
199 
200             String strXmlSource = XmlUtil.getXmlHeader(  ) +
201                 digg.getXml( request, strBufferListDiggSubmitXml, adminUser.getLocale(  ) );
202             XmlTransformerService xmlTransformerService = new XmlTransformerService(  );
203 
204             String strFileOutPut = xmlTransformerService.transformBySourceWithXslCache( strXmlSource,
205                     exportFormat.getXsl(  ), XSL_UNIQUE_PREFIX_ID + nIdExportFormat, null, null );
206 
207             String strFormatExtension = exportFormat.getExtension(  ).trim(  );
208             String strFileName = digg.getTitle(  ) + "." + strFormatExtension;
209             boolean isExporTypeCSV = ( ( strFormatExtension != null ) && strFormatExtension.equals( EXPORT_CSV_EXT ) );
210 
211             String strEncoding = isExporTypeCSV
212                 ? AppPropertiesService.getProperty( PROPERTY_EXPORT_ENCODING_CSV, DEAFULT_ENCODING )
213                 : AppPropertiesService.getProperty( PROPERTY_EXPORT_ENCODING_XML, DEAFULT_ENCODING );
214             String strResponseContentType = null;
215 
216             if ( isExporTypeCSV )
217             {
218                 strResponseContentType = CONSTANT_MIME_TYPE_CSV;
219             }
220             else
221             {
222                 String strMimeType = FileSystemUtil.getMIMEType( strFileName );
223                 strResponseContentType = ( strMimeType != null ) ? strMimeType : CONSTANT_MIME_TYPE_OCTETSTREAM;
224             }
225 
226             DiggUtils.addHeaderResponse( request, response, strFileName );
227             response.setContentType( strResponseContentType );
228             response.setCharacterEncoding( strEncoding );
229 
230             try
231             {
232                 byte[] byteFileOutPut = strFileOutPut.getBytes( strEncoding );
233                 response.setContentLength( (int) byteFileOutPut.length );
234 
235                 OutputStream os = response.getOutputStream(  );
236                 os.write( byteFileOutPut );
237                 os.close(  );
238             }
239             catch ( IOException e )
240             {
241                 AppLogService.error( e );
242 
243                 result.setRedirect( AdminMessageService.getMessageUrl( request, MESSAGE_ERROR_DURING_DOWNLOAD_FILE,
244                         AdminMessage.TYPE_STOP ) );
245             }
246         }
247 
248         result.setNoop( true );
249 
250         return result;
251     }
252 
253     /**
254      * Gets the plugin
255      * @return the plugin
256      */
257     private Plugin getPlugin(  )
258     {
259         return PluginService.getPlugin( DigglikePlugin.PLUGIN_NAME );
260     }
261 }