// --- BEGIN COPYRIGHT BLOCK --- // 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; version 2 of the License. // // 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., // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. // // (C) 2007 Red Hat, Inc. // All rights reserved. // --- END COPYRIGHT BLOCK --- package com.netscape.cms.servlet.common; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.util.Date; import java.util.Enumeration; import javax.servlet.ServletOutputStream; import com.netscape.certsrv.apps.CMS; import com.netscape.certsrv.base.EBaseException; import com.netscape.certsrv.base.IArgBlock; import com.netscape.certsrv.logging.ILogger; /** * File templates. This implementation will take * an HTML file with a special customer tag * <CMS_TEMPLATE> and replace the tag with * a series of javascript variable definitions * (depending on the servlet) * * @version $Revision$, $Date$ */ public class CMSTemplate extends CMSFile { public static final String SUFFIX = ".template"; /*========================================================== * variables *==========================================================*/ /* private variables */ private String mTemplateFileName = ""; private ILogger mLogger = CMS.getLogger(); private long mTimeStamp; /* public vaiables */ public String mPreOutput; public String mPostOutput; public static final String TEMPLATE_TAG = ""; /* Character set for i18n */ /* Will be set by CMSServlet.getTemplate() */ private String mCharset = null; /*========================================================== * constructors *==========================================================*/ /** * Constructor * * @param file template file to load * @param charset character set * @throws IOException if the there was an error opening the file */ public CMSTemplate(File file, String charset) throws IOException, EBaseException { mCharset = charset; mAbsPath = file.getAbsolutePath(); mLastModified = file.lastModified(); try { init(file); } catch (IOException e) { log(ILogger.LL_FAILURE, CMS.getLogMessage("CMSGW_CANT_LOAD_TEMPLATE", mAbsPath, e.toString())); throw new ECMSGWException( CMS.getLogMessage("CMSGW_ERROR_LOADING_TEMPLATE")); } String content = mPreOutput + mPostOutput; mContent = content.getBytes(mCharset); } /*========================================================== * public methods *==========================================================*/ /* * * Load the form from the file and setup the * pre/post output buffer if it is a template * file. Otherwise, only post output buffer is * filled. * @param template the template file to load * @return true if successful */ public boolean init(File template) throws EBaseException, IOException { StringBuffer buf = new StringBuffer(); /* load template */ String content = loadFile(template); if (content == null) { log(ILogger.LL_FAILURE, CMS.getLogMessage("CMSGW_TEMPLATE_EMPTY", mAbsPath)); throw new ECMSGWException( CMS.getLogMessage("CMSGW_TEMPLATE_NO_CONTENT_1", mAbsPath)); } /* time stamp */ Date now = CMS.getCurrentDate(); mTimeStamp = now.getTime(); /* if template file, find template tag substring and set * pre/post output string */ int location = content.indexOf(TEMPLATE_TAG); if (location == -1) { log(ILogger.LL_FAILURE, CMS.getLogMessage( "CMSGW_TEMPLATE_MISSING", mAbsPath, TEMPLATE_TAG)); throw new ECMSGWException( CMS.getLogMessage("CMSGW_MISSING_TEMPLATE_TAG_2", TEMPLATE_TAG, mAbsPath)); } mPreOutput = content.substring(0, location); mPostOutput = content.substring(TEMPLATE_TAG.length() + location); return true; } /** * Write a javascript representation of 'input' * surrounded by SCRIPT tags to the outputstream * * @param rout the outputstream to write to * @param input the parameters to write */ public void renderOutput(OutputStream rout, CMSTemplateParams input) throws IOException { Enumeration e = null; Enumeration q = null; IArgBlock r = null; boolean headerBlock = false, fixedBlock = false, queryBlock = false; CMSTemplateParams data = (CMSTemplateParams) input; HTTPOutputStreamWriter http_out = null; if (mCharset == null) http_out = new HTTPOutputStreamWriter(rout); else http_out = new HTTPOutputStreamWriter(rout, mCharset); try { templateLine out = new templateLine(); // Output the prolog out.print(mPreOutput); // Output the header data out.println(""); out.println(mPostOutput); http_out.print(out.toString()); } catch (EBaseException ex) { throw new IOException(ex.getMessage()); } } /** * Ouput the pre-amble HTML Header including * the pre-output buffer. * * @param out output stream specified * @return success or error */ public boolean outputProlog(PrintWriter out) { //Debug.trace("FormCache:outputProlog"); /* output pre-output buffer */ out.print(mPreOutput); /* output JavaScript variables and objects */ out.println(""); out.println(mPostOutput); return true; } /** * @return full path of template */ public String getTemplateName() { return mAbsPath; } // inherit getabspath, getContent, get last access and set last access /*========================================================== * private methods *==========================================================*/ /* load file into string */ private String loadFile(File template) throws IOException { // Debug.trace("FormCache:loadFile"); /* create input stream, can throw IOException */ FileInputStream inStream = new FileInputStream(template); InputStreamReader inReader = new InputStreamReader(inStream, mCharset); ; BufferedReader in = new BufferedReader(inReader); StringBuffer buf = new StringBuffer(); String line; while ((line = in.readLine()) != null) { buf.append(line); buf.append('\n'); } try { in.close(); inStream.close(); } catch (IOException e) { log(ILogger.LL_WARN, CMS.getLogMessage("CMSGW_ERR_CLOSE_TEMPL_FILE", mAbsPath, e.getMessage())); } return buf.toString(); } private String renderValue(Object v) { String s = null; // Figure out the type of object if (v instanceof IRawJS) { s = v.toString(); } else if (v instanceof String) { if (v.equals("")) s = "null"; else s = "\"" + escapeJavaScriptString((String) v) + "\""; } else if (v instanceof Integer) { s = ((Integer) v).toString(); } else if (v instanceof Boolean) { if (((Boolean) v).booleanValue() == true) { s = "true"; } else { s = "false"; } } else if (v instanceof BigInteger) { s = ((BigInteger) v).toString(10); } else if (v instanceof Character && ((Character) v).equals(Character.valueOf((char) 0))) { s = "null"; } else { s = "\"" + v.toString() + "\""; } return s; } /** * Escape the contents of src string in preparation to be enclosed in * double quotes as a JavaScript String Literal within an