/* * The contents of this file are subject to the GNU Lesser General Public * License Version 2.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.gnu.org/copyleft/lesser.html * * 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. * * Developer: * Todd Ditchendorf, todd@ditchnet.org * */ /** * @author Todd Ditchendorf * @version 0.8 * @since 0.8 */ package org.ditchnet.jsp.taglib.tabs.listener; import java.util.List; import java.util.Iterator; import java.util.Arrays; import java.util.Collections; import java.io.File; import java.io.Reader; import java.io.InputStream; import java.io.BufferedInputStream; import java.io.OutputStream; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.net.URL; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; /** * @author Todd Ditchendorf * @since 0.8 * * <p><code>ServletContextListener</code> that handles extracting CSS, * JavaScript, and image resource files from this taglib's JAR file, and * places them in a directory called <code>org.ditchnet.taglib/</code> in this * web app's root directory. Why do this? The HTML files in which the tabs are * used must have access to the CSS, JavaScript and image files that render * the tabs correctly. Therefore, they must be placed in a known location * outside of the <code>WEB-INF</code> directory so that client browsers can * access them.</p> * <p>By implementing this feature as as <code>ServletContextListener</code>, * These resources are deployed immediately on reloading your web app, and * are therefore available before the first request! */ public class TabServletContextListener implements ServletContextListener { private static final String DEST_FOLDER_NAME = "/include/"; public static final String SCRIPT_URI = DEST_FOLDER_NAME + "tabs.js"; public static final String STYLE_URI = DEST_FOLDER_NAME + "tabstyle.jsp"; private static final List DEST_PATHS = Arrays.asList( new String [] { SCRIPT_URI, STYLE_URI }); private static final List RESOURCE_PATHS = Arrays.asList( new String [] {"/lib/js/tabs.js", "/lib/style/tabs.css" }); private static final String IMAGE_RESOURCE_FOLDER = "/lib/images/"; private static final List IMAGE_RESOURCE_NAMES = Arrays.asList( new String [] {"default_tab_bg_left.gif","default_tab_bg_right.gif", "default_tab_bg_white_left.gif","default_tab_bg_white_right.gif"}); /** * Handles finding all CSS, JavaScript, and image resources from this * taglib's JAR file and copies them to a directory in the web app's * root directory where the tab components can link to them. */ public void contextInitialized(final ServletContextEvent evt) { ServletContext servletContext = evt.getServletContext(); createDitchnetDir(servletContext); String sourcePath,destPath,fileName; URL sourceURL; int i = 0; for (Iterator iter = RESOURCE_PATHS.iterator(); iter.hasNext();) { sourcePath = (String)iter.next(); sourceURL = getClass().getResource(sourcePath); destPath = (String)DEST_PATHS.get(i); destPath = servletContext.getRealPath(destPath); writeFile(sourceURL,destPath,servletContext); i++; } for (Iterator iter = IMAGE_RESOURCE_NAMES.iterator(); iter.hasNext();) { fileName = (String)iter.next(); sourcePath = IMAGE_RESOURCE_FOLDER + fileName; sourceURL = getClass().getResource(sourcePath); destPath = DEST_FOLDER_NAME + fileName; destPath = servletContext.getRealPath(destPath); writeFile(sourceURL,destPath,servletContext); } } public void contextDestroyed(final ServletContextEvent evt) { } private void createDitchnetDir(final ServletContext servletContext) { String dirPath = servletContext.getRealPath(DEST_FOLDER_NAME); File dir = null; try { dir = new File(dirPath); dir.mkdir(); } catch (Exception e) { //log.error("Error creating Ditchnet dir"); } } private void writeFile(final URL fromURL, final String toPath, final ServletContext servletContext) { InputStream in = null; OutputStream out = null; try { in = new BufferedInputStream(fromURL.openStream()); out = new BufferedOutputStream(new FileOutputStream(toPath)); int len; byte [] buffer = new byte [4096]; while ((len = in.read(buffer,0,buffer.length)) != -1) { out.write(buffer,0,len); } out.flush(); } catch (Exception e) { //log.error("Error writing file dude: " + e.getMessage()); } finally { try { in.close(); out.close(); } catch (Exception e) { } } } }