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.workflow.modules.ticketing.service.daemon;
35
36 import java.util.ArrayList;
37 import java.util.HashMap;
38 import java.util.List;
39 import java.util.Map;
40 import java.util.Map.Entry;
41 import java.util.StringJoiner;
42 import java.util.stream.Collectors;
43
44 import fr.paris.lutece.plugins.genericattributes.business.Response;
45 import fr.paris.lutece.plugins.ticketing.business.ticket.Ticket;
46 import fr.paris.lutece.plugins.ticketing.business.ticket.TicketHome;
47 import fr.paris.lutece.plugins.ticketing.business.ticketpj.TicketPj;
48 import fr.paris.lutece.plugins.ticketing.business.ticketpj.TicketPjHome;
49 import fr.paris.lutece.plugins.ticketing.service.TicketTransfertPjService;
50 import fr.paris.lutece.plugins.ticketing.service.util.PluginConfigurationService;
51 import fr.paris.lutece.plugins.workflow.modules.ticketing.business.anonymisation.IAnonymisationDAO;
52 import fr.paris.lutece.plugins.workflow.modules.ticketing.business.information.ITaskInformationDAO;
53 import fr.paris.lutece.plugins.workflow.modules.ticketing.business.resourcehistory.IResourceHistoryDAO;
54 import fr.paris.lutece.portal.business.file.File;
55 import fr.paris.lutece.portal.business.file.FileHome;
56 import fr.paris.lutece.portal.service.daemon.Daemon;
57 import fr.paris.lutece.portal.service.plugin.Plugin;
58 import fr.paris.lutece.portal.service.plugin.PluginService;
59 import fr.paris.lutece.portal.service.spring.SpringContextService;
60 import fr.paris.lutece.portal.service.util.AppLogService;
61 import fr.paris.lutece.util.sql.TransactionManager;
62
63
64
65
66 public class TicketPjMigrationDaemon extends Daemon
67 {
68 private static final int MAX_TICKETS_PAR_LOT_MIGRATION_PJ = PluginConfigurationService.getInt( PluginConfigurationService.PROPERTY_MIGRATION_TICKET_MAX_PJ, 200 );
69 private static final int STATUS_TRANSFERT_OK = 1;
70 private static Plugin _plugin = PluginService.getPlugin( "ticketing" );
71
72 private static IResourceHistoryDAO _daoResourceHist = SpringContextService.getBean( IResourceHistoryDAO.BEAN_SERVICE );
73 private static ITaskInformationDAO _daoTaskInfo = SpringContextService.getBean( ITaskInformationDAO.BEAN_SERVICE );
74 private static IAnonymisationDAO _daoAnonymisation = SpringContextService.getBean( IAnonymisationDAO.BEAN_SERVICE );
75
76
77
78
79 public TicketPjMigrationDaemon( )
80 {
81 super( );
82 }
83
84
85
86
87 @Override
88 public void run( )
89 {
90 StringJoiner sb = new StringJoiner( "\n\r" );
91
92 sb.add( "Début de la migration" );
93 migratePj( sb );
94 sb.add( "Fin de la migration" );
95 setLastRunLogs( sb.toString( ) );
96 }
97
98
99
100
101
102
103
104
105 private void migratePj( StringJoiner sb )
106 {
107 List<Integer> ticketsList = TicketPjHome.getIdTicketListForPjMigration( MAX_TICKETS_PAR_LOT_MIGRATION_PJ );
108
109 if ( !ticketsList.isEmpty( ) )
110 {
111 sb.add( "nombre de tickets dont les PJ sont à transférer : " + ticketsList.size( ) );
112 for ( Integer idTicket : ticketsList )
113 {
114 Ticket ticket = TicketHome.findByPrimaryKeyWithoutFiles( idTicket );
115 if ( !TicketPjHome.isTicketExistInTicketPj( idTicket ) )
116 {
117 try
118 {
119 TransactionManager.beginTransaction( _plugin );
120
121
122 managePjforS3ForUsager( ticket );
123
124
125 List<Integer> idResponseTotal = new ArrayList<>( );
126 List<Integer> idCoreUploadFinal = new ArrayList<>( );
127
128 List<Integer> idHistoryList = _daoResourceHist.getIdHistoryListByResource( ticket.getId( ), _plugin );
129 for ( int idHistory : idHistoryList )
130 {
131
132 idResponseTotal = searchPjFromTaskInfoAndNotifyHistory( idHistory, idResponseTotal );
133
134
135 idCoreUploadFinal = searchPjFromTaskUploadFiles( idHistory, idCoreUploadFinal );
136 }
137
138 if ( !idResponseTotal.isEmpty( ) )
139 {
140 managePjforS3WithIdResponse( idResponseTotal, ticket );
141 }
142 if ( !idCoreUploadFinal.isEmpty( ) )
143 {
144
145 managePjforS3ForAgent( idCoreUploadFinal, ticket, false );
146 }
147
148 TicketPjHome.updateTransfertStatus( STATUS_TRANSFERT_OK, ticket.getId( ) );
149
150 } catch ( Exception e )
151 {
152 TransactionManager.rollBack( _plugin );
153 sb.add( "Annulation de la migration pour le ticket id : " + idTicket );
154 AppLogService.error( e );
155 }
156 TransactionManager.commitTransaction( _plugin );
157 }
158 TicketPjHome.updateTransfertStatus( STATUS_TRANSFERT_OK, ticket.getId( ) );
159 }
160 }
161 else
162 {
163 sb.add( "La liste est vide, il n'y a plus de pj à transférer" );
164 }
165 }
166
167
168
169
170
171
172
173
174
175
176 private List<Integer> searchPjFromTaskUploadFiles( int idHistory, List<Integer> idCoreUploadFinal )
177 {
178 List<Integer> idCoreUploadList = findIsFileFromTaskUploadFiles( idHistory, idCoreUploadFinal );
179 if ( !idCoreUploadList.isEmpty( ) )
180 {
181 idCoreUploadFinal.addAll( idCoreUploadList );
182 }
183 return idCoreUploadFinal.stream( ).distinct( ).collect( Collectors.toList( ) );
184 }
185
186
187
188
189
190
191
192
193
194
195 private List<Integer> searchPjFromTaskInfoAndNotifyHistory( int idHistory, List<Integer> idResponseTotal )
196 {
197 List<Integer> idResponseTaskInfoList = findIdResponseFromTaskInfo( idHistory, idResponseTotal );
198 List<Integer> idResponseNotifyHistoryList = findIdResponseFromNotifyHistory( idHistory, idResponseTotal );
199
200 if ( !idResponseTaskInfoList.isEmpty( ) )
201 {
202 idResponseTotal.addAll( idResponseTaskInfoList );
203 }
204 if ( !idResponseNotifyHistoryList.isEmpty( ) )
205 {
206 idResponseTotal.addAll( idResponseNotifyHistoryList );
207 }
208 return idResponseTotal.stream( ).distinct( ).collect( Collectors.toList( ) );
209 }
210
211
212
213
214
215
216
217 private void managePjforS3ForUsager( Ticket ticket )
218 {
219 List<Integer> usagerAttachment = TicketTransfertPjService.findUsagerAttachment( ticket );
220
221 if ( ( null != usagerAttachment ) && !usagerAttachment.isEmpty( ) )
222 {
223 usagerAttachment = cleanIdCoreList( usagerAttachment );
224
225 insertTicketPjAndCleanIdCoreList( usagerAttachment, ticket, true );
226 }
227 }
228
229
230
231
232
233
234
235
236 private List<Integer> cleanIdCoreList( List<Integer> idFileList )
237 {
238 List<Integer> cleanidList = new ArrayList<>( );
239 for ( Integer idFile : idFileList )
240 {
241 if ( TicketPjHome.isFileExistInCoreFile( idFile ) )
242 {
243 File file = FileHome.findByPrimaryKey( idFile );
244 if ( TicketPjHome.isFileExistInCorePhysicalFile( file.getPhysicalFile( ).getIdPhysicalFile( ) ) )
245 {
246 cleanidList.add( idFile );
247 }
248 }
249 }
250 return cleanidList;
251 }
252
253
254
255
256
257
258
259
260
261
262
263 private void managePjforS3ForAgent( List<Integer> idCoreUploadFinal, Ticket ticket, boolean isUsagerPj )
264 {
265 idCoreUploadFinal = cleanIdCoreList( idCoreUploadFinal );
266 insertTicketPjAndCleanIdCoreList( idCoreUploadFinal, ticket, isUsagerPj );
267 }
268
269
270
271
272
273
274
275
276
277 private void managePjforS3WithIdResponse( List<Integer> idResponseTotal, Ticket ticket )
278 {
279 Map<Integer, Integer> coreIdFileAgentFromIdResponseListClean = new HashMap<Integer, Integer>( );
280
281 Map<Integer, Integer> coreIdFileAgentFromIdResponseList = TicketHome.selectCoreFileForAgentPjMap( idResponseTotal );
282 if ( !coreIdFileAgentFromIdResponseList.isEmpty( ) )
283 {
284 for ( Entry<Integer, Integer> entry : coreIdFileAgentFromIdResponseList.entrySet( ) )
285 {
286 if ( TicketPjHome.isFileExistInCoreFile( entry.getValue( ) ) )
287 {
288 coreIdFileAgentFromIdResponseListClean.put( entry.getKey( ), entry.getValue( ) );
289 }
290 }
291
292 insertTicketPjFromMap( coreIdFileAgentFromIdResponseListClean, ticket, false );
293 }
294 }
295
296
297
298
299
300
301
302
303
304
305 private List<Integer> findIsFileFromTaskUploadFiles( int idHistory, List<Integer> idCoreUploadFinal )
306 {
307 List<Integer> idCoreUploadFound = TicketTransfertPjService.findUploadFiles( idHistory );
308 idCoreUploadFinal.addAll( idCoreUploadFound );
309 return idCoreUploadFinal;
310 }
311
312
313
314
315
316
317
318
319
320
321 private List<Integer> findIdResponseFromTaskInfo( int idHistory, List<Integer> idResponseTotal )
322 {
323 List<Integer> idResponseFromTaskInfo = ticketTaskInfoService( idHistory );
324 idResponseTotal.addAll( idResponseFromTaskInfo );
325 return idResponseTotal;
326 }
327
328
329
330
331
332
333
334
335
336
337 private List<Integer> findIdResponseFromNotifyHistory( int idHistory, List<Integer> idResponseTotal )
338 {
339 List<Integer> idResponseFromNotifyHistory = ticketNotifyHsitoryService( idHistory );
340 idResponseTotal.addAll( idResponseFromNotifyHistory );
341 return idResponseTotal;
342 }
343
344
345
346
347
348
349
350
351
352
353
354 private void insertTicketPjAndCleanIdCoreList( List<Integer> idFileList, Ticket ticket, boolean isUsagerPj )
355 {
356 idFileList = cleanIdCoreList( idFileList );
357 insertTicketPj( idFileList, ticket, isUsagerPj );
358 }
359
360
361
362
363
364
365
366
367
368
369
370 private void insertTicketPj( List<Integer> idFileList, Ticket ticket, boolean isUsagerPj )
371 {
372 if ( ( null != idFileList ) && !idFileList.isEmpty( ) )
373 {
374 for ( Integer idFile : idFileList )
375 {
376 TicketPj pj = new TicketPj( );
377 pj.setIdTicket( ticket.getId( ) );
378 pj.setIdFile( idFile );
379 for ( Response response : ticket.getListResponse( ) )
380 {
381 if ( ( null != response.getFile( ) ) && ( response.getFile( ).getIdFile( ) == idFile ) )
382 {
383 pj.setIdResponse( response.getIdResponse( ) );
384 break;
385 }
386 }
387 pj.setUrlTicketing( "" );
388 pj.setStockageTicketing( 0 );
389 pj.setUsager( isUsagerPj );
390 TicketPjHome.create( pj );
391 }
392 }
393 }
394
395
396
397
398
399
400
401
402
403
404
405 private void insertTicketPjFromMap( Map<Integer, Integer> idsMaps, Ticket ticket, boolean isUsagerPj )
406 {
407 if ( ( null != idsMaps ) && !idsMaps.isEmpty( ) )
408 {
409 for ( Entry<Integer, Integer> entry : idsMaps.entrySet( ) )
410 {
411 TicketPj pj = new TicketPj( );
412 pj.setIdTicket( ticket.getId( ) );
413 pj.setIdFile( entry.getValue( ) );
414 pj.setIdResponse( entry.getKey( ) );
415 pj.setUrlTicketing( "" );
416 pj.setStockageTicketing( 0 );
417 pj.setUsager( isUsagerPj );
418 TicketPjHome.create( pj );
419 }
420 }
421 }
422
423
424
425
426
427
428
429 private List<Integer> ticketTaskInfoService( int idHistory )
430 {
431 String valueInfo = _daoTaskInfo.getInfoHistoryValueByIdHistory( idHistory, _plugin );
432 List<Integer> idResponseTotal = new ArrayList<>( );
433 if ( !valueInfo.isEmpty( ) )
434 {
435 String valueInfoUpdated = _daoTaskInfo.getInfoHistoryValueByIdHistory( idHistory, _plugin );
436 if ( valueInfoUpdated.contains( "a href=" ) )
437 {
438 List<Integer> idResponseListForAgent = TicketTransfertPjService.extractIdResponse( valueInfoUpdated );
439 idResponseTotal.addAll( idResponseListForAgent );
440 }
441 }
442 return idResponseTotal;
443 }
444
445
446
447
448
449
450
451 private List<Integer> ticketNotifyHsitoryService( int idHistory )
452 {
453 Map<String, String> valueNotifyMessages = _daoAnonymisation.loadMessageNotifyHIstoryTotal( idHistory, _plugin );
454 List<Integer> idResponseTotal = new ArrayList<>( );
455 if ( ( null != valueNotifyMessages ) && !valueNotifyMessages.isEmpty( ) )
456 {
457 for ( Map.Entry<String, String> mapEntry : valueNotifyMessages.entrySet( ) )
458 {
459 if ( ( null != mapEntry.getValue( ) ) && mapEntry.getValue( ).contains( "a href=" ) )
460 {
461 List<Integer> idResponseListForAgent = TicketTransfertPjService.extractIdResponse( mapEntry.getValue( ) );
462 idResponseTotal.addAll( idResponseListForAgent );
463 }
464 }
465 }
466 return idResponseTotal;
467 }
468 }