View Javadoc

1   /**
2    * Copyright 2005-2012 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.rice.krad.service.impl;
17  
18  import org.apache.log4j.Logger;
19  import org.kuali.rice.core.api.mail.MailMessage;
20  import org.kuali.rice.core.api.mail.Mailer;
21  import org.kuali.rice.kim.api.identity.Person;
22  import org.kuali.rice.krad.exception.ExceptionIncident;
23  import org.kuali.rice.krad.exception.KualiExceptionIncident;
24  import org.kuali.rice.krad.service.KRADServiceLocator;
25  import org.kuali.rice.krad.service.KualiExceptionIncidentService;
26  import org.kuali.rice.krad.util.GlobalVariables;
27  import org.kuali.rice.krad.util.KRADConstants;
28  
29  import java.util.ArrayList;
30  import java.util.HashSet;
31  import java.util.List;
32  import java.util.Map;
33  import java.util.Set;
34  
35  /**
36   * This is a basic implementation of the KualiReporterService. Currently, it only has
37   * a mail service as reporting mechanism.
38   * 
39   * @author Kuali Rice Team (rice.collab@kuali.org)
40   *
41   */
42  public class KualiExceptionIncidentServiceImpl implements KualiExceptionIncidentService {
43      private Logger LOG=Logger.getLogger(KualiExceptionIncidentServiceImpl.class);
44      
45      /**
46       * An list to send incident emails to.
47       */
48      private String incidentMailingList;
49      
50      /**
51       * This property must be defined in the base configuration file for specifying
52       * the mailing list for the report to be sent.
53       * <p>Example:
54       * <code>
55       * <param name="KualiReporterServiceImpl.REPORT_MAIL_LIST">a@y,b@z</param>
56       * </code>
57       */
58      public static final String REPORT_MAIL_LIST=String.format(
59              "%s.REPORT_MAIL_LIST",KualiExceptionIncidentServiceImpl.class.getSimpleName());
60      /**
61       * A Mailer for sending report.
62       */
63      private Mailer mailer;
64      
65      /**
66       * The injected Mailer.
67       * @param mailService the mailService to set
68       */
69      public final void setMailer(Mailer mailer) {
70          this.mailer = mailer;
71      }
72      
73      /**
74       * An email template is used to construct an email to be sent by the mail service.
75       */
76      private MailMessage messageTemplate;
77  
78      /**
79       * This mails the report using the mail service from the mail template.
80       * 
81       * @see org.kuali.rice.krad.service.KualiExceptionIncidentService#emailReport(java.lang.String, java.lang.String)
82       */
83      @Override
84  	public void emailReport(String subject, String message) throws Exception {
85          if (LOG.isTraceEnabled()) {
86              String lm=String.format("ENTRY %s;%s",
87                      (subject==null)?"null":subject.toString(),
88                      (message==null)?"null":message.toString());
89              LOG.trace(lm);
90          }
91          
92          if (mailer == null) {
93              String errorMessage = "mailer property of KualiExceptionIncidentServiceImpl is null";
94              LOG.fatal(errorMessage);
95              throw new IllegalStateException(errorMessage);
96          }
97          
98          // Send mail
99          MailMessage msg=createMailMessage(subject, message);
100         mailer.sendEmail(msg);
101 
102         if (LOG.isTraceEnabled()) {
103             LOG.trace("EXIT");
104         }
105     }
106 
107     /**
108      * This method create an instance of MailMessage from the inputs using the given
109      * template.
110      * 
111      * @param subject
112      * @param message
113      * @return
114      * @exception
115      */
116     @SuppressWarnings("unchecked")
117     private MailMessage createMailMessage(String subject, String message)
118                 throws Exception{
119         if (LOG.isTraceEnabled()) {
120             String lm=String.format("ENTRY %s%n%s",
121                     (subject==null)?"null":subject.toString(),
122                     (message==null)?"null":message.toString());
123             LOG.trace(lm);
124         }
125         
126         if (messageTemplate == null) {
127             throw new IllegalStateException(String.format(
128                     "%s.templateMessage is null or not set",
129                     this.getClass().getName()));
130         }
131         
132         // Copy input message reference for creating an instance of mail message
133         MailMessage msg=new MailMessage();
134         
135         Person actualUser = GlobalVariables.getUserSession().getPerson();
136         String fromEmail = actualUser.getEmailAddress();
137         if ((fromEmail != null) && (fromEmail != "")) {
138         	msg.setFromAddress(fromEmail);
139     	} else {
140         	msg.setFromAddress(messageTemplate.getFromAddress());
141     	}
142     	
143         msg.setBccAddresses(messageTemplate.getBccAddresses());
144         msg.setCcAddresses(messageTemplate.getCcAddresses());
145         // First check if message template already define mailing list
146         Set emails=messageTemplate.getToAddresses();
147         if (emails == null || emails.isEmpty()) {
148             String mailingList= KRADServiceLocator.getKualiConfigurationService().getPropertyValueAsString(
149                     REPORT_MAIL_LIST);
150             if (mailingList == null || mailingList.trim().length() == 0) {
151                 String em=REPORT_MAIL_LIST+" is not set or messageTemplate does not have ToAddresses already set.";
152                 LOG.error(em);
153                 throw new IllegalStateException(em);
154             } else {
155                 msg.setToAddresses(new HashSet<String>(split(mailingList,
156                         KRADConstants.FIELD_CONVERSIONS_SEPARATOR)));
157             }
158         } else {
159             msg.setToAddresses(emails);
160         }
161 
162         // Set mail message subject
163         msg.setSubject((subject==null)?"":subject);
164 
165         // Set mail message body
166         msg.setMessage((message==null)?"":message);
167         
168         if (LOG.isTraceEnabled()) {
169             String lm=String.format("EXIT %s",
170                     (msg==null)?"null":msg.toString());
171             LOG.trace(lm);
172         }
173 
174         return msg;
175     }
176 
177     /**
178      * This overridden method send email to the specified list of addresses.
179      * 
180      * @see org.kuali.rice.krad.service.KualiExceptionIncidentService#report(org.kuali.rice.krad.exception.KualiExceptionIncident)
181      */
182     @Override
183 	public void report(KualiExceptionIncident exceptionIncident) throws Exception {
184         if (LOG.isTraceEnabled()) {
185             String lm=String.format("ENTRY %s",
186                     (exceptionIncident==null)?"null":exceptionIncident.toString());
187             LOG.trace(lm);
188         }
189         
190         emailReport(
191                 exceptionIncident.getProperty(
192                         KualiExceptionIncident.EXCEPTION_REPORT_SUBJECT),
193                 exceptionIncident.getProperty(
194                         KualiExceptionIncident.EXCEPTION_REPORT_MESSAGE));
195         
196         if (LOG.isTraceEnabled()) {
197             String lm=String.format("EXIT");
198             LOG.trace(lm);
199         }
200         
201     }
202 
203     /**
204      * This method first separate a composite string of the format
205      * "string token string".
206      * <p>Example: 1,2,a,b where ',' is the token
207      * 
208      * @param s
209      * @param token
210      * @return
211      */
212     public List<String> split(String s, String token) {
213         if (LOG.isTraceEnabled()) {
214             String lm=String.format("ENTRY %s;%s", s, token);
215             LOG.trace(lm);
216         }
217                 
218         String[] sarray=s.split(token);
219         List<String> list=new ArrayList<String>();
220         for (int i=0; i<sarray.length && sarray[i].length() > 0; i++) {
221             list.add(sarray[i]);
222         }
223         
224         if (LOG.isTraceEnabled()) {
225             String lm=String.format("EXIT %s", list.toString());
226             LOG.trace(lm);
227         }
228         
229         return list;
230     }
231 
232     /**
233      * @return the messageTemplate
234      */
235     public final MailMessage getMessageTemplate() {
236         return this.messageTemplate;
237     }
238 
239     /**
240      * @param messageTemplate the messageTemplate to set
241      */
242     public final void setMessageTemplate(MailMessage messageTemplate) {
243         this.messageTemplate = messageTemplate;
244     }
245 
246     /**
247      * This overridden method create an instance of the KualiExceptionIncident.
248      * 
249      * @see org.kuali.rice.krad.service.KualiExceptionIncidentService#getExceptionIncident(
250      * java.lang.Exception,java.util.Map)
251      */
252     @Override
253 	public KualiExceptionIncident getExceptionIncident(Exception exception,
254             Map<String, String> properties) {
255     	if ( exception == null ) {
256     		return getExceptionIncident(properties);
257     	}
258         if (LOG.isTraceEnabled()) {
259             String lm=String.format("ENTRY %s;%s", exception.getMessage(),
260                     properties.toString());
261             LOG.trace(lm);
262         }
263         
264         KualiExceptionIncident ei=new ExceptionIncident(exception, properties);
265         
266         if (LOG.isTraceEnabled()) {
267             String lm=String.format("EXIT %s", ei.toProperties().toString());
268             LOG.trace(lm);
269         }
270                 
271         return ei;
272     }
273 
274     /**
275      * This overridden method create an instance of ExceptionIncident from list of
276      * name-value pairs as exception incident information.
277      * 
278      * @see org.kuali.rice.krad.service.KualiExceptionIncidentService#getExceptionIncident(java.util.Map)
279      */
280     @Override
281 	public KualiExceptionIncident getExceptionIncident(Map<String, String> properties) {
282         if (LOG.isTraceEnabled()) {
283             String lm=String.format("ENTRY %s", properties.toString());
284             LOG.trace(lm);
285         }
286         
287         ExceptionIncident ei=new ExceptionIncident(properties);
288                 
289         if (LOG.isTraceEnabled()) {
290             String lm=String.format("EXIT %s", ei.toProperties().toString());
291             LOG.trace(lm);
292         }
293                 
294         return ei;
295     }
296     
297 	/**
298 	 * @return the incidentMailingList
299 	 */
300 	public String getIncidentMailingList() {
301 		return this.incidentMailingList;
302 	}
303 
304 	/**
305 	 * @param incidentMailingList the incidentMailingList to set
306 	 */
307 	public void setIncidentMailingList(String incidentMailingList) {
308 		this.incidentMailingList = incidentMailingList;
309 	}
310 
311 }