/* * Created on Jul 1, 2004 */ package org.entermedia.error; import java.io.PrintWriter; import java.io.StringWriter; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import javax.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.entermedia.email.PostMail; import com.openedit.OpenEditException; import com.openedit.WebPageRequest; import com.openedit.config.Configuration; import com.openedit.config.XMLConfiguration; import com.openedit.error.ErrorHandler; import com.openedit.hittracker.HitTracker; import com.openedit.page.Page; import com.openedit.page.PageRequestKeys; import com.openedit.page.manage.PageManager; import com.openedit.users.Group; import com.openedit.users.User; import com.openedit.users.UserManager; /** * @author Matthew Avery, mavery@einnovation.com */ public class EmailErrorHandler implements ErrorHandler { protected String fieldRecipientList; protected String fieldServer; protected String fieldFrom; protected boolean fieldConsumeErrors; protected PageManager fieldPageManager; protected UserManager fieldUserManager; protected PostMail postMail; private static Log log = LogFactory.getLog(EmailErrorHandler.class); public boolean handleError(Exception error, WebPageRequest inRequest) //public boolean handleError( Exception error, String inPath, WebPageRequest inContext ) { try { if ( fieldRecipientList == null) { configure(); } Set emails = findNotificationEmailAddresses(); if( emails.size() == 0) { log.error("No users configured to receive email error notifications"); return false; } String server = (String) inRequest.getPageValue(PageRequestKeys.WEB_SERVER_PATH); if( server == null ) { server = (String) inRequest.getPageValue("hostName"); } String message = createMessage(error, inRequest, server); String subject = "Open Edit error: "; if ( server != null ) { subject = "Open Edit error on " + server + ": "; } if ( error.getMessage() != null ) { subject = subject + error.getMessage(); } //Loop over the groups and fill a list of users String[] recepients = (String[])emails.toArray(new String[emails.size()]); postMail.postMail(recepients,subject,null,message,getFrom()); } catch (Exception e) { log.error( "Email Error Sender Failed: " + e ); return false; } return isConsumeErrors(); } /** * Determine all the email addresses to notify for all the groups the given * user is in. TODO: Move this to a business object * * @param inGroups * The user for which to determine the email addresses * * @return All the email addresses */ public Set findNotificationEmailAddresses() throws OpenEditException { Set emailAddresses = new HashSet(); for (Iterator groupIter = getUserManager().getGroups().iterator(); groupIter.hasNext();) { Group group = (Group) groupIter.next(); if (group.hasPermission("oe.error.notify")) { // Collect the email addresses of all the users in this group. HitTracker list = getUserManager().getUsersInGroup(group); for (Iterator userIter = list.iterator(); userIter.hasNext();) { User user = (User) userIter.next(); String email = user.getEmail(); if ((email != null) && (email.length() > 0)) { emailAddresses.add(email); } } } } return emailAddresses; } protected String createMessage(Exception error, WebPageRequest inRequest, String server) { StringWriter writer = new StringWriter(); writer.write("<pre>"); writer.write( "Requested Path: " + inRequest.getPath() + "\n\n"); HttpServletRequest req = inRequest.getRequest(); if ( req != null) { String header = req.getHeader("Referer"); if ( header != null) { writer.write( "Referer: "+ header); writer.write( "\n"); } String ipaddress = req.getRemoteAddr(); if ( ipaddress != null) { writer.write( "Remote IP address: "+ ipaddress); writer.write( "\n"); } String userAgent = req.getHeader("User-Agent"); if ( userAgent != null) { writer.write( "User agent: "+ userAgent); writer.write( "\n"); } } if ( server == null && req != null ) { server = req.getServerName(); if ( server != null) { writer.write( "Server: "+ server); writer.write( "\n"); } else { server = "unknown"; } } try { String serverIP = InetAddress.getLocalHost().getHostAddress(); writer.write( "Server Id: " + serverIP ); writer.write( "\n"); } catch (UnknownHostException e) { log.error(e); } String version = (String)inRequest.getPageValue("version"); if ( version != null) { writer.write("OE Core Version: " + version); writer.write("\n"); } //writer.write( "Recipients: " + getRecipientList() + "\n\n"); User user = inRequest.getUser(); if ( user != null ) { writer.write( "User: " + user.getUserName() + "\n\n" ); } else { writer.write( "User: none\n\n" ); } if ( error.getMessage() != null ) { writer.write( "Error Message: " + error.getMessage() + "\n\n" ); } writer.write( "Detail:\n\n" ); error.printStackTrace( new PrintWriter( writer ) ); writer.write("<pre>"); //String message = URLUtilities.xmlEscape( writer.toString() ); //Dont allow HTML in here return writer.toString(); } protected boolean isConsumeErrors() { return fieldConsumeErrors; } public PageManager getPageManager() { return fieldPageManager; } public void setPageManager(PageManager inPageManager) { fieldPageManager = inPageManager; } protected void configure() throws OpenEditException { //read in the configuration file //TODO: Look for a config file on the root level first Page config = getPageManager().getPage("/WEB-INF/errorsettings.xml"); if ( !config.exists() ) { config = getPageManager().getPage("/openedit/notification/errorsettings.xml"); } if( config.exists() ) { XMLConfiguration notificationConfig = new XMLConfiguration(); notificationConfig.readXML(config.getReader()); Configuration configuration = notificationConfig.getChild("emailsettings"); String sender = configuration.getChildValue( "from" ); //setsetsender ); setFrom(sender); setServer( configuration.getChildValue( "smtp-server" ) ); /* String consumeError = configuration.getChildValue("consume-error"); if ( consumeError != null ) { setConsumeErrors( Boolean.valueOf( consumeError ).booleanValue() ); } */ } else { log.error("No error settings page available " ); } } public String getServer() { return fieldServer; } public void setServer(String inServer) { fieldServer = inServer; } public String getFrom() { return fieldFrom; } public void setFrom(String inFrom) { fieldFrom = inFrom; } public UserManager getUserManager() { return fieldUserManager; } public void setUserManager(UserManager inUserManager) { fieldUserManager = inUserManager; } public PostMail getPostMail() { return postMail; } public void setPostMail(PostMail postMail) { this.postMail = postMail; } public void sendNotification(String inSubject, String inMessage) { try { if ( fieldRecipientList == null) { configure(); } Set emails = findNotificationEmailAddresses(); if( emails.size() == 0) { log.error("No users configured to receive email error notifications"); return; } String[] recepients = (String[])emails.toArray(new String[emails.size()]); postMail.postMail(recepients,inSubject,null,inMessage,getFrom()); } catch (Exception e) { log.error( "Email Error Sender Failed: " + e ); return ; } } }