001    /* PAVLOV -- Multiple Choice Study System
002     * Copyright (C) 2000 - 2004 T.J. Willis
003     *
004     * This program is free software; you can redistribute it and/or
005     * modify it under the terms of the GNU General Public License
006     * as published by the Free Software Foundation; either version 2
007     * of the License, or (at your option) any later version.
008     *
009     * This program is distributed in the hope that it will be useful,
010     * but WITHOUT ANY WARRANTY; without even the implied warranty of
011     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
012     * GNU General Public License for more details.
013     *
014     * You should have received a copy of the GNU General Public License
015     * along with this program; if not, write to the Free Software
016     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
017     *
018     * $Header: /cvsroot/pavlov/net/sourceforge/pavlov/library/AbstractBook.java,v 1.5 2004/06/29 02:51:16 tj_willis Exp $
019     */
020    package net.sourceforge.pavlov.library;
021    
022    import java.io.IOException;
023    import java.io.Writer;
024    import java.util.Collection;
025    import javax.swing.tree.DefaultMutableTreeNode;
026    import org.apache.log4j.*;
027    
028    /**
029     * An interface to be implemented by classes that can act as Pavlov books.
030     * As of Pavlov 1.0, the only implementation is Book, which reads a book
031     * from an XML file.  However, there's no reason that an implementation 
032     * couldn't be written to generate its chapters and questions programmatically,
033     * i.e., an arithmetic book with chapters "Addition" and "Subtraction" who
034     * generate questions algorithmically from the question ID. 
035     *
036     * @author <a href="mailto:tj_willis@users.sourceforge.net"></a>
037     * @version 1.0
038     * @has 1 Has 1..n net.sourceforge.pavlov.library.AbstractChapter
039     */
040    public interface AbstractBook extends Comparable {
041        // FIXME: programmatic books as plugins?
042        /**
043         * Returns name of the author/maintainer of this book.
044         * @return a <code>String</code> value
045         */
046        String getAuthor();
047    
048        /**
049         * Returns the named chapter, or null if it doesn't exist
050         * @param cpName a <code>String</code> value
051         * @return a <code>Chapter</code> value
052         */
053        Chapter getChapter(String cpName);
054    
055        /**
056         * Returns filename of a descriptive image of this book.
057         * @return a <code>String</code> value
058         */
059        String getCover();
060    
061        /**
062         * Returns textual description of this book's contents.
063         * @return a <code>String</code> value
064         */
065        String getDescription();
066    
067        /**
068         * Returns descriptive name of this book.
069         * @return a <code>String</code> value
070         */
071        String getName();
072    
073        /**
074         * Sums the number of questions of all my chapters and returns the total.
075         * @return an <code>int</code> value
076         */
077        int getNumberOfQuestions();
078    
079        /**
080         * Describe <code>getTitle</code> method here.
081         *
082         * @return a <code>String</code> value
083         * @deprecated use getName() instead.
084         */
085        @Deprecated String getTitle();
086    
087        /**
088         * Returns the book's chapters as a collection. 
089         * @return a <code>Collection</code> value
090         * @deprecated
091         */
092        @Deprecated Collection<AbstractChapter> getValues();
093    
094        /**
095         * Returns the book's chapters as a read-only collection. 
096         * @return a <code>Collection</code> value
097         */
098        Collection<AbstractChapter> getChaptersReadOnly();
099    
100        /**
101         * Displays chapters as a tree.  
102         * @param bk a <code>DefaultMutableTreeNode</code> value
103         */
104        void populateTree(DefaultMutableTreeNode bk);
105    
106        /**
107         * Returns the book's name
108         * @return a <code>String</code> value
109         */
110        String toString();
111    
112        /**
113         * Dumps the Book in XML format to the given writer.  
114         * Loops throught chapters, questions.
115         * @param writer a <code>Writer</code> value
116         * @exception IOException if an error occurs
117         */
118        void toXML(Writer writer) throws IOException;
119    
120        void save(java.io.File directory) throws IOException;
121    }