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/randommedia/RandomImageFactory.java,v 1.4 2004/05/10 14:58:54 tj_willis Exp $
019     */ 
020    package net.sourceforge.pavlov.randommedia;
021    
022    import javax.swing.ImageIcon;
023    import net.sourceforge.pavlov.zipUtilities.*;
024    import org.apache.log4j.*;
025    
026    // This class no longer provides a singleton.
027    /**
028     * RandomImageFactory provides an interface for retrieving a
029     * random image from a filesystem directory tree.  Images can
030     * be individual files or JAR files of images.  JAR files are
031     * treated as directories. Directories can be interactively
032     * enabled and disabled.
033     *
034     * <P>This implementation is thread safe and is an example of the
035     * Singleton OOD design pattern.
036     *
037     * <P><B>Note: If the directory tree has closed loops, it will
038     * make the current implementation go into an infinite loop.
039     * For example if b is a subdirectory of a (a/b) and c is a link
040     * in b to a (a/b/c->a), this implementation will add an infinite
041     * number of copies of the a and b directories.</B>
042     *
043     * @author <a href="mailto:tj_willis@users.sourceforge.net">T.J. Willis</a>
044     * @version $Revision: 1.4 $
045     */
046    public class RandomImageFactory
047        extends AbstractRandomMediaFactory
048    {
049        //private volatile static RandomImageFactory instance;
050        //private volatile static ImageLoader loader;
051        private volatile ImageCache loader;
052        private ZipCapableFileFilter filter;
053    
054        //FIXED: desingleton this class
055    //   /**
056    //    *
057    //    * @return a <code>RandomImageFactory</code> value
058    //    */
059    //   public synchronized static RandomImageFactory getInstance() {
060    //         if (instance == null)
061    //             instance = new RandomImageFactory();
062    //         return instance;
063    //     }
064    
065      /**
066       * Creates a new <code>RandomImageFactory</code> instance.
067       */
068      public RandomImageFactory()
069        {
070            super();
071            zinit();
072        }
073    
074        private void zinit() {
075    
076            loader = new ImageCache(this,50);
077            loader.loadObjects(10);
078        }
079    
080        /**
081         * Creates a new <code>RandomImageFactory</code> instance.
082         * @param rootDir a <code>String</code> value
083         */
084        public RandomImageFactory(String rootDir)
085        {
086            super(rootDir);
087            zinit();
088        }
089    
090    
091      // this being synched is new
092      /**
093       * Clears the cache maintained in the ImageLoader.  Useful
094       * after enabling or disabling directories and changing the
095       * root directory.
096       *
097       */
098      public synchronized void clearCache()
099        {
100            if(loader==null) return;
101            loader.clearCache();
102        }
103    
104      /**
105       * Gets an image embedded in a CacheObject, which provides some
106       * additional information about the image.
107       *
108       * @return a <code>CacheObject</code> value with an random ImageIcon as its
109       * CacheObject.object field.
110       */
111      public synchronized CacheObject getRandomCacheObject()
112        {
113            assert loader!=null : "Loader is null";
114            CacheObject foo = loader.getRandomCacheObject();
115            return foo;
116        }
117    
118      /**
119       * Gets a random image as an ImageIcon.
120       *
121       * @param size an <code>int</code> value
122       * @return an <code>ImageIcon</code> value
123       */
124      public synchronized ImageIcon getRandomImageIcon(int size)
125        {
126            assert loader!=null : "Loader is null";
127            CacheObject foo = loader.getRandomCacheObject();
128            if(foo==null) return null;
129            return (ImageIcon)foo.object;
130        }
131    
132    
133      public static int getGlobalCacheObjectCount()
134      {
135         return CacheObject.count;
136      }
137    
138    
139    
140        /**
141         * Describe <code>getFileFilter</code> method here.
142         *
143         * @return a <code>ZipCapableFileFilter</code> value
144         */
145        protected ZipCapableFileFilter getFileFilter()
146        {
147            if (filter!=null) return filter;
148            filter = new JPEGFileFilter();
149            return filter;
150        }
151    }
152    
153    
154    
155    
156    
157    
158    
159