| /* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved. |
| * |
| * This program and the accompanying materials are made available under |
| * the terms of the Common Public License v1.0 which accompanies this distribution, |
| * and is available at http://www.eclipse.org/legal/cpl-v10.html |
| * |
| * $Id: AttributeSet.java,v 1.1.1.1 2004/05/09 16:57:41 vlad_r Exp $ |
| */ |
| package com.vladium.emma.report.html.doc; |
| |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.Map; |
| |
| import com.vladium.util.Strings; |
| |
| // ---------------------------------------------------------------------------- |
| /** |
| * @author Vlad Roubtsov, (C) 2003 |
| */ |
| public |
| abstract class AttributeSet implements IContent |
| { |
| // public: ................................................................ |
| |
| public static AttributeSet create () |
| { |
| return new AttributeSetImpl (); |
| } |
| |
| // ACCESSORS: |
| |
| public abstract boolean isEmpty (); |
| |
| // MUTATORS: |
| |
| public abstract AttributeSet set (Attribute attr, String value); |
| public abstract AttributeSet set (Attribute attr, int value); |
| |
| // protected: ............................................................. |
| |
| // package: ............................................................... |
| |
| |
| AttributeSet () {} |
| |
| // private: ............................................................... |
| |
| |
| private static final class AttributeSetImpl extends AttributeSet |
| { |
| public void emit (final HTMLWriter out) |
| { |
| boolean first = true; |
| for (Iterator a = m_attrMap.entrySet ().iterator (); a.hasNext (); ) |
| { |
| final Map.Entry entry = (Map.Entry) a.next (); |
| |
| final Attribute attr = (Attribute) entry.getKey (); |
| final String value = entry.getValue ().toString (); |
| |
| if (first) |
| first = false; |
| else |
| out.write (' '); |
| |
| out.write (attr.getName ()); |
| out.write ("=\""); |
| |
| if ((m_buf != null) && (m_buf.length () <= MAX_BUF_LENGTH)) |
| m_buf.setLength (0); |
| else |
| m_buf = new StringBuffer (); |
| |
| Strings.HTMLEscape (value, m_buf); |
| out.write (m_buf.toString ()); |
| |
| out.write ('\"'); |
| } |
| } |
| |
| public boolean isEmpty () |
| { |
| return m_attrMap.isEmpty (); |
| } |
| |
| |
| public AttributeSet set (final Attribute attr, final String value) // null removes? |
| { |
| m_attrMap.put (attr, value); |
| |
| return this; |
| } |
| |
| public AttributeSet set (final Attribute attr, final int value) |
| { |
| m_attrMap.put (attr, new Integer (value)); // TODO: use int factory here |
| |
| return this; |
| } |
| |
| |
| AttributeSetImpl () |
| { |
| m_attrMap = new HashMap (); |
| } |
| |
| // TODO: consider lazy-initing this |
| private final Map /* Attribute->String|Integer */ m_attrMap; // never null |
| private StringBuffer m_buf; // reused by emit() |
| |
| private static final int MAX_BUF_LENGTH = 4 * 1024; |
| |
| } // end of nested class |
| |
| } // end of class |
| // ---------------------------------------------------------------------------- |