/* * The contents of this file are subject to the Mozilla Public License Version 1.1 * (the "License"); you may not use this file except in compliance with the License. * You may obtain a copy of the License at . * * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT * WARRANTY OF ANY KIND, either express or implied. See the License for the specific * language governing rights and limitations under the License. * * The Original Code is the Venice Web Communities System. * * The Initial Developer of the Original Code is Eric J. Bowersox , * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are * Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * * Contributor(s): */ package com.silverwrist.venice.ui.servlet; import java.io.*; import org.apache.log4j.*; import com.silverwrist.util.IOUtil; import com.silverwrist.util.cache.CacheMap; import com.silverwrist.venice.ui.*; import com.silverwrist.venice.ui.helpers.*; public class FrameServlet extends BaseServlet { /*-------------------------------------------------------------------------------- * Internal class for returning the framed data. *-------------------------------------------------------------------------------- */ static class FramedData implements ContentDirect { private String locator; // static locator identity private File file; // the actual file we're retrieving private long last_update; // when was file last updated? private boolean processed = false; // have we processed this file? private String title = null; // the actual title private String content = null; // the actual content FramedData(String locator, String filename) throws ErrorBox { this.locator = locator; this.file = new File(filename); if (!(file.canRead())) { // the file does not exist! logger.error("FramedData: file \"" + filename + "\" not accessible"); throw new ErrorBox(null,"The static document \"" + locator + "\" was not found on the disk.",null); } // end if this.last_update = file.lastModified(); } // end constructor private synchronized void process() { if (processed) { // check to see if the file's been modified long new_last_update = file.lastModified(); if (last_update!=new_last_update) { // been updated - need to reprocess! last_update = new_last_update; title = null; content = null; processed = false; } // end if } // end if if (processed) return; // don't need to re-process // Read in the whole thing. StringBuffer raw_data; try { // read in from the file raw_data = IOUtil.loadText(file); } // end try catch (IOException ioe) { // I/O exception - just discard title = locator; content = "I/O error reading " + locator + ": " + ioe.getMessage(); return; } // end catch // make the upper-case search page and use that to locate the page title and body String search_page = raw_data.toString().toUpperCase(); title = searchBetweenTags(raw_data,search_page,"TITLE"); content = searchBetweenTags(raw_data,search_page,"BODY"); if (content==null) { // no content? content = "No content seen on " + locator; processed = false; } // end if processed = true; // set the flag to indicate we've got everything } // end process public boolean needFrame() { return true; } // end needFrame public int getMenuSelector() { return MENU_SELECTOR_NOCHANGE; } // end getMenuSelector public String getPageTitle(RequestOutput ro) { process(); return title; } // end getPageTitle public String getPageQID() { return locator; } // end getPageQID public void render(RequestOutput out) throws IOException { process(); out.write(content); out.flush(); } // end render } // end class FramedData /*-------------------------------------------------------------------------------- * Static data members *-------------------------------------------------------------------------------- */ private static Category logger = Category.getInstance(FrameServlet.class); /*-------------------------------------------------------------------------------- * Attributes *-------------------------------------------------------------------------------- */ private CacheMap cache = new CacheMap(15,25); /*-------------------------------------------------------------------------------- * Internal operations *-------------------------------------------------------------------------------- */ private static String searchBetweenTags(StringBuffer data, String search, String tagname) { tagname = tagname.toUpperCase(); String start = "<" + tagname; String end = ""; int startpos = search.indexOf(start); if (startpos<0) return null; startpos += start.length(); int bkt_pos = search.indexOf('>',startpos); if (bkt_pos<0) return null; int end_pos = search.indexOf(end,++bkt_pos); if (end_pos<0) return data.substring(bkt_pos); else return data.substring(bkt_pos,end_pos); } // end searchBetweenTags /*-------------------------------------------------------------------------------- * Implementations from class BaseServlet *-------------------------------------------------------------------------------- */ public Object process(RequestInput req) throws ThrowableContent { String page_name = req.getPathInfo().substring(1); FramedData rc = null; synchronized (cache) { // look up and see if we already have the page data cached rc = (FramedData)(cache.get(page_name)); if (rc==null) { // we have to map the name to a static path and thence to a real filename HTMLRendering html = (HTMLRendering)(req.queryService(HTMLRendering.class)); String locator = html.getStaticPath(page_name); String real_path = req.mapPath(locator); if (real_path==null) { // the mapper doesn't work! logger.error("FrameServlet: locator \"" + locator + "\" does not map"); return new ErrorBox(null,"The static document \"" + locator + "\" was not found.",null); } // end if // create new FramedData object and add it to the cache rc = new FramedData(locator,real_path); // may throw an ErrorBox cache.put(page_name,rc); } // end if } // end synchronized block return rc; } // end process } // end class FrameServlet