@Override
  protected AccessLogElement[] createLogElements() {
    if (log.isDebugEnabled()) {
      log.debug("decodePattern, pattern =" + pattern);
    }
    List<AccessLogElement> list = new ArrayList<AccessLogElement>();

    PatternTokenizer tokenizer = new PatternTokenizer(pattern);
    try {

      // Ignore leading whitespace.
      tokenizer.getWhiteSpaces();

      if (tokenizer.isEnded()) {
        log.info("pattern was just empty or whitespace");
        return null;
      }

      String token = tokenizer.getToken();
      while (token != null) {
        if (log.isDebugEnabled()) {
          log.debug("token = " + token);
        }
        AccessLogElement element = getLogElement(token, tokenizer);
        if (element == null) {
          break;
        }
        list.add(element);
        String whiteSpaces = tokenizer.getWhiteSpaces();
        if (whiteSpaces.length() > 0) {
          list.add(new StringElement(whiteSpaces));
        }
        if (tokenizer.isEnded()) {
          break;
        }
        token = tokenizer.getToken();
      }
      if (log.isDebugEnabled()) {
        log.debug("finished decoding with element size of: " + list.size());
      }
      return list.toArray(new AccessLogElement[0]);
    } catch (IOException e) {
      log.error("parse error", e);
      return null;
    }
  }