예제 #1
0
 /**
  * If the current line specifies an association of a note to the current vertical position of a
  * lifeline, this method returns a pair consisting of the lifeline and the note number.
  *
  * @return a pair of a lifeline and a note number, if the current line specifies and association
  *     between the note and the lifeline, otherwise <tt>null</tt>
  */
 public Pair<Lifeline, Integer> getEventAssociation() 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("\\((\\d+)\\)\\s*(\\w+)", currentLine());
   if (parts == null) {
     return null;
   }
   int number = Integer.parseInt(parts[0]);
   String obj = parts[1];
   Lifeline line = diagram.getLifeline(obj);
   if (line == null) {
     throw new SyntaxError(this, obj + " does not exist");
   }
   return new Pair<Lifeline, Integer>(line, number);
 }
예제 #2
0
 /**
  * Sets the diagram instance that corresponds to the specification read by this
  * <tt>TextHandler</tt>. This method is called inside {@linkplain SequenceDiagram#generate()}.
  *
  * @param diagram the diagram that corresponds to the specification read by this
  *     <tt>TextHandler</tt>
  */
 public void setDiagram(SequenceDiagram diagram) {
   this.diagram = diagram;
   this.reuseSpace = diagram.getConfiguration().isReuseSpace();
 }
예제 #3
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;
  }