1 package fr.paris.lutece.plugins.workflow.modules.eudonetrestdirectory.threadService;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import net.sf.json.JSONArray;
7 import net.sf.json.JSONObject;
8
9 import com.sun.jersey.api.client.ClientResponse;
10
11 import fr.paris.lutece.plugins.directory.business.Directory;
12 import fr.paris.lutece.plugins.directory.business.DirectoryHome;
13 import fr.paris.lutece.plugins.directory.business.Record;
14 import fr.paris.lutece.plugins.directory.business.RecordHome;
15 import fr.paris.lutece.plugins.directory.service.DirectoryPlugin;
16 import fr.paris.lutece.plugins.managewferror.business.Resource;
17 import fr.paris.lutece.plugins.managewferror.business.service.IProcessTaskErrorService;
18 import fr.paris.lutece.plugins.managewferror.business.service.ProcessTaskErrorService;
19 import fr.paris.lutece.plugins.workflow.modules.eudonetrestdirectory.business.EudonetLink;
20 import fr.paris.lutece.plugins.workflow.modules.eudonetrestdirectory.business.EudonetLinkHome;
21 import fr.paris.lutece.plugins.workflow.modules.eudonetrestdirectory.business.EudonetRestData;
22 import fr.paris.lutece.plugins.workflow.modules.eudonetrestdirectory.service.BuildJsonBodyService;
23 import fr.paris.lutece.plugins.workflow.modules.eudonetrestdirectory.service.EudonetClient;
24 import fr.paris.lutece.plugins.workflow.modules.eudonetrestdirectory.service.EudonetRestWsService;
25 import fr.paris.lutece.plugins.workflow.modules.eudonetrestdirectory.utils.EudonetRestException;
26 import fr.paris.lutece.portal.service.plugin.Plugin;
27 import fr.paris.lutece.portal.service.plugin.PluginService;
28 import fr.paris.lutece.portal.service.util.AppLogService;
29
30 public class AcdpThread extends Thread
31 {
32 private static final String THREAD_NAME = "eudonetRest-export-Acdp-thread";
33 private static final String ACTION = "ACDP ACTION";
34
35 private EudonetClient _client;
36 private EudonetRestWsService _eudonetRestWsService;
37 private List<EudonetRestData> _listEuData;
38 private int _nIdResource;
39 private int _nIdDirectory;
40 private int _nIdAction;
41 private EudonetRestException _eudonetException;
42 private boolean _bRunning;
43
44 IProcessTaskErrorService _erroService = ProcessTaskErrorService.getService( );
45
46 boolean bError = false;
47 Resource resourceDTO= null;
48 fr.paris.lutece.plugins.managewferror.business.Error error= null;
49
50
51
52
53
54
55
56
57
58
59 public AcdpThread( EudonetClient client, EudonetRestWsService service, List<EudonetRestData> listEuData, int idDirectory, int idResource, int idAction )
60 {
61 _client = client;
62 _eudonetRestWsService = service;
63 _listEuData = listEuData;
64 _nIdResource = idResource;
65 _nIdDirectory = idDirectory;
66 _nIdAction = idAction;
67 setName( THREAD_NAME + _nIdResource );
68 }
69
70
71
72
73 @Override
74 public void run( )
75 {
76
77
78 try
79 {
80 resourceDTO = getResourceDTO( );
81 error = resourceDTO.getError().get(0);
82
83
84 _bRunning = true;
85 _eudonetException = null;
86
87 String strToken = token( );
88
89 if ( strToken != null )
90 {
91 createRecords( strToken );
92 createRecordsLink( strToken );
93
94 }
95 else
96 {
97 AppLogService.error( "Erreur d'authentification sur eudonet" );
98 bError = true;
99 error.setError( "Erreur d'authentification sur eudonet" );
100 _erroService.saveErrorTrace( resourceDTO );
101 }
102
103 if ( !bError )
104 {
105
106
107
108 _erroService.deleteErrorTrace( _nIdResource );
109 }
110 }
111 catch( Exception ex )
112 {
113 AppLogService.error( "error calling addProjectsInEudonet method : " + ex.getMessage( ), ex );
114 _bRunning = false;
115 bError = true;
116 error.setError( "error calling addProjectsInEudonet method : " + ex.getMessage( ) );
117 _erroService.saveErrorTrace( resourceDTO );
118 }
119
120 _bRunning = false;
121 this.interrupt( );
122 }
123
124 public EudonetRestException getEudonetException( )
125 {
126 return _eudonetException;
127 }
128
129
130
131
132
133
134 public boolean isRunning( )
135 {
136 return _bRunning;
137 }
138
139
140
141
142 public void setRuning( boolean bool )
143 {
144 this._bRunning = bool;
145 }
146
147 public String token( )
148 {
149 try
150 {
151 String strAuthenticateJson = _eudonetRestWsService.getAuthenticateJsonBody( );
152 ClientResponse response = _client.getTokenAuthenticate( strAuthenticateJson );
153
154 if ( response.getStatus( ) == 200 )
155 {
156 String strResponse = response.getEntity( String.class );
157 JSONObject jsonObject = new JSONObject( );
158 jsonObject.accumulate( "object", strResponse );
159
160 String strStatus = jsonObject.getJSONObject( "object" ).getJSONObject( "ResultInfos" ).getString( "Success" );
161
162 if ( strStatus.equals( "true" ) )
163 {
164 return jsonObject.getJSONObject( "object" ).getJSONObject( "ResultData" ).getString( "Token" );
165 }
166 else
167 {
168 String strErrorMessage = jsonObject.getJSONObject( "object" ).getJSONObject( "ResultInfos" ).getString( "ErrorMessage" );
169 AppLogService.error( "Error Eudonet : " + strErrorMessage );
170 }
171
172 }
173 }
174 catch( Exception ex )
175 {
176 AppLogService.error( "Erreur to generate the token", ex );
177 }
178
179 return null;
180 }
181
182 public void createRecords( String strToken )
183 {
184 if ( strToken != null )
185 {
186 List<Integer> idTableList = getTableListNotLink( strToken );
187 for ( Integer i : idTableList )
188 {
189 try
190 {
191 String strJsonBody = BuildJsonBodyService.getService( ).getCreateRecordJsonBody( i, _listEuData, _nIdResource, _nIdDirectory );
192 ClientResponse response = _client.createRecord( strToken, "" + i, strJsonBody );
193 if ( response.getStatus( ) == 200 )
194 {
195 String strResponse = response.getEntity( String.class );
196 JSONObject jsonObject = new JSONObject( );
197 jsonObject.accumulate( "object", strResponse );
198
199 String strStatus = jsonObject.getJSONObject( "object" ).getJSONObject( "ResultInfos" ).getString( "Success" );
200
201 if ( strStatus.equals( "true" ) )
202 {
203 String strFileId = jsonObject.getJSONObject( "object" ).getJSONObject( "ResultData" ).getString( "FileId" );
204 if ( strFileId != null && !strFileId.isEmpty( ) )
205 {
206 Integer nFileId = Integer.parseInt( strFileId );
207
208 if ( isAnnexed( i ) )
209 createAnnexes( strToken, nFileId, i );
210
211 EudonetLink eudonetLink = new EudonetLink( );
212 eudonetLink.setIdRessource( _nIdResource );
213 eudonetLink.setIdField( "" + nFileId );
214 eudonetLink.setIdTable( "" + i );
215 eudonetLink.setIdTableLink( "" );
216
217 EudonetLinkHome.create( eudonetLink );
218 }
219
220 AppLogService.info( "Succes Creation - FileId : " + strFileId );
221 }
222 else
223 {
224 String strErrorMessage = jsonObject.getJSONObject( "object" ).getJSONObject( "ResultInfos" ).getString( "ErrorMessage" );
225 AppLogService.error( "Error Eudonet : " + strErrorMessage );
226 bError = true;
227 error.setError("Create main Record: "+strErrorMessage);
228 _erroService.saveErrorTrace( resourceDTO );
229 }
230 }
231 }
232 catch( Exception ex )
233 {
234 AppLogService.error( "Erreur to create table : " + i, ex );
235 bError = true;
236 error.setError("Create main Record: "+ex.getMessage( ));
237 _erroService.saveErrorTrace( resourceDTO );
238 }
239 }
240 }
241 }
242
243 public void createRecordsLink( String strToken )
244 {
245 if ( strToken != null )
246 {
247 List<Integer> idTableList = getTableListLink( strToken );
248 for ( Integer i : idTableList )
249 {
250 List<Integer> idTableListLinked = getTableListLinked( strToken, i );
251
252 try
253 {
254 String strJsonBody = BuildJsonBodyService.getService( ).getCreateRecordJsonBodyLink( i, _listEuData, _nIdResource, _nIdDirectory,
255 idTableListLinked );
256 ClientResponse response = _client.createRecord( strToken, "" + i, strJsonBody );
257 if ( response.getStatus( ) == 200 )
258 {
259 String strResponse = response.getEntity( String.class );
260 JSONObject jsonObject = new JSONObject( );
261 jsonObject.accumulate( "object", strResponse );
262
263 String strStatus = jsonObject.getJSONObject( "object" ).getJSONObject( "ResultInfos" ).getString( "Success" );
264
265 if ( strStatus.equals( "true" ) )
266 {
267 String strFileId = jsonObject.getJSONObject( "object" ).getJSONObject( "ResultData" ).getString( "FileId" );
268 if ( strFileId != null && !strFileId.isEmpty( ) )
269 {
270 Integer nFileId = Integer.parseInt( strFileId );
271
272 if ( isAnnexed( i ) )
273 createAnnexes( strToken, nFileId, i );
274 }
275
276 AppLogService.info( "Succes Creation - FileId : " + strFileId );
277 }
278 else
279 {
280 String strErrorMessage = jsonObject.getJSONObject( "object" ).getJSONObject( "ResultInfos" ).getString( "ErrorMessage" );
281 AppLogService.error( "Error Eudonet : " + strErrorMessage );
282 bError = true;
283 error.setError("create Record Link: "+strErrorMessage);
284 _erroService.saveErrorTrace( resourceDTO );
285 }
286 }
287 }
288 catch( Exception ex )
289 {
290 AppLogService.error( "Erreur to create table : " + i, ex );
291 bError = true;
292 error.setError("create Record Link: "+ex.getMessage( ));
293 _erroService.saveErrorTrace( resourceDTO );
294 }
295 }
296
297 }
298 }
299
300 public void createAnnexes( String strToken, int nIdFile, int nIdTable )
301 {
302 if ( strToken != null )
303 {
304 try
305 {
306 JSONArray jSONArray = BuildJsonBodyService.getService( ).getCreateAnnexeJsonBody( nIdFile, nIdTable, _listEuData, _nIdResource, _nIdDirectory );
307 for ( int index = 0; index < jSONArray.size( ); index++ )
308 {
309 JSONObject jObject = jSONArray.getJSONObject( index );
310 String strJObject = jObject.toString( );
311 ClientResponse response = _client.addAnnexes( strToken, strJObject );
312 if ( response.getStatus( ) == 200 )
313 {
314 String strResponse = response.getEntity( String.class );
315 JSONObject jsonObject = new JSONObject( );
316 jsonObject.accumulate( "object", strResponse );
317
318 String strStatus = jsonObject.getJSONObject( "object" ).getJSONObject( "ResultInfos" ).getString( "Success" );
319
320 if ( strStatus.equals( "true" ) )
321 {
322 String strFileId = jsonObject.getJSONObject( "object" ).getJSONObject( "ResultData" ).getString( "AnnexId" );
323
324 AppLogService.info( "Succes Add Annexe - FileId : " + strFileId );
325 }
326 else
327 {
328 String strErrorMessage = jsonObject.getJSONObject( "object" ).getJSONObject( "ResultInfos" ).getString( "ErrorMessage" );
329 AppLogService.error( "Error Eudonet : adding Annexe " + strErrorMessage );
330 bError = true;
331 error.setError("Create Annexes :"+strErrorMessage);
332 _erroService.saveErrorTrace( resourceDTO );
333 }
334 }
335 }
336 }
337 catch( Exception ex )
338 {
339 AppLogService.error( "Erreur to create table : " + nIdTable, ex );
340 bError = true;
341 error.setError("Create Annexes :"+ex.getMessage());
342 _erroService.saveErrorTrace( resourceDTO );
343 }
344 }
345 }
346
347 public List<Integer> getTableListDistinct( )
348 {
349 List<Integer> idTableList = new ArrayList<Integer>( );
350 for ( EudonetRestData eudonetRestData : _listEuData )
351 {
352 String strIdTable = eudonetRestData.getIdTable( ).split( "-" ) [0];
353 if ( !strIdTable.isEmpty( ) )
354 {
355 Integer nIdTable = Integer.parseInt( strIdTable );
356 if ( !strIdTable.equals( "102000" ) && !idTableList.contains( nIdTable ) )
357 {
358 idTableList.add( nIdTable );
359 }
360 }
361 }
362
363 return idTableList;
364 }
365
366 public boolean isAnnexed( Integer nIdTable )
367 {
368 for ( EudonetRestData eudonetRestData : _listEuData )
369 {
370 String strIdTableLink = eudonetRestData.getIdTableLink( ).split( "-" ) [0];
371 String strIdTable = eudonetRestData.getIdTable( ).split( "-" ) [0];
372 if ( !strIdTableLink.isEmpty( ) && strIdTable.equals( "" + nIdTable ) )
373 {
374 return true;
375 }
376 }
377
378 return false;
379 }
380
381 public List<Integer> getTableListNotLink( String strToken )
382 {
383 List<Integer> idTableListDistinct = getTableListDistinct( );
384 List<Integer> idTableList = new ArrayList<Integer>( );
385 for ( Integer idTable : idTableListDistinct )
386 {
387 String strBody = BuildJsonBodyService.getService( ).getMetaInfosJsonBody( "" + idTable );
388 if ( strBody != null )
389 {
390 ClientResponse response = _client.getAttributListMetaInfos( strToken, strBody );
391 if ( response.getStatus( ) == 200 )
392 {
393 String strResponse = response.getEntity( String.class );
394 JSONObject jsonObject = new JSONObject( );
395 jsonObject.accumulate( "object", strResponse );
396 String strStatus = jsonObject.getJSONObject( "object" ).getJSONObject( "ResultInfos" ).getString( "Success" );
397 if ( strStatus.equals( "true" ) )
398 {
399 JSONArray jsonArray = jsonObject.getJSONObject( "object" ).getJSONObject( "ResultMetaData" ).getJSONArray( "Tables" ).getJSONObject( 0 )
400 .getJSONArray( "Links" );
401 if ( jsonArray.size( ) == 0 && idTableListDistinct.contains( idTable ) )
402 {
403 idTableList.add( idTable );
404 }
405 }
406 else
407 {
408 String strErrorMessage = jsonObject.getJSONObject( "object" ).getJSONObject( "ResultInfos" ).getString( "ErrorMessage" );
409 AppLogService.error( "Error Eudonet : " + strErrorMessage );
410 }
411 }
412 }
413 }
414
415 return idTableList;
416 }
417
418 public List<Integer> getTableListLinked( String strToken, Integer nIdTable )
419 {
420 List<Integer> idTableList = new ArrayList<Integer>( );
421 String strBody = BuildJsonBodyService.getService( ).getMetaInfosJsonBody( "" + nIdTable );
422 if ( strBody != null )
423 {
424 ClientResponse response = _client.getAttributListMetaInfos( strToken, strBody );
425 if ( response.getStatus( ) == 200 )
426 {
427 String strResponse = response.getEntity( String.class );
428 JSONObject jsonObject = new JSONObject( );
429 jsonObject.accumulate( "object", strResponse );
430 String strStatus = jsonObject.getJSONObject( "object" ).getJSONObject( "ResultInfos" ).getString( "Success" );
431 if ( strStatus.equals( "true" ) )
432 {
433 JSONArray jsonArray = jsonObject.getJSONObject( "object" ).getJSONObject( "ResultMetaData" ).getJSONArray( "Tables" ).getJSONObject( 0 )
434 .getJSONArray( "Links" );
435 for ( int i = 0; i < jsonArray.size( ); i++ )
436 {
437 idTableList.add( jsonArray.getInt( i ) );
438 }
439 }
440 else
441 {
442 String strErrorMessage = jsonObject.getJSONObject( "object" ).getJSONObject( "ResultInfos" ).getString( "ErrorMessage" );
443 AppLogService.error( "Error Eudonet : " + strErrorMessage );
444 }
445 }
446 }
447
448 return idTableList;
449 }
450
451 public List<Integer> getTableListLink( String strToken )
452 {
453 List<Integer> idTableListDistinct = getTableListDistinct( );
454 List<Integer> idTableListNotLink = getTableListNotLink( strToken );
455 for ( Integer i : idTableListNotLink )
456 {
457 if ( idTableListDistinct.contains( i ) )
458 {
459 idTableListDistinct.remove( i );
460 }
461 }
462
463 return idTableListDistinct;
464 }
465
466 public Resource getResourceDTO( )
467 {
468 Plugin pluginDirectory = PluginService.getPlugin( DirectoryPlugin.PLUGIN_NAME );
469
470 Record record = RecordHome.findByPrimaryKey( _nIdResource, pluginDirectory );
471 Directory directory= DirectoryHome.findByPrimaryKey(record.getDirectory().getIdDirectory(), pluginDirectory);
472 Resource resourceDTO = new Resource( );
473 resourceDTO.setIdResource( record.getIdRecord( ) );
474
475 resourceDTO.setAction( _nIdAction );
476 resourceDTO.setDescription( ACTION );
477 resourceDTO.setStatus( Resource.STATUS_KO );
478 resourceDTO.setIdWorkflow(directory.getIdWorkflow( ));
479
480 List<fr.paris.lutece.plugins.managewferror.business.Error> listError = new ArrayList<fr.paris.lutece.plugins.managewferror.business.Error>( );
481 fr.paris.lutece.plugins.managewferror.business.Error error = new fr.paris.lutece.plugins.managewferror.business.Error( );
482 java.sql.Timestamp date = new java.sql.Timestamp( System.currentTimeMillis( ) );
483 error.setDateError( date );
484 error.setAction( ACTION );
485 listError.add( error );
486 resourceDTO.setError( listError );
487
488 return resourceDTO;
489 }
490 }