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/Library.java,v 1.6 2004/07/01 05:50:20 tj_willis Exp $
019     */ 
020    package net.sourceforge.pavlov.library;
021    import java.io.*;
022    import java.util.*;
023    import javax.swing.tree.DefaultMutableTreeNode;
024    import org.apache.log4j.*;
025    
026    //import net.sourceforge.pavlov.event.BookAndChapterEvent;
027    
028    /**
029     * Describes a Library, which is a collection of Books.
030     *
031     * @author <a href="mailto:tj_willis@users.sourceforge.net"></a>
032     * @version 1.0
033     * @see Book
034     * @see Chapter
035     * @see Question
036     * @has 1 Has 1..n net.sourceforge.pavlov.library.AbstractBook
037     * @has 1 Has 1 java.io.File
038     * @has 1 Has 1 net.sourceforge.pavlov.library.LibraryLoader
039     */
040    public final class Library implements AbstractLibrary {
041        /** Collection of Book objects. */
042        private Hashtable<String, AbstractBook> books;
043        private File directory;
044    
045        /** Creates an empty library.*/
046        public Library() {
047            books = new Hashtable<String,AbstractBook>();
048        }
049    
050        /**
051         * Describe <code>setDirectory</code> method here.
052         *
053         * @param dir a <code>File</code> value
054         */
055        public void setDirectory(File dir)
056        {
057            directory = dir;
058        }
059    
060        /**
061         * Describe <code>getDirectory</code> method here.
062         *
063         * @return a <code>File</code> value
064         */
065        public File getDirectory()
066        {
067            return directory;
068        }
069    
070        /**
071         * Returns all books as a Collection. 
072         * @return a <code>Collection</code> value
073         * @deprecated Use getBooks()
074         */
075        @Deprecated  public Collection<AbstractBook> getBookCollection() {
076                return getBooks();
077        } 
078    
079        /**
080         * Returns all books as a read-only Collection. 
081         * @return a <code>Collection</code> value
082         */
083        public Collection<AbstractBook> getBooksReadOnly(){
084            return Collections.unmodifiableCollection(getBooks());
085        }
086    
087        /**
088         * Returns all books as a Collection. 
089         * @return a <code>Collection</code> value
090         */
091        public Collection<AbstractBook> getBooks() {
092                final boolean mode = true;
093                if(mode){
094                    return new TreeSet<AbstractBook>(books.values());
095                } else {
096                        return books.values();
097                }
098        } 
099       
100        /**
101         * Adds the book to the library , keyed on Book.getName().
102         * @param c a <code>Book</code> value
103         */
104        public void addBook(final Book c) { 
105            assert books!=null: "Books is Null";
106            assert c!=null: "Adding null book";
107            books.put(c.getName(), c); 
108        }
109    
110    
111        /**
112         * Adds the book to the library , keyed on Book.getName().
113         * @param c an <code>AbstractBook</code> value
114         */
115        public void addBook(final AbstractBook c) {
116            assert books!=null: "Books is Null";
117            assert c!=null: "Adding null book";
118            books.put(c.getName(), c);
119        }
120    
121    
122        /**
123         * Asks each book to save itself in its cannonical filename in my directory.
124         *
125         */
126        public void save()
127            throws IOException
128        {
129            Collection<AbstractBook> cv = books.values();
130            for(AbstractBook da : cv) {
131                da.save(directory);
132            }
133        }  
134    
135    
136        /**
137         * Saves the given book in its cannonical filename in my directory.
138         *
139         * @param b a <code>Book</code> value
140         */
141        public void saveBook(final Book b)
142            throws IOException
143        {
144            b.save(directory);
145        }
146    
147        /**
148         * Displays books and chapters as a tree.  
149         * @param top a <code>DefaultMutableTreeNode</code> value
150         */
151        public void populateTree(DefaultMutableTreeNode top) {
152            DefaultMutableTreeNode bookNode = null;
153    
154            Collection<AbstractBook> cv = books.values();
155            //String x;
156            for( AbstractBook book : cv) {
157                bookNode = new DefaultMutableTreeNode(book);
158                top.add(bookNode);
159                book.populateTree(bookNode);
160            }
161        }
162    
163        /**
164         * Returns the named Chapter from the named book. Null if either doesn't exist.
165         * @param bkName a <code>String</code> value
166         * @param cpName a <code>String</code> value
167         * @return a <code>Chapter</code> value
168         */
169        public Chapter getChapter(final String bkName, final String cpName) {
170            AbstractBook b = (AbstractBook) books.get(bkName);
171            if (b == null) return null;
172            return b.getChapter(cpName);
173        }
174    
175        /**
176         * Returns the named book.
177         *
178         * @param bkName a <code>String</code> value
179         * @return a <code>Book</code> value
180         */
181        public AbstractBook getBook(final String bkName)
182        {
183            return books.get(bkName);
184        }
185    
186        /**
187         * Removes the named book from this library.
188         *
189         * @param bkName a <code>String</code> value
190         */
191        public void deleteBook(final String bkName)
192        {
193            if(bkName==null) return;
194            Object o = books.remove(bkName);
195        }
196    
197    }
198