    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    }