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

org.mvel2.util.LineMapper Maven / Gradle / Ivy

There is a newer version: 2.12.15
Show newest version
package org.mvel2.util;

import java.util.ArrayList;
import java.util.Set;
import java.util.TreeSet;

/**
 * @author Mike Brock 
 */
public class LineMapper {
  private char[] expr;

  private ArrayList lineMapping;
  private Set lines;

  public LineMapper(char[] expr) {
    this.expr = expr;
  }

  public LineLookup map() {
    lineMapping = new ArrayList();
    lines = new TreeSet();

    int cursor = 0;
    int start = 0;
    int line = 1;

    for (; cursor < expr.length; cursor++) {
      switch (expr[cursor]) {
        case '\n':
          lines.add(line);
          lineMapping.add(new Node(start, cursor, line++));
          start = cursor + 1;
          break;
      }
    }

    if (cursor > start) {
      lines.add(line);
      lineMapping.add(new Node(start, cursor, line));
    }

    return new LineLookup() {
      public int getLineFromCursor(int cursor) {
        for (Node n : lineMapping) {
          if (n.isInRange(cursor)) {
            return n.getLine();
          }
        }
        return -1;
      }

      public boolean hasLine(int line) {
        return lines.contains(line);
      }
    };
  }

  public static interface LineLookup {
    public int getLineFromCursor(int cursor);
    public boolean hasLine(int line);
  }

  private static class Node implements Comparable {
    private int cursorStart;
    private int cursorEnd;

    private int line;


    private Node(int cursorStart, int cursorEnd, int line) {
      this.cursorStart = cursorStart;
      this.cursorEnd = cursorEnd;
      this.line = line;
    }

    public int getLine() {
      return line;
    }

    public boolean isInRange(int cursor) {
      return cursor >= cursorStart && cursor <= cursorEnd;
    }

    public int compareTo(Node node) {
      if (node.cursorStart >= cursorEnd) {
        return 1;
      } else if (node.cursorEnd < cursorStart) {
        return -1;
      } else {
        return 0;
      }
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy