Example #1
0
  /**
   * If there is a note specified at the current line and the subsequent lines, a {@linkplain Note}
   * representation is returned, otherwise <tt>null</tt>
   *
   * @return a note, if one is specified at the current position in text, otherwise <tt>null</tt>
   */
  public Note getNote() throws SyntaxError {
    if (section == 0) {
      throw new IllegalStateException("not all objects have been read");
    }
    if (currentLine() == null) {
      throw new IllegalStateException("nothing to read");
    }
    String[] parts = grep.parse("\\s*(\\*|\\+)(\\d+)\\s*(.+)", currentLine());
    if (parts == null) {
      return null;
    }
    boolean consuming = parts[0].equals("+");
    int number = -1;
    try {
      number = Integer.parseInt(parts[1]);
    } catch (NumberFormatException nfe) {
      /* empty */
    }
    if (number < 0) {
      throw new SyntaxError(this, "bad note number: " + parts[1]);
    }
    String obj = parts[2];
    Lifeline line = diagram.getLifeline(obj);
    if (line == null) {
      throw new SyntaxError(this, obj + " does not exist");
    }
    int oldBegin = getLineBegin();
    int oldEnd = getLineEnd();
    line = line.getRightmost();
    List<String> desc = new LinkedList<String>();
    boolean more;
    do {
      if (!advance(false)) {
        reset(oldBegin, oldEnd);
        throw new SyntaxError(this, "The note is not closed.");
      }
      more = !currentLine().trim().equals(parts[0] + parts[1]);
    } while (more && desc.add(currentLine()));
    if (desc.size() == 0) {
      reset(oldBegin, oldEnd);
      throw new SyntaxError(this, "The note is empty.");
    }
    String[] noteText = desc.toArray(new String[0]);
    URI link = null;
    if (noteText.length == 1) {
      String linkString = noteText[0].trim();

      if (linkString.startsWith("link:")) {
        try {
          linkString = linkString.substring(5).trim();

          link = new URI(linkString);
          if (link.getPath() == null) {
            throw new SyntaxError(this, "Empty path in URI: " + linkString);
          }
          noteText[0] = link.getPath();

        } catch (URISyntaxException e) {
          throw new SyntaxError(this, "Bad URI syntax: " + e.getMessage());
        }
      }
    }
    Note note = new Note(line, number, noteText, consuming);
    note.setLink(link);
    return note;
  }