From: Miguel <mic...@us...> - 2004-04-28 23:33:30
|
Update of /cvsroot/jmol/Jmol/src/org/jmol/adapter/smarter In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16311/src/org/jmol/adapter/smarter Modified Files: CmlReader.java ModelReader.java Log Message: initial simple CML support Index: CmlReader.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/jmol/adapter/smarter/CmlReader.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- CmlReader.java 28 Apr 2004 08:40:22 -0000 1.3 +++ CmlReader.java 28 Apr 2004 23:33:05 -0000 1.4 @@ -29,6 +29,8 @@ import org.xml.sax.helpers.DefaultHandler; import java.io.*; +import java.util.StringTokenizer; +import java.util.NoSuchElementException; class CmlReader extends ModelReader { @@ -52,7 +54,6 @@ xmlr.setEntityResolver(cmlh); xmlr.setContentHandler(cmlh); - System.out.println("here we go!"); xmlr.parse(is); if (model.atomCount == 0) { @@ -66,7 +67,21 @@ final static int DISCARD = 0; final static int ELEMENT_TYPE = 1; - + final static int COORDINATE3 = 2; + final static int ARRAY_ID = 3; + final static int X3 = 4; + final static int Y3 = 5; + final static int Z3 = 6; + + boolean inAtomArrayContext = false; + + int moleculeCount = 0; + Atom atom; + int atomArrayCount; + Atom[] atomArray; + int stringCount; + String[] strings; + String chars; class CmlHandler extends DefaultHandler { @@ -78,10 +93,16 @@ System.out.println("startElement(" + namespaceURI + "," + localName + "," + qName + "," + atts + ")"); */ + chars = null; + if ("molecule".equals(qName)) { + ++moleculeCount; + return; + } if ("atom".equals(qName)) { inAtomContext = true; - String id = atts.getValue("id"); - System.out.println("an atom whose id is:" + id); + atom = new Atom(); + atom.atomName = atts.getValue("id"); + atom.modelNumber = moleculeCount; return; } if (inAtomContext) { @@ -90,6 +111,46 @@ charactersState = ELEMENT_TYPE; return; } + if ("coordinate3".equals(qName) && + "xyz3".equals(atts.getValue("builtin"))) { + charactersState = COORDINATE3; + return; + } + return; + } + if ("atomArray".equals(qName)) { + inAtomArrayContext = true; + atomArrayCount = -1; + return; + } + if (inAtomArrayContext) { + String builtin = atts.getValue("builtin"); + if ("stringArray".equals(qName)) { + if ("id".equals(builtin)) { + charactersState = ARRAY_ID; + return; + } + if ("elementType".equals(builtin)) { + charactersState = ELEMENT_TYPE; + return; + } + return; + } + if ("floatArray".equals(qName)) { + if ("x3".equals(builtin)) { + charactersState = X3; + return; + } + if ("y3".equals(builtin)) { + charactersState = Y3; + return; + } + if ("z3".equals(builtin)) { + charactersState = Z3; + return; + } + return; + } return; } } @@ -100,10 +161,71 @@ System.out.println("endElement(" + uri + "," + localName + "," + qName + ")"); */ - charactersState = DISCARD; - if ("atom".equals(qName)) { - inAtomContext = false; - return; + try { + if ("atom".equals(qName)) { + inAtomContext = false; + if (atom.elementSymbol != null && + ! Float.isNaN(atom.z)) { + model.addAtom(atom); + } + atom = null; + return; + } + if (inAtomContext) { + if (charactersState == ELEMENT_TYPE && + "string".equals(qName)) { + atom.elementSymbol = chars; + return; + } + if (charactersState == COORDINATE3 && + "coordinate3".equals(qName) && + chars != null) { + atom.x = parseFloat(chars); + atom.y = parseFloat(chars, ichNextParse); + atom.z = parseFloat(chars, ichNextParse); + return; + } + return; + } + if ("atomArray".equals(qName) && + atomArray != null) { + for (int i = 0; i < atomArrayCount; ++i) + model.addAtom(atomArray[i]); + atomArrayCount = -1; + return; + } + if (inAtomArrayContext) { + breakOutStrings(); + if (charactersState == ARRAY_ID) { + for (int i = 0; i < stringCount; ++i) + atomArray[i].atomName = strings[i]; + return; + } + if (charactersState == ELEMENT_TYPE) { + for (int i = 0; i < stringCount; ++i) + atomArray[i].elementSymbol = strings[i]; + return; + } + if (charactersState == X3) { + for (int i = 0; i < stringCount; ++i) + atomArray[i].x = parseFloat(strings[i]); + return; + } + if (charactersState == Y3) { + for (int i = 0; i < stringCount; ++i) + atomArray[i].y = parseFloat(strings[i]); + return; + } + if (charactersState == Z3) { + for (int i = 0; i < stringCount; ++i) + atomArray[i].z = parseFloat(strings[i]); + return; + } + return; + } + } finally { + charactersState = DISCARD; + chars = null; } } @@ -111,11 +233,10 @@ if (charactersState == DISCARD) return; String str = new String(ch, start, length); - switch(charactersState) { - case ELEMENT_TYPE: - System.out.println("I see elementType:" + str); - return; - } + if (chars == null) + chars = str; + else + chars += str; } // Methods for entity resolving, e.g. getting an DTD resolved @@ -136,6 +257,30 @@ System.out.println(" systemID: " + systemId); return null; } + + void breakOutStrings() { + StringTokenizer st = new StringTokenizer(chars); + stringCount = st.countTokens(); + if (strings == null || stringCount > strings.length) + strings = new String[stringCount]; + if (atomArrayCount < 0) { + atomArrayCount = stringCount; + if (atomArray == null || atomArrayCount > atomArray.length) { + atomArray = new Atom[atomArrayCount]; + for (int i = atomArrayCount; --i >= 0; ) + atomArray[i] = new Atom(); + } + } else if (atomArrayCount != stringCount) + throw new IndexOutOfBoundsException("bad cml file"); + + for (int i = 0; i < stringCount; ++i) { + try { + strings[i] = st.nextToken(); + } catch (NoSuchElementException nsee) { + strings[i] = null; + } + } + } } } Index: ModelReader.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/jmol/adapter/smarter/ModelReader.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- ModelReader.java 12 Apr 2004 09:00:59 -0000 1.9 +++ ModelReader.java 28 Apr 2004 23:33:21 -0000 1.10 @@ -40,18 +40,20 @@ abstract Model readModel(BufferedReader reader) throws Exception; - static float parseFloat(String str) { + int ichNextParse; + + float parseFloat(String str) { return parseFloatChecked(str, 0, str.length()); } - static float parseFloat(String str, int ich) { + float parseFloat(String str, int ich) { int cch = str.length(); if (ich >= cch) return Integer.MIN_VALUE; return parseFloatChecked(str, ich, cch); } - static float parseFloat(String str, int ichStart, int ichMax) { + float parseFloat(String str, int ichStart, int ichMax) { int cch = str.length(); if (ichMax > cch) ichMax = cch; @@ -65,7 +67,7 @@ static float[] tensScale = {10, 100, 1000, 10000, 100000, 1000000}; - static float parseFloatChecked(String str, int ichStart, int ichMax) { + float parseFloatChecked(String str, int ichStart, int ichMax) { boolean digitSeen = false; float value = 0; int ich = ichStart; @@ -115,21 +117,22 @@ } // System.out.println("parseFloat(" + str + "," + ichStart + "," + // ichMax + ") -> " + value); + ichNextParse = ich; return value; } - static int parseInt(String str) { + int parseInt(String str) { return parseIntChecked(str, 0, str.length()); } - static int parseInt(String str, int ich) { + int parseInt(String str, int ich) { int cch = str.length(); if (ich >= cch) return Integer.MIN_VALUE; return parseIntChecked(str, ich, cch); } - static int parseInt(String str, int ichStart, int ichMax) { + int parseInt(String str, int ichStart, int ichMax) { int cch = str.length(); if (ichMax > cch) ichMax = cch; @@ -138,7 +141,7 @@ return parseIntChecked(str, ichStart, ichMax); } - static int parseIntChecked(String str, int ichStart, int ichMax) { + int parseIntChecked(String str, int ichStart, int ichMax) { boolean digitSeen = false; int value = 0; int ich = ichStart; @@ -161,21 +164,22 @@ value = -value; // System.out.println("parseInt(" + str + "," + ichStart + "," + // ichMax + ") -> " + value); + ichNextParse = ich; return value; } - static String parseToken(String str) { + String parseToken(String str) { return parseTokenChecked(str, 0, str.length()); } - static String parseToken(String str, int ich) { + String parseToken(String str, int ich) { int cch = str.length(); if (ich >= cch) return null; return parseTokenChecked(str, ich, cch); } - static String parseToken(String str, int ichStart, int ichMax) { + String parseToken(String str, int ichStart, int ichMax) { int cch = str.length(); if (ichMax > cch) ichMax = cch; @@ -184,7 +188,7 @@ return parseTokenChecked(str, ichStart, ichMax); } - static String parseTokenChecked(String str, int ichStart, int ichMax) { + String parseTokenChecked(String str, int ichStart, int ichMax) { int ich = ichStart; while (ich < ichMax && str.charAt(ich) == ' ') ++ich; @@ -195,6 +199,7 @@ return null; if (ich == ichStart && (ichLast + 1) == ichMax) return str; + ichNextParse = ichLast + 1; return str.substring(ich, ichLast + 1); } @@ -207,7 +212,7 @@ return t; } - static int[] setLength(int[] array, int newLength) { + int[] setLength(int[] array, int newLength) { int oldLength = array.length; int[] t = new int[newLength]; System.arraycopy(array, 0, t, 0, |