diff --git a/.classpath b/.classpath index 5c16154..b95f410 100644 --- a/.classpath +++ b/.classpath @@ -21,11 +21,6 @@ - - - - - diff --git a/src/org/atriasoft/exml/Exml.java b/src/org/atriasoft/exml/Exml.java index 2e09e65..707b90a 100644 --- a/src/org/atriasoft/exml/Exml.java +++ b/src/org/atriasoft/exml/Exml.java @@ -9,6 +9,7 @@ package org.atriasoft.exml; import java.lang.reflect.Array; import java.util.List; +import org.atriasoft.etk.Uri; import org.atriasoft.exml.builder.Builder; import org.atriasoft.exml.builder.BuilderGeneric; import org.atriasoft.exml.builder.BuilderIntrospection; @@ -98,6 +99,22 @@ public class Exml { * the file: fileIo->close(); // parse the data: boolean ret = * parse(tmpDataUnicode); //Display(); return ret; } */ + + public static XmlElement parse(final Uri data) throws ExmlBuilderException, ExmlParserErrorMulti { + final Builder builder = new BuilderGeneric(); + final ParseXml parser = new ParseXml(builder); + final ParsingProperty property = new ParsingProperty(); + property.setDisplayError(true); + final byte[] elemData = Uri.getAllData(data); + if (elemData == null) { + Log.error("Can not read the Stream : " + data); + Log.displayBackTrace(); + return null; + } + final String dataToParse = new String(elemData); + return (XmlElement) parser.parse(dataToParse, property); + } + /** * Store the Xml in the file * diff --git a/src/org/atriasoft/exml/internal/Log.java b/src/org/atriasoft/exml/internal/Log.java index 81da50b..160005e 100644 --- a/src/org/atriasoft/exml/internal/Log.java +++ b/src/org/atriasoft/exml/internal/Log.java @@ -10,61 +10,66 @@ import io.scenarium.logger.Logger; public class Log { private static final String LIB_NAME = "exml"; - private static final String LIB_NAME_DRAW = Logger.getDrawableName(LIB_NAME); - private static final boolean PRINT_CRITICAL = Logger.getNeedPrint(LIB_NAME, LogLevel.CRITICAL); - private static final boolean PRINT_ERROR = Logger.getNeedPrint(LIB_NAME, LogLevel.ERROR); - private static final boolean PRINT_WARNING = Logger.getNeedPrint(LIB_NAME, LogLevel.WARNING); - private static final boolean PRINT_INFO = Logger.getNeedPrint(LIB_NAME, LogLevel.INFO); - private static final boolean PRINT_DEBUG = Logger.getNeedPrint(LIB_NAME, LogLevel.DEBUG); - private static final boolean PRINT_VERBOSE = Logger.getNeedPrint(LIB_NAME, LogLevel.VERBOSE); - private static final boolean PRINT_TODO = Logger.getNeedPrint(LIB_NAME, LogLevel.TODO); - private static final boolean PRINT_PRINT = Logger.getNeedPrint(LIB_NAME, LogLevel.PRINT); + private static final String LIB_NAME_DRAW = Logger.getDrawableName(Log.LIB_NAME); + private static final boolean PRINT_CRITICAL = Logger.getNeedPrint(Log.LIB_NAME, LogLevel.CRITICAL); + private static final boolean PRINT_DEBUG = Logger.getNeedPrint(Log.LIB_NAME, LogLevel.DEBUG); + private static final boolean PRINT_ERROR = Logger.getNeedPrint(Log.LIB_NAME, LogLevel.ERROR); + private static final boolean PRINT_INFO = Logger.getNeedPrint(Log.LIB_NAME, LogLevel.INFO); + private static final boolean PRINT_PRINT = Logger.getNeedPrint(Log.LIB_NAME, LogLevel.PRINT); + private static final boolean PRINT_TODO = Logger.getNeedPrint(Log.LIB_NAME, LogLevel.TODO); + private static final boolean PRINT_VERBOSE = Logger.getNeedPrint(Log.LIB_NAME, LogLevel.VERBOSE); + private static final boolean PRINT_WARNING = Logger.getNeedPrint(Log.LIB_NAME, LogLevel.WARNING); public static void critical(final String data) { - if (PRINT_CRITICAL) { - Logger.critical(LIB_NAME_DRAW, data); + if (Log.PRINT_CRITICAL) { + Logger.critical(Log.LIB_NAME_DRAW, data); } } public static void debug(final String data) { - if (PRINT_DEBUG) { - Logger.debug(LIB_NAME_DRAW, data); + if (Log.PRINT_DEBUG) { + Logger.debug(Log.LIB_NAME_DRAW, data); } } + public static void displayBackTrace() { + // TODO Auto-generated method stub + + } + public static void error(final String data) { - if (PRINT_ERROR) { - Logger.error(LIB_NAME_DRAW, data); + if (Log.PRINT_ERROR) { + Logger.error(Log.LIB_NAME_DRAW, data); } } public static void info(final String data) { - if (PRINT_INFO) { - Logger.info(LIB_NAME_DRAW, data); + if (Log.PRINT_INFO) { + Logger.info(Log.LIB_NAME_DRAW, data); } } public static void print(final String data) { - if (PRINT_PRINT) { - Logger.print(LIB_NAME_DRAW, data); + if (Log.PRINT_PRINT) { + Logger.print(Log.LIB_NAME_DRAW, data); } } public static void todo(final String data) { - if (PRINT_TODO) { - Logger.todo(LIB_NAME_DRAW, data); + if (Log.PRINT_TODO) { + Logger.todo(Log.LIB_NAME_DRAW, data); } } public static void verbose(final String data) { - if (PRINT_VERBOSE) { - Logger.verbose(LIB_NAME_DRAW, data); + if (Log.PRINT_VERBOSE) { + Logger.verbose(Log.LIB_NAME_DRAW, data); } } public static void warning(final String data) { - if (PRINT_WARNING) { - Logger.warning(LIB_NAME_DRAW, data); + if (Log.PRINT_WARNING) { + Logger.warning(Log.LIB_NAME_DRAW, data); } } diff --git a/src/org/atriasoft/exml/model/XmlElement.java b/src/org/atriasoft/exml/model/XmlElement.java index 4aea7b0..a35a555 100644 --- a/src/org/atriasoft/exml/model/XmlElement.java +++ b/src/org/atriasoft/exml/model/XmlElement.java @@ -28,8 +28,7 @@ public class XmlElement extends XmlAttributeList { /** * Constructor */ - public XmlElement() { - } + public XmlElement() {} /** * Constructor @@ -142,6 +141,18 @@ public class XmlElement extends XmlAttributeList { throw new ExmlNodeDoesNotExist("Node does not exist: '" + name + "' in " + this.listAttribute.size()); } + public XmlNode getNodeNoExcept(final String name) { + if (name.isEmpty()) { + return null; + } + for (int iii = 0; iii < this.listSub.size(); iii++) { + if (this.listSub.get(iii) != null && this.listSub.get(iii).getValue().contentEquals(name)) { + return this.listSub.get(iii); + } + } + return null; + } + /** * Get the list of the sub-nodes. * @return List of current nodes. diff --git a/src/org/atriasoft/exml/parser/ParseXml.java b/src/org/atriasoft/exml/parser/ParseXml.java index d0e60d2..5c6302a 100644 --- a/src/org/atriasoft/exml/parser/ParseXml.java +++ b/src/org/atriasoft/exml/parser/ParseXml.java @@ -200,6 +200,27 @@ public class ParseXml { return false; } + protected boolean iParseDOCTYPE(final Object parent, final String data, final PositionParsing pos, final FilePos filePos, final ParsingProperty parsingProperty) throws ExmlBuilderException { + Log.verbose("start parse : 'DOCTYPE'"); + final FilePos tmpPos = new FilePos(); + final int white = Tools.countWhiteChar(data, pos.value, tmpPos); + filePos.add(tmpPos); + // search end of the comment : + for (int iii = pos.value + white; iii < data.length(); iii++) { + Tools.drawElementParsed(data.charAt(iii), filePos); + if (filePos.check(data.charAt(iii))) { + continue; + } + if (data.charAt(iii) == '>') { + pos.value = iii; + return true; + } + } + pos.value = data.length(); + parsingProperty.createError(new ExmlParserError(Tools.extractLine(data, pos.value), filePos, "DOTYPE got end of file without finding end node")); + return false; + } + protected boolean iParseElement(final Object parent, final String nameElement, final String data, final PositionParsing pos, final FilePos filePos, final ParsingProperty parsingProperty) throws ExmlBuilderException { // note : When start parsing the upper element must have set the value of the element and set the position after this one @@ -410,6 +431,23 @@ public class ParseXml { return false; } iii = pos.value; + } else if (data.charAt(iii + white + 2) == 'D' && iii + white + 9 < data.length() && data.charAt(iii + white + 3) == 'O' && data.charAt(iii + white + 4) == 'C' + && data.charAt(iii + white + 5) == 'T' && data.charAt(iii + white + 6) == 'Y' && data.charAt(iii + white + 7) == 'P' && data.charAt(iii + white + 8) == 'E') { + tmpPos.increment(); + tmpPos.increment(); + tmpPos.increment(); + tmpPos.increment(); + tmpPos.increment(); + tmpPos.increment(); + tmpPos.increment(); + tmpPos.increment(); + // find comment: + pos.value = iii + white + 4; + filePos.add(tmpPos); + if (!iParseDOCTYPE(parent, data, pos, filePos, parsingProperty)) { + return false; + } + iii = pos.value; } else { parsingProperty .createError(new ExmlParserError(Tools.extractLine(data, pos.value), filePos, "End file with ' invalide XML")); diff --git a/src/org/atriasoft/exml/parser/Tools.java b/src/org/atriasoft/exml/parser/Tools.java index 05d5e76..1f7081e 100644 --- a/src/org/atriasoft/exml/parser/Tools.java +++ b/src/org/atriasoft/exml/parser/Tools.java @@ -20,9 +20,9 @@ public class Tools { * @return false The value can NOT be a part of attribute name */ public static boolean checkAvaillable(final Character val, final boolean firstChar) { - if (val == '!' || val == '"' || val == '#' || val == '$' || val == '%' || val == '&' || val == '\'' // ' - || val == '(' || val == ')' || val == '*' || val == '+' || val == ',' || val == '/' || val == ';' || val == '<' || val == '=' || val == '>' || val == '?' || val == '@' || val == '[' - || val == '\\' || val == ']' || val == '^' || val == '`' || val == '{' || val == '|' || val == '}' || val == '~' || val == ' ' || val == '\n' || val == '\t' || val == '\r') { + if (val == '!' || val == '"' || val == '#' || val == '$' || val == '%' || val == '&' || val == '\'' || val == '(' || val == ')' || val == '*' || val == '+' || val == ',' || val == '/' + || val == ';' || val == '<' || val == '=' || val == '>' || val == '?' || val == '@' || val == '[' || val == '\\' || val == ']' || val == '^' || val == '`' || val == '{' || val == '|' + || val == '}' || val == '~' || val == ' ' || val == '\n' || val == '\t' || val == '\r') { return false; } if (firstChar) { @@ -33,6 +33,16 @@ public class Tools { return true; } + public static boolean checkNumber(final Character val, final boolean firstChar) { + if (val == '.' || (val >= '0' && val <= '9')) { + return true; + } + if (firstChar && val == '-') { + return true; + } + return false; + } + public static String cleanNumberList(final String data) { return data.replaceAll("[ \t\n\r]", "").replaceAll(",", ";"); }