1 2 11 package org.mmbase.util; 12 13 import java.io.*; 14 import java.util.Locale ; 15 import java.util.Vector ; 16 17 import org.mmbase.bridge.Field; 18 import org.mmbase.module.core.*; 19 import org.mmbase.util.logging.Logger; 20 import org.mmbase.util.logging.Logging; 21 import org.mmbase.util.xml.DocumentReader; 22 import org.w3c.dom.*; 23 import org.xml.sax.InputSource ; 24 25 33 public class XMLNodeReader extends DocumentReader { 34 private static final Logger log = Logging.getLoggerInstance(XMLNodeReader.class); 35 36 private ResourceLoader path; 37 38 41 public XMLNodeReader(InputSource is, ResourceLoader path) { 42 super(is, false); 43 this.path = path; 44 } 45 46 49 public String getExportSource() { 50 Node n1 = document.getDocumentElement(); 51 if (n1 != null) { 52 NamedNodeMap nm = n1.getAttributes(); 53 if (nm != null) { 54 Node n2 = nm.getNamedItem("exportsource"); 55 return (n2.getNodeValue()); 56 } 57 } 58 else { 59 log.warn("exportsource attribute missing"); 60 } 61 return null; 62 } 63 64 67 public int getTimeStamp() { 68 Node n1 = document.getFirstChild(); 69 if (n1.getNodeType() == Node.DOCUMENT_TYPE_NODE) { 70 n1 = n1.getNextSibling(); 71 } 72 if (n1 != null) { 73 NamedNodeMap nm = n1.getAttributes(); 74 if (nm != null) { 75 Node n2 = nm.getNamedItem("timestamp"); 76 try { 77 java.text.SimpleDateFormat formatter = 78 new java.text.SimpleDateFormat ("yyyyMMddhhmmss", Locale.US); 79 int times = 80 (int) (formatter.parse(n2.getNodeValue()).getTime() / 1000); 81 return times; 83 } 84 catch (java.text.ParseException e) { 85 return -1; 86 } 87 } 88 } 89 else { 90 log.warn("timestamp attribute missing"); 91 } 92 return -1; 93 } 94 95 public Vector getNodes(MMBase mmbase) { 96 Vector nodes = new Vector (); 97 Node n1 = document.getDocumentElement(); 98 while (n1 != null) { 99 MMObjectBuilder bul = mmbase.getMMObject(n1.getNodeName()); 100 if (bul == null) { 101 log.error( 102 "Can't get builder with name: '" + n1.getNodeName() + "'"); 103 } 104 else { 105 Node n2 = n1.getFirstChild(); 106 while (n2 != null) { 107 if (n2.getNodeName().equals("node")) { 108 NamedNodeMap nm = n2.getAttributes(); 109 if (nm != null) { 110 Node n4 = nm.getNamedItem("owner"); 111 MMObjectNode newNode = null; 112 if (n4 != null) { 113 newNode = bul.getNewNode(n4.getNodeValue()); 114 } else { 115 newNode = bul.getNewNode("import"); 116 } 117 n4 = nm.getNamedItem("alias"); 118 if (n4 != null) { 119 log.info("Setting alias to " + n4.getNodeValue()); 120 newNode.setAlias(n4.getNodeValue()); 121 } 122 n4 = nm.getNamedItem("number"); 123 try { 124 int num = Integer.parseInt(n4.getNodeValue()); 125 newNode.setValue("number", num); 126 } catch (Exception e) {} 127 Node n5 = n2.getFirstChild(); 128 while (n5 != null) { 129 if (n5.getNodeType() == Node.ELEMENT_NODE) { 130 String key = n5.getNodeName(); 131 NodeList nl = n5.getChildNodes(); 132 StringBuffer res = new StringBuffer (""); 133 for (int i = 0; i < nl.getLength(); i++) { 134 Node n = nl.item(i); 135 if ((n.getNodeType() == Node.TEXT_NODE) 136 || (n.getNodeType() == Node.CDATA_SECTION_NODE)) { 137 res.append(n.getNodeValue().trim()); 138 } 139 } 140 String value = res.toString(); 141 142 setValue(bul, newNode, n5, key, value); 143 } 144 n5 = n5.getNextSibling(); 145 } 146 nodes.add(newNode); 147 } 148 } 149 n2 = n2.getNextSibling(); 150 } 151 } 152 n1 = n1.getNextSibling(); 153 } 154 return nodes; 155 } 156 157 protected void setValue(MMObjectBuilder bul, MMObjectNode newNode, Node n5, String key, String value) { 158 int type = bul.getDBType(key); 159 if (type != -1) { 160 if (type == Field.TYPE_STRING || type == Field.TYPE_XML) { 161 if (value == null) { 162 value = ""; 163 } 164 newNode.setValue(key, value); 165 } else if (type == Field.TYPE_NODE) { 166 newNode.storeValue("__" + key, value); newNode.setValue(key, null); 169 } else if (type == Field.TYPE_INTEGER) { 170 try { 171 newNode.setValue(key, Integer.parseInt(value)); 172 } catch (Exception e) { 173 log.warn("error setting integer-field '" + key + "' to '" + value + "' because " + e); 174 newNode.setValue(key, -1); 175 } 176 } else if (type == Field.TYPE_FLOAT) { 177 try { 178 newNode.setValue(key, Float.parseFloat(value)); 179 } catch (Exception e) { 180 log.warn("error setting float-field '" + key + "' to '" + value + "' because " + e); 181 newNode.setValue(key, -1); 182 } 183 } else if (type == Field.TYPE_DOUBLE) { 184 try { 185 newNode.setValue(key, Double.parseDouble(value)); 186 } catch (Exception e) { 187 log.warn("error setting double-field '" + key + "' to '" + value + "' because " + e); 188 newNode.setValue(key, -1); 189 } 190 } else if (type == Field.TYPE_LONG) { 191 try { 192 newNode.setValue(key, Long.parseLong(value)); 193 } catch (Exception e) { 194 log.warn("error setting long-field '" + key + "' to '" + value + "' because " + e); 195 newNode.setValue(key, -1); 196 } 197 } else if (type == Field.TYPE_DATETIME) { 198 newNode.setValue(key, Casting.toDate(value)); 199 } else if (type == Field.TYPE_BOOLEAN) { 200 newNode.setValue(key, Casting.toBoolean(value)); 201 } else if (type == Field.TYPE_BINARY) { 202 NamedNodeMap nm2 = n5.getAttributes(); 203 Node n7 = nm2.getNamedItem("file"); 204 try { 205 newNode.setValue(key, readBytesStream(n7.getNodeValue())); 206 } catch (IOException ioe) { 207 log.warn("Could not set field " + key + " " + ioe); 208 } 209 } else { 210 log.error("CoreField not found for #" + type + " was not known for field with name: '" 211 + key + "' and with value: '" + value + "'"); 212 } 213 } 214 } 215 216 private byte[] readBytesStream(String resourceName) throws IOException { 217 InputStream stream = path.getResourceAsStream(resourceName); 218 ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 219 int c = stream.read(); 220 while (c != -1) { 221 buffer.write(c); 222 c = stream.read(); 223 } 224 return buffer.toByteArray(); 225 } 226 } 227 | Popular Tags |