KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > util > XMLNodeReader


1
2 /*
3
4 This software is OSI Certified Open Source Software.
5 OSI Certified is a certification mark of the Open Source Initiative.
6
7 The license (Mozilla version 1.0) can be read at the MMBase site.
8 See http://www.MMBase.org/license
9
10 */

11 package org.mmbase.util;
12
13 import java.io.*;
14 import java.util.Locale JavaDoc;
15 import java.util.Vector JavaDoc;
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 JavaDoc;
24
25 /**
26  * This class reads a node from an exported application.
27  * @application Applications
28  * @move org.mmbase.util.xml
29  * @author Daniel Ockeloen
30  * @author Michiel Meeuwissen
31  * @version $Id: XMLNodeReader.java,v 1.41.2.1 2006/09/08 18:40:43 nklasens Exp $
32  */

33 public class XMLNodeReader extends DocumentReader {
34     private static final Logger log = Logging.getLoggerInstance(XMLNodeReader.class);
35
36     private ResourceLoader path;
37
38     /**
39      * @since MMBase-1.8
40      */

41     public XMLNodeReader(InputSource JavaDoc is, ResourceLoader path) {
42         super(is, false);
43         this.path = path;
44     }
45
46     /**
47     * get the name of this application
48      */

49     public String JavaDoc 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     /**
65      * get the name of this application
66      */

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 JavaDoc formatter =
78                   new java.text.SimpleDateFormat JavaDoc("yyyyMMddhhmmss", Locale.US);
79                     int times =
80                   (int) (formatter.parse(n2.getNodeValue()).getTime() / 1000);
81                     //int times=DateSupport.parsedatetime(n2.getNodeValue());
82
return times;
83                 }
84                 catch (java.text.ParseException JavaDoc e) {
85                     return -1;
86                 }
87             }
88         }
89         else {
90             log.warn("timestamp attribute missing");
91         }
92         return -1;
93     }
94
95     public Vector JavaDoc getNodes(MMBase mmbase) {
96         Vector JavaDoc nodes = new Vector JavaDoc();
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 JavaDoc e) {}
127                             Node n5 = n2.getFirstChild();
128                             while (n5 != null) {
129                                 if (n5.getNodeType() == Node.ELEMENT_NODE) {
130                                     String JavaDoc key = n5.getNodeName();
131                                     NodeList nl = n5.getChildNodes();
132                                     StringBuffer JavaDoc res = new StringBuffer JavaDoc("");
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 JavaDoc 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 JavaDoc key, String JavaDoc 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                 // do not really set it, because we need syncnodes later for this.
167
newNode.storeValue("__" + key, value); // yes, this is hackery, I'm sorry.
168
newNode.setValue(key, null);
169             } else if (type == Field.TYPE_INTEGER) {
170                try {
171                     newNode.setValue(key, Integer.parseInt(value));
172                 } catch (Exception JavaDoc 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 JavaDoc 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 JavaDoc 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 JavaDoc 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 JavaDoc 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