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 * BasicProjectInfo.java
029 * ---------------------
030 * (C)opyright 2004, by Thomas Morgner and Contributors.
031 *
032 * Original Author: Thomas Morgner;
033 * Contributor(s): David Gilbert (for Object Refinery Limited);
034 *
035 * $Id: BasicProjectInfo.java,v 1.7 2006/04/14 13:00:56 taqua Exp $
036 *
037 * Changes
038 * -------
039 * 07-Jun-2004 : Added source headers (DG);
040 *
041 */
042
043 package org.jfree.base;
044
045 import java.util.ArrayList;
046 import java.util.List;
047 import java.lang.reflect.Method;
048
049 import org.jfree.util.ObjectUtilities;
050 import org.jfree.util.Log;
051
052 /**
053 * Basic project info.
054 *
055 * @author Thomas Morgner
056 */
057 public class BasicProjectInfo extends Library {
058 /**
059 * A helper class, which simplifies the loading of optional library
060 * implementations.
061 */
062 private static class OptionalLibraryHolder {
063 private String libraryClass;
064 private transient Library library;
065
066 public OptionalLibraryHolder(final String libraryClass) {
067 if (libraryClass == null) {
068 throw new NullPointerException("LibraryClass must not be null.");
069 }
070 this.libraryClass = libraryClass;
071 }
072
073 public OptionalLibraryHolder(final Library library) {
074 if (library == null) {
075 throw new NullPointerException("Library must not be null.");
076 }
077 this.library = library;
078 this.libraryClass = library.getClass().getName();
079 }
080
081 public String getLibraryClass() {
082 return libraryClass;
083 }
084
085 public Library getLibrary() {
086 if (library == null) {
087 library = loadLibrary(libraryClass);
088 }
089 return library;
090 }
091
092 protected Library loadLibrary(final String classname) {
093 if (classname == null) {
094 return null;
095 }
096 try {
097 final Class c = ObjectUtilities.getClassLoader(
098 getClass()).loadClass(classname);
099 try {
100 final Method m = c.getMethod("getInstance", (Class[]) null);
101 return (Library) m.invoke(null, (Object[]) null);
102 }
103 catch(Exception e) {
104 // ok, fall back ...
105 }
106 return (Library) c.newInstance();
107 }
108 catch (Exception e) {
109 // ok, this library has no 'getInstance()' method. Check the
110 // default constructor ...
111 return null;
112 }
113 }
114
115 }
116
117 /** The project copyright statement. */
118 private String copyright;
119
120 /** A list of libraries used by the project. */
121 private List libraries;
122
123 private List optionalLibraries;
124
125 /**
126 * Default constructor.
127 */
128 public BasicProjectInfo() {
129 this.libraries = new ArrayList();
130 this.optionalLibraries = new ArrayList();
131 }
132
133 /**
134 * Creates a new library reference.
135 *
136 * @param name the name.
137 * @param version the version.
138 * @param licence the licence.
139 * @param info the web address or other info.
140 */
141 public BasicProjectInfo(final String name, final String version,
142 final String licence, final String info) {
143 this();
144 setName(name);
145 setVersion(version);
146 setLicenceName(licence);
147 setInfo(info);
148 }
149
150 /**
151 * Creates a new project info instance.
152 *
153 * @param name the project name.
154 * @param version the project version.
155 * @param info the project info (web site for example).
156 * @param copyright the copyright statement.
157 * @param licenceName the license name.
158 */
159 public BasicProjectInfo(final String name, final String version,
160 final String info, final String copyright,
161 final String licenceName) {
162 this(name, version, licenceName, info);
163 setCopyright(copyright);
164 }
165
166 /**
167 * Returns the copyright statement.
168 *
169 * @return The copyright statement.
170 */
171 public String getCopyright() {
172 return this.copyright;
173 }
174
175 /**
176 * Sets the project copyright statement.
177 *
178 * @param copyright the project copyright statement.
179 */
180 public void setCopyright(final String copyright) {
181 this.copyright = copyright;
182 }
183
184 /**
185 * Sets the project info string (for example, this could be the project URL).
186 *
187 * @param info the info string.
188 */
189 public void setInfo(final String info) {
190 super.setInfo(info);
191 }
192
193 /**
194 * Sets the license name.
195 *
196 * @param licence the license name.
197 */
198 public void setLicenceName(final String licence) {
199 super.setLicenceName(licence);
200 }
201
202 /**
203 * Sets the project name.
204 *
205 * @param name the project name.
206 */
207 public void setName(final String name) {
208 super.setName(name);
209 }
210
211 /**
212 * Sets the project version number.
213 *
214 * @param version the version number.
215 */
216 public void setVersion(final String version) {
217 super.setVersion(version);
218 }
219
220 /**
221 * Returns a list of libraries used by the project.
222 *
223 * @return the list of libraries.
224 */
225 public Library[] getLibraries() {
226 return (Library[]) this.libraries.toArray
227 (new Library[this.libraries.size()]);
228 }
229
230 /**
231 * Adds a library.
232 *
233 * @param library the library.
234 */
235 public void addLibrary (final Library library) {
236 if (library == null) {
237 throw new NullPointerException();
238 }
239 this.libraries.add(library);
240 }
241
242 /**
243 * Returns a list of optional libraries used by the project.
244 *
245 * @return the list of libraries.
246 */
247 public Library[] getOptionalLibraries() {
248 final ArrayList libraries = new ArrayList();
249 for (int i = 0; i < optionalLibraries.size(); i++) {
250 OptionalLibraryHolder holder =
251 (OptionalLibraryHolder) optionalLibraries.get(i);
252 Library l = holder.getLibrary();
253 if (l != null) {
254 libraries.add(l);
255 }
256 }
257 return (Library[]) libraries.toArray(new Library[libraries.size()]);
258 }
259
260 /**
261 * Adds an optional library. These libraries will be booted, if they define
262 * a boot class. A missing class is considered non-fatal and it is assumed
263 * that the programm knows how to handle that.
264 *
265 * @param library the library.
266 */
267 public void addOptionalLibrary (final String libraryClass) {
268 if (libraryClass == null) {
269 throw new NullPointerException("Library classname must be given.");
270 }
271 this.optionalLibraries.add
272 (new OptionalLibraryHolder(libraryClass));
273 }
274
275
276 /**
277 * Adds an optional library. These libraries will be booted, if they define
278 * a boot class. A missing class is considered non-fatal and it is assumed
279 * that the programm knows how to handle that.
280 *
281 * @param library the library.
282 */
283 public void addOptionalLibrary (final Library library) {
284 if (library == null) {
285 throw new NullPointerException("Library must be given.");
286 }
287 this.optionalLibraries.add(new OptionalLibraryHolder(library));
288 }
289 }