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 * ObjectDescription.java
029 * ----------------------
030 * (C)opyright 2003, 2004, by Thomas Morgner and Contributors.
031 *
032 * Original Author: Thomas Morgner;
033 * Contributor(s): David Gilbert (for Object Refinery Limited);
034 *
035 * $Id: CollectionObjectDescription.java,v 1.2 2005/10/18 13:31:58 mungady Exp $
036 *
037 * Changes
038 * -------------------------
039 * 06-May-2003 : Initial version
040 */
041 package org.jfree.xml.factory.objects;
042
043 import java.util.ArrayList;
044 import java.util.Collection;
045 import java.util.Iterator;
046
047 import org.jfree.util.Log;
048
049 /**
050 * An object description for simple collection objects, like java.util.List
051 * or java.util.Set.
052 *
053 * @author Thomas Morgner
054 */
055 public class CollectionObjectDescription extends AbstractObjectDescription {
056
057 /**
058 * Creates a list object description for the given collection class.
059 * <P>
060 * Throws <code>ClassCastException</code> if the given class is no collection instance.
061 *
062 * @param c the class of the collection implementation.
063 */
064 public CollectionObjectDescription(final Class c) {
065 super(c);
066 if (!Collection.class.isAssignableFrom(c)) {
067 throw new ClassCastException("The given class is no Collection instance");
068 }
069 }
070
071 /**
072 * Tries to parse the given parameter string into a positive integer.
073 * Returns -1 if the parsing failed for some reason.
074 *
075 * @param name the name of the parameter.
076 * @return the parsed int value or -1 on errors.
077 */
078 private int parseParameterName(final String name) {
079 try {
080 return Integer.parseInt(name);
081 }
082 catch (Exception e) {
083 return -1;
084 }
085 }
086
087 /**
088 * Returns a parameter definition. If the parameter is invalid, this
089 * function returns null.
090 *
091 * @param name the definition name.
092 *
093 * @return The parameter class or null, if the parameter is not defined.
094 */
095 public Class getParameterDefinition(final String name) {
096 if (name.equals("size")) {
097 return Integer.TYPE;
098 }
099 final int par = parseParameterName(name);
100 if (par < 0) {
101 return null;
102 }
103 return Object.class;
104 }
105
106 /**
107 * Returns an iterator for the parameter names.
108 *
109 * @return The iterator.
110 */
111 public Iterator getParameterNames() {
112 final Integer size = (Integer) getParameter("size");
113 if (size == null) {
114 return getDefinedParameterNames();
115 }
116 else {
117 final ArrayList l = new ArrayList();
118 l.add("size");
119 for (int i = 0; i < size.intValue(); i++) {
120 l.add(String.valueOf(i));
121 }
122 return l.iterator();
123 }
124 }
125
126 /**
127 * Creates an object based on the description.
128 *
129 * @return The object.
130 */
131 public Object createObject() {
132 try {
133 final Collection l = (Collection) getObjectClass().newInstance();
134 int counter = 0;
135 while (getParameterDefinition(String.valueOf(counter)) != null) {
136 final Object value = getParameter(String.valueOf(counter));
137 if (value == null) {
138 break;
139 }
140
141 l.add(value);
142 counter += 1;
143 }
144 return l;
145 }
146 catch (Exception ie) {
147 Log.warn("Unable to instantiate Object", ie);
148 return null;
149 }
150 }
151
152 /**
153 * Sets the parameters of this description object to match the supplied object.
154 *
155 * @param o the object.
156 *
157 * @throws ObjectFactoryException if there is a problem while reading the
158 * properties of the given object.
159 */
160 public void setParameterFromObject(final Object o) throws ObjectFactoryException {
161 if (o == null) {
162 throw new NullPointerException("Given object is null");
163 }
164 final Class c = getObjectClass();
165 if (!c.isInstance(o)) {
166 throw new ObjectFactoryException("Object is no instance of " + c + "(is "
167 + o.getClass() + ")");
168 }
169
170 final Collection l = (Collection) o;
171 final Iterator it = l.iterator();
172 int counter = 0;
173 while (it.hasNext()) {
174 final Object ob = it.next();
175 setParameter(String.valueOf(counter), ob);
176 counter++;
177 }
178 }
179 }