package com.ngMAT.appl.ezfile.servlets; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import javax.servlet.http.HttpServletResponse; import com.ngMAT.Common.CoolProperties; import com.ngMAT.Common.Log; import com.ngMAT.HTML.HTMLComponent; import com.ngMAT.HTML.HTMLString; import com.ngMAT.HTML.HTMLTemplate; import com.ngMAT.HTML.ByteArrayComponent; import com.ngMAT.appl.genericservlet.GenericServlet; import com.ngMAT.appl.genericservlet.GenericServletConfig; import com.ngMAT.appl.genericservlet.GenericServletContext; public class EZFileServlet extends GenericServlet { public boolean isReadyToGo(GenericServletContext context) { return true; } public HTMLComponent process(GenericServletContext context) { EZFileServletConfig config = (EZFileServletConfig)context.getConfig(); String uri = config.path_handler.getPath (context); if (isDir (config, context, uri)) return handleDir (config, context, uri); if (isHTML (config, context, uri)) { if (isSimpleHTML (config, context, uri)) return handleSimpleHTML (config, context, uri); else return handleHTML (config, context, uri); } else { return handleBinary (config, context, uri); } } public boolean isHTML (EZFileServletConfig config, GenericServletContext context, String path) { boolean res = false; path = path.toLowerCase(); for (int i = 0; i < config.html_extentions.size(); i++) { if (path.endsWith ((String)config.html_extentions.elementAt (i))) { res = true; break; } } return res; } public boolean isTextfile (EZFileServletConfig config, GenericServletContext context, String path) { int x = path.lastIndexOf ("."); if (x < 0) return false; return config.textfile_extentions.indexOf ("," + path.substring (x) + ",") >= 0; } public boolean isDir (EZFileServletConfig config, GenericServletContext context, String path) { if (path.endsWith (config.path_separator)) return true; if (path.length() > 0) path += config.path_separator; path = composeAbsolutePath (config, path); File f = new File (path); return f.isDirectory(); } private String findMimeType (EZFileServletConfig config, GenericServletContext context, String path) { int x = path.lastIndexOf ("."); if (x >= 0) { String res = config.mime_types.getProperty (path.substring (x + 1)); if (res != null) { if (isTextfile (config, context, path)) { res += "; charset=" + config.getServletCharSet(); } return res; } } return config.mime_types.getProperty ("*"); } private HTMLComponent handleDir (EZFileServletConfig config, GenericServletContext context, String uri) { if (uri.endsWith (config.path_separator) || uri.length() == 0) { uri = config.path_separator + uri + config.default_filename; context.forward (uri); } else { uri = config.path_separator + uri + config.path_separator; context.sendRedirect (uri); } return null; } private HTMLTemplate handleHTML (EZFileServletConfig config, GenericServletContext context, String uri) { try { HTMLTemplate output = context.getTemplate (config.document_root, uri); return output; } catch (Throwable t) { getLog().println (t.getMessage()); try { context.sendError (HttpServletResponse.SC_NOT_FOUND); } catch (IOException e2) { // エラーを送れなかったらあきらめる(^^ゞ } return context.getTemplate (config.not_available_template_name); } } private HTMLComponent handleSimpleHTML (EZFileServletConfig config, GenericServletContext context, String uri) { EZFileServletConfig.Dir dir = config.getSimpleDirInfo (uri); HTMLString output = null; try { output = context.getString (config.document_root, uri); } catch (Throwable t) { try { context.sendError (HttpServletResponse.SC_NOT_FOUND); } catch (IOException e2) { // エラーを送れなかったらあきらめる(^^ゞ } return null; } if (dir.including_template_name != null) { HTMLTemplate outer = context.getTemplate (config.document_root, dir.including_template_name); outer.setTagValue ("contents", output); return outer; } else return output; } private boolean isSimpleHTML (EZFileServletConfig config, GenericServletContext context, String uri) { EZFileServletConfig.Dir dir = config.getSimpleDirInfo (uri); return (dir != null); } private HTMLComponent handleBinary (EZFileServletConfig config, GenericServletContext context, String uri) { try { ByteArrayComponent bac = new ByteArrayComponent(); uri = context.getTemplateRealPath (config.document_root, uri); String path = composeAbsolutePath (config, uri); FileInputStream fis = new FileInputStream (path); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024 * 64]; int len; while ((len = fis.read (buffer)) >= 0) { baos.write (buffer, 0, len); } fis.close(); bac.setMimeType (findMimeType (config, context, uri)); bac.setBuffer (baos.toByteArray()); baos.close(); return bac; } catch (java.io.FileNotFoundException e) { try { context.sendError (HttpServletResponse.SC_NOT_FOUND); } catch (IOException e2) { // エラーを送れなかったらあきらめる(^^ゞ } return null; } catch (java.io.IOException e) { throw new com.ngMAT.Common.LowLevelException (e); } } private String composeAbsolutePath (EZFileServletConfig config, String path) { if (config.document_root == null) path = config.TemplateFolder + config.path_separator + path; else path = config.TemplateFolder + config.path_separator + config.document_root + config.path_separator + path; return path; } }