    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
    043package org.jfree.base;
    044
    045import java.lang.reflect.Method;
    046import java.util.ArrayList;
    047import java.util.List;
    048
    049import org.jfree.util.ObjectUtilities;
    050
    051/**
    052 * Basic project info.
    053 *
    054 * @author Thomas Morgner
    055 */
    056public 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}