001    /* ========================================================================
002     * JCommon : a free general purpose class library for the Java(tm) platform
003     * ========================================================================
004     *
005     * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
006     * 
007     * Project Info:  http://www.jfree.org/jcommon/index.html
008     *
009     * This library is free software; you can redistribute it and/or modify it 
010     * under the terms of the GNU Lesser General Public License as published by 
011     * the Free Software Foundation; either version 2.1 of the License, or 
012     * (at your option) any later version.
013     *
014     * This library is distributed in the hope that it will be useful, but 
015     * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
016     * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
017     * License for more details.
018     *
019     * You should have received a copy of the GNU Lesser General Public
020     * License along with this library; if not, write to the Free Software
021     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
022     * USA.  
023     *
024     * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
025     * in the United States and other countries.]
026     * 
027     * --------------------------
028     * RenderingHintsHandler.java
029     * --------------------------
030     * (C)opyright 2003-2005, by Thomas Morgner and Contributors.
031     *
032     * Original Author:  Thomas Morgner;
033     * Contributor(s):   David Gilbert (for Object Refinery Limited);
034     *
035     * $Id: RenderingHintsWriteHandler.java,v 1.5 2005/10/18 13:35:21 mungady Exp $
036     *
037     * Changes 
038     * -------------------------
039     * 22.11.2003 : Initial version
040     *  
041     */
042    
043    package org.jfree.xml.writer.coretypes;
044    
045    import java.awt.RenderingHints;
046    import java.io.IOException;
047    import java.lang.reflect.Field;
048    import java.lang.reflect.Modifier;
049    import java.util.Iterator;
050    
051    import org.jfree.util.Log;
052    import org.jfree.xml.writer.AbstractXmlWriteHandler;
053    import org.jfree.xml.writer.AttributeList;
054    import org.jfree.xml.writer.XMLWriter;
055    import org.jfree.xml.writer.XMLWriterException;
056    import org.jfree.xml.writer.XMLWriterSupport;
057    
058    /**
059     * A handler for writing a {@link RenderingHints} object.
060     */
061    public class RenderingHintsWriteHandler extends AbstractXmlWriteHandler {
062    
063        /**
064         * Default constructor.
065         */
066        public RenderingHintsWriteHandler() {
067            super();
068        }
069    
070        /**
071         * Performs the writing of a single object.
072         *
073         * @param tagName  the tag name.
074         * @param object  the object.
075         * @param writer  the writer.
076         * @param mPlexAttribute  ??.
077         * @param mPlexValue  ??.
078         * 
079         * @throws IOException if there is an I/O error.
080         * @throws XMLWriterException if there is a writer problem.
081         */
082        public void write(final String tagName, final Object object, final XMLWriter writer,
083                          final String mPlexAttribute, final String mPlexValue)
084            throws IOException, XMLWriterException {
085    
086            writer.writeTag(tagName, mPlexAttribute, mPlexValue, XMLWriterSupport.OPEN);
087            writer.allowLineBreak();
088            final RenderingHints hints = (RenderingHints) object;
089            final Iterator it = hints.keySet().iterator();
090            while (it.hasNext()) {
091                final RenderingHints.Key key = (RenderingHints.Key) it.next();
092                final String keyname = hintFieldToString(key);
093                final String value = hintFieldToString(hints.get(key));
094                final AttributeList attribs = new AttributeList();
095                attribs.setAttribute("key", keyname);
096                attribs.setAttribute("value", value);
097                writer.writeTag("entry", attribs, XMLWriterSupport.CLOSE);
098                writer.allowLineBreak();
099            }
100            writer.writeCloseTag(tagName);
101            writer.allowLineBreak();
102        }
103    
104        private String hintFieldToString(final Object o) {
105            final Field[] fields = RenderingHints.class.getFields();
106            for (int i = 0; i < fields.length; i++) {
107                final Field f = fields[i];
108                if (Modifier.isFinal(f.getModifiers()) 
109                    && Modifier.isPublic(f.getModifiers()) 
110                    && Modifier.isStatic(f.getModifiers())) {
111                    try {
112                        final Object value = f.get(null);
113                        if (o.equals(value)) {
114                            return f.getName();
115                        }
116                    }
117                    catch (Exception e) {
118                        Log.info ("Unable to write RenderingHint", e);
119                    }
120                }
121            }
122            throw new IllegalArgumentException("Invalid value given");
123        }
124    
125    }