View Javadoc
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       * constructor
52       * 
53       * @param client
54       * @param service
55       * @param listEuData
56       * @param idDirectory
57       * @param idResource
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       * {@inheritDoc }
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 	            //Plugin pluginDirectory = PluginService.getPlugin( DirectoryPlugin.PLUGIN_NAME );
107 	        	//Record record = RecordHome.findByPrimaryKey( _nIdResource, pluginDirectory );
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      * Return the running state
131      * 
132      * @return the running state
133      */
134     public boolean isRunning( )
135     {
136         return _bRunning;
137     }
138 
139     /**
140      * @param bool
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                             // String strErrorMessage = jsonObject.getJSONObject( "object" ).getJSONObject( "ResultInfos" ).getString( "ErrorMessage" );
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         //resourceDTO.setIdGfaProvider( Integer.parseInt( record.getDirectory( ).getIdDirectory( ) + "" ) );
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 }