From ad6719da32b7325501c2a22f2c6897a9d476d3b6 Mon Sep 17 00:00:00 2001 From: "Christian P. MOMON" Date: Tue, 23 Feb 2010 15:03:14 +0100 Subject: [PATCH] Devinsy integration for new ledb-admin project. --- build.xml | 2 +- demo/XidDemo.java | 26 +- src/xid/Attributes.java | 79 - src/xid/Data.java | 383 ----- src/xid/DomPresenter.java | 196 --- src/xid/FilePresenter.java | 170 --- src/xid/IdData.java | 177 --- src/xid/IdDataCore.java | 18 - src/xid/IdsDataById.java | 40 - src/xid/IdsDataByIndex.java | 18 - src/xid/ParserErrorHandler.java | 159 -- src/xid/Presenter.java | 1330 ----------------- src/xid/StringPresenter.java | 198 --- src/xid/TagData.java | 36 - src/xid/TagsDataById.java | 40 - src/xid/testXid.html | 79 - src/xid/testXid.t | 69 - src/xid/xhtml-lat1.ent | 196 --- src/xid/xhtml-special.ent | 82 - src/xid/xhtml-symbol.ent | 237 --- src/xid/xhtml1-frameset.dtd | 1235 --------------- src/xid/xhtml1-transitional.dtd | 1210 --------------- test/xid/test/Test.java | 237 --- webapp-examples/WEB-INF/classes/build.xml | 30 - .../WEB-INF/classes/log4j.properties | 9 - webapp-examples/WEB-INF/classes/testXid.t | 69 - .../WEB-INF/classes/xid/Test.class | Bin 4021 -> 0 bytes webapp-examples/WEB-INF/classes/xid/Test.java | 136 -- webapp-examples/WEB-INF/lib/xid.jar | Bin 37491 -> 0 bytes webapp-examples/WEB-INF/web.xml | 13 +- 30 files changed, 17 insertions(+), 6457 deletions(-) delete mode 100644 src/xid/Attributes.java delete mode 100644 src/xid/Data.java delete mode 100644 src/xid/DomPresenter.java delete mode 100644 src/xid/FilePresenter.java delete mode 100644 src/xid/IdData.java delete mode 100644 src/xid/IdDataCore.java delete mode 100644 src/xid/IdsDataById.java delete mode 100644 src/xid/IdsDataByIndex.java delete mode 100644 src/xid/ParserErrorHandler.java delete mode 100644 src/xid/Presenter.java delete mode 100644 src/xid/StringPresenter.java delete mode 100644 src/xid/TagData.java delete mode 100644 src/xid/TagsDataById.java delete mode 100644 src/xid/testXid.html delete mode 100644 src/xid/testXid.t delete mode 100644 src/xid/xhtml-lat1.ent delete mode 100644 src/xid/xhtml-special.ent delete mode 100644 src/xid/xhtml-symbol.ent delete mode 100644 src/xid/xhtml1-frameset.dtd delete mode 100644 src/xid/xhtml1-transitional.dtd delete mode 100644 test/xid/test/Test.java delete mode 100644 webapp-examples/WEB-INF/classes/build.xml delete mode 100644 webapp-examples/WEB-INF/classes/log4j.properties delete mode 100644 webapp-examples/WEB-INF/classes/testXid.t delete mode 100644 webapp-examples/WEB-INF/classes/xid/Test.class delete mode 100644 webapp-examples/WEB-INF/classes/xid/Test.java delete mode 100644 webapp-examples/WEB-INF/lib/xid.jar diff --git a/build.xml b/build.xml index 47c1d06..5bcff48 100644 --- a/build.xml +++ b/build.xml @@ -63,7 +63,7 @@ - + diff --git a/demo/XidDemo.java b/demo/XidDemo.java index b453616..26a0a09 100644 --- a/demo/XidDemo.java +++ b/demo/XidDemo.java @@ -1,37 +1,39 @@ -import java.util.*; -import java.io.*; +/** + * XidDemo + */ + import fr.devinsy.xid.*; /** * */ -class Demo +class XidDemo { - static private org.apache.log4j.Logger log; + static private org.apache.log4j.Logger logger; static { - // Initialize log. + // Initialize logger. org.apache.log4j.Logger log = null; org.apache.log4j.BasicConfigurator.configure (); log = org.apache.log4j.Logger.getRootLogger (); - //log.setLevel (org.apache.log4j.Level.INFO); - log.setLevel (org.apache.log4j.Level.INFO); + //logger.setLevel (org.apache.log4j.Level.INFO); + logger.setLevel (org.apache.log4j.Level.INFO); - log.info ("Enter"); + logger.info ("Enter"); // - log.info ("Set the log file format..."); + logger.info ("Set the log file format..."); // log = org.apache.log4j.Category.getInstance(Application.class.getName()); - log.info ("... done."); + logger.info ("... done."); - log.debug ("Exit"); - log = org.apache.log4j.Logger.getLogger (Demo.class); + logger.debug ("Exit"); + log = org.apache.log4j.Logger.getLogger (XidDemo.class); } diff --git a/src/xid/Attributes.java b/src/xid/Attributes.java deleted file mode 100644 index cad8b68..0000000 --- a/src/xid/Attributes.java +++ /dev/null @@ -1,79 +0,0 @@ -package xid; - -import java.util.*; -import java.io.*; - - - -/** - * - * Note: no more AttrValue as in Brill, because the exception of style is managed - * in the attribute merging on the "style" string detection. - */ -public class Attributes extends HashMap -{ - /* - * - */ - public Attributes () - { - super (); - } - - - /* - * Useful for the merge attributes. - */ - public Attributes (Attributes attributes) - { - super (attributes); - } - - - /* - * - */ - public void setAttribute (String label, String value) - { - this.put (label, value); - } - - - /* - * Add a value to an existing value. This is useful to the 'style' attribute. - * - */ - public void appendAttribute (String label, String value) - { - if (this.containsKey (label)) - { - this.put (label, this.get (label) + value); - } - else - { - this.put (label, value); - } - } - - - /* - * - */ - public String getAttribute (String label) - { - String result; - - if (this.containsKey (label)) - { - result = this.get (label); - } - else - { - result = null; - } - - // - return (result); - } - -} diff --git a/src/xid/Data.java b/src/xid/Data.java deleted file mode 100644 index 7d312e8..0000000 --- a/src/xid/Data.java +++ /dev/null @@ -1,383 +0,0 @@ -package xid; - -import java.util.*; -import java.io.*; - -/* - * - */ -public class Data -{ - protected IdsDataById idsDataById; - protected TagsDataById tagsDataById; - - - /** - * - */ - public Data () - { - this.idsDataById = new IdsDataById (); - this.tagsDataById = new TagsDataById (); - } - - - /** - * - */ - public IdsDataById getIdsDataById () - { - IdsDataById result; - - result = this.idsDataById; - - // - return (result); - } - - - /** - * - */ - public TagsDataById getTagsDataById () - { - TagsDataById result; - - result = this.tagsDataById; - - // - return (result); - } - - - /** - * - */ - public IdData getIdData (String id) - { - IdData result; - - // Be sure that IdData is existing and get item. - result = (IdData) this.idsDataById.getId (id); - - if (result == null) - { - this.idsDataById.setId (id, new IdData ()); - - result = (IdData) this.idsDataById.getId (id); - } - - - // - return (result); - } - - - /** - * - */ - public IdData getIdData (String id, int line) - { - IdData result; - - // Be sure that IdsData are existing. - IdsDataByIndex tags = (IdsDataByIndex) this.idsDataById.getId (id); - if (tags == null) - { - this.idsDataById.setId (id, new IdsDataByIndex ()); - - tags = (IdsDataByIndex) this.idsDataById.getId (id); - } - - // Be sure that lines are existing. - int nbLines = tags.size (); - for (int nLine = nbLines; nLine < line + 1; nLine++) - { - tags.add (nLine, new IdData ()); - } - - // Get item. - result = (IdData) tags.elementAt (line); - - // - return (result); - } - - - /** - * - */ - public IdData getIdData (String id, int line, String column) - { - IdData result; - - // Be sure that IdsData are existing. - IdsDataByIndex tags = (IdsDataByIndex) this.idsDataById.getId (id); - if (tags == null) - { - this.idsDataById.setId (id, new IdsDataByIndex ()); - - tags = (IdsDataByIndex) this.idsDataById.getId (id); - } - - // Be sure that lines are existing. - int nbLines = tags.size (); - for (int nLine = nbLines; nLine < line + 1; nLine++) - { - tags.add (nLine, new IdsDataById ()); - } - - // Get item. - IdsDataById lineData = (IdsDataById) tags.elementAt (line); - - result = (IdData) lineData.get (column); - - if (result == null) - { - lineData.put (column, new IdData ()); - - result = (IdData) lineData.get (column); - } - - // - return (result); - } - - - /** - * - */ - public void setIterationStrategy (String id, IdData.IterationStrategy strategy) - { - IdData tag = (IdData) this.getIdData (id); - - tag.setIterationStrategy (strategy); - } - - - - /** - * - */ - public void setContent (String id, String content) - { - if (id.startsWith ("<")) - { - String tagName = id.substring (1, id.length () - 1); - - TagData tag = this.tagsDataById.getId (tagName); - if (tag == null) - { - tag = new TagData (); - this.tagsDataById.setId (tagName, tag); - } - - tag.setContent (content); - } - else - { - IdData idData = this.getIdData (id); - - idData.setContent (content); - } - } - - - /** - * - */ - public void setContent (String id, int content) - { - setContent (id, (new Integer (content)).toString ()); - } - - - /** - * - */ - public void setContent (String id, int line, String content) - { - IdData tag = this.getIdData (id, line); - - tag.setContent (content); - } - - - /** - * - */ - public void setContent (String id, int line, int content) - { - setContent (id, line, (new Integer (content)).toString ()); - } - - - /** - * - */ - public void setContent (String id, int line, String column, String content) - { - IdData tag = this.getIdData (id, line, column); - - tag.setContent (content); - } - - - /** - * - */ - public void setContent (String id, int line, String column, int content) - { - setContent (id, line, column, (new Integer (content)).toString ()); - } - - - /** - * - */ - public void setAttribute (String id, String label, String value) - { - if (id.startsWith ("<")) - { - String tagName = id.substring (1, id.length () - 1); - - TagData tag = this.tagsDataById.getId (tagName); - if (tag == null) - { - tag = new TagData (); - this.tagsDataById.setId (tagName, tag); - } - - tag.getAttributes ().setAttribute (label, value); - } - else - { - IdData tag = this.getIdData (id); - - tag.getAttributes ().setAttribute (label, value); - } - } - - - /** - * - */ - public void setAttribute (String id, String label, int value) - { - setAttribute (id, label, (new Integer (value)).toString ()); - } - - - /** - * - */ - public void setAttribute (String id, int line, String label, String value) - { - IdData tag = this.getIdData (id, line); - - tag.getAttributes ().setAttribute (label, value); - } - - - /** - * - */ - public void setAttribute (String id, int line, String label, int value) - { - setAttribute (id, line, label, (new Integer (value)).toString ()); - } - - - /** - * - */ - public void setAttribute (String id, int line, String column, String label, String value) - { - IdData tag = this.getIdData (id, line, column); - - tag.getAttributes ().setAttribute (label, value); - } - - - /** - * - */ - public void setAttribute (String id, int line, String column, String label, int value) - { - setAttribute (id, line, column, label, (new Integer (value)).toString ()); - } - - - /** - * - */ - public void appendAttribute (String id, int line, String column, String label, String value) - { - org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger (Data.class); - - - IdData tag = this.getIdData (id, line, column); - - tag.getAttributes ().appendAttribute (label, value); - } - - - /** - * - */ - public void appendAttribute (String id, String label, String value) - { - IdData tag = this.getIdData (id); - - tag.getAttributes ().appendAttribute (label, value); - } - - - /** - * - */ - public void appendAttribute (String id, String label, int value) - { - appendAttribute (id, label, (new Integer (value)).toString ()); - } - - - /** - * - */ - public void appendContent (String id, int line, String value) - { - IdData tag = this.getIdData (id, line); - - tag.appendContent (value); - } - - - /** - * - */ - public void appendContent (String id, int line, int value) - { - appendContent (id, line, (new Integer (value)).toString ()); - } - - - /** - * - */ - public void appendContent (String id, int line, String column, String value) - { - IdData tag = this.getIdData (id, line, column); - - tag.appendContent (value); - } - - - /** - * - */ - public void appendContent (String id, int line, String column, int value) - { - appendContent (id, line, column, (new Integer (value)).toString ()); - } -} diff --git a/src/xid/DomPresenter.java b/src/xid/DomPresenter.java deleted file mode 100644 index bb2d242..0000000 --- a/src/xid/DomPresenter.java +++ /dev/null @@ -1,196 +0,0 @@ -package xid; - -import java.util.*; -import java.io.*; -import javax.xml.parsers.*; -import javax.xml.transform.stream.StreamSource; -import javax.xml.validation.Schema; -import org.xml.sax.*; -import org.w3c.dom.*; -/** - * - */ -public class DomPresenter extends Presenter -{ - static final public char INDEX_SEPARATOR = '_'; - - static protected org.apache.log4j.Logger log; - static - { - log = org.apache.log4j.Logger.getLogger (DomPresenter.class); - } - - static protected String staticRootPath; - static - { - staticRootPath = null; - } - - - protected String webappPath; - protected Document doc; - - /* - * - */ - public DomPresenter () - { - this.webappPath = Presenter.staticRootPath; - this.doc = null; - } - - - /* - * - */ - public DomPresenter (Document doc) - { - this.webappPath = Presenter.staticRootPath; - this.doc = doc; - DomPresenter.addMetaTag (this.doc, "generator", "XID 0.0"); - } - - - /* - * - */ - public DomPresenter (String webappPath, Document doc) - { - if ((webappPath == null) || (webappPath.equals (""))) - { - this.webappPath = Presenter.staticRootPath; - } - else - { - this.webappPath = webappPath; - } - - this.doc = doc; - DomPresenter.addMetaTag (this.doc, "generator", "XID 0.0"); - } - - - /* - * - */ - public String getWebappPath () - { - String result; - - result = this.webappPath; - - // - return (result); - } - - /* - * - */ - public void setWebappPath (String path) - { - this.webappPath = path; - } - - - /** - * - */ - public Document getDom () - { - Document result; - - result = this.doc; - - // - return (result); - } - - - /** - * - */ - public void setDom (Document doc) - { - this.doc = doc; - } - - - /* - * - */ - public void setSource (Document doc) - { - this.doc = doc; - - Presenter.addMetaTag (this.doc, "generator", "XID 0.0"); - } - - - /* - * - */ - public Object getSource () - { - Object result; - - result = this.doc; - - // - return (result); - } - - - /* - * - */ - public StringBuffer doXid (Data datas, StringBuffer errorOutput) - { - return (doXid (datas.getIdsDataById (), datas.getTagsDataById (), errorOutput)); - } - - /* - * - */ - public StringBuffer doXid (IdsDataById datas, TagsDataById tagsData, StringBuffer errorOutput) - { - StringBuffer result; - - if (this.doc == null) - { - String errorMessage = "source not defined"; - errorOutput.append (errorMessage); - log.error (errorMessage); - result = null; - } - else - { - // Build the web page. - result = Presenter.doXid (this.doc, datas, tagsData, this.webappPath, errorOutput); - } - - // - return (result); - } - - - /* - * Xid a file with data. - */ - static public StringBuffer doXid (Document doc, IdsDataById datas, String webappPath, StringBuffer errorOutput) - { - return (doXid (doc, datas, null, webappPath, errorOutput)); - } - - /* - * Xid a file with data. - */ - static public StringBuffer doXid (Document doc, IdsDataById datas, TagsDataById tagsData, String webappPath, StringBuffer errorOutput) - { - StringBuffer result; - - result = Presenter.process (doc, datas, tagsData, webappPath, errorOutput); - - // - return (result); - } -} diff --git a/src/xid/FilePresenter.java b/src/xid/FilePresenter.java deleted file mode 100644 index 2adbe82..0000000 --- a/src/xid/FilePresenter.java +++ /dev/null @@ -1,170 +0,0 @@ -package xid; - -import java.util.*; -import java.io.*; -import javax.xml.parsers.*; -import javax.xml.transform.stream.StreamSource; -import javax.xml.validation.Schema; -import org.xml.sax.*; -import org.w3c.dom.*; -/** - * - */ -public class FilePresenter extends DomPresenter -{ - static protected org.apache.log4j.Logger log; - static - { - log = org.apache.log4j.Logger.getLogger (FilePresenter.class); - } - - protected String sourceFileName; - protected long sourceFileTime; - - /* - * - */ - public FilePresenter () - { - this.webappPath = Presenter.staticRootPath; - this.sourceFileName = null; - this.sourceFileTime = 0; - this.doc = null; - } - - - /* - * - */ - public FilePresenter (String fileName) - { - this.webappPath = Presenter.staticRootPath; - this.sourceFileName = fileName; - this.sourceFileTime = 0; - this.doc = null; - } - - - /* - * - */ - public FilePresenter (String webappPath, String fileName) - { - if ((webappPath == null) || (webappPath.equals (""))) - { - this.webappPath = Presenter.staticRootPath; - } - else - { - this.webappPath = webappPath; - } - this.sourceFileName = fileName; - this.sourceFileTime = 0; - this.doc = null; - } - - - /* - * - */ - public void setSource (String fileName) - { - this.sourceFileName = fileName; - this.sourceFileTime = 0; - this.doc = null; - } - - - /* - * - */ - public String getSource () - { - String result; - - result = this.sourceFileName; - - // - return (result); - } - - - /* - * - */ - public StringBuffer doXid (Data datas, StringBuffer errorOutput) - { - return (doXid (datas.getIdsDataById (), datas.getTagsDataById (), errorOutput)); - } - - - /* - * - */ - public StringBuffer doXid (IdsDataById datas, TagsDataById tagsData, StringBuffer errorOutput) - { - StringBuffer result; - - String sourceFilePath = this.webappPath + File.separator + this.sourceFileName; - - // Get the good tree. - File source = new File (sourceFilePath); - - if (source == null) - { - String errorMessage = "source file not defined"; - errorOutput.append (errorMessage); - log.error (errorMessage); - result = null; - } - else if (!source.exists ()) - { - String errorMessage = "source file defined but not found (" + sourceFilePath + ")"; - errorOutput.append (errorMessage); - log.error (errorMessage); - result = null; - } - else if ((this.doc == null) || - (this.sourceFileTime != source.lastModified ())) - { - this.sourceFileTime = source.lastModified (); - this.doc = Presenter.fileToTree (sourceFilePath, errorOutput); - - if (this.doc != null) - { - Presenter.addMetaTag (doc, "generator", "XID 0.0"); - } - } - - // Build the web page. - result = Presenter.doXid (doc, datas, tagsData, this.webappPath, errorOutput); - - // - return (result); - } - - - /* - * Xid a file without data. - */ - static public StringBuffer doXid (String fileName, String webappPath, StringBuffer errorOutput) - { - StringBuffer result; - - Document doc = Presenter.fileToTree (fileName, errorOutput); - - if (doc == null) - { - result = null; - } - else - { - Presenter.addMetaTag (doc, "generator", "XID 0.0"); - - result = Presenter.doXid (doc, null, null, webappPath, errorOutput); - } - - // - return (result); - } -} diff --git a/src/xid/IdData.java b/src/xid/IdData.java deleted file mode 100644 index 708e8bb..0000000 --- a/src/xid/IdData.java +++ /dev/null @@ -1,177 +0,0 @@ -package xid; - -import java.util.*; -import java.io.*; - -/** - * IdData class is used to hold application data and - * the business logic that operates on the data. - * - * The only requirement of a IdData class is that it must implement a - * display method. The display method must return a text representation - * of the data, suitable for display in a web page. - * - * XID provides a User Input IdData, Text IdData and ... - * application may also implement it's own IdData classes. - * - */ -public class IdData implements Serializable, IdDataCore -{ - public enum IterationStrategy {ONLY_FIRST_ROW, ONLY_FIRST_TWO_ROWS, ONLY_ROWS_WITH_ID, ONLY_ROWS_WITHOUT_ID, ALL_ROWS} - - protected IterationStrategy iterationStrategy; - - - public enum MODE {REPLACE, APPEND, IGNORE}; - - protected Attributes attributes; - protected boolean excludeSection; - protected MODE displayMode = MODE.REPLACE; - protected String content; - - /* - * - */ - public IdData () - { - this.attributes = null; - this.excludeSection = false; - this.displayMode = MODE.REPLACE; - this.content = null; - this.iterationStrategy = IterationStrategy.ALL_ROWS; - } - - - /* - * - */ - public IdData (String text) - { - this.attributes = null; - this.excludeSection = false; - this.displayMode = MODE.REPLACE; - this.content = text; - this.iterationStrategy = IterationStrategy.ALL_ROWS; - } - - - /* - * - */ - public String display () - { - String result; - - result = this.content; - - // - return (result); - } - - - /* - * - */ - public void setContent (String text) - { - this.content = text; - } - - - /* - * - */ - public void appendContent (String text) - { - if (this.content == null) - { - this.content = text; - } - else - { - this.content += text; - } - } - - - /* - * - */ - public void setDisplayMode(MODE displayMode) - { - this.displayMode = displayMode; - } - - - /* - * - */ - public MODE getDisplayMode() - { - MODE result; - - result = this.displayMode; - - return (result); - } - - - /* - * - */ - public Attributes getAttributes () - { - Attributes result; - - if (this.attributes == null) - { - this.attributes = new Attributes (); - } - - result = this.attributes; - - // - return (result); - } - - - /* - * - */ - public void setExcludeSection(boolean excludeSection) - { - this.excludeSection = excludeSection; - } - - - /* - * - */ - public boolean getExcludeSection() - { - return excludeSection; - } - - - /** - * - */ - public void setIterationStrategy (IterationStrategy strategy) - { - this.iterationStrategy = strategy; - } - - - /** - * - */ - public IterationStrategy getIterationStrategy () - { - IterationStrategy result; - - result = this.iterationStrategy; - - // - return (result); - } -} diff --git a/src/xid/IdDataCore.java b/src/xid/IdDataCore.java deleted file mode 100644 index 5fa290c..0000000 --- a/src/xid/IdDataCore.java +++ /dev/null @@ -1,18 +0,0 @@ -package xid; - -import java.util.*; -import java.io.*; - -/* - * Xid uses three class to describe data: - * - TagData - * - TagsData - * - TagsDataById - * Others class that doesn't extends these won't be use by Xid. - * - * This interface helps to express this fact. - * - */ -public interface IdDataCore -{ -} diff --git a/src/xid/IdsDataById.java b/src/xid/IdsDataById.java deleted file mode 100644 index e9f1d1c..0000000 --- a/src/xid/IdsDataById.java +++ /dev/null @@ -1,40 +0,0 @@ -package xid; - -import java.util.*; -import java.io.*; - -/* - * - */ -public class IdsDataById extends HashMap implements IdDataCore -{ - /* - * - */ - public IdsDataById () - { - super (); - } - - /* - * - */ - public void setId (String id, IdDataCore data) - { - this.put (id, data); - } - - /* - * - */ - public IdDataCore getId (String id) - { - IdDataCore result; - - result = this.get (id); - - // - return (result); - } - -} diff --git a/src/xid/IdsDataByIndex.java b/src/xid/IdsDataByIndex.java deleted file mode 100644 index 5466783..0000000 --- a/src/xid/IdsDataByIndex.java +++ /dev/null @@ -1,18 +0,0 @@ -package xid; - -import java.util.*; -import java.io.*; - -/* - * - */ -public class IdsDataByIndex extends Vector implements IdDataCore -{ - /** - * - */ - public IdsDataByIndex () - { - super (); - } -} diff --git a/src/xid/ParserErrorHandler.java b/src/xid/ParserErrorHandler.java deleted file mode 100644 index 83b0e3e..0000000 --- a/src/xid/ParserErrorHandler.java +++ /dev/null @@ -1,159 +0,0 @@ -package xid; - -import org.xml.sax.*; -import java.util.*; - -/** - * Extract from org.xml.sax Interface ErrorHandler: - * "If a SAX application needs to implement customized error handling, - * it must implement this interface and then register an instance with - * the XML reader using the setErrorHandler method. The parser will - * then report all errors and warnings through this interface." - * - */ -public class ParserErrorHandler implements ErrorHandler -{ - Vector messages; - int fatalErrorsCount; - int errorsCount; - int warningCount; - - public ParserErrorHandler () - { - fatalErrorsCount = 0; - errorsCount = 0; - warningCount = 0; - messages = new Vector (); - } - - - /** - * - */ - public int fatalErrorsCount () - { - int result; - - result = this.fatalErrorsCount; - - // - return (result); - } - - /** - * - */ - public int errorsCount () - { - int result; - - result = this.errorsCount; - - // - return (result); - } - - /** - * - */ - public int warningCount () - { - int result; - - result = this.warningCount; - - // - return (result); - } - - /** - * - */ - public int allErrorsCount () - { - int result; - - result = fatalErrorsCount () + errorsCount () + warningCount (); - - // - return (result); - } - - /** - * - */ - public boolean hasError () - { - boolean result; - - if (allErrorsCount () == 0) - { - result = false; - } - else - { - result = true; - } - - // - return (result); - } - - - /** - * Called by the XML parser to handle fatal errors. - * @param ex Parse Excpetion. Contains the warning text and the line number. - */ - public void error (SAXParseException exception) - { - String message = "Error at line " + exception.getLineNumber() + " : " + exception.getMessage(); - - this.errorsCount += 1; - this.messages.add (message); - } - - /** - * Called by the XML parser to handle fatal errors. - * @param ex Parse Excpetion. Contains the error text and the line number. - * When a fatal parse error occurs, the parse does not return a document. - */ - public void fatalError (SAXParseException exception) - { - String message = "Fatal error at line " + exception.getLineNumber() + " : " + exception.getMessage(); - - this.fatalErrorsCount += 1; - this.messages.add (message); - } - - /** - * Called by the XML parser to handle warnings. - * @param ex Parse Excpetion. Contains the warning text and the line number. - */ - public void warning(SAXParseException exception) - { - String message = "Warning at line " + exception.getLineNumber() + " : " + exception.getMessage(); - - this.warningCount += 1; - this.messages.add (message); - } - - - /** - * - */ - public String toString () - { - StringBuffer result; - - result = new StringBuffer (); - - for (String message : messages) - { - result.append (message); - result.append ('\n'); - } - - // - return (result.toString ()); - } -} diff --git a/src/xid/Presenter.java b/src/xid/Presenter.java deleted file mode 100644 index 60f5517..0000000 --- a/src/xid/Presenter.java +++ /dev/null @@ -1,1330 +0,0 @@ -package xid; - -import java.util.*; -import java.io.*; -import javax.xml.parsers.*; -import javax.xml.transform.stream.StreamSource; -import javax.xml.validation.Schema; -import org.xml.sax.*; -import org.w3c.dom.*; -/** - * - */ -public class Presenter -{ - static final public char INDEX_SEPARATOR = '_'; - - static protected org.apache.log4j.Logger log; - static - { - log = org.apache.log4j.Logger.getLogger (Presenter.class); - } - - static protected String staticRootPath; - static - { - staticRootPath = null; - } - - - /* - * - */ - static public void setStaticRootPath (String path) - { - Presenter.staticRootPath = path; - } - - - /* - * - */ - static public String getStaticRootPath () - { - String result; - - result = Presenter.staticRootPath; - - // - return (result); - } - - /* - * Xid a file with data. - */ - static public StringBuffer doXid (Document doc, IdsDataById datas, String webappPath, StringBuffer errorOutput) - { - return (doXid (doc, datas, null, webappPath, errorOutput)); - } - - /* - * Xid a file with data. - */ - static public StringBuffer doXid (Document doc, IdsDataById datas, TagsDataById tagsData, String webappPath, StringBuffer errorOutput) - { - StringBuffer result; - - result = Presenter.process (doc, datas, tagsData, webappPath, errorOutput); - - // - return (result); - } - - - /* - * - */ - static public String getClassAttributeValue (Node node) - { - String result; - - NamedNodeMap attributes = node.getAttributes (); - if (attributes == null) - { - result = null; - } - else - { - Node nameAttribute = attributes.getNamedItem ("class"); - - if (nameAttribute == null) - { - result = null; - } - else - { - result = nameAttribute.getNodeValue (); - } - } - - // - return (result); - } - - - /** - * - */ - static public Attributes mergeAttributes (Attributes target, Attributes source) - { - Attributes result; - - // - if (target == null) - { - result = source; - } - else if (source == null) - { - result = target; - } - else - { - result = new Attributes (target); - - Iterator iterator = source.entrySet().iterator(); - - while (iterator.hasNext()) - { - Map.Entry attribute = (Map.Entry) iterator.next(); - - String currentValue = target.get (attribute.getKey ()); - - if (currentValue == null) - { - result.put (attribute.getKey (), attribute.getValue ()); - } - else if (attribute.getKey ().equals ("style")) - { - result.put (attribute.getKey (), currentValue + attribute.getValue ()); - } - else - { - result.put (attribute.getKey (), attribute.getValue ()); - } - } - } - - // - return (result); - } - - /* - * - */ - static protected StringBuffer processChildren (Node node, IdsDataById datas, TagsDataById tagsData, String webappPath, StringBuffer errorOutput) - { - StringBuffer result; - - result = processChildren (node, datas, tagsData, webappPath, "", errorOutput); - - // - return (result); - } - - - /* - * - */ - static protected StringBuffer processChildren (Node node, - IdsDataById datas, - TagsDataById tagsData, - String webappPath, - String suffix, - StringBuffer errorOutput) - { - StringBuffer result; - result = new StringBuffer (); - - // Get the iteration strategy. - IdData.IterationStrategy strategy; - - NamedNodeMap attributes = node.getAttributes (); - if (attributes == null) - { - strategy = IdData.IterationStrategy.ALL_ROWS; - } - else - { - Node id = attributes.getNamedItem ("id"); - - if (id == null) - { - strategy = IdData.IterationStrategy.ALL_ROWS; - } - else - { - IdDataCore dataCore = datas.getId (id.getNodeValue ()); - if (dataCore == null) - { - strategy = IdData.IterationStrategy.ALL_ROWS; - } - else if (dataCore instanceof IdData) - { - IdData data = (IdData) dataCore; - strategy = data.getIterationStrategy (); - } - else - { - strategy = IdData.IterationStrategy.ALL_ROWS; - } - } - } - - - // Iterate. - NodeList children = node.getChildNodes(); - int childrenCount = children.getLength (); - - switch (strategy) - { - case ONLY_FIRST_ROW: - int lineCounter = 0; - for (int childIndex = 0; childIndex < childrenCount; childIndex++) - { - if (children.item (childIndex).getNodeType () == Node.ELEMENT_NODE) - { - lineCounter += 1; - if (lineCounter == 1) - { - result.append (process (children.item (childIndex), datas, tagsData, webappPath, suffix, errorOutput)); - } - } - else - { - result.append (process (children.item (childIndex), datas, tagsData, webappPath, suffix, errorOutput)); - } - } - break; - - case ONLY_FIRST_TWO_ROWS: - lineCounter = 0; - for (int childIndex = 0; childIndex < childrenCount; childIndex++) - { - if (children.item (childIndex).getNodeType () == Node.ELEMENT_NODE) - { - lineCounter += 1; - - if ((lineCounter == 1) || (lineCounter == 2)) - { - result.append (process (children.item (childIndex), datas, tagsData, webappPath, suffix, errorOutput)); - } - } - else - { - result.append (process (children.item (childIndex), datas, tagsData, webappPath, suffix, errorOutput)); - } - } - break; - - case ONLY_ROWS_WITH_ID: - for (int childIndex = 0; childIndex < childrenCount; childIndex++) - { - if (children.item (childIndex).getNodeType () == Node.ELEMENT_NODE) - { - NamedNodeMap attrs2 = children.item (childIndex).getAttributes (); - - if ((attrs2 != null) && - (attrs2.getNamedItem ("id") != null)) - { - result.append (process (children.item (childIndex), datas, tagsData, webappPath, suffix, errorOutput)); - } - } - else - { - result.append (process (children.item (childIndex), datas, tagsData, webappPath, suffix, errorOutput)); - } - } - break; - - case ONLY_ROWS_WITHOUT_ID: - for (int childIndex = 0; childIndex < childrenCount; childIndex++) - { - if (children.item (childIndex).getNodeType () == Node.ELEMENT_NODE) - { - NamedNodeMap attrs2 = children.item (childIndex).getAttributes (); - if ((attrs2 == null) || - (attrs2.getNamedItem ("id") == null)) - { - result.append (process (children.item(childIndex), datas, tagsData, webappPath, suffix, errorOutput)); - } - } - else - { - result.append (process (children.item (childIndex), datas, tagsData, webappPath, suffix, errorOutput)); - } - } - break; - - case ALL_ROWS: - for (int childIndex = 0; childIndex < childrenCount; childIndex++) - { - result.append (process (children.item(childIndex), datas, tagsData, webappPath, suffix, errorOutput)); - } - break; - } - - // - return (result); - } - - - - /** - * Includes another file into the current page. - * - * @param node - * @param attrMap - * @param idAttr - */ - static protected StringBuffer processObjectTag (Node node, - NamedNodeMap attrMap, - Node idAttr, - IdsDataById datas, - TagsDataById tagsData, - String webappPath, - StringBuffer errorOutput) - { - StringBuffer result; - - result = new StringBuffer (); - - // Find codetype. - String codetype; - if (attrMap == null) - { - codetype = null; - } - else if (attrMap.getNamedItem ("codetype") == null) - { - codetype = null; - } - else - { - codetype = attrMap.getNamedItem ("codetype").getNodeValue (); - } - - // Check tag requirements. - if ((attrMap == null) || - (codetype == null) || - (!codetype.equals ("application/xid")) || - (attrMap.getNamedItem ("data") == null)) - { - // STU: do default action. - Presenter.processElementBasically (node, datas, tagsData, webappPath, errorOutput); - } - else - { - log.debug ("object action"); - result.append (""); - - // Build the file name. - String htmlFileName = webappPath + attrMap.getNamedItem ("data").getNodeValue (); - - - // Load file in tree. - Document childDoc = null; - try - { - childDoc = fileToTree (htmlFileName, errorOutput); - } - catch (Exception ex) - { - errorOutput.append ("unable to build the file tree"); - log.debug ("unable to build the file tree"); - } - - // Extract the 'body' section. - Node body = null; - try - { - NodeList nodes = childDoc.getElementsByTagName ("body"); - - if (nodes.getLength () == 0) - { - errorOutput.append ("no body tag in include html"); - log.debug ("no body tag in include html"); - } - else - { - body = nodes.item(0); - } - } - catch (Exception e) - { - errorOutput.append ("error getting child"); - log.debug ("error getting child"); - } - - // Process the body child as part of the primary tree. - if (body == null) - { - errorOutput.append ("xid object body empty."); - } - else - { - NodeList bodyChildren = body.getChildNodes (); - - if (bodyChildren != null) - { - int childCount = bodyChildren.getLength (); - for (int childCounter = 0; childCounter < childCount; childCounter++) - { - result.append (process (bodyChildren.item (childCounter), datas, tagsData, webappPath, errorOutput)); - } - } - } - - // - result.append (""); - } - log.debug ("end of object action"); - // - return (result); - } - - - - /** - * Processes a node that has dynamic content. Calls the appropriate code - * generator method, depending on the tag. - * - * @param node - * Current node. - * @param attrs - * The tag attributes. - * @param idAttr - * The ID. - */ - static protected StringBuffer processElementWithId (Node node, - NamedNodeMap attrs, - Node idAttr, - IdsDataById datas, - String webappPath, - StringBuffer errorOutput) - - { - StringBuffer result; - - result = processElementWithId (node, attrs, idAttr, datas, null, "", webappPath, errorOutput); - - // - return (result); - } - - - /** - * Processes a node that has dynamic content. Calls the appropriate code - * generator method, depending on the tag. - * - * @param node - * Current node. - * @param attrs - * The tag attributes. - * @param idAttr - * The ID. - */ - static protected StringBuffer processElementWithId (Node node, - NamedNodeMap attrs, - Node idAttr, - IdsDataById datas, - TagsDataById tagsData, - String webappPath, - String suffix, - StringBuffer errorOutput) - { - StringBuffer result; - result = new StringBuffer (); - - String tag = node.getNodeName(); - - if (tag.equals ("object")) - { - result.append (processObjectTag (node, attrs, idAttr, datas, tagsData, webappPath, errorOutput)); - } - else - { - String idValue = idAttr.getNodeValue(); - - log.debug ("tag=" + tag); - - // Get data of this id. - IdDataCore dataCore = datas.get (idAttr.getNodeValue ()); - - if (dataCore == null) - { - result.append (Presenter.processElementBasically (node, datas, tagsData, webappPath, suffix, errorOutput)); - } - else if (dataCore instanceof IdData) - { - IdData data = (IdData) dataCore; - - String theClass; - if (data == null) - { - theClass = null; - } - else - { - theClass = data.getAttributes ().getAttribute ("class"); - } - - if ((theClass == null) || - (!theClass.equals ("xid:nodisplay"))) - { - // Open the tag. - result.append ("<"); - result.append (node.getNodeName()); - - // Build attributes. - Attributes tagAttributes; - if (tagsData == null) - { - tagAttributes = null; - } - else - { - TagData tagData = tagsData.getId (node.getNodeName ()); - if (tagData == null) - { - tagAttributes = null; - } - else - { - tagAttributes = tagData.getAttributes (); - } - } - - result.append (processAttributes (attrs, data.getAttributes (), tagAttributes, suffix)); - - if ((node.getChildNodes () == null) && - ((data == null) || (data.display () == null))) - { - // Close the tag. - result.append (" />"); - } - else - { - result.append ('>'); - - // CHANGED, cpm: - - // Insert data. - if ((data == null) || - (data.display () == null)) - { - result.append (processChildren (node, datas, tagsData, webappPath, suffix, errorOutput)); - } - else - { - result.append (data.display ()); - } - - // Close the tag. - result.append ("'); - } - } - } - else if (dataCore instanceof IdsDataByIndex) - { - IdsDataByIndex tags = (IdsDataByIndex) dataCore; - - int nbLines = tags.size (); - for (int nLine = 0; nLine < nbLines; nLine++) - { - if (tags.elementAt (nLine) instanceof IdData) - { - IdData data = (IdData) tags.elementAt (nLine); - - // Open the tag. - result.append ("<"); - result.append (node.getNodeName()); - - // Build attributes. - Attributes tagAttributes; - if (tagsData == null) - { - tagAttributes = null; - } - else - { - TagData tagData = tagsData.getId (node.getNodeName ()); - if (tagData == null) - { - tagAttributes = null; - } - else - { - tagAttributes = tagData.getAttributes (); - } - } - - result.append (processAttributes (attrs, data.getAttributes (), tagAttributes, Integer.toString (nLine))); - - if ((node.getChildNodes () == null) && - ((data == null) || (data.display () == null))) - { - // Close the tag. - result.append (" />\n"); - } - else - { - result.append ('>'); - - - // CHANGED, cpm - - // Insert data. - if ((data == null) || (data.display () == null)) - { - result.append (processChildren (node, datas, tagsData, webappPath, suffix, errorOutput)); - } - else - { - result.append (data.display ()); - } - - // Close the tag. - result.append ("\n"); - } - } - else - { - // Manage a Hashmap. - IdsDataById data = (IdsDataById) tags.elementAt (nLine); - - result.append (Presenter.processElementWithId (node, attrs, idAttr, data, tagsData, webappPath, Integer.toString (nLine), errorOutput)); - result.append ('\n'); - } - } - } - else - { - log.warn ("Unknow type of IdDataId"); - } - } - - // - log.debug ("Exit"); - return (result); - } - - - - /** - * - */ - static protected StringBuffer process (Node node, IdsDataById datas, TagsDataById tagsData, String webappPath, StringBuffer errorOutput) - { - StringBuffer result; - - result = Presenter.process (node, datas, tagsData, webappPath, "", errorOutput); - - // - return (result); - } - - - /** - * Recursive method that processes a node and any child nodes. - * - */ - static protected StringBuffer process (Node node, IdsDataById datas, TagsDataById tagsData, String webappPath, String suffix, StringBuffer errorOutput) - { - log.debug ("Enter"); - String TRANSITIONAL_DTD = "xhtml1-transitional.dtd"; - String TRANSITIONAL_DOCTYPE = "\n"; - - StringBuffer result; - result = new StringBuffer (); - - // Is there anything to do? - if (node != null) - { - log.debug ("nodeName=" + node.getNodeName ()); - // Find the name attribute value. - String name; - name = getClassAttributeValue (node); - - if ((name == null) || - ((name != null) && - (!name.equals ("xid:nodisplay")))) - { - int type = node.getNodeType(); - switch (type) - { - case Node.DOCUMENT_NODE: - { - log.debug ("case Node.DOCUMENT_NODE"); - DocumentType dt = ((Document) node).getDoctype(); - - if (dt != null) - { - String publicId = dt.getPublicId(); - String systemId = dt.getSystemId(); - - if (systemId.equals(TRANSITIONAL_DTD)) - { - result.append(TRANSITIONAL_DOCTYPE); - } - - // Log.write(Log.TRACE,"publicId = " + publicId); - // Log.write(Log.TRACE,"systemId = " + systemId); - } - - result.append (Presenter.process (((Document) node).getDocumentElement(), datas, tagsData, webappPath, suffix, errorOutput)); - - break; - } - - case Node.ELEMENT_NODE: - { - log.debug ("case Node.ELEMENT_NODE"); - - NamedNodeMap attrs = node.getAttributes (); - Node idAttr = attrs.getNamedItem ("id"); - - if (idAttr != null) - { - result.append (Presenter.processElementWithId (node, - attrs, - idAttr, - datas, - tagsData, - webappPath, - suffix, - errorOutput)); - } - else - { - - String tag = node.getNodeName(); - - if (tag.equals ("object")) - { - result.append (processObjectTag (node, attrs, idAttr, datas, tagsData, webappPath, errorOutput)); - } - else - { - result.append (Presenter.processElementBasically (node, datas, tagsData, webappPath, suffix, errorOutput)); - } - } - - break; - } - - // handle entity reference nodes - case Node.ENTITY_REFERENCE_NODE: - { - log.debug ("case Node.ENTITY_REFERENCE_NODE"); - - result.append ('&'); - result.append (node.getNodeName()); - result.append (';'); - break; - } - - // print cdata sections - case Node.CDATA_SECTION_NODE: - { - log.debug ("case Node.CDATA_SECTION_NODE"); - - result.append (""); - - break; - } - - // print text - case Node.TEXT_NODE: - { - log.debug ("case Node.TEXTE_NODE"); - result.append (restoreEntities (new StringBuffer(node.getNodeValue()))); - break; - } - - // print processing instruction - case Node.PROCESSING_INSTRUCTION_NODE: - { - log.debug ("Node.PROCESSING_INSTRUCTION_NODE"); - - result.append (" 0)) - { - result.append (' '); - result.append (data); - } - result.append ("?>"); - break; - } - } - } - } - - // - //log.info ("result=" + result); - log.debug ("Exit"); - return (result); - } - - - /* - * - */ - static StringBuffer processElementBasically (Node node, IdsDataById datas, TagsDataById tagsData, String webappPath, StringBuffer errorOutput) - { - StringBuffer result; - - result = processElementBasically (node, datas, tagsData, webappPath, "", errorOutput); - - // - return (result); - } - - - /* - * - */ - static StringBuffer processElementBasically (Node node, IdsDataById datas, TagsDataById tagsData, String webappPath, String suffix, StringBuffer errorOutput) - { - StringBuffer result; - result = new StringBuffer (); - - // Open the tag. - result.append ('<'); - result.append (node.getNodeName()); - - // Build the tag attributes. - Attributes tagAttributes; - if (tagsData == null) - { - tagAttributes = null; - } - else - { - TagData tagData = tagsData.getId (node.getNodeName ()); - if (tagData == null) - { - tagAttributes = null; - } - else - { - tagAttributes = tagData.getAttributes (); - } - } - - result.append (processAttributes (node.getAttributes (), - tagAttributes, - null, - suffix)); - - // - if (node.getChildNodes () == null) - { - result.append(" />"); - } - else - { - result.append('>'); - - result.append (processChildren (node, datas, tagsData, webappPath, suffix, errorOutput)); - - result.append("'); - } - - - // - return (result); - } - - - - /* - * - */ - static protected Document buildTree (InputStream source, StringBuffer errorOutput) - { - Document result; - - try - { - // Create a DocumentBuilderFactory and configure it. - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance (); - - // Set various configuration options. - dbf.setValidating (true); - dbf.setIgnoringComments (true); - dbf.setIgnoringElementContentWhitespace (false); - dbf.setCoalescing (false); - - // Keep entity references as they are. - dbf.setExpandEntityReferences(false); - - // Create a DocumentBuilder that satisfies the constraints - // specified by the DocumentBuilderFactory. - DocumentBuilder db = dbf.newDocumentBuilder (); - - ParserErrorHandler errorHandler; - errorHandler = new ParserErrorHandler(); - - // Set the error handler. - db.setErrorHandler (errorHandler); - - Schema schema = db.getSchema (); - log.debug ("schema=" + schema); - - // Parse the input file. - result = db.parse (source); - - if (errorHandler.hasError ()) - { - errorOutput.append (errorHandler.toString ()); - } - else - { - DomPresenter.addMetaTag (result, "generator", "XID 0.0"); - } - } - catch (ParserConfigurationException exception) - { - String errorMessage = "Parser configuration exception: " + exception.getMessage (); - errorOutput.append (errorMessage); - log.error (errorMessage); - result = null; - } - catch (SAXException exception) - { - String errorMessage = "Error during SAX parsing: " + exception.getMessage (); - errorOutput.append (errorMessage); - log.error (errorMessage); - result = null; - } - catch (IOException exception) - { - String errorMessage = "IOError during parsing." + exception.getMessage (); - errorOutput.append (errorMessage); - log.error (errorMessage); - result = null; - } - - // - return (result); - } - - - - - /* - * - */ - static protected void addMetaTag (Document doc, String name, String content) - { - // Find head tag. - - Node headNode = Presenter.findHeadNode (doc); - - Node metaNode = doc.createElement ("meta"); - - NamedNodeMap attrMap = metaNode.getAttributes(); - Node attrNode = doc.createAttribute("name"); - attrMap.setNamedItem(attrNode); - attrNode.setNodeValue(name); - - attrNode = doc.createAttribute("content"); - attrMap.setNamedItem(attrNode); - attrNode.setNodeValue(content); - headNode.insertBefore(metaNode, headNode.getFirstChild()); - } - - - /** - * Finds the node containing the <head> tag. - * - * @param node - * Document node. - * @return The head tag node - */ - static protected Node findHeadNode (Node node) - { - Node headNode = null; - - int type = node.getNodeType(); - switch (type) - { - // print document - case Node.DOCUMENT_NODE: - { - headNode = findHeadNode(((Document) node).getDocumentElement()); - break; - } - - case Node.ELEMENT_NODE: - { - String tag = node.getNodeName(); - - if ("head".equals(tag)) - { - headNode = node; - break; - } - - NodeList children = node.getChildNodes(); - int numChildren = 0; - - if (children != null) - numChildren = children.getLength(); - - for (int i = 0; i < numChildren; i++) - { - headNode = findHeadNode(children.item(i)); - if (headNode != null) - break; - } - break; - } - } - return headNode; - } - - - /** - * Any ampersand lt;, ampersand gt; and ampersand amp; sequences in text - * nodes get read in as symbols. This method converts them back to entities. - * - * @param s String that is to have the entities restored.. - * @return The processed string. - */ - static public String restoreEntities (StringBuffer s) - { - String result; - - if (s == null) - { - result = null; - } - else - { - StringBuffer str = new StringBuffer(); - - int len = (s != null) ? s.length() : 0; - for (int i = 0; i < len; i++) - { - char ch = s.charAt(i); - switch (ch) - { - case '<': - { - str.append("<"); - break; - } - - case '>': - { - str.append(">"); - break; - } - - case '&': - { - str.append("&"); - break; - } - - default: - { - str.append(ch); - } - } - } - result = str.toString (); - } - - - // - return (result); - } - - - /** - * Get the text for an element. Converts new lines to spaces. - * - * @param node - */ - static protected String getElementText (Node node) - { - String result; - result = ""; // Grrrr, Java ... - - NodeList children = node.getChildNodes(); - if (children == null) - { - result = ""; - } - else - { - boolean ended = false; - int childCounter = 0; - int childCount = children.getLength (); - while (!ended) - { - if (childCounter >= childCount) - { - ended = true; - result = ""; - } - else - { - Node child = children.item (childCounter); - if (child.getNodeType () == Node.TEXT_NODE) - { - result = newLinesToSpaces (child.getNodeValue ()); // STU (+=, newLines...) - ended = true; - } - else - { - childCounter += 1; - } - } - } - } - - // - return (result); - } - - - /** - * Converts New Line characters to spaces. This is used when for example - * the text in a div tag goes over serveral lines. - * - * @param text String - * @return String - */ - static protected String newLinesToSpaces (String text) - { - StringBuffer result = new StringBuffer (text); - - for (int i = 0; i < result.length(); i++) - { - if (result.charAt (i) == '\n') - { - result.setCharAt (i,' '); - } - } - - // - return (result.toString()); - } - - - /* - * - */ - static protected StringBuffer processAttributes (NamedNodeMap attrs, Attributes dataAttributes, Attributes namedDataAttributes, String suffix) - { - StringBuffer result; - - result = processAttributes (attrs, mergeAttributes (dataAttributes, namedDataAttributes), suffix); - - // - return (result); - } - - - /* - * - */ - static protected StringBuffer processAttributes (NamedNodeMap attrs, Attributes dataAttributes) - { - StringBuffer result; - - result = processAttributes (attrs, dataAttributes, ""); - - // - return (result); - } - - - /* - * - */ - static protected StringBuffer processAttributes (NamedNodeMap attrs) - { - StringBuffer result; - - result = processAttributes (attrs, null, null, ""); - - // - return (result); - } - - - /* - * - */ - static protected StringBuffer processAttributes (NamedNodeMap attrs, Attributes dataAttributes, String suffix) - { - StringBuffer result; - - result = new StringBuffer (); - - // Build the original attributes list. - HashMap mergedAttributes; - mergedAttributes = new HashMap (); - for (int attributeCounter = 0; attributeCounter < attrs.getLength(); attributeCounter++) - { - Attr attr = (Attr) attrs.item (attributeCounter); - mergedAttributes.put (attr.getNodeName(), attr.getNodeValue ()); - } - - - // Put model attributes in the merged attributes list. - if (dataAttributes != null) - { - Iterator iterator = dataAttributes.entrySet().iterator(); - - while (iterator.hasNext()) - { - Map.Entry attribute = (Map.Entry) iterator.next(); - - if (mergedAttributes.containsKey (attribute.getKey ())) - { - if (attribute.getKey ().equalsIgnoreCase ("style")) - { - mergedAttributes.put (attribute.getKey (), mergedAttributes.get (attribute.getKey ()) + attribute.getValue ()); - } - else - { - mergedAttributes.put (attribute.getKey (), attribute.getValue ()); - } - } - else - { - mergedAttributes.put (attribute.getKey (), attribute.getValue ()); - } - } - } - - // Display the attributes - Iterator iterator = mergedAttributes.entrySet().iterator(); - while (iterator.hasNext ()) - { - Map.Entry attribute = (Map.Entry) iterator.next(); - - if ((attribute.getKey ().equals ("id")) && (suffix.length () != 0)) - { - result.append(" " + attribute.getKey () + "=\"" + attribute.getValue () + Presenter.INDEX_SEPARATOR + suffix + "\""); - } - else - { - result.append(" " + attribute.getKey () + "=\"" + attribute.getValue ()+ "\""); - } - } - - // - return (result); - } - - - /* - * - */ - static public String extractBodyContent (StringBuffer data) - { - String result = null; - - // Extract the body content. - String dataLowerCase = data.toString ().toLowerCase (); - - int startBody = dataLowerCase.indexOf (""); - int endBody = dataLowerCase.indexOf (""); - - // Note: as failed search is improbable, no care about complexity - // in failed search case. - if ((startBody == -1) || (endBody == -1)) - { - result = null; - } - else - { - result = data.substring (startBody + 6, endBody).trim (); - } - - // - return (result); - } - - - /* - * Define in Presnter cause needs this possibility. - */ - static protected Document fileToTree (String fileName, StringBuffer errorOutput) - { - Document result; - - try - { - result = buildTree (new FileInputStream (new File (fileName)), errorOutput); - } - catch (IOException exception) - { - String errorMessage = "IOError during parsing." + exception.getMessage (); - errorOutput.append (errorMessage); - log.error (errorMessage); - result = null; - } - - // - return (result); - } -} diff --git a/src/xid/StringPresenter.java b/src/xid/StringPresenter.java deleted file mode 100644 index c82fb4c..0000000 --- a/src/xid/StringPresenter.java +++ /dev/null @@ -1,198 +0,0 @@ -package xid; - -import java.util.*; -import java.io.*; -import javax.xml.parsers.*; -import javax.xml.transform.stream.StreamSource; -import javax.xml.validation.Schema; -import org.xml.sax.*; -import org.w3c.dom.*; -/** - * - */ -public class StringPresenter extends DomPresenter -{ - static protected org.apache.log4j.Logger log; - static - { - log = org.apache.log4j.Logger.getLogger (StringPresenter.class); - } - - protected String html; - - /* - * - */ - public StringPresenter () - { - super (); - this.webappPath = Presenter.staticRootPath; - this.doc = null; - this.html = null; - } - - - /* - * - */ - public StringPresenter (String html) - { - this.webappPath = Presenter.staticRootPath; - this.doc = null; - this.html = html; - } - - - /* - * - */ - public StringPresenter (String webappPath, String html) - { - if ((webappPath == null) || (webappPath.equals (""))) - { - this.webappPath = Presenter.staticRootPath; - } - else - { - this.webappPath = webappPath; - } - this.doc = null; - this.html = html; - } - - - /* - * - */ - public void setSource (String html) - { - this.html = html; - this.doc = null; - } - - - /* - * - */ - public String getSource () - { - String result; - - result = this.html; - - // - return (result); - } - - - /* - * - */ - public StringBuffer doXid (Data datas, StringBuffer errorOutput) - { - return (doXid (datas.getIdsDataById (), datas.getTagsDataById (), errorOutput)); - } - - /* - * - */ - public StringBuffer doXid (IdsDataById datas, TagsDataById tagsData, StringBuffer errorOutput) - { - StringBuffer result; - - if (this.doc == null) - { - // Build doc from this.html. - String htmlSource; - if ((this.html.startsWith ("")) || - (this.html.startsWith (""))) - { - htmlSource = html; - } - else - { - htmlSource = "\n" + html + ""; - } - - // StringBufferInputStream is deprecated so we use another solution. - // (see http://www.developpez.net/forums/archive/index.php/t-14101.html). - doc = buildTree (new ByteArrayInputStream (htmlSource.getBytes ()), errorOutput); - } - - StringBuffer htmlTarget; - htmlTarget = Presenter.doXid (doc, datas, tagsData, this.webappPath, errorOutput); - - if (htmlTarget == null) - { - result = null; - } - else if ((this.html.startsWith ("")) || - (this.html.startsWith (""))) - { - result = htmlTarget; - } - else - { - String bodyContent = extractBodyContent (htmlTarget); - - if (bodyContent == null) - { - result = null; - } - else - { - result = new StringBuffer (bodyContent); - } - } - - // - return (result); - } - - - /* - * - */ - static public StringBuffer doXid (String html, Data datas, StringBuffer errorOutput) - { - return (doXid (html, datas.getIdsDataById (), datas.getTagsDataById (), "", errorOutput)); - } - - - /* - * - */ - static public StringBuffer doXid (String html, Data datas, String webappPath, StringBuffer errorOutput) - { - return (doXid (html, datas.getIdsDataById (), datas.getTagsDataById (), webappPath, errorOutput)); - } - - - /* - * Xid a string with html in. - */ - static public StringBuffer doXid (String html, IdsDataById datas, String webappPath, StringBuffer errorOutput) - { - return (doXid (html, datas, null, webappPath, errorOutput)); - } - - - /* - * Xid a string with html in. - */ - static public StringBuffer doXid (String html, IdsDataById datas, TagsDataById tagsData, String webappPath, StringBuffer errorOutput) - { - StringBuffer result; - - StringPresenter presenter = new StringPresenter (webappPath, html); - - result = presenter.doXid (datas, tagsData, errorOutput); - - // - return (result); - } -} diff --git a/src/xid/TagData.java b/src/xid/TagData.java deleted file mode 100644 index 66b54f6..0000000 --- a/src/xid/TagData.java +++ /dev/null @@ -1,36 +0,0 @@ -package xid; - -import java.util.*; -import java.io.*; - -/** - * IdData class is used to hold application data and - * the business logic that operates on the data. - * - * The only requirement of a IdData class is that it must implement a - * display method. The display method must return a text representation - * of the data, suitable for display in a web page. - * - * XID provides a User Input IdData, Text IdData and ... - * application may also implement it's own IdData classes. - * - */ -public class TagData extends IdData implements Serializable -{ - /* - * - */ - public TagData () - { - super (); - } - - - /* - * - */ - public TagData (String text) - { - super (text); - } -} diff --git a/src/xid/TagsDataById.java b/src/xid/TagsDataById.java deleted file mode 100644 index 8b7d47b..0000000 --- a/src/xid/TagsDataById.java +++ /dev/null @@ -1,40 +0,0 @@ -package xid; - -import java.util.*; -import java.io.*; - -/* - * - */ -public class TagsDataById extends HashMap -{ - /* - * - */ - public TagsDataById () - { - super (); - } - - /* - * - */ - public void setId (String id, TagData data) - { - this.put (id, data); - } - - /* - * - */ - public TagData getId (String id) - { - TagData result; - - result = this.get (id); - - // - return (result); - } - -} diff --git a/src/xid/testXid.html b/src/xid/testXid.html deleted file mode 100644 index 78a308e..0000000 --- a/src/xid/testXid.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - test - - - Test 01: No id attribute - XHTML: Hello world. - no Java code - Result: Hello world. - - Test 02: id attribute with empty model - XHTML: Hello world. - no Java code - Result: Hello world. - - - Test 03: model changing the text - XHTML: Hello world. - // Populate attributes of Test 03. - text = new TextModel (); - text.getAttributes ().appendAttribute ("style", "background: blue;"); - text.getAttributes ().appendAttribute ("style", "foreground: red;"); - text.getAttributes ().setAttribute ("class", "totoClass"); - text.setText ("mummy"); - datas.put ("test03", text); - Result: Hello world. - - - Test 04: model changing title - XHTML: Hello world. - // Populate attributes of Test 04. - text = new TextModel (); - text.getAttributes ().setAttribute ("title", "another title"); - datas.put ("test04", text); - Result: Hello world. - - - Test 05: model adding style attributes - XHTML: Hello world. - // Populate attributes of Test 05. - text = new TextModel (); - text.getAttributes ().appendAttribute ("style", "background: blue;"); - text.getAttributes ().appendAttribute ("style", "foreground: red;"); - text.getAttributes ().setAttribute ("class", "aClass"); - datas.put ("test05", text); - Result: Hello world. - - - Test 06: model appending style attributes - XHTML: Hello world. - // Populate attributes of Test 06. - text = new TextModel (); - text.getAttributes ().appendAttribute ("style", "foreground: red;"); - text.getAttributes ().setAttribute ("class", "aClass"); - datas.put ("test06", text); - Result: Hello world. - - - Test 07: image - XHTML: A picture pinguoin flottant. - // Populate attributes of Test 07. - text = new TextModel (); - text.getAttributes ().setAttribute ("width", "50%"); - datas.put ("test07", text); - Result: A picture pinguoin flottant. - - - Test 08: xhtml source contains no display order in a tag. - XHTML: Hello you there. - Result: Hello you there. - - - Test 09: dynamic addition of the nodisplay order. - XHTML: Hello you there. - Result: Hello you there. - - - \ No newline at end of file diff --git a/src/xid/testXid.t b/src/xid/testXid.t deleted file mode 100644 index 9037424..0000000 --- a/src/xid/testXid.t +++ /dev/null @@ -1,69 +0,0 @@ - - - - test - - - Test 01: No id attribute - XHTML: Hello world. - no Java code - Result: Hello world. - - Test 02: id attribute with empty model - XHTML: Hello world. - no Java code - Result: Hello world. - - - Test 03: model changing the text - XHTML: Hello world. - // Populate attributes of Test 03. - text = new TextModel (); - text.getAttributes ().appendAttribute ("style", "background: blue;"); - text.getAttributes ().appendAttribute ("style", "foreground: red;"); - text.getAttributes ().setAttribute ("class", "totoClass"); - text.setText ("mummy"); - datas.put ("test03", text); - Result: Hello world. - - - Test 04: model changing title - XHTML: Hello world. - // Populate attributes of Test 04. - text = new TextModel (); - text.getAttributes ().setAttribute ("title", "another title"); - datas.put ("test04", text); - Result: Hello world. - - - Test 05: model adding style attributes - XHTML: Hello world. - // Populate attributes of Test 05. - text = new TextModel (); - text.getAttributes ().appendAttribute ("style", "background: blue;"); - text.getAttributes ().appendAttribute ("style", "foreground: red;"); - text.getAttributes ().setAttribute ("class", "aClass"); - datas.put ("test05", text); - Result: Hello world. - - - Test 06: model appending style attributes - XHTML: Hello world. - // Populate attributes of Test 06. - text = new TextModel (); - text.getAttributes ().appendAttribute ("style", "foreground: red;"); - text.getAttributes ().setAttribute ("class", "aClass"); - datas.put ("test06", text); - Result: Hello world. - - - Test 07: image - XHTML: A picture pinguoin flottant. - // Populate attributes of Test 07. - text = new TextModel (); - text.getAttributes ().setAttribute ("width", "50%"); - datas.put ("test07", text); - Result: A picture pinguoin flottant. - - - \ No newline at end of file diff --git a/src/xid/xhtml-lat1.ent b/src/xid/xhtml-lat1.ent deleted file mode 100644 index ffee223..0000000 --- a/src/xid/xhtml-lat1.ent +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/xid/xhtml-special.ent b/src/xid/xhtml-special.ent deleted file mode 100644 index cead4e8..0000000 --- a/src/xid/xhtml-special.ent +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/xid/xhtml-symbol.ent b/src/xid/xhtml-symbol.ent deleted file mode 100644 index 63c2abf..0000000 --- a/src/xid/xhtml-symbol.ent +++ /dev/null @@ -1,237 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/xid/xhtml1-frameset.dtd b/src/xid/xhtml1-frameset.dtd deleted file mode 100644 index 1a00936..0000000 --- a/src/xid/xhtml1-frameset.dtd +++ /dev/null @@ -1,1235 +0,0 @@ - - - - - -%HTMLlat1; - - -%HTMLsymbol; - - -%HTMLspecial; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/xid/xhtml1-transitional.dtd b/src/xid/xhtml1-transitional.dtd deleted file mode 100644 index e22581b..0000000 --- a/src/xid/xhtml1-transitional.dtd +++ /dev/null @@ -1,1210 +0,0 @@ - - - - - -%HTMLlat1; - - -%HTMLsymbol; - - -%HTMLspecial; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/xid/test/Test.java b/test/xid/test/Test.java deleted file mode 100644 index b12acf6..0000000 --- a/test/xid/test/Test.java +++ /dev/null @@ -1,237 +0,0 @@ -package xid.test; - -import java.util.*; -import java.io.*; -import xid.*; - -/** - * - */ -class Test -{ - static private org.apache.log4j.Logger log; - - static - { - // Initialize log. - org.apache.log4j.Logger log = null; - - org.apache.log4j.BasicConfigurator.configure (); - - - log = org.apache.log4j.Logger.getRootLogger (); - //log.setLevel (org.apache.log4j.Level.INFO); - log.setLevel (org.apache.log4j.Level.INFO); - - log.info ("Enter"); - - // - log.info ("Set the log file format..."); - - - // log = org.apache.log4j.Category.getInstance(Application.class.getName()); - log.info ("... done."); - - log.debug ("Exit"); - log = org.apache.log4j.Logger.getLogger (Test.class.getName ()); - } - - - - /** - * - */ - public static String check (String title, StringBuffer source, String model) - { - String result; - - if (source.indexOf (model) == -1) - { - result = String.format ("%-40s -> KO <-", title) + "\nGet:\n" + source + "\nWaiting:\n" + model; - - } - else - { - result = String.format ("%-40s [ OK ] ", title); - } - - - // - return (result); - } - - public enum MONTHS {JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBRE, DECEMBRE}; - - /** - * - */ - public static void main(String[] args) - { - System.out.println("Automatic test action for Xid!"); - - - Data datas; - IdData tag; - - - String htmlSource; - StringBuffer html; - StringBuffer errorMessage; - - // Populate attributes of Test 03. - System.out.println ("----------------------------"); - datas = new Data (); - datas.setContent ("name", "Superman"); - errorMessage = new StringBuffer (); - - html = StringPresenter.doXid ("
a name
", datas, errorMessage); - - System.out.println (check ("only content change", html, "
Superman
")); - - - // Populate attributes of Test 03. - System.out.println ("----------------------------"); - datas = new Data (); - datas.setContent ("lastname", "Spiderman"); - datas.appendAttribute ("lastname", "style", "background: blue;"); - datas.appendAttribute ("lastname", "style", "foreground: red;"); - datas.setAttribute ("lastname", "class", "nameClass"); - - errorMessage = new StringBuffer (); - html = StringPresenter.doXid ("
a last name
", datas, errorMessage); - System.out.println (check ("content and attributes", html, "
Spiderman
")); - - // Populate attributes of Test 03. - System.out.println ("----------------------------"); - datas = new Data (); - datas.setContent ("words", 0, "alpha"); - datas.setContent ("words", 1, "bravo"); - datas.setContent ("words", 2, "charlie"); - datas.setContent ("words", 3, "delta"); - datas.setContent ("words", 4, "echo"); - datas.setContent ("words", 5, "fox"); - - - errorMessage = new StringBuffer (); - html = StringPresenter.doXid ("
    \n
  • a word
  • \n
", datas, errorMessage); - - System.out.println (check ("list assertion 1", html, "
  • alpha
  • ")); - System.out.println (check ("list assertion 2", html, "
  • bravo
  • ")); - System.out.println (check ("list assertion 3", html, "
  • charlie
  • ")); - System.out.println (check ("list assertion 4", html, "
  • delta
  • ")); - System.out.println (check ("list assertion 5", html, "
  • echo
  • ")); - System.out.println (check ("list assertion 6", html, "
  • fox
  • ")); - - // Populate attributes of Test 03. - System.out.println ("----------------------------"); - datas = new Data (); - datas.setContent ("identity", 0, "nom", "Jemba"); - datas.setContent ("identity", 0, "prenom", "Epo"); - datas.setContent ("identity", 1, "nom", "Momon"); - datas.setContent ("identity", 1, "prenom", "Christian"); - datas.setContent ("identity", 2, "nom", "Tronche"); - datas.setContent ("identity", 2, "prenom", "Christophe"); - - - errorMessage = new StringBuffer (); - StringBuffer source = new StringBuffer (); - source.append ("\n"); - source.append (" \n"); - source.append ("
    noidun nomun prenom
    "); - htmlSource = source.toString (); - html = StringPresenter.doXid (htmlSource, datas, errorMessage); - - System.out.println (check ("table 1 assertion 1", html, "noidJembaEpo")); - System.out.println (check ("table 1 assertion 2", html, "noidMomonChristian")); - System.out.println (check ("table 1 assertion 3", html, "noidTroncheChristophe")); - - /* - // Populate attributes of Test 03. - System.out.println ("----------------------------"); - datas = new Data (); - datas.setContent ("identity", 0, "nom", "Jemba"); - datas.setContent ("identity", 0, "prenom", "Epo"); - datas.setContent ("identity", 1, "nom", "Momon"); - datas.setContent ("identity", 1, "prenom", "Christian"); - datas.setContent ("identity", 2, "nom", "Tronche"); - datas.setContent ("identity", 2, "prenom", "Christophe"); - datas.setIterationStrategy ("identity", IdsDataByIndex.IterationStrategy.ONLY_FIRST_ROW); - //datas.setIterationStrategy ("identity", IdsDataByIndex.IterationStrategy.ONLY_ROWS_WITH_ID); - //datas.setIterationStrategy ("identity", IdsDataByIndex.IterationStrategy.ONLY_ROWS_WITHOUT_ID); - //datas.setIterationStrategy ("identity", IdsDataByIndex.IterationStrategy.ALL_ROWS); - - - errorMessage = new StringBuffer (); - source = new StringBuffer (); - source.append ("\n"); - source.append (" \n"); - source.append (" \n"); - source.append (" \n"); - source.append ("
    noidun nomun prenom
    noidun nomun prenom
    noidun nomun prenom
    "); - htmlSource = source.toString (); - - System.out.println ("datas = new Data ();"); - System.out.println ("datas.setContent (\"identity\", 0, \"nom\", \"Jemba\");"); - System.out.println ("datas.setContent (\"identity\", 0, \"prenom\", \"Epo\");"); - System.out.println ("datas.setContent (\"identity\", 1, \"nom\", \"Momon\");"); - System.out.println ("datas.setContent (\"identity\", 1, \"prenom\", \"Christian\");"); - System.out.println ("datas.setContent (\"identity\", 2, \"nom\", \"Tronche\");"); - System.out.println ("datas.setContent (\"identity\", 2, \"prenom\", \"Christophe\");"); - - System.out.println ("+"); - System.out.println (htmlSource); - System.out.println ("=>"); - - - datas.setIterationStrategy ("identity", IdsDataByIndex.IterationStrategy.ONLY_FIRST_ROW); - System.out.println ("ONLY_FIRST_ROW:"); - html = Presenter.doXid (htmlSource, datas, "", errorMessage); - System.out.println (html); - - datas.setIterationStrategy ("identity", IdsDataByIndex.IterationStrategy.ONLY_ROWS_WITH_ID); - System.out.println ("ONLY_ROWS_WITH_ID:"); - html = Presenter.doXid (htmlSource, datas, "", errorMessage); - System.out.println (html); - - datas.setIterationStrategy ("identity", IdsDataByIndex.IterationStrategy.ONLY_ROWS_WITHOUT_ID); - System.out.println ("ONLY_ROWS_WITHOUT_ID:"); - html = Presenter.doXid (htmlSource, datas, "", errorMessage); - System.out.println (html); - - datas.setIterationStrategy ("identity", IdsDataByIndex.IterationStrategy.ALL_ROWS); - System.out.println ("ALL_ROWS:"); - html = Presenter.doXid (htmlSource, datas, "", errorMessage); - System.out.println (html); - - - - // Populate attributes of Test 03. - System.out.println ("----------------------------"); - datas = new Data (); - datas.setAttribute ("
    ", "class", "aDivClass"); - datas.setAttribute ("
    ", "style", "background-color: #000000;"); - datas.setAttribute ("number", "style", "background-color: #0000FF;"); - - errorMessage = new StringBuffer (); - source = new StringBuffer (); - source.append ("
    \n"); - source.append ("

    one

    \n"); - source.append ("
    \n"); - source.append ("
    \n"); - source.append ("

    three

    \n"); - source.append ("
    "); - htmlSource = source.toString (); - html = Presenter.doXid (htmlSource, datas, "", errorMessage); - - System.out.println (htmlSource); - System.out.println ("+"); - System.out.println ("datas = new Data ();"); - System.out.println ("datas.setAttribute (\"
    \", \"class\", \"aDivClass\");"); - System.out.println ("datas.setAttribute (\"
    \", \"style\", \"background-color: #000000;\");"); - System.out.println ("datas.setAttribute (\"number\", \"style\", \"background-color: #0000FF;\");"); - - System.out.println ("=>"); - System.out.println (html); - */ - } -} diff --git a/webapp-examples/WEB-INF/classes/build.xml b/webapp-examples/WEB-INF/classes/build.xml deleted file mode 100644 index 9405f9d..0000000 --- a/webapp-examples/WEB-INF/classes/build.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/webapp-examples/WEB-INF/classes/log4j.properties b/webapp-examples/WEB-INF/classes/log4j.properties deleted file mode 100644 index d23f58c..0000000 --- a/webapp-examples/WEB-INF/classes/log4j.properties +++ /dev/null @@ -1,9 +0,0 @@ -# Log information (priority setting : DEBUG < INFO < WARN < ERROR) -# ################ -log4j.rootCategory = INFO, Writer -log4j.appender.Writer = org.apache.log4j.RollingFileAppender -log4j.appender.Writer.File = /var/log/tomcat5/xid-test.log -log4j.appender.Writer.MaxFileSize = 100000KB -log4j.appender.Writer.MaxBackupIndex = 10 -log4j.appender.Writer.layout = org.apache.log4j.PatternLayout -log4j.appender.Writer.layout.ConversionPattern = %d{ISO8601} - %-17t %-6p %-34c.%20M - %m%n diff --git a/webapp-examples/WEB-INF/classes/testXid.t b/webapp-examples/WEB-INF/classes/testXid.t deleted file mode 100644 index 9037424..0000000 --- a/webapp-examples/WEB-INF/classes/testXid.t +++ /dev/null @@ -1,69 +0,0 @@ - - - - test - - - Test 01: No id attribute - XHTML: Hello world. - no Java code - Result: Hello world. - - Test 02: id attribute with empty model - XHTML: Hello world. - no Java code - Result: Hello world. - - - Test 03: model changing the text - XHTML: Hello world. - // Populate attributes of Test 03. - text = new TextModel (); - text.getAttributes ().appendAttribute ("style", "background: blue;"); - text.getAttributes ().appendAttribute ("style", "foreground: red;"); - text.getAttributes ().setAttribute ("class", "totoClass"); - text.setText ("mummy"); - datas.put ("test03", text); - Result: Hello world. - - - Test 04: model changing title - XHTML: Hello world. - // Populate attributes of Test 04. - text = new TextModel (); - text.getAttributes ().setAttribute ("title", "another title"); - datas.put ("test04", text); - Result: Hello world. - - - Test 05: model adding style attributes - XHTML: Hello world. - // Populate attributes of Test 05. - text = new TextModel (); - text.getAttributes ().appendAttribute ("style", "background: blue;"); - text.getAttributes ().appendAttribute ("style", "foreground: red;"); - text.getAttributes ().setAttribute ("class", "aClass"); - datas.put ("test05", text); - Result: Hello world. - - - Test 06: model appending style attributes - XHTML: Hello world. - // Populate attributes of Test 06. - text = new TextModel (); - text.getAttributes ().appendAttribute ("style", "foreground: red;"); - text.getAttributes ().setAttribute ("class", "aClass"); - datas.put ("test06", text); - Result: Hello world. - - - Test 07: image - XHTML: A picture pinguoin flottant. - // Populate attributes of Test 07. - text = new TextModel (); - text.getAttributes ().setAttribute ("width", "50%"); - datas.put ("test07", text); - Result: A picture pinguoin flottant. - - - \ No newline at end of file diff --git a/webapp-examples/WEB-INF/classes/xid/Test.class b/webapp-examples/WEB-INF/classes/xid/Test.class deleted file mode 100644 index edb30be8bf0adfc6fb20f474a1bdf098ab9acb40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4021 zcmai1d6ZjK9scf2l6NP4Gi}pOOSHwb(CJJ&ZHjcAhN0WE9XnlUhb|P9m*h?6wMkz3 z^3u+Lf~;;-5fChhEG|`1WYKg}Q0rR7DkzGm;DX>*x8pw^kH_!6m&|0CDLpyo-FtuU zw|u|#zMT5s@uvV>gnxyx0Rv&I$6x~=*GOC&#yjyY4c95+^%CzMhZ}IC#7$v@aI=P6 z!q73G;npykFd*?Bb$+kJ`_%dU>hS@I+awN#@j-k@;&zD-OWdJOcS_tP@ezr;CGL^< zsKgIG&GK>zTrUPG6y1uM-Wr-saMp3P!5mjFYl(PrS#@WK3tdKqz75Ew_`bt!>){ z0;}z`DKNgr%A1=?xuogz8p$jvksdo`WVaiRrOp*%!0oq+0^yzkD;@7Oi>^|bwzt?t zS72*v&mLpHF%U1B&i<_F#`|5j5MR&7HlMK7+*eXE=VU7u?0nH&uJF}6=01Vh=M?cZ zd;A1=ZX^{G^rdScWfokE7BzfJ!?y*3X?vYXhcwz&fCZ#u`T{gS*Hye!1h$ZD=3OtY z!L;ETG~MLK#>f=ckihr^TyuabCRSoL;Px7s>Z^V?mlZhA^Ddq>@|pNH*Rk@MRi(Z@ zPpfV^j_qtTi$x>Dq}1Cbs%rN6Et>$Wyt~7(d?xQE zKeI`fN?96-jK$Qbn0o93rnA~85>G?XHJpk)(angN`Lu6cCQ{i-p@p~EB`0OBwNzO( zsH&N->O{vTY}WC1Y}e6)jSPF23Z;hc==d(aC(t+|#5zvl`vM}a;RiaN!4Cy=m%4UZ z>G>**O5JJFln^8AMW1={j*Lqs=yXsCEx1_6kMLvK%$0JvK^@QHIUPU2Pf01dg9_-x zq>OXhM7&+GV^GBTmhcFgKK$4oPP!Bo~LGW`v%?b@r=UdPWBZ_u?| zrLWP*+it(<#42YW$HFS0Mcf#kT$QqzvInfR+t0KwS}?0hUg8I)BX6gzVj*iV)4r-@ z0#j66M<-mz3;2bC#yGGkb6E{9>iDH{`B(Tga%8h^Yw=ZRgJJ zHL>2VZM})Oe`cl=@%}1LlJyo#W>R+6b}pG|JFH`KCZ(y@iN(2T9Fk8u@lGAT!Ef2q zEAuh0x?^@KRbmulRzAjT#$3lV+#LIAenPP`42gncQtV|_6`@32orrC;vsN~3Iy!!b z-|Kh`qYTlqeltzX;Jo0EIYl&SUu19HSDA04Qn8Q(H838Qb#>ebUk2wryc zZtq}04O9B&Pk**UCEM{)*TPV#)!Y`0TtVF(**uFsYvwcFm}za}3=jFP3(TucOEscn z_~&&UgE*d7hs(jpF>bk*inVlYUru0h6<*CPN0|v;8`RKPbgo@Q z;Sg^_v6L)&wkG$x9gWQLU$<0W&!+RO9ooETAgYzo))8ut%sGa+b!b0^c7YBV zm63U6%;ysKmj(WEk-xmvUoQ5Sg=(RmMTc-1B^LYCCElXwOG#Yj6Mcyj=pcaQ5wawr zp`*BjtKvwM(K*a_7#Bw6xmhpuC01}zxnIfL4;R?8Sjd8Dhs1nL=O3^ZEMh4y#xg9y z3M^%*FJpmqAdODsa47~!y$Ne@8@g~e*7C2=Iy}nOI8M%!Y>U%ui5J-vudqbVu+IO3 z%S8aYL?f;cQS25Mz!2?7ipA&?oydr_u*62}5xv+eb|Wj2$O#L!D4-w?z!BHO6}O@! z4r0H!3kSq~7!VI*P@Kdy;uNkG&)_<71~-U*<3{mc+*}vHEncHs=@)yoQR;$thubnzMtB-v0c;w7Z$VE}RQJWTW`CWNl;Y>zM#U5f+L>mEQubD-`)NYQf`O>?F< zvme)%v94$CV-)rWM~iX*2YI@k6Xy<0#+{gkd-%Wb5ZZ7rQ+7X7^pNN5LfH#3l55eH;rj_xeL&Z($Ms3^JWOpI0@^^=st?KJ&Af%CBmCx{upZJ N1e-$2e$U8({{ua;4>$k- diff --git a/webapp-examples/WEB-INF/classes/xid/Test.java b/webapp-examples/WEB-INF/classes/xid/Test.java deleted file mode 100644 index 20c2945..0000000 --- a/webapp-examples/WEB-INF/classes/xid/Test.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * - */ -package xid; -import java.io.*; -import java.text.*; -import java.util.*; -import javax.servlet.*; -import javax.servlet.http.*; -import xid.*; - -/** - * - */ -public class Test extends HttpServlet -{ - static private org.apache.log4j.Logger log; - - static - { - log = org.apache.log4j.Logger.getLogger (Test.class.getName()); - } - - - /** - * - */ - public void doPost (HttpServletRequest req, - HttpServletResponse res) - throws ServletException, IOException - { - doGet (req, res); - } - - - - /** - * - */ - public void doGet (HttpServletRequest request, - HttpServletResponse response) - throws IOException, ServletException - { - log.info ("Enter"); - - Presenter xid = new Presenter (getServletContext ().getRealPath ("/"), "testXid.html"); - - // - TagsData datas = new TagsData (); - TextTagData text; - - // Populate attributes of Test 03. - text = new TextTagData (); - datas.put ("test03", text); - text.setText ("mummy"); - text.getAttributes ().appendAttribute ("style", "background: blue;"); - text.getAttributes ().appendAttribute ("style", "foreground: red;"); - text.getAttributes ().setAttribute ("class", "totoClass"); - - - // Populate attributes of Test 04. - text = new TextTagData (); - text.getAttributes ().setAttribute ("title", "another title"); - datas.put ("test04", text); - - - // Populate attributes of Test 05. - text = new TextTagData (); - datas.put ("test05", text); - text.getAttributes ().appendAttribute ("style", "background: blue;"); - text.getAttributes ().appendAttribute ("style", "foreground: red;"); - text.getAttributes ().setAttribute ("class", "aClass"); - - - // Populate attributes of Test 06. - text = new TextTagData (); - text.getAttributes ().appendAttribute ("style", "foreground: red;"); - text.getAttributes ().setAttribute ("class", "aClass"); - datas.put ("test06", text); - - - // Populate attributes of Test 07. - text = new TextTagData (); - text.getAttributes ().setAttribute ("width", "50%"); - datas.put ("test07", text); - - - // Populate attributes of Test 09. - text = new TextTagData (); - text.getAttributes ().setAttribute ("class", "xid:nodisplay"); - datas.put ("test09", text); - - - StringBuffer html; - StringBuffer errorMessage; - - errorMessage = new StringBuffer (); - html = xid.doXid (datas, errorMessage); - - - // Display page. - response.setContentType ("text/html"); - PrintWriter out = response.getWriter(); - - out.println (""); - out.println (""); - out.println ("XID TEST"); - out.println (""); - out.println (""); - - out.println ("
    "); - out.println ("XID TEST
    "); - - if (errorMessage.length () != 0) - { - out.println ("An error occured in Xid treatment.
    "); - out.println ("
    ");
    -	out.println (errorMessage);
    -	out.println ("
    "); - out.println ("
    "); - out.println ("
    " + Presenter.restoreEntities (html) + "
    "); - out.println ("
    "); - } - else - { - out.println ("
    " + Presenter.restoreEntities (html) + "
    "); - } - - out.println (""); - out.println (""); - - log.info ("Exit"); - } -} - -// //////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/webapp-examples/WEB-INF/lib/xid.jar b/webapp-examples/WEB-INF/lib/xid.jar deleted file mode 100644 index 0235c4376407eb50d1c8be4cf89f9b1872526f22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37491 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

    6ylpO%Qlf0aABf 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 diff --git a/webapp-examples/WEB-INF/web.xml b/webapp-examples/WEB-INF/web.xml index b7eacff..2dff563 100644 --- a/webapp-examples/WEB-INF/web.xml +++ b/webapp-examples/WEB-INF/web.xml @@ -1,20 +1,11 @@ - - - - - + + XID TESTS Some tests on XID. - - - - XidTest