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