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    }