All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ch.qos.logback.core.html.HTMLLayoutBase Maven / Gradle / Ivy

/**
 * Logback: the reliable, generic, fast and flexible logging framework.
 * Copyright (C) 1999-2009, QOS.ch. All rights reserved.
 *
 * This program and the accompanying materials are dual-licensed under
 * either the terms of the Eclipse Public License v1.0 as published by
 * the Eclipse Foundation
 *
 *   or (per the licensee's choosing)
 *
 * under the terms of the GNU Lesser General Public License version 2.1
 * as published by the Free Software Foundation.
 */
package ch.qos.logback.core.html;

import java.util.HashMap;
import java.util.Map;

import ch.qos.logback.core.Context;
import ch.qos.logback.core.CoreConstants;
import static ch.qos.logback.core.CoreConstants.LINE_SEPARATOR;
import ch.qos.logback.core.LayoutBase;
import ch.qos.logback.core.pattern.Converter;
import ch.qos.logback.core.pattern.ConverterUtil;
import ch.qos.logback.core.pattern.parser.Node;
import ch.qos.logback.core.pattern.parser.Parser;
import ch.qos.logback.core.pattern.parser.ScanException;

/**
 * This class is a base class for HTMLLayout classes part of
 * other logback modules such as logback-classic and logback-access.
 * 
 *
 * @author Sébastien Pennec
 */
public abstract class HTMLLayoutBase extends LayoutBase {

  protected String pattern;

  protected Converter head;

  protected String title = "Logback Log Messages";

  //It is the responsibility of derived classes to set
  //this variable in their constructor to a default value.
  protected CssBuilder cssBuilder;

   // counter keeping track of the rows output
  protected long counter = 0;
  
  /**
   * Set the ConversionPattern  option. This is the string which controls
   * formatting and consists of a mix of literal content and conversion
   * specifiers.
   */
  public void setPattern(String conversionPattern) {
    pattern = conversionPattern;
  }

  /**
   * Returns the value of the ConversionPattern  option.
   */
  public String getPattern() {
    return pattern;
  }

  public CssBuilder getCssBuilder() {
    return cssBuilder;
  }

  public void setCssBuilder(CssBuilder cssBuilder) {
    this.cssBuilder = cssBuilder;
  }

  /**
   * Parses the pattern and creates the Converter linked list.
   */
  @Override
  public void start() {
    int errorCount = 0;
    
    try {
      Parser p = new Parser(pattern);
      p.setContext(getContext());
      Node t = p.parse();
      this.head = p.compile(t, getEffectiveConverterMap());
      ConverterUtil.startConverters(this.head);
    } catch (ScanException ex) {
      addError("Incorrect pattern found", ex);
      errorCount++;
    }

    if (errorCount == 0) {
      super.started = true;
    }
  }
  
  protected abstract Map getDefaultConverterMap();

  
  /**
   * Returns a map where the default converter map is merged with the map
   * contained in the context.
   */
  public Map getEffectiveConverterMap() {
    Map effectiveMap = new HashMap();

    // add the least specific map fist
    Map defaultMap = getDefaultConverterMap();
    if (defaultMap != null) {
      effectiveMap.putAll(defaultMap);
    }

    // contextMap is more specific than the default map
    Context context = getContext();
    if (context != null) {
      @SuppressWarnings("unchecked")
      Map contextMap = (Map) context
          .getObject(CoreConstants.PATTERN_RULE_REGISTRY);
      if (contextMap != null) {
        effectiveMap.putAll(contextMap);
      }
    }
    return effectiveMap;
  }
  
  /**
   * The Title  option takes a String value. This option sets the
   * document title of the generated HTML document.
   * 
   * 

* Defaults to 'Logback Log Messages'. */ public void setTitle(String title) { this.title = title; } /** * Returns the current value of the Title option. */ public String getTitle() { return title; } /** * Returns the content type output by this layout, i.e "text/html". */ @Override public String getContentType() { return "text/html"; } /** * Returns appropriate HTML headers. */ @Override public String getFileHeader() { StringBuilder sbuf = new StringBuilder(); sbuf.append(""); sbuf.append(LINE_SEPARATOR); sbuf.append(""); sbuf.append(LINE_SEPARATOR); sbuf.append(" "); sbuf.append(LINE_SEPARATOR); sbuf.append(" "); sbuf.append(title); sbuf.append(""); sbuf.append(LINE_SEPARATOR); cssBuilder.addCss(sbuf); // if (cssBuilder == null) { // DefaultCssBuilder.addDefaultCSS(sbuf); // } else { // cssBuilder.addExternalCSS(sbuf); // } sbuf.append(LINE_SEPARATOR); sbuf.append(" "); sbuf.append(LINE_SEPARATOR); sbuf.append(""); sbuf.append(LINE_SEPARATOR); return sbuf.toString(); } public String getPresentationHeader() { StringBuilder sbuf = new StringBuilder(); sbuf.append("


"); sbuf.append(LINE_SEPARATOR); sbuf.append("

Log session start time "); sbuf.append(new java.util.Date()); sbuf.append("

"); sbuf.append(LINE_SEPARATOR); sbuf.append(LINE_SEPARATOR); sbuf.append(""); sbuf.append(LINE_SEPARATOR); buildHeaderRowForTable(sbuf); return sbuf.toString(); } private void buildHeaderRowForTable(StringBuilder sbuf) { Converter c = head; String name; sbuf.append(""); sbuf.append(LINE_SEPARATOR); while (c != null) { name = computeConverterName(c); if (name == null) { c = c.getNext(); continue; } sbuf.append(""); sbuf.append(LINE_SEPARATOR); c = c.getNext(); } sbuf.append(""); sbuf.append(LINE_SEPARATOR); } public String getPresentationFooter() { StringBuilder sbuf = new StringBuilder(); sbuf.append("
"); sbuf.append(computeConverterName(c)); sbuf.append("
"); return sbuf.toString(); } /** * Returns the appropriate HTML footers. */ @Override public String getFileFooter() { StringBuilder sbuf = new StringBuilder(); sbuf.append(LINE_SEPARATOR); sbuf.append(""); return sbuf.toString(); } protected void startNewTableIfLimitReached(StringBuilder sbuf) { if (this.counter >= CoreConstants.TABLE_ROW_LIMIT) { counter = 0; sbuf.append(""); sbuf.append(LINE_SEPARATOR); sbuf.append("

"); sbuf.append(""); sbuf.append(LINE_SEPARATOR); buildHeaderRowForTable(sbuf); } } protected String computeConverterName(Converter c) { String className = c.getClass().getSimpleName(); int index = className.indexOf("Converter"); if (index == -1) { return className; } else { return className.substring(0, index); } } }