package er.ajax; import org.apache.log4j.Logger; import com.webobjects.appserver.WOActionResults; import com.webobjects.appserver.WOAssociation; import com.webobjects.appserver.WOContext; import com.webobjects.appserver.WOElement; import com.webobjects.appserver.WORequest; import com.webobjects.appserver.WOResponse; import com.webobjects.appserver.WOSession; import com.webobjects.foundation.NSDictionary; import er.extensions.appserver.ERXDirectAction; import er.extensions.appserver.ERXResponse; /** * Allows you to log <code>window.console</code> JS messages from the browser to * a logger on the server. Pretty helpful when trying to debug JS problems that * do not occur on your machine. As you will to a round trip to the server on * each message, it's pretty costly and should be used with care. * * @author ak * * @binding logger the log4j logger to append to (default: "AjaxRemoteLogging") * @binding level the log4j logging level to use (default: "info") * @binding throttle the number of milliseconds to collect statements before actually sending (default: 100) * @binding filter a javascript function that returns true on a single argument * msg when the logging should go to the server * */ public class AjaxRemoteLogging extends AjaxDynamicElement { private WOAssociation _logger; private WOAssociation _filter; private WOAssociation _level; private WOAssociation _throttle; public AjaxRemoteLogging(String arg0, NSDictionary arg1, WOElement arg2) { super(arg0, arg1, arg2); _filter = (WOAssociation) arg1.objectForKey("filter"); _logger = (WOAssociation) arg1.objectForKey("logger"); _level = (WOAssociation) arg1.objectForKey("level"); _throttle = (WOAssociation) arg1.objectForKey("throttle"); } @Override public void appendToResponse(WOResponse response, WOContext context) { super.appendToResponse(response, context); String level = "info"; String logger = getClass().getSimpleName(); String filter = null; Object throttle = "100"; if (_filter != null) { filter = (String) _filter.valueInComponent(context.component()); } if (_logger != null) { logger = (String) _logger.valueInComponent(context.component()); } if (_level != null) { level = (String) _level.valueInComponent(context.component()); } if (_throttle != null) { throttle = _throttle.valueInComponent(context.component()); } String url = context.directActionURLForActionNamed(Log.class.getName(), null); StringBuilder buf = new StringBuilder(); buf.append("<script type='text/javascript'>\n"); buf.append("WonderRemoteLogging.install({url: '").append(url); buf.append("', level: '").append(level); buf.append("', logger: '").append(logger); buf.append("', throttle: ").append(throttle); buf.append(" , filter: ").append(filter); buf.append("});\n"); buf.append("</script>"); response.appendContentString(buf.toString()); } public static class Log extends ERXDirectAction { public Log(WORequest r) { super(r); } @Override public WOActionResults performActionNamed(String logger) { String level = context().request().stringFormValueForKey("l"); String msg = context().request().stringFormValueForKey("m"); if (logger == null) { logger = AjaxRemoteLogging.class.getSimpleName(); } // trigger session loading if present WOSession existing = existingSession(); Logger log = Logger.getLogger(logger); if ("fatal".equalsIgnoreCase(level)) { log.fatal(msg); } else if ("error".equalsIgnoreCase(level)) { log.error(msg); } else if ("warn".equalsIgnoreCase(level)) { log.warn(msg); } else if ("info".equalsIgnoreCase(level)) { log.info(msg); } else if ("debug".equalsIgnoreCase(level)) { log.debug(msg); } return new ERXResponse(); } } @Override protected void addRequiredWebResources(WOResponse response, WOContext context) { addScriptResourceInHead(context, response, "prototype.js"); addScriptResourceInHead(context, response, "wonder.js"); } @Override public WOActionResults handleRequest(WORequest request, WOContext context) { return null; } }