- From: Thomas Gambet via cvs-syncmail <cvsmail@w3.org>
- Date: Tue, 11 Aug 2009 16:20:45 +0000
- To: www-validator-cvs@w3.org
Update of /sources/public/2006/unicorn/src/org/w3c/unicorn/output In directory hutz:/tmp/cvs-serv7188/src/org/w3c/unicorn/output Added Files: Tag: dev2 SimpleOutputModule.java OutputFormater.java XMLOutputFormater.java SimpleOutputFormater.java OutputModule.java OutputFactory.java XHTMLize.java EscapeXMLEntities.java EnumOutputModule.java Log Message: commit --- NEW FILE: OutputFactory.java --- // $Id: OutputFactory.java,v 1.1.2.1 2009/08/11 16:20:43 tgambet Exp $ // Author: Damien LEROY. // (c) COPYRIGHT MIT, ERCIM ant Keio, 2006. // Please first read the full copyright statement in file COPYRIGHT.html package org.w3c.unicorn.output; import java.io.IOException; import java.util.LinkedHashMap; import java.util.Map; import java.util.Properties; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.velocity.exception.ParseErrorException; import org.apache.velocity.exception.ResourceNotFoundException; import org.w3c.unicorn.util.Property; /** * This class allow to manage all output module and output formater. It provide * a way to share an instance of a output module or output formater between * different call of the framework UniCORN. * * @author Damien LEROY */ public class OutputFactory { protected static final Log logger = LogFactory .getLog("org.w3c.unicorn.output"); private static final Map<EnumOutputModule, OutputModule> mapOfOutputModule = new LinkedHashMap<EnumOutputModule, OutputModule>(); private static final Map<String, OutputFormater> mapOfOutputFormater = new LinkedHashMap<String, OutputFormater>(); private static Properties aPropertiesSpecialFormaters; public static void init() { OutputFactory.aPropertiesSpecialFormaters = Property.getProps("specialFormaters.properties"); /*try { OutputFactory.aPropertiesSpecialFormaters.load(Property .getPropertyFileURL("specialFormaters.properties") .openStream()); } catch (final IOException e) { OutputFactory.logger.error("IOException : " + e.getMessage(), e); e.printStackTrace(); }*/ } /** * Create a new output module and add it to the map. * * @param aEnumOutputModule * To identify which type of output module will be created. * @return The new output module. */ private static OutputModule createOutputModule( final EnumOutputModule aEnumOutputModule) { OutputFactory.logger.trace("createOutputModule"); if (OutputFactory.logger.isDebugEnabled()) { OutputFactory.logger.debug("Output module : " + aEnumOutputModule + "."); } final OutputModule aOutputModule; switch (aEnumOutputModule) { case SIMPLE: aOutputModule = new SimpleOutputModule(); break; default: return null; } OutputFactory.mapOfOutputModule.put(aEnumOutputModule, aOutputModule); return aOutputModule; } /** * Create a new output formater and add it to the map. * * @param sOutputFormat * The format who the output formater must produce. * @return The new output formater. * @throws ResourceNotFoundException * @throws ParseErrorException * @throws Exception */ private static OutputFormater createOutputFormater( final String sOutputFormat, final String sLang, final String sMimeType) throws ResourceNotFoundException, ParseErrorException, Exception { OutputFactory.logger.trace("createOutputformater"); if (OutputFactory.logger.isDebugEnabled()) { OutputFactory.logger .debug("Output format : " + sOutputFormat + "."); OutputFactory.logger.debug("Language : " + sLang + "."); OutputFactory.logger.debug("Mime type : " + sMimeType + "."); } final String sFormaterName = OutputFactory.aPropertiesSpecialFormaters .getProperty(sMimeType); if (null != sFormaterName) { final Class aFormaterClass = Class .forName("org.w3c.unicorn.output." + sFormaterName); final Class[] tClassParamType = { String.class, String.class }; final Object[] tObjectParamValue = { sOutputFormat, sLang }; final OutputFormater aOutputFormater; aOutputFormater = (OutputFormater) aFormaterClass.getConstructor( tClassParamType).newInstance(tObjectParamValue); OutputFactory.mapOfOutputFormater.put(sMimeType + "_" + sLang + "_" + sOutputFormat, aOutputFormater); return aOutputFormater; } final OutputFormater aOutputFormater; aOutputFormater = new SimpleOutputFormater(sOutputFormat, sLang); OutputFactory.mapOfOutputFormater.put(sLang + "_" + sOutputFormat, aOutputFormater); return aOutputFormater; } /** * Return the output module asked. * * @param sOutputModule * The name of the output module to return. * @return The output module asked. */ public static OutputModule getOutputModule(final String sOutputModule) { OutputFactory.logger.trace("getOutputModule"); if (OutputFactory.logger.isDebugEnabled()) { OutputFactory.logger .debug("Output module : " + sOutputModule + "."); } final EnumOutputModule aEnumOutputModule = EnumOutputModule .fromValue(sOutputModule); if (null == aEnumOutputModule) { OutputFactory.logger.error("Unknow output module."); return null; } return OutputFactory.getOutputModule(aEnumOutputModule); } /** * Retuern the output module asked. * * @param aEnumOutputModule * @return The output module asked. */ public static OutputModule getOutputModule( final EnumOutputModule aEnumOutputModule) { OutputFactory.logger.trace("getOutputModule"); if (OutputFactory.logger.isDebugEnabled()) { OutputFactory.logger.debug("Output module : " + aEnumOutputModule + "."); } final OutputModule aOutputModule = OutputFactory.mapOfOutputModule .get(aEnumOutputModule); // if output module not already exist if (null == aOutputModule) { // create it return OutputFactory.createOutputModule(aEnumOutputModule); } return aOutputModule; } /** * Return the output formater asked. * * @param sOutputFormat * The output format who be puduce by the output formater. * @return The output formater asked. * @throws ResourceNotFoundException * @throws ParseErrorException * @throws Exception */ public static OutputFormater getOutputFormater(final String sOutputFormat, final String sLang, final String sMimeType) throws ResourceNotFoundException, ParseErrorException, Exception { OutputFactory.logger.trace("getOutputformater"); if (OutputFactory.logger.isDebugEnabled()) { OutputFactory.logger .debug("Output format : " + sOutputFormat + "."); OutputFactory.logger.debug("Language : " + sLang + "."); } OutputFormater aOutputFormater = OutputFactory.mapOfOutputFormater .get(sMimeType + "_" + sLang + "_" + sOutputFormat); if (null != aOutputFormater) { return aOutputFormater; } aOutputFormater = OutputFactory.mapOfOutputFormater.get(sLang + "_" + sOutputFormat); if (null != aOutputFormater) { return aOutputFormater; } // if output formater not already exist create it aOutputFormater = OutputFactory.createOutputFormater(sOutputFormat, sLang, sMimeType); return aOutputFormater; } } --- NEW FILE: OutputModule.java --- // $Id: OutputModule.java,v 1.1.2.1 2009/08/11 16:20:43 tgambet Exp $ // Author: Damien LEROY. // (c) COPYRIGHT MIT, ERCIM ant Keio, 2006. // Please first read the full copyright statement in file COPYRIGHT.html package org.w3c.unicorn.output; import java.io.IOException; import java.io.Writer; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.velocity.exception.MethodInvocationException; import org.apache.velocity.exception.ParseErrorException; import org.apache.velocity.exception.ResourceNotFoundException; /** * Interface for all output module. * * @author Damien LEROY */ public interface OutputModule { public static final Log logger = OutputFactory.logger; /** * Generate the output of all response. * * @throws IOException * @throws Exception * @throws MethodInvocationException * @throws ParseErrorException * @throws ResourceNotFoundException */ public abstract void produceOutput(final OutputFormater aOutputFormater, final Map<String, Object> mapOfStringObject, final Map<String, String[]> mapOfParameter, final Writer aWriter) throws IOException, ResourceNotFoundException, ParseErrorException, MethodInvocationException, Exception; /** * Generates an error output * * @throws IOException * @throws Exception * @throws MethodInvocationException * @throws ParseErrorException * @throws ResourceNotFoundException */ public abstract void produceError(final OutputFormater aOutputFormater, final Exception error, final Map<String, String[]> mapOfParameter, final Writer aWriter) throws IOException, ResourceNotFoundException, ParseErrorException, MethodInvocationException, Exception; } --- NEW FILE: SimpleOutputModule.java --- // $Id: SimpleOutputModule.java,v 1.1.2.1 2009/08/11 16:20:42 tgambet Exp $ // Author: Damien LEROY. // (c) COPYRIGHT MIT, ERCIM ant Keio, 2006. // Please first read the full copyright statement in file COPYRIGHT.html package org.w3c.unicorn.output; import java.io.Writer; import java.util.Map; import org.apache.velocity.exception.MethodInvocationException; import org.apache.velocity.exception.ParseErrorException; import org.apache.velocity.exception.ResourceNotFoundException; /** * This module allow to generate output in text format. * * @author Damien LEROY */ public class SimpleOutputModule implements OutputModule { public void produceOutput(final OutputFormater aOutputFormater, final Map<String, Object> mapOfStringObject, final Map<String, String[]> mapOfParameter, final Writer aWriter) throws ResourceNotFoundException, ParseErrorException, MethodInvocationException, Exception { OutputModule.logger.trace("Constructor"); aOutputFormater.produceOutput(mapOfStringObject, aWriter); } public void produceError(final OutputFormater aOutputFormater, final Exception aException, final Map<String, String[]> mapOfParameter, final Writer aWriter) throws ResourceNotFoundException, ParseErrorException, MethodInvocationException, Exception { OutputModule.logger.trace("produceError"); aOutputFormater.produceError(aException, aWriter); } } --- NEW FILE: EnumOutputModule.java --- // $Id: EnumOutputModule.java,v 1.1.2.1 2009/08/11 16:20:43 tgambet Exp $ // Author: Damien LEROY. // (c) COPYRIGHT MIT, ERCIM ant Keio, 2006. // Please first read the full copyright statement in file COPYRIGHT.html package org.w3c.unicorn.output; /** * @author Damien LEROY * */ public enum EnumOutputModule { SIMPLE("simple"), MAIL("mail"); private final String sValue; private EnumOutputModule(final String sValue) { this.sValue = sValue; } public final String value() { return this.sValue; } /** * Returns if the string is an output method possible value * * @param sValue * string to compare * @return the output method if matches and null otherwise */ public static EnumOutputModule fromValue(final String sValue) { for (final EnumOutputModule aEnumOutputMethod : EnumOutputModule .values()) { if (aEnumOutputMethod.sValue.equals(sValue)) { return aEnumOutputMethod; } } return null; } } --- NEW FILE: OutputFormater.java --- // $Id: OutputFormater.java,v 1.1.2.1 2009/08/11 16:20:42 tgambet Exp $ // Author: Jean-Guilhem Rouel // (c) COPYRIGHT MIT, ERCIM and Keio, 2006. // Please first read the full copyright statement in file COPYRIGHT.html package org.w3c.unicorn.output; import java.io.Writer; import java.util.Map; import org.apache.velocity.exception.MethodInvocationException; import org.apache.velocity.exception.ParseErrorException; import org.apache.velocity.exception.ResourceNotFoundException; /** * SimpleOutputFormater<br /> * Created: Jul 19, 2006 5:54:33 PM<br /> * * @author Jean-Guilhem Rouel */ public interface OutputFormater { public abstract void produceOutput( final Map<String, Object> mapOfStringObject, final Writer aWriter) throws ResourceNotFoundException, ParseErrorException, MethodInvocationException, Exception; /** * @param aException * @param aWriter * @throws Exception * @throws MethodInvocationException * @throws ParseErrorException * @throws ResourceNotFoundException */ public abstract void produceError(final Exception aException, final Writer aWriter) throws ResourceNotFoundException, ParseErrorException, MethodInvocationException, Exception; } --- NEW FILE: EscapeXMLEntities.java --- package org.w3c.unicorn.output; import org.apache.velocity.app.event.ReferenceInsertionEventHandler; /** * Escape all XML Entities in the reference insertion. Specifically, the * following conversions are performed: * <DL> * <DT>&</DT> * <DD>&amp;</DD> * <DT><</DT> * <DD>&lt;</DD> * <DT>></DT> * <DD>&gt;</DD> * <DT>"</DT> * <DD>&quot;</DD> * </DL> * * @author <a href="mailto:wglass@forio.com">Will Glass-Husain</a> */ public class EscapeXMLEntities implements ReferenceInsertionEventHandler { /** * Escape the XML entities for all inserted references. */ public Object referenceInsert(final String sUnused, final Object oValue) { final String sValue = oValue.toString(); return EscapeXMLEntities.escapeText(sValue); } /** * Escape the provided text. * * @param sValue * @return */ public static String escapeText(final String sValue) { final StringBuffer aStringBuffer = new StringBuffer(sValue.length()); final int iLength = sValue.length(); int iPosition = 0; int iNextPosition = EscapeXMLEntities.nextPosition(sValue, iPosition); while (iNextPosition != -1) { aStringBuffer.append(sValue.substring(iPosition, iNextPosition)); aStringBuffer.append(EscapeXMLEntities.escapeChar(sValue .charAt(iNextPosition))); iPosition = iNextPosition + 1; if (iPosition < iLength) { iNextPosition = EscapeXMLEntities.nextPosition(sValue, iPosition); } else { iNextPosition = -1; } } if (iPosition < iLength) { aStringBuffer.append(sValue.substring(iPosition)); } return aStringBuffer.toString(); } /** * Transform the escape char into xml encoding * * @param c * char to transform * @return same character in xml form */ private static String escapeChar(final char c) { switch (c) { case '<': return "<"; case '>': return ">"; case '&': return "&"; case '"': return """; } return null; } /** * Returns the position of the next xml tag * * @param s * string to analyze * @param iCurrentPosition * current position in the string * @return position of the next tag */ private static int nextPosition(final String s, final int iCurrentPosition) { final int iLT = s.indexOf('<', iCurrentPosition); final int iGT = s.indexOf('>', iCurrentPosition); final int iAMP = s.indexOf('&', iCurrentPosition); final int iQUOT = s.indexOf('"', iCurrentPosition); if ((iLT != -1) && ((iGT == -1) || (iLT < iGT)) && ((iAMP == -1) || (iLT < iAMP)) && ((iQUOT == -1) || (iLT < iQUOT))) { return iLT; } if ((iGT != -1) && ((iAMP == -1) || (iGT < iAMP)) && ((iQUOT == -1) || (iGT < iQUOT))) { return iGT; } if ((iAMP != -1) && ((iQUOT == -1) || (iAMP < iQUOT))) { return iAMP; } return iQUOT; } } --- NEW FILE: XHTMLize.java --- package org.w3c.unicorn.output; import org.apache.velocity.app.event.ReferenceInsertionEventHandler; import org.w3c.unicorn.response.A; import org.w3c.unicorn.response.Code; import org.w3c.unicorn.response.Img; /** * Escape all XML Entities in the reference insertion. Specifically, the * following conversions are performed: * <DL> * <DT>&</DT> * <DD>&amp;</DD> * <DT><</DT> * <DD>&lt;</DD> * <DT>></DT> * <DD>&gt;</DD> * <DT>"</DT> * <DD>&quot;</DD> * </DL> * * @author <a href="mailto:wglass@forio.com">Will Glass-Husain</a> */ public class XHTMLize implements ReferenceInsertionEventHandler { /** * Escape the XML entities for all inserted references. */ public Object referenceInsert(final String sUnused, final Object oValue) { if (oValue == null) { return null; } if (oValue instanceof A) { A link = (A) oValue; return insertA(link); } if (oValue instanceof Img) { Img image = (Img) oValue; return insertImg(image); } if (oValue instanceof Code) { Code code = (Code) oValue; return insertCode(code); } return EscapeXMLEntities.escapeText(oValue.toString()); } /** * Insert a link * * @param aLink * link to insert * @return return the object containing the link */ private Object insertA(final A aLink) { String sResultat = "<a href=\"" + EscapeXMLEntities.escapeText(aLink.getHref()) + "\">"; for (final Object oElement : aLink.getContent()) { if (oElement instanceof Img) { sResultat += insertImg((Img) oElement); } else { sResultat += EscapeXMLEntities.escapeText(oElement.toString()); } } sResultat += "</a>"; return sResultat; } /** * Insert code tag into the tags * * @param aCode * code to insert * @return object with code inserted */ private Object insertCode(final Code aCode) { String sResultat = "<code>"; for (final Object oElement : aCode.getContent()) { if (oElement instanceof A) { sResultat += insertA((A) oElement); } else if (oElement instanceof Img) { sResultat += insertImg((Img) oElement); } else { sResultat += EscapeXMLEntities.escapeText(oElement.toString()); } } sResultat += "</code>"; return sResultat; } /** * Insert an img tag * * @param img * image path to insert * @return the string containing the image tag */ private String insertImg(final Img aImage) { return "<img src=\"" + EscapeXMLEntities.escapeText(aImage.getSrc()) + "\" alt=\"" + EscapeXMLEntities.escapeText(aImage.getAlt()) + "\"/>"; } } --- NEW FILE: SimpleOutputFormater.java --- // $Id: SimpleOutputFormater.java,v 1.1.2.1 2009/08/11 16:20:43 tgambet Exp $ // Author: Damien LEROY. // (c) COPYRIGHT MIT, ERCIM ant Keio, 2006. // Please first read the full copyright statement in file COPYRIGHT.html package org.w3c.unicorn.output; import java.io.Writer; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.exception.MethodInvocationException; import org.apache.velocity.exception.ParseErrorException; import org.apache.velocity.exception.ResourceNotFoundException; import org.w3c.unicorn.util.TemplateHelper; /** * Class for simple output formater. * * @author Jean-Guilhem ROUEL */ public class SimpleOutputFormater implements OutputFormater { private static final Log logger = OutputFactory.logger; private Template aTemplateOutput = null; private Template aTemplateError = null; private static VelocityContext aVelocityContext = new VelocityContext(); public SimpleOutputFormater(final String sOutputFormat, final String sLang) throws ResourceNotFoundException, ParseErrorException, Exception { SimpleOutputFormater.logger.trace("Constructor"); SimpleOutputFormater.logger.debug("Output format : " + sOutputFormat + "."); SimpleOutputFormater.logger.debug("Output language : " + sLang + "."); this.aTemplateOutput = TemplateHelper.getInternationalizedTemplate( sOutputFormat, sLang, aVelocityContext); this.aTemplateError = TemplateHelper.getInternationalizedTemplate( sOutputFormat + ".error", sLang, aVelocityContext); } /* * (non-Javadoc) * * @see org.w3c.unicorn.output.OutputFormater#produceOutput(java.util.Map, * java.io.Writer) */ public void produceOutput(final Map<String, Object> mapOfStringObject, final Writer aWriter) throws ResourceNotFoundException, ParseErrorException, MethodInvocationException, Exception { SimpleOutputFormater.logger.trace("produceOutput"); SimpleOutputFormater.logger.debug("Map of String -> Object : " + mapOfStringObject + "."); SimpleOutputFormater.logger.debug("Writer : " + aWriter + "."); for (final String sObjectName : mapOfStringObject.keySet()) { aVelocityContext.put(sObjectName, mapOfStringObject .get(sObjectName)); } this.aTemplateOutput.merge(aVelocityContext, aWriter); } /* * (non-Javadoc) * * @see org.w3c.unicorn.output.OutputFormater#produceError(java.lang.Exception, * java.io.Writer) */ public void produceError(final Exception aException, final Writer aWriter) throws ResourceNotFoundException, ParseErrorException, MethodInvocationException, Exception { SimpleOutputFormater.logger.trace("produceError"); SimpleOutputFormater.logger.debug("Error : " + aException.getMessage() + "."); SimpleOutputFormater.logger.debug("Writer : " + aWriter + "."); aVelocityContext.put("error", aException); this.aTemplateError.merge(aVelocityContext, aWriter); } } --- NEW FILE: XMLOutputFormater.java --- // $Id: XMLOutputFormater.java,v 1.1.2.1 2009/08/11 16:20:43 tgambet Exp $ // Author: Damien LEROY. // (c) COPYRIGHT MIT, ERCIM ant Keio, 2006. // Please first read the full copyright statement in file COPYRIGHT.html package org.w3c.unicorn.output; import java.io.Writer; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.event.EventCartridge; import org.apache.velocity.exception.MethodInvocationException; import org.apache.velocity.exception.ParseErrorException; import org.apache.velocity.exception.ResourceNotFoundException; import org.w3c.unicorn.util.TemplateHelper; /** * Class for XML output formater. * * @author Jean-Guilhem ROUEL */ public class XMLOutputFormater implements OutputFormater { /** * Object used for complex logging purpose */ private static final Log logger = OutputFactory.logger; /** * Template for the standard output */ private Template aTemplateOutput = null; /** * Template used for the standard error */ private Template aTemplateError = null; /** * Apache velocity context */ private static VelocityContext aVelocityContext = new VelocityContext(); /** * Write the result of the XML in a file * * @param sOutputFormat * format of the output * @param sLang * Language of the output * @throws ResourceNotFoundException * exception when resources not found using the path * @throws ParseErrorException * error in the parser * @throws Exception * odd error occur */ public XMLOutputFormater(final String sOutputFormat, final String sLang) throws ResourceNotFoundException, ParseErrorException, Exception { XMLOutputFormater.logger.trace("Constructor"); XMLOutputFormater.logger .debug("Output format : " + sOutputFormat + "."); XMLOutputFormater.logger.debug("Output language : " + sLang + "."); aTemplateOutput = TemplateHelper.getInternationalizedTemplate( sOutputFormat, sLang, aVelocityContext); aTemplateError = TemplateHelper.getInternationalizedTemplate( sOutputFormat + ".error", sLang, aVelocityContext); } /* * (non-Javadoc) * * @see org.w3c.unicorn.output.OutputFormater#produceOutput(java.util.Map, * java.io.Writer) */ public void produceOutput(final Map<String, Object> mapOfStringObject, final Writer aWriter) throws ResourceNotFoundException, ParseErrorException, MethodInvocationException, Exception { XMLOutputFormater.logger.trace("produceOutput"); XMLOutputFormater.logger.debug("Map of String -> Object : " + mapOfStringObject + "."); XMLOutputFormater.logger.debug("Writer : " + aWriter + "."); final EventCartridge aEventCartridge = new EventCartridge(); aEventCartridge.addEventHandler(new XHTMLize()); // aEventCartridge.addEventHandler(new EscapeXMLEntities()); aEventCartridge.attachToContext(aVelocityContext); for (final String sObjectName : mapOfStringObject.keySet()) { aVelocityContext.put(sObjectName, mapOfStringObject .get(sObjectName)); } this.aTemplateOutput.merge(aVelocityContext, aWriter); } /* * (non-Javadoc) * * @see org.w3c.unicorn.output.OutputFormater#produceError(java.lang.Exception, * java.io.Writer) */ public void produceError(final Exception aException, final Writer aWriter) throws ResourceNotFoundException, ParseErrorException, MethodInvocationException, Exception { XMLOutputFormater.logger.trace("produceError"); XMLOutputFormater.logger.debug("Error : " + aException + "."); XMLOutputFormater.logger.debug("Writer : " + aWriter + "."); final EventCartridge aEventCartridge = new EventCartridge(); aEventCartridge.addEventHandler(new EscapeXMLEntities()); aEventCartridge.attachToContext(aVelocityContext); aVelocityContext.put("error", aException); this.aTemplateError.merge(aVelocityContext, aWriter); } }
Received on Tuesday, 11 August 2009 16:20:54 UTC