// HTTPDFileHandler.java // ----------------------- // (C) by Michael Peter Christen; mc@yacy.net // first published on http://www.anomic.de // Frankfurt, Germany, 2004, 2005 // // $LastChangedDate$ // $LastChangedRevision$ // $LastChangedBy$ // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA /* Class documentation: this class provides a file servlet and CGI interface for the httpd server. Whenever this server is addressed to load a local file, this class searches for the file in the local path as configured in the setting property 'rootPath' The servlet loads the file and returns it to the client. Every file can also act as an template for the built-in CGI interface. There is no specific path for CGI functions. CGI functionality is triggered, if for the file to-be-served 'template.html' also a file 'template.class' exists. Then, the class file is called with the GET/POST properties that are attached to the http call. Possible variable hand-over are: - form method GET - form method POST, enctype text/plain - form method POST, enctype multipart/form-data The class that creates the CGI respond must have at least one static method of the form public static java.util.Hashtable respond(java.util.HashMap, serverSwitch) In the HashMap, the GET/POST variables are handed over. The return value is a Property object that contains replacement key/value pairs for the patterns in the template file. The templates must have the form either '#['<name>']#' for single attributes, or '#{'<enumname>'}#' and '#{/'<enumname>'}#' for enumerations of values '#['<value>']#'. A single value in repetitions/enumerations in the template has the property key '_'<enumname><count>'_'<value> Please see also the example files 'test.html' and 'test.java' */ package net.yacy.server.http; import java.io.File; import net.yacy.cora.document.analysis.Classification; import net.yacy.cora.util.ConcurrentLog; import net.yacy.search.Switchboard; import net.yacy.search.SwitchboardConstants; import net.yacy.server.serverSwitch; public final class HTTPDFileHandler { // create a class loader private static serverSwitch switchboard = null; public static File htDocsPath = null; public static String[] defaultFiles = null; private static File htDefaultPath = null; private static File htLocalePath = null; public static String indexForward = ""; //private Properties connectionProperties = null; // creating a logger static { final serverSwitch theSwitchboard = Switchboard.getSwitchboard(); if (switchboard == null) { switchboard = theSwitchboard; if (Classification.countMimes() == 0) { // load the mime table final String mimeTablePath = theSwitchboard.getConfig("mimeTable",""); ConcurrentLog.config("HTTPDFiles", "Loading mime mapping file " + mimeTablePath); Classification.init(new File(theSwitchboard.getAppPath(), mimeTablePath)); } // create default files array initDefaultPath(); // create a htDocsPath: user defined pages if (htDocsPath == null) { htDocsPath = theSwitchboard.getDataPath(SwitchboardConstants.HTDOCS_PATH, SwitchboardConstants.HTDOCS_PATH_DEFAULT); if (!(htDocsPath.exists())) htDocsPath.mkdirs(); } // create htLocaleDefault, htLocalePath if (htDefaultPath == null) htDefaultPath = theSwitchboard.getAppPath("htDefaultPath", SwitchboardConstants.HTROOT_PATH_DEFAULT); if (htLocalePath == null) htLocalePath = theSwitchboard.getDataPath("locale.translated_html", "DATA/LOCALE/htroot"); } } public static final void initDefaultPath() { // create default files array defaultFiles = switchboard.getConfigArray(SwitchboardConstants.BROWSER_DEFAULT, "index.html"); if (defaultFiles.length == 0) defaultFiles = new String[] {"index.html"}; indexForward = switchboard.getConfig(SwitchboardConstants.INDEX_FORWARD, ""); if (indexForward.startsWith("/")) indexForward = indexForward.substring(1); } /** Returns a path to the localized or default file according to the locale.language (from he switchboard) * @param path relative from htroot * @param clientLang preferred client language (browser setting), applied if config locale.language=browser */ public static File getLocalizedFile(final String path, final String clientLang){ String localeSelection = switchboard.getConfig("locale.language", "browser"); if (!(localeSelection.equals("default"))) { if (localeSelection.equals("browser")) { // handle preferred language of client browser if (clientLang != null && !clientLang.isEmpty()) { final File localePath = new File(htLocalePath, clientLang + '/' + path); if (localePath.exists()) { // on success return otherwise continue with default htDocsPath return localePath; // avoid "NoSuchFile" troubles if the "localeSelection" is misspelled } } } else { // use language from switchboard config final File localePath = new File(htLocalePath, localeSelection + '/' + path); if (localePath.exists()) { return localePath; // avoid "NoSuchFile" troubles if the "localeSelection" is misspelled } } } final File docsPath = new File(htDocsPath, path); if (docsPath.exists()) return docsPath; return new File(htDefaultPath, path); } public static final File getOverlayedFile(final String path) { File targetFile; targetFile = getLocalizedFile(path, null); if (!targetFile.exists()) { targetFile = new File(htDocsPath, path); } return targetFile; } }