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