001package org.maltparser.core.helper;
002
003
004import java.io.File;
005import java.io.IOException;
006import java.io.InputStream;
007import java.net.MalformedURLException;
008import java.net.URL;
009
010import org.maltparser.core.exception.MaltChainedException;
011import org.maltparser.core.plugin.Plugin;
012import org.maltparser.core.plugin.PluginLoader;
013
014/**
015*
016*
017* @author Johan Hall
018*/
019public class URLFinder {
020        /**
021         * Search for a file according the following priority:
022         * <ol>
023         * <li>The local file system
024         * <li>Specified as an URL (starting with http:, file:, ftp: or jar:
025         * <li>MaltParser distribution file (malt.jar)
026         * <li>MaltParser plugins
027         * </ol>
028         * 
029         * If the file string is found, an URL object is returned, otherwise <b>null</b>
030         * 
031         * @param fileString    the file string to convert into an URL.
032         * @return an URL object, if the file string is found, otherwise <b>null</b>
033         * @throws MaltChainedException
034         */
035        public URL findURL(String fileString) throws MaltChainedException {
036                File specFile = new File(fileString);
037
038                try {
039                        if (specFile.exists()) {
040                                // found the file in the file system
041                                return new URL("file:///"+specFile.getAbsolutePath());
042                        } else if (fileString.startsWith("http:") || fileString.startsWith("file:") || fileString.startsWith("ftp:") || fileString.startsWith("jar:")) {
043                                // the input string is an URL string starting with http, file, ftp or jar
044                                return new URL(fileString);
045                        } else {
046                                return findURLinJars(fileString);
047                        } 
048                } catch (MalformedURLException e) {
049                        throw new MaltChainedException("Malformed URL: "+fileString, e);
050                }
051        }
052        
053        public URL findURLinJars(String fileString) throws MaltChainedException {
054                try {
055                        // search in malt.jar and its plugins
056                        if (getClass().getResource(fileString) != null) {
057                                // found the input string in the malt.jar file
058                                return getClass().getResource(fileString);
059                        } else { 
060                                 for (Plugin plugin : PluginLoader.instance()) {
061                                        URL url = null;
062                                        if (!fileString.startsWith("/")) {
063                                                url = new URL("jar:"+plugin.getUrl() + "!/" + fileString);
064                                        } else {
065                                                url = new URL("jar:"+plugin.getUrl() + "!" + fileString);
066                                        }
067                                        
068                                        try { 
069                                                InputStream is = url.openStream();
070                                                is.close();
071                                        } catch (IOException e) {
072                                                continue;
073                                        }
074                                        // found the input string in one of the plugins
075                                        return url;
076                                } 
077                                // could not convert the input string into an URL
078                                return null; 
079                        }
080                } catch (MalformedURLException e) {
081                        throw new MaltChainedException("Malformed URL: "+fileString, e);
082                }
083        }
084}