/* * Copyright 2005-2010 Ignis Software Tools Ltd. All rights reserved. */ package jsystem.extensions.report.html.summary; import java.util.LinkedList; import java.util.ListIterator; public class Attributes extends LinkedList<Object> { /** * */ private static final long serialVersionUID = -6049526357736518817L; public Attributes() { super(); } public Attributes(String attr) throws IllegalArgumentException { super(); setAttributes(attr); } public Attributes(Attribute[] attrs) { super(); for (int i = 0; i < attrs.length; i++) { add(attrs[i]); } } public Attributes(Attribute attr) { super(); add(attr); } /** * Set the value of attributes. * * @param str * String with HTML attributes like: border="0" cellpadding="0" * cellspacing="0" */ public void setAttributes(String str) throws IllegalArgumentException { Attribute attribute = new Attribute(); final int START = 0; // final int EOL = 1; final int ERR = -1; final int Attr = 2; final int Val0 = 3; final int Val1 = 4; final int Value = 5; final int QVal = 6; // finite state machine for parsing int state = START; int prev = -1; // debug int i = 0; StringBuffer token = new StringBuffer(); while ((i <= str.length()) && (state != ERR)) { char chr; if (i < str.length()) chr = str.charAt(i); else chr = ' '; i++; prev = state; switch (state) { case START: switch (chr) { case ' ': break; case '"': case '=': state = ERR; break; default: token.append(chr); state = Attr; } break; case Attr: switch (chr) { case ' ': attribute = new Attribute(token.toString()); state = Val0; break; case '=': attribute = new Attribute(token.toString()); state = Val1; break; case '"': state = ERR; break; default: token.append(chr); } break; case Val0: switch (chr) { case '=': state = Val1; break; case ' ': break; default: this.add(attribute); token = new StringBuffer(); token.append(chr); state = Attr; } break; case Val1: token = new StringBuffer(); switch (chr) { case '"': state = QVal; break; case '=': state = ERR; break; case ' ': break; default: token.append(chr); state = Value; break; } break; case Value: switch (chr) { case ' ': attribute.setValue(token.toString()); this.add(attribute); token = new StringBuffer(); state = START; break; case '=': state = ERR; break; default: token.append(chr); } break; case QVal: switch (chr) { case '"': attribute.setValue(token.toString()); this.add(attribute); token = new StringBuffer(); state = START; break; default: token.append(chr); } break; } } if ((i <= str.length()) || (state == ERR)) { System.err.println("Parse error:"); System.err.println(str); for (int j = 0; j < i; j++) System.err.print(' '); System.err.println('^'); throw new IllegalArgumentException("Parse error in state " + Integer.toString(prev)); } } public String toString() { StringBuffer out = new StringBuffer(" "); ListIterator<Object> iterator = this.listIterator(); while (iterator.hasNext()) { out.append(iterator.next().toString()); out.append(' '); } out.deleteCharAt(out.length() - 1); return out.toString(); } }