Mega Code Archive

 
Categories / Java / Swing JFC
 

Reads a AttributedString object that has been serialised by the SerialUtilities writeAttributedString(AttributedString, ObjectOu

import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.text.AttributedCharacterIterator; import java.text.AttributedString; import java.text.CharacterIterator; import java.util.HashMap; import java.util.Map; /*   * JCommon : a free general purpose class library for the Java(tm) platform  *   *  * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.  *   * Project Info:  http://www.jfree.org/jcommon/index.html  *  * This library is free software; you can redistribute it and/or modify it   * under the terms of the GNU Lesser General Public License as published by   * the Free Software Foundation; either version 2.1 of the License, or   * (at your option) any later version.  *  * This library is distributed in the hope that it will be useful, but   * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY   * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public   * License for more details.  *  * You should have received a copy of the GNU Lesser General Public  * License along with this library; if not, write to the Free Software  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,   * USA.    *  * [Java is a trademark or registered trademark of Sun Microsystems, Inc.   * in the United States and other countries.]  *   * ------------  * IOUtils.java  * ------------  * (C)opyright 2002-2004, by Thomas Morgner and Contributors.  *  * Original Author:  Thomas Morgner;  * Contributor(s):   David Gilbert (for Object Refinery Limited);  *  * $Id: IOUtils.java,v 1.8 2009/01/22 08:34:58 taqua Exp $  *  * Changes  * -------  * 26-Jan-2003 : Initial version  * 23-Feb-2003 : Documentation  * 25-Feb-2003 : Fixed Checkstyle issues (DG);  * 29-Apr-2003 : Moved to jcommon  * 04-Jan-2004 : Fixed JDK 1.2.2 issues with createRelativeURL;  *               added support for query strings within these urls (TM);  */ public class Main {   /**    * Returns <code>true</code> if a class implements <code>Serializable</code>    * and <code>false</code> otherwise.    *    * @param c  the class.    *    * @return A boolean.    */   public static boolean isSerializable(final Class c) {       /**       final Class[] interfaces = c.getInterfaces();       for (int i = 0; i < interfaces.length; i++) {           if (interfaces[i].equals(Serializable.class)) {               return true;           }       }       Class cc = c.getSuperclass();       if (cc != null) {           return isSerializable(cc);       }        */       return (Serializable.class.isAssignableFrom(c));   }   /**    * Reads a <code>AttributedString</code> object that has been serialised by    * the {@link SerialUtilities#writeAttributedString(AttributedString,    * ObjectOutputStream)} method.    *    * @param stream  the input stream (<code>null</code> not permitted).    *    * @return The attributed string object (possibly <code>null</code>).    *    * @throws IOException  if there is an I/O problem.    * @throws ClassNotFoundException  if there is a problem loading a class.    */   public static AttributedString readAttributedString(           ObjectInputStream stream)           throws IOException, ClassNotFoundException {       if (stream == null) {           throw new IllegalArgumentException("Null 'stream' argument.");       }       AttributedString result = null;       final boolean isNull = stream.readBoolean();       if (!isNull) {           // read string and attributes then create result           String plainStr = (String) stream.readObject();           result = new AttributedString(plainStr);           char c = stream.readChar();           int start = 0;           while (c != CharacterIterator.DONE) {               int limit = stream.readInt();               Map atts = (Map) stream.readObject();               result.addAttributes(atts, start, limit);               start = limit;               c = stream.readChar();           }       }       return result;   }   /**    * Serialises an <code>AttributedString</code> object.    *    * @param as  the attributed string object (<code>null</code> permitted).    * @param stream  the output stream (<code>null</code> not permitted).    *    * @throws IOException if there is an I/O error.    */   public static void writeAttributedString(AttributedString as,           ObjectOutputStream stream) throws IOException {       if (stream == null) {           throw new IllegalArgumentException("Null 'stream' argument.");       }       if (as != null) {           stream.writeBoolean(false);           AttributedCharacterIterator aci = as.getIterator();           // build a plain string from aci           // then write the string           StringBuffer plainStr = new StringBuffer();           char current = aci.first();           while (current != CharacterIterator.DONE) {               plainStr = plainStr.append(current);               current = aci.next();           }           stream.writeObject(plainStr.toString());           // then write the attributes and limits for each run           current = aci.first();           int begin = aci.getBeginIndex();           while (current != CharacterIterator.DONE) {               // write the current character - when the reader sees that this               // is not CharacterIterator.DONE, it will know to read the               // run limits and attributes               stream.writeChar(current);               // now write the limit, adjusted as if beginIndex is zero               int limit = aci.getRunLimit();               stream.writeInt(limit - begin);               // now write the attribute set               Map atts = new HashMap(aci.getAttributes());               stream.writeObject(atts);               current = aci.setIndex(limit);           }           // write a character that signals to the reader that all runs           // are done...           stream.writeChar(CharacterIterator.DONE);       }       else {           // write a flag that indicates a null           stream.writeBoolean(true);       }   } }