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/RandomMediaDirectory.java,v 1.6 2004/05/21 07:28:54 tj_willis Exp $
019     */ 
020    package net.sourceforge.pavlov.randommedia;
021    
022    import java.io.File;
023    import java.net.URL;
024    import java.util.Enumeration;
025    import java.util.jar.*;
026    import net.sourceforge.pavlov.zipUtilities.*;
027    import org.apache.log4j.*;
028    
029    /**
030     * A filesystem directory full of media items.
031     * @author <a href="mailto:tj_willis@users.sourceforge.net">T.J. Willis</a>
032     * @version 1.0
033     */
034    public class RandomMediaDirectory extends AbstractMediaDirectory
035    {
036        private Category cat
037            = Category.getInstance(RandomMediaDirectory.class.getName());
038        /**
039         * Creates and initializes a RandomMediaDirectory object with the 
040         * given file and fileFilter.
041         * @param f a <code>File</code> value
042         * @param filt a <code>ZipCapableFileFilter</code> value
043         */
044        public RandomMediaDirectory(File f, ZipCapableFileFilter filt)
045        {
046            super(f,filt);
047            //System.out.println("const fname = " + f.getAbsolutePath());
048        }
049    
050        /**
051         * Creates and initializes a RandomMediaDirectory object with the 
052         * given file and fileFilter.
053         * @param f a <code>File</code> value
054         * @param filt a <code>ZipCapableFileFilter</code> value
055         * @param shouldRefresh a <code>boolean</code> value
056         */
057        public RandomMediaDirectory(File f, ZipCapableFileFilter filt,boolean shouldRefresh)
058        {
059            super(f,filt,shouldRefresh);
060        }
061    
062    
063        /**
064         * Handles the case where the base directory is a, or is in a Jar File.  
065         *
066         */
067        // FIXME: this is a horrible, unstable hack
068        private void handleJar()
069        {
070            String baseURLstring = 
071                JarUtilities.getJarFileName(getDirectoryString()); 
072            
073            JarFile tmp = null;
074            try {
075                tmp = new JarFile(baseURLstring);
076            } catch (Exception ex) {
077                cat.warn("Can't make jarfile: " + baseURLstring,ex);
078            }
079            
080            Enumeration<JarEntry> entries = tmp.entries();
081            //int mySize = 0;
082            
083            while(entries.hasMoreElements())
084            {
085                JarEntry xx = entries.nextElement();
086                if(!acceptEntry(xx)){
087                    continue;
088                }
089                try {
090                    
091                    //String tmpNm = baseURLstring+xx.getName();
092                    URL u  = JarUtilities.makeJarURL(baseURLstring, 
093                                                     xx.toString());
094                    addURL(u);
095                } catch (Exception e) {
096                    cat.warn("Can't make jar url: " + xx,e);
097                }
098            }
099        }
100    
101    
102    
103    
104        /**
105         * Describe <code>refresh</code> method here.
106         *
107         */
108        public void refresh()
109        {
110            //assert file.isDirectory(): "Not a directory";
111            if(JarUtilities.isInAJar(getDirectory())){
112                handleJar();
113                return;
114            }
115            
116            File fileArr[] = listFiles();
117            
118            // FIXED: frequent NPE
119            clearURLs();
120            
121            for(File f : fileArr){ 
122                if(f==null)
123                    continue;
124                else if(f.isDirectory() || JarUtilities.isAJar(f))
125                    addSubdirectory(f);
126                else {
127                    if(acceptFile(f)) {
128                        try {
129                            URL u = f.toURL(); //entryURL(f.getName());
130                            addURL(u);
131                        } catch (Exception e){
132                            cat.warn("Can't make url: " + f,e);
133                        }
134                    }
135                }
136            }
137        }
138        
139    }
140