Package er.ajax

Source Code of er.ajax.AjaxRemoteLogging$Log

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;
  }
}
TOP

Related Classes of er.ajax.AjaxRemoteLogging$Log

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.