package org.signalml.codec.generator.xml; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.apache.log4j.Logger; public class CodecCore { protected static final String NAMESPACES_FEATURE_ID = "http://xml.org/sax/features/namespaces"; protected static final String VALIDATION_FEATURE_ID = "http://xml.org/sax/features/validation"; protected static final String SCHEMA_VALIDATION_FEATURE_ID = "http://apache.org/xml/features/validation/schema"; protected static final String SCHEMA_FULL_CHECKING_FEATURE_ID = "http://apache.org/xml/features/validation/schema-full-checking"; protected static final String DEFAULT_PARSER_NAME = "org.signalml.codec.generator.xml.Xerces"; protected static final boolean DEFAULT_NAMESPACES = true; protected static final boolean DEFAULT_VALIDATION = false; protected static final boolean DEFAULT_SCHEMA_VALIDATION = false; protected static final boolean DEFAULT_SCHEMA_FULL_CHECKING = false; protected static final Logger log = Logger.getLogger(Document.class); public static Document parse(String arg) { ParserWrapper parser = null; try { parser=(ParserWrapper)Class.forName(DEFAULT_PARSER_NAME).newInstance(); } catch (Exception e) { log.error("error: Unable to instantiate parser ("+DEFAULT_PARSER_NAME+")", e); return null; } try { parser.setFeature(NAMESPACES_FEATURE_ID, DEFAULT_NAMESPACES); } catch (SAXException e) { log.warn("Parser does not support feature ("+NAMESPACES_FEATURE_ID+")"); } try { parser.setFeature(VALIDATION_FEATURE_ID, DEFAULT_VALIDATION); } catch (SAXException e) { log.warn("Parser does not support feature ("+VALIDATION_FEATURE_ID+")"); } try { parser.setFeature(SCHEMA_VALIDATION_FEATURE_ID, DEFAULT_SCHEMA_VALIDATION); } catch (SAXException e) { log.warn("Parser does not support feature ("+SCHEMA_VALIDATION_FEATURE_ID+")"); } try { parser.setFeature(SCHEMA_FULL_CHECKING_FEATURE_ID, DEFAULT_SCHEMA_FULL_CHECKING); } catch (SAXException e) { log.warn("Parser does not support feature ("+SCHEMA_FULL_CHECKING_FEATURE_ID+")"); } try { return parser.parse(arg); } catch (SAXParseException e) { log.error("Parse error occurred", e); } catch (Exception e) { if (e instanceof SAXException) log.warn("SAX error", ((SAXException)e).getException()); log.error("Parse error occurred", e); } return null; } public Node getNode(String path) { return new XPath().get(doc, path); } public Node []getNodes(String path) { return new XPath().getNodes(doc, path); } public static String getValue(Node node) { StringBuffer buf=new StringBuffer(); if (node.hasChildNodes()) { NodeList list=node.getChildNodes(); int len=list.getLength(); for (int i=0 ; i<len ; i++) { Node next=list.item(i); if (next.getNodeType()==Node.TEXT_NODE) buf.append(next.getNodeValue()); } } return buf.toString().trim(); } public static String getAttribute(Node node, String name) { if (node.hasAttributes()) { NamedNodeMap attr=node.getAttributes(); Node out=attr.getNamedItem(name); if (out!=null) { return out.getNodeValue(); } } return null; } protected Document doc=null; public CodecCore(String filename) throws XMLCodecException { if ((doc=parse(filename))==null) { throw new XMLCodecException("parse error !"); } } public CodecCore() { } protected String identLines(String text) { char arr[]=text.toCharArray(); StringBuffer buf=new StringBuffer(); int len=arr.length; buf.append('\t'); for (int i=0 ; i<len ; i++) { if (arr[i]=='\n') { buf.append("\n\t"); } else { buf.append(arr[i]); } } return buf.toString(); } protected String identString(String text, String prefix) { char arr[]=text.toCharArray(); StringBuffer buf=new StringBuffer(); int len=arr.length; buf.append("\""); for (int i=0 ; i<len ; i++) { if (arr[i]=='\n') { buf.append("\"+\n"); buf.append(prefix); buf.append("\""); } else if (arr[i]=='"') { buf.append("\\\""); } else { buf.append(arr[i]); } } buf.append("\""); return buf.toString(); } protected static String expand(String text) throws XMLCodecException { char arr[]=text.toCharArray(); int i, len=arr.length; for (i=len-1 ; i>=0 ; i--) { if (arr[i]=='/') { break; } } String expr=text.substring(i+1, len); int idx=expr.indexOf("["); if (idx!=-1) { StringBuffer buf=new StringBuffer(); buf.append(expr.substring(0, idx)); buf.append('_'); idx=expr.indexOf("="); int idx2=expr.indexOf("]"); if (idx==-1 || idx2==-1) { throw new XMLCodecException("expand: syntax error"); } buf.append(expr.substring(idx+1, idx2)); expr=buf.toString(); } return "get_"+expr+"()"; } protected static String eval(String text) throws XMLCodecException { if (text==null) { return null; } char arr[]=text.toCharArray(); StringBuffer buf=new StringBuffer(); int len=arr.length; for (int i=0 ; i<len ; i++) { if (arr[i]=='{') { StringBuffer v=new StringBuffer(); for (i++ ; i<len ; i++) { if (arr[i]=='}') { break; } else { v.append(arr[i]); } } String value=v.toString(); if (value.equals("number_of_channels")) { buf.append("get_number_of_channels()"); } else if (value.equals("sampling_frequency")) { buf.append("get_sampling_frequency()"); } else if (value.equals("calibration")) { buf.append("get_calibration()"); } else if (value.equals("this")) { buf.append("theResult"); } else if (value.equals("index")) { buf.append("index"); } else if (value.equals("basename")) { buf.append("get_basename()"); } else { buf.append(expand(value)); } } else { buf.append(arr[i]); } } return buf.toString(); } }