Source for org.jfree.xml.factory.objects.ArrayObjectDescription

   1: /* ========================================================================
   2:  * JCommon : a free general purpose class library for the Java(tm) platform
   3:  * ========================================================================
   4:  *
   5:  * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
   6:  * 
   7:  * Project Info:  http://www.jfree.org/jcommon/index.html
   8:  *
   9:  * This library is free software; you can redistribute it and/or modify it 
  10:  * under the terms of the GNU Lesser General Public License as published by 
  11:  * the Free Software Foundation; either version 2.1 of the License, or 
  12:  * (at your option) any later version.
  13:  *
  14:  * This library is distributed in the hope that it will be useful, but 
  15:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
  16:  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
  17:  * License for more details.
  18:  *
  19:  * You should have received a copy of the GNU Lesser General Public
  20:  * License along with this library; if not, write to the Free Software
  21:  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
  22:  * USA.  
  23:  *
  24:  * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
  25:  * in the United States and other countries.]
  26:  * 
  27:  * ---------------------------
  28:  * ArrayObjectDescription.java
  29:  * ---------------------------
  30:  * (C)opyright 2003, 2004, by Thomas Morgner and Contributors.
  31:  *
  32:  * Original Author:  Thomas Morgner (taquera@sherito.org);
  33:  * Contributor(s):   David Gilbert (for Object Refinery Limited);
  34:  *
  35:  * $Id: ArrayObjectDescription.java,v 1.4 2006/01/27 18:53:15 taqua Exp $
  36:  *
  37:  * Changes
  38:  * -------
  39:  * 14-Apr-2003 : Initial version
  40:  * 29-Apr-2003 : Distilled from the JFreeReport project and moved into JCommon
  41:  */
  42: package org.jfree.xml.factory.objects;
  43: 
  44: import java.lang.reflect.Array;
  45: import java.util.ArrayList;
  46: import java.util.Iterator;
  47: 
  48: import org.jfree.util.Log;
  49: 
  50: /**
  51:  * Describes an Object- or primitive value array. This object description is
  52:  * not intended to be created outside the ArrayClassFactory.
  53:  *
  54:  * @author Thomas Morgner
  55:  */
  56: public class ArrayObjectDescription extends AbstractObjectDescription {
  57: 
  58:     /**
  59:      * Constructs a new array objet description for the given array class.
  60:      * <P>
  61:      * Note:  throws <code>IllegalArgumentException</code> if the given class is no array.
  62:      * 
  63:      * @param c the array class object.
  64:      */
  65:     public ArrayObjectDescription(final Class c) {
  66:         super(c);
  67:         if (!c.isArray()) {
  68:             throw new IllegalArgumentException("Need an array class");
  69:         }
  70:     }
  71: 
  72:     /**
  73:      * Creates an object based on the description.
  74:      *
  75:      * @return The object.
  76:      */
  77:     public Object createObject() {
  78:         try {
  79:             final Integer size = (Integer) getParameter("size");
  80:             if (size == null) {
  81:                 final ArrayList l = new ArrayList();
  82:                 int counter = 0;
  83:                 while (getParameterDefinition(String.valueOf(counter)) != null) {
  84:                     final Object value = getParameter(String.valueOf(counter));
  85:                     if (value == null) {
  86:                         break;
  87:                     }
  88: 
  89:                     l.add(value);
  90:                     counter += 1;
  91:                 }
  92: 
  93:                 final Object o = Array.newInstance
  94:                     (getObjectClass().getComponentType(), l.size());
  95:                 for (int i = 0; i < l.size(); i++) {
  96:                     Array.set(o, i, l.get(i));
  97:                 }
  98:                 return o;
  99:             }
 100:             else {
 101:                 // a size is given, so we can assume that all values are defined.
 102:                 final Object o = Array.newInstance
 103:                     (getObjectClass().getComponentType(), size.intValue());
 104:                 for (int i = 0; i < size.intValue(); i++) {
 105:                     Array.set(o, i, getParameter(String.valueOf(i)));
 106:                 }
 107:                 return o;
 108:             }
 109:         }
 110:         catch (Exception ie) {
 111:             Log.warn("Unable to instantiate Object", ie);
 112:             return null;
 113:         }
 114:     }
 115: 
 116:     /**
 117:      * Sets the parameters of this description object to match the supplied object.
 118:      *
 119:      * @param o  the object.
 120:      *
 121:      * @throws ObjectFactoryException if there is a
 122:      * problem while reading the properties of the given object.
 123:      */
 124:     public void setParameterFromObject(final Object o) throws ObjectFactoryException {
 125:         if (o == null) {
 126:             throw new ObjectFactoryException("Given object is null.");
 127:         }
 128: 
 129:         if (!o.getClass().isArray()) {
 130:             throw new ObjectFactoryException("Given object is no array");
 131:         }
 132: 
 133:         if (!getObjectClass().isAssignableFrom(o.getClass())) {
 134:             throw new ObjectFactoryException("Given object is incompatible with base class");
 135:         }
 136: 
 137:         final int size = Array.getLength(o);
 138:         setParameter("size", new Integer(size));
 139:         for (int i = 0; i < size; i++) {
 140:             setParameter(String.valueOf(i), Array.get(o, i));
 141:         }
 142:     }
 143: 
 144:     /**
 145:      * Tries to parse the given parameter string into a positive integer.
 146:      * Returns -1 if the parsing failed for some reason.
 147:      *
 148:      * @param name the name of the parameter.
 149:      * @return the parsed int value or -1 on errors.
 150:      */
 151:     private int parseParameterName(final String name) {
 152:         try {
 153:             return Integer.parseInt(name);
 154:         }
 155:         catch (Exception e) {
 156:             return -1;
 157:         }
 158:     }
 159: 
 160:     /**
 161:      * Returns a parameter definition. If the parameter is invalid, this
 162:      * function returns null.
 163:      *
 164:      * @param name  the definition name.
 165:      *
 166:      * @return The parameter class or null, if the parameter is not defined.
 167:      */
 168:     public Class getParameterDefinition(final String name) {
 169:         if (name.equals("size")) {
 170:             return Integer.TYPE;
 171:         }
 172:         final int par = parseParameterName(name);
 173:         if (par < 0) {
 174:             return null;
 175:         }
 176:         return getObjectClass().getComponentType();
 177:     }
 178: 
 179:     /**
 180:      * Returns an iterator for the parameter names.
 181:      *
 182:      * @return The iterator.
 183:      */
 184:     public Iterator getParameterNames() {
 185:         final Integer size = (Integer) getParameter("size");
 186:         if (size == null) {
 187:             return getDefinedParameterNames();
 188:         }
 189:         else {
 190:             final ArrayList l = new ArrayList();
 191:             l.add("size");
 192:             for (int i = 0; i < size.intValue(); i++) {
 193:                 l.add(String.valueOf(i));
 194:             }
 195:             return l.iterator();
 196:         }
 197:     }
 198: 
 199:     /**
 200:      * Returns a new instance of the object description.
 201:      *
 202:      * @return The object description.
 203:      */
 204:     public ObjectDescription getInstance() {
 205:         return new ArrayObjectDescription(getObjectClass());
 206:     }
 207: }