/** * 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); }
/** * 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(); }
/** * 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; }