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.parisconnect.service;
35  
36  import java.sql.Date;
37  import java.sql.Timestamp;
38  import java.text.SimpleDateFormat;
39  import java.util.ArrayList;
40  import java.util.List;
41  
42  import org.apache.commons.collections.CollectionUtils;
43  import org.apache.commons.lang.StringUtils;
44  import org.apache.log4j.Logger;
45  
46  import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;
47  
48  import fr.paris.lutece.plugins.parisconnect.business.Alert;
49  import fr.paris.lutece.plugins.parisconnect.business.AlertHome;
50  import fr.paris.lutece.plugins.parisconnect.business.DoListResponse;
51  import fr.paris.lutece.plugins.parisconnect.business.Message;
52  import fr.paris.lutece.plugins.parisconnect.business.Newsletter;
53  import fr.paris.lutece.plugins.parisconnect.business.NewsletterHome;
54  import fr.paris.lutece.plugins.parisconnect.business.UserInformations;
55  import fr.paris.lutece.portal.service.cache.AbstractCacheableService;
56  import fr.paris.lutece.portal.service.util.AppLogService;
57  import fr.paris.lutece.portal.service.util.AppPropertiesService;
58  import fr.paris.lutece.util.date.DateUtil;
59  
60  
61  /**
62   *
63   * ParisConnectService
64   */
65  public final class ParisConnectService
66  {
67  
68     public static final String ERROR_ALREADY_SUBSCRIBE = "ALREADY_SUBSCRIBE";
69     public static final String ERROR_DURING_SUBSCRIBE = "ERROR_DURING_SUBSCRIBE";
70     public static final String CATEGORY_TYPE_AVIS = "avis";
71     public static final String CATEGORY_TYPE_DEMANDE = "demande";
72     private static ParisConnectService _singleton;
73     private static final String RESPONSE_OK_1 = "1";
74     private static final String RESPONSE_OK_0 = "0";
75     
76     private static final String RESPONSE_OK = "\"ok\"";
77     private static final String RESPONSE_LIST_EMPTY = "0";
78     private static final String RESPONSE_ALREADY = "\"ALREADY\"";
79     private static final String RESPONSE_SUCCESS = "success";
80     private static final String RESPONSE_ERROR_OBJECT_NULL = "null";
81     private static final String DATE_ENVOI_PATTERN = "yyyy-MM-dd HH:mm:ss";
82  
83     
84     private static Logger _logger = Logger.getLogger( Constants.LOGGER_PARISCONNECT );
85     private static AbstractCacheableService _cacheUserName = new  UserNameCacheService(  );
86     private static AbstractCacheableService _cacheUser = new  UserCacheService(  );
87     private static SimpleDateFormat  _formatterDate=new SimpleDateFormat(DATE_ENVOI_PATTERN);
88  	      
89  
90  
91      /**
92       * Empty constructor
93       */
94      private ParisConnectService(  )
95      {
96          // nothing
97      }
98  
99      /**
100      * Gets the instance
101      *
102      * @return the instance
103      */
104     public static ParisConnectService getInstance(  )
105     {
106         if ( _singleton == null )
107         {
108             _singleton = new ParisConnectService(  );
109         }       
110 
111         return _singleton;
112     }
113 
114     
115     
116 
117     /**
118      * Subscribe user to a newsletter
119      * @param strPCUID the user pcuid
120      * @param strMail the user mail
121      * @param strIdAlertes the alert id
122      * @return the JSON response
123       */
124     public String subscribeNewsletter( String strPCUID,String strMail, String strIdNewsletter )
125     {
126         String strError = null;
127       
128         if(isNewsletterParisFr( strIdNewsletter ))
129         {
130              return subscribeDoList( strMail )?null:ERROR_DURING_SUBSCRIBE;
131         }
132         
133         String strResponse = ParisConnectAPIService.subscribeNewsletter( strPCUID, strIdNewsletter );
134 
135         if ( strResponse != null )
136         {
137             if ( !RESPONSE_OK_1.equals( strResponse ) )
138             {
139                 if ( RESPONSE_ALREADY.equals( strResponse ) )
140                 {
141                     strError = ERROR_ALREADY_SUBSCRIBE;
142                 }
143                 else
144                 {
145                     strError = ERROR_DURING_SUBSCRIBE;
146                     _logger.error( "error during subscribeUser : " + strResponse );
147                 }
148             }
149         }
150         else
151         {
152             strError = ERROR_DURING_SUBSCRIBE;
153         }
154 
155         return strError;
156     }
157     
158     
159 
160     /**
161      * Unsubscribe user to a newsletter
162      * @param strPCUID the user pcuid
163      * @param strIdNewsletter the newsletter id
164      * @return the JSON response
165       */
166     public boolean unSubscribeNewsletter( String strPCUID,String strMail,String strIdNewsletter )
167     {
168         boolean unscribe = false;
169         if(isNewsletterParisFr( strIdNewsletter ))
170         {
171              return unSubscribeDoList( strMail );
172         }
173         
174         String strResponse = ParisConnectAPIService.unSubscribeNewsletter( strPCUID, strIdNewsletter );
175 
176         if ( strResponse != null )
177         {
178             if ( RESPONSE_OK_1.equals( strResponse ) )
179             {
180                 unscribe = true;
181             }
182             else
183             {
184                 _logger.error( "error during unSubscribeUser : " + strResponse );
185             }
186         }
187 
188         return unscribe;
189     }
190 
191     
192     public boolean  markMessageAsRead(String strIdMessage)
193     {
194         boolean markMessageAsRead = false;
195         String strResponse = ParisConnectAPIService.markMessageAsRead( strIdMessage );
196 
197         if ( strResponse != null )
198         {
199             if ( RESPONSE_OK.equals( strResponse ) )
200             {
201                 markMessageAsRead = true;
202             }
203             else
204             {
205                 _logger.error( "error during  markMessageAsRead : " + strResponse );
206             }
207         }
208 
209         return markMessageAsRead;
210         
211     }
212     
213     public boolean  markMessageAsUnRead(String strIdMessage)
214     {
215         boolean markMessageAsUnRead = false;
216         String strResponse = ParisConnectAPIService.markMessageAsUnRead( strIdMessage );
217 
218         if ( strResponse != null )
219         {
220             if ( RESPONSE_OK.equals( strResponse ) )
221             {
222                 markMessageAsUnRead = true;
223             }
224             else
225             {
226                 _logger.error( "error during  markMessageAsRead : " + strResponse );
227             }
228         }
229 
230         return markMessageAsUnRead;
231         
232     }
233     
234 
235 
236     /**
237      * Subscribe user to a alert
238      * @param strPCUID the user pcuid
239      * @param strIdAlertes the alert id
240      * @return the JSON response
241       */
242     public String subscribeAlert( String strPCUID, String strIdAlertes )
243     {
244         String strError = null;
245         String strResponse = ParisConnectAPIService.subscribeAlert( strPCUID, strIdAlertes );
246 
247         if ( strResponse != null )
248         {
249             if ( !RESPONSE_OK.equals( strResponse ) )
250             {
251                 if ( RESPONSE_ALREADY.equals( strResponse ) )
252                 {
253                     strError = ERROR_ALREADY_SUBSCRIBE;
254                 }
255                 else
256                 {
257                     strError = ERROR_DURING_SUBSCRIBE;
258                     _logger.error( "error during subscribeUser : " + strResponse );
259                 }
260             }
261         }
262         else
263         {
264             strError = ERROR_DURING_SUBSCRIBE;
265         }
266 
267         return strError;
268     }
269     
270     
271 
272     /**
273      * Unsubscribe user to a alert
274      * @param strPCUID the user pcuid
275      * @param strIdAlertes the alert id
276      * @return the JSON response
277       */
278     public boolean unSubscribeAlert( String strPCUID, String strIdAlertes )
279     {
280         boolean unscribe = false;
281         String strResponse = ParisConnectAPIService.unSubscribeAlert( strPCUID, strIdAlertes );
282 
283         if ( strResponse != null )
284         {
285             if ( RESPONSE_OK.equals( strResponse ) )
286             {
287                 unscribe = true;
288             }
289             else
290             {
291                 _logger.error( "error during unSubscribeUser : " + strResponse );
292             }
293         }
294 
295         return unscribe;
296     }
297     
298     
299     public List<Alert> getAlerts()
300     {
301     	
302     
303         String strResponse = ParisConnectAPIService.getAlerts();
304     	return getAlerts(strResponse);
305     }
306     
307     public List<Alert> getUserAlerts(String strUid)
308     {
309     	
310         String strResponse = ParisConnectAPIService.getUserAlerts(strUid);
311     	return getAlerts(strResponse);
312     }
313    
314     
315     
316     public List<Newsletter> getNewsletters()
317     {
318     	
319     	 String strResponse = ParisConnectAPIService.getNewsletters();
320     	 return getNewsletter(strResponse);
321      }
322     
323     public List<Newsletter> getUserNewsletters(String strUid,String strMail)
324     {
325     	
326         List<Newsletter> newsletterList=null;
327          String strResponse = ParisConnectAPIService.getUserNewsletters(strUid);
328        	 if(!RESPONSE_LIST_EMPTY.equals(strResponse))
329        	 {
330        		newsletterList=getNewsletter(strResponse);
331        		
332        		if(!CollectionUtils.isEmpty( newsletterList))
333        		{
334        		    Newsletter newsletterToRemove=null;
335            		for(Newsletter newsletter:newsletterList)
336            		{
337            		   //delete information if the information come of parisconnect
338            		  if(isNewsletterParisFr(newsletter.getCode( )) )
339            		  {
340            		      newsletterToRemove= newsletter ;
341            		  }
342            		    
343            		}
344            		if(newsletterToRemove!=null)
345            		{
346            		    newsletterList.remove( newsletterToRemove );
347            		}
348        		}
349        		if(isSubscribeDoList( strMail ) )
350        		{
351        		    Newsletter newsletter=new Newsletter( );
352        		    newsletter.setCode( getnewsletterParisFrCode( ) );
353        		    completeNewsletterInformations( newsletter );
354        		    newsletterList.add(newsletter);
355        		}
356        		
357        	 }
358        	 return newsletterList;
359        	 
360     }
361     
362     public List<Message> getUserMessages(String strIdUSers)
363     {
364     
365      List<Message> listMessage=new ArrayList<>();
366    	 String strResponse = ParisConnectAPIService.getUserMessages(strIdUSers);
367    	 if(!RESPONSE_ERROR_OBJECT_NULL.equals(strResponse) &&  !RESPONSE_LIST_EMPTY.equals(strResponse))
368    	 {
369    		listMessage=getMessages(strResponse);
370    	 }
371    	 
372    	 return listMessage;
373     }
374     public List<Message> getMessage(String strIdMessage)
375     {
376     
377      
378      List<Message> listMessage=new ArrayList<>();
379     	   		
380    	 String strResponse = ParisConnectAPIService.getMessage(strIdMessage);
381    	 if(!RESPONSE_ERROR_OBJECT_NULL.equals(strResponse) &&  !RESPONSE_LIST_EMPTY.equals(strResponse))
382    	 {
383    		listMessage=getMessages(strResponse);
384    		 
385    	 }
386    	 
387 	  return listMessage;
388     }
389     
390     public List<Message> getTicket( String strIdMessageParent )
391     {
392      List<Message> listMessage=new ArrayList<>();	
393    	 String strResponse = ParisConnectAPIService.getTicket(strIdMessageParent);
394    	if(!RESPONSE_ERROR_OBJECT_NULL.equals(strResponse) &&  !RESPONSE_LIST_EMPTY.equals(strResponse))
395   	 {
396   		listMessage=getMessages(strResponse);
397   		 
398   	 }
399   	 
400    		return listMessage;
401     }
402     
403     
404     
405     public UserInformations getUser( String strUid )
406     {
407     	return getUser(strUid, false);
408 	}
409     
410     public UserInformations getUser( String strUid , boolean bUseCache)
411     {
412     
413     	
414 	    UserInformations userInformations=bUseCache?(UserInformations) _cacheUser.getFromCache(strUid ):null;
415 	    if(userInformations == null)
416 	    {
417 	    	String strResponse = ParisConnectAPIService.getUser(strUid);
418 	    	if ( !RESPONSE_ERROR_OBJECT_NULL.equals( strResponse ) )
419 	           {
420 			            
421 			    	userInformations =getUserInformations(strResponse);
422 			    	if(userInformations!=null && bUseCache)
423 			    	{
424 			    		_cacheUser.putInCache(strUid, userInformations);
425 			    	}
426 	            }
427 	    }
428 	    
429 	    return userInformations;
430 	}
431     
432     public UserInformations getUserName( String strIdUSers)
433     {
434     	return getUserName(strIdUSers,false);
435     }
436     
437     public UserInformations getUserName( String strIdUSers, boolean bUseCache )
438     {
439     	
440     	 UserInformations userInformations=bUseCache?(UserInformations) _cacheUser.getFromCache(strIdUSers ):null;;
441  	    if(userInformations == null)
442  	    {
443  	    	String strResponse = ParisConnectAPIService.getUserName(strIdUSers);
444  	    	if ( !RESPONSE_ERROR_OBJECT_NULL.equals( strResponse ) )
445 	           {
446 		 	    	if(!StringUtils.isEmpty(strResponse) && strResponse.length()>2)
447 		 	    	{
448 		 	    		//Delete []
449 		 	    		strResponse=strResponse.substring(1, strResponse.length()-1);
450 		 	    		
451 		 	    	}
452 		 	    	userInformations =getUserInformations(strResponse);
453 		 	    	if(userInformations!=null && bUseCache)
454 		 	    	{
455 		 	    		_cacheUserName.putInCache(strIdUSers, userInformations);
456 		 	    	}
457 	           }
458  	    }
459  	    
460  	    return userInformations;
461     }
462     
463     
464     
465    
466 
467     /**
468      * get user pcuid by email
469      * @param strMail the mail
470      * @return the pcuid of the user if a account exist
471      */
472     public String getPcuidByEmail( String strMail )
473     {
474         return ParisConnectAPIService.getPcuidByEmail( strMail );
475     }
476 
477     /**
478      * create a Shadow account
479      * @param strMail the mail
480      * @param strIdEmail the mail id
481      * @return the user PCUID
482      */
483     public String setAccountShadow( String strMail, String strIdEmail )
484     {
485         return ParisConnectAPIService.setAccountShadow( strMail, strIdEmail );
486     }
487 
488    
489     
490     
491     
492     
493     
494     /**
495      * sendMessageEmp
496      * @param strMail the mail	
497      * @param strMessage the message
498      * @param strBackUrl the back url
499      * @return true if there is no problem
500      */
501     public boolean sendMessageEmp(String strMail,String strMessage,String strBackUrl,String strCategory)
502     {
503     		return ParisConnectAPIService.sendMessageEmp(strMail, strMessage,strBackUrl,strCategory);
504     }
505     
506     /**
507      * sendMessageEmp
508      * @param strMail the mail  
509      * @param strMessage the message
510      * @param strBackUrl the back url
511      * @return true if there is no problem
512      */
513     public boolean sendUserResponseEmp(String strIdMessageParentEmp,String strMessage,String strPcuid)
514     {
515         boolean bResponseEmp = false;
516         String strResponse = ParisConnectAPIService.sendUserResponseEmp( strIdMessageParentEmp, strMessage, strPcuid );
517 
518         if ( strResponse != null )
519         {
520             if ( RESPONSE_OK.toUpperCase( ).equals( strResponse ) )
521             {
522                 bResponseEmp = true;
523             }
524             else
525             {
526                 _logger.error( "error during sendUserResponseEmp : " + strResponse );
527             }
528         }
529 
530         return bResponseEmp;   
531      
532     }
533     
534     
535     
536     /**
537      * Subscribe user to a newsletter do list   
538      * @param strPCUID the user pcuid
539      * @param strIdAlertes the alert id
540      * @return the JSON response
541       */
542     private boolean subscribeDoList( String strMail )
543     {
544         String strResponse = ParisConnectAPIService.subscribeUserDoList( strMail );
545 
546         DoListResponse doListResponse=null;
547         if ( !StringUtils.isEmpty(strResponse) )
548         {
549         
550             doListResponse = JsonUtil.getObjectResponse(strResponse, DoListResponse.class);
551             if(RESPONSE_SUCCESS.equals( doListResponse.getStatus( ) ) && RESPONSE_OK_1.equals(doListResponse.getData( )))
552             {
553                 
554                 return true;
555                 
556             }
557          }
558         
559         return false;
560     }
561     
562     
563 
564     /**
565      * Unsubscribe user to a newsletter
566      * @param strPCUID the user pcuid
567      * @param strIdNewsletter the newsletter id
568      * @return the JSON response
569       */
570     private boolean unSubscribeDoList( String strMail )
571     {
572         String strResponse = ParisConnectAPIService.unSubscribeUserDoList( strMail );
573 
574         DoListResponse doListResponse=null;
575         if ( !StringUtils.isEmpty(strResponse) )
576         {
577         
578             doListResponse = JsonUtil.getObjectResponse(strResponse, DoListResponse.class);
579             if(RESPONSE_SUCCESS.equals( doListResponse.getStatus( ) ) && RESPONSE_OK_1.equals(doListResponse.getData( )))
580             {
581                 
582                 return true;
583                 
584             }
585          }
586         
587         return false;
588     }
589     
590     
591     /**
592      * Unsubscribe user to a newsletter
593      * @param strPCUID the user pcuid
594      * @param strIdNewsletter the newsletter id
595      * @return the JSON response
596       */
597  private boolean isSubscribeDoList( String strMail )
598     {
599         String strResponse = ParisConnectAPIService.isSubscribedDoList( strMail );
600 
601         DoListResponse doListResponse=null;
602         if ( !StringUtils.isEmpty(strResponse) )
603         {
604         
605             doListResponse = JsonUtil.getObjectResponse(strResponse, DoListResponse.class);
606             if(RESPONSE_SUCCESS.equals( doListResponse.getStatus( ) ) && RESPONSE_OK_0.equals(doListResponse.getData( )))
607             {
608                 
609                 return true;
610                 
611             }
612          }
613         
614         return false;
615     }
616     
617  
618     
619     
620     
621     
622     /**
623      * send Message
624      * @param message the message
625      * @return the JSON response
626       */
627     public String sendMessage( Message message)
628     {
629     	return ParisConnectAPIService.sendMessage(message);	
630     }
631     
632     private void completeAlertInformations(Alert alert)
633     {
634     	 Alert alertDatabase=AlertHome.findByIdPc(alert.getIdPc());
635     	 if(alertDatabase!= null)
636     	 {
637     		 alert.setCategory(alertDatabase.getCategory());
638     	 }
639     }
640     
641     
642     
643     private List<Alert> getAlerts(String strResponse) 
644     
645     {
646     	List<Alert> listAlertPcResult=new ArrayList<>();
647 	    if ( !StringUtils.isEmpty(strResponse) )
648 	    {
649 		 
650 			 	listAlertPcResult = JsonUtil.getObjectResponseList( strResponse,
651 					 Alert.class); 
652 			 
653 			 for(Alert alert:listAlertPcResult )
654 			 {
655 				completeAlertInformations(alert);
656 			 }
657 	    }
658 	    return listAlertPcResult;
659     }
660     
661     private List<Newsletter> getNewsletter(String strResponse)
662     {
663     	
664     	List<Newsletter> listNewsletter=new ArrayList<Newsletter>( );
665        	 if ( !StringUtils.isEmpty(strResponse) )
666          {
667     	 
668     		 listNewsletter = JsonUtil.getObjectResponseList( strResponse,
669     				 Newsletter.class); 
670     		 
671     		 for(Newsletter newsletter:listNewsletter )
672     		 {
673     			completeNewsletterInformations(newsletter);
674     		 }
675          }
676     	 return listNewsletter;
677      }
678     
679     private List<Message> getMessages(String strResponse)
680     {
681     	
682     	List<Message> listMessage=null;
683        	 if ( !StringUtils.isEmpty(strResponse) )
684          {
685     	 
686        		listMessage = JsonUtil.getObjectResponseList( strResponse,
687     				 Message.class); 
688     		 
689     		
690          }
691        	if(listMessage!=null)
692        	{
693        	    
694        	    for(Message message:listMessage)
695        	    {
696        		if(message.getDateEnvoi()!=null)
697        		{
698        		 // you can change format of date
699        		    try {
700        		 java.util.Date date = _formatterDate.parse(message.getDateEnvoi());
701 			Timestamp timeDateEnvoi = new Timestamp(date.getTime());
702        		    	message.setDateModification(timeDateEnvoi);
703        		} 
704 		    catch (java.text.ParseException e) {
705        	     
706        		    AppLogService.error("Api Message Paris connect erreur de format de date envoi ",e);
707        		  
708        		}
709        		
710        	    
711        		}
712        	    }
713        	}
714        	 
715     	 return listMessage;
716      }
717     
718     private UserInformations getUserInformations(String strResponse)
719     {
720     	
721     	UserInformations userInformations=null;
722     	 if ( !StringUtils.isEmpty(strResponse) )
723          {
724     	 
725     		 userInformations = JsonUtil.getObjectResponse(strResponse, UserInformations.class);
726     		 
727     		
728          }
729     	return userInformations;
730     	
731      }
732     
733     
734     
735     
736     
737     
738     private void completeNewsletterInformations(Newsletter newsletter)
739     {
740     	 Newsletter newsletterDatabase=NewsletterHome.findByCode(newsletter.getCode());
741     	 if(newsletterDatabase!= null)
742     	 {
743     		 newsletter.setDescription(newsletterDatabase.getDescription());
744     		 newsletter.setTitle(newsletterDatabase.getTitle());
745     		 newsletter.setPicture(newsletterDatabase.getPicture());
746     		 newsletter.setLinkRequirement(newsletterDatabase.getLinkRequirement());
747     		 newsletter.setLinkLastNumber(newsletterDatabase.getLinkLastNumber());
748     		 newsletter.setEnabled(newsletterDatabase.getEnabled());
749     	}
750     }
751     
752     private boolean isNewsletterParisFr(String strCode)
753     {
754         String  strNewsletterParisFrCode=AppPropertiesService.getProperty( Constants.PROPERTY_NEWSLETTER_PARIS_FR_CODE );
755    
756         return strNewsletterParisFrCode!=null &&  strCode.startsWith(strNewsletterParisFrCode);
757     }
758     private String getnewsletterParisFrCode()
759     {
760         return AppPropertiesService.getProperty( Constants.PROPERTY_NEWSLETTER_PARIS_FR_CODE );
761    
762          
763     }
764     
765    }