1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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
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
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
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
115
116 @Override
117 public String getName( )
118 {
119 return ACTION_NAME;
120 }
121
122
123
124
125 @Override
126 public String getButtonTemplate( )
127 {
128 return null;
129 }
130
131
132
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
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
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
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
255
256
257 private Plugin getPlugin( )
258 {
259 return PluginService.getPlugin( DigglikePlugin.PLUGIN_NAME );
260 }
261 }