1 10 package org.mmbase.util.xml.applicationdata; 11 12 import java.io.*; 13 import java.util.*; 14 15 import org.mmbase.bridge.Field; 16 import org.mmbase.core.CoreField; 17 import org.mmbase.module.core.*; 18 import org.mmbase.module.corebuilders.*; 19 import org.mmbase.util.logging.*; 20 import org.mmbase.util.Casting; 21 import org.mmbase.util.Encode; 22 23 31 public class NodeWriter { 32 33 private static final Logger log = Logging.getLoggerInstance(NodeWriter.class); 34 35 private MMBase mmb; 36 private Logger logger; 37 private String directory; 38 private String builderName; 39 private boolean isRelationNode; 40 private File file; 41 private OutputStreamWriter fw; 42 private int nrOfNodes; 43 44 56 NodeWriter(MMBase mmb, Logger logger, String directory, 57 String builderName, boolean isRelationNode) { 58 this.mmb = mmb; 60 this.logger = logger; 61 this.directory = directory; 62 this.builderName = builderName; 63 this.isRelationNode = isRelationNode; 64 file = new File(directory + builderName + ".xml"); 66 try { 67 log.debug("Opening " + file + " for writing."); 68 fw = new OutputStreamWriter(new FileOutputStream(file), "UTF-8"); 69 } catch (Exception e) { 70 logger.error("Failed opening file " + file); 71 } 72 write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"); 74 Calendar cal= Calendar.getInstance(); 76 long htimestamp=cal.get(Calendar.YEAR)*10000+ 77 (cal.get(Calendar.MONTH)+1)*100+ 78 cal.get(Calendar.DAY_OF_MONTH); 79 long ltimestamp= cal.get(Calendar.AM_PM)*120000+ 80 cal.get(Calendar.HOUR)*10000+ 81 cal.get(Calendar.MINUTE)*100+ 82 cal.get(Calendar.SECOND); 83 long timestamp=(htimestamp*1000000)+ltimestamp; 84 85 write("<" + builderName + " " 86 + "exportsource=\"mmbase://"+ mmb.getHost()+"/"+mmb.getStorageManagerFactory().getCatalog()+"/"+mmb.getBaseName()+"\" "+ 88 "timestamp=\""+timestamp+"\">\n"); nrOfNodes = 0; 91 } 92 93 98 public void write(MMObjectNode node) { 99 int number=node.getIntValue("number"); 101 String owner=node.getStringValue("owner"); 102 if (isRelationNode) { 104 String rtype = builderName; 109 int rnumber=node.getIntValue("rnumber"); 110 MMObjectNode reldefnode=mmb.getRelDef().getNode(rnumber); 111 if (reldefnode!=null) { 112 rtype = reldefnode.getStringValue("sname"); 113 } 114 write("\t<node number=\""+number+"\" owner=\""+owner+"\" snumber=\""+ node.getIntValue("snumber") +"\" dnumber=\""+ node.getIntValue("dnumber") +"\" rtype=\""+ rtype +"\""); 115 if (InsRel.usesdir) { 117 int dir=node.getIntValue("dir"); 118 if (dir==1) { 119 write(" dir=\"unidirectional\""); 120 } else { 121 write(" dir=\"bidirectional\""); 122 } 123 } 124 write(">\n"); 125 } else { 126 String tm = mmb.getOAlias().getAlias(number); 128 if (tm == null) { 129 write("\t<node number=\"" + number+"\" owner=\"" + owner + "\">\n"); 130 } else { 131 write("\t<node number=\"" + number+"\" owner=\"" + owner + "\" alias=\"" + tm + "\">\n"); 132 } 133 } 134 MMObjectBuilder bul = node.getBuilder(); 135 Iterator nd = bul.getFields().iterator(); 136 while (nd.hasNext()) { 137 CoreField def = (CoreField)nd.next(); 138 if (def.inStorage()) { 139 String key = def.getName(); 140 if (isRelationNode) { 141 if (!key.equals("number") && !key.equals("owner") 145 && !key.equals("otype") 146 && !key.equals("snumber") && !key.equals("dnumber") 147 && !key.equals("rnumber") && !key.equals("dir") && !def.isTemporary()) { 148 write("\t\t<" + key + ">" + node.getValue(key) + "</" + key + ">\n"); 149 } 150 } else { 151 if (!def.isTemporary()) { 155 write(writeXMLField(key, node, directory, mmb)); 156 } 157 } 158 } 159 } 160 write("\t</node>\n\n"); 162 nrOfNodes++; 163 } 164 165 168 public void done() { 169 write("</"+ builderName + ">\n"); 171 logger.info("Saving " + nrOfNodes + " " + builderName 172 + " to : " + file); 173 try { 174 log.debug("Closing file " + file); 175 fw.close(); 176 } catch (Exception e) { 177 logger.error("Failed closing file " + file); 178 } 179 } 180 181 185 private void write(String s) { 186 try { 187 fw.write(s); 188 } catch (Exception e) { 189 logger.error("Failed writing to file " + file); 190 } 191 } 192 193 205 private static String writeXMLField(String key,MMObjectNode node, String targetpath,MMBase mmb) { 206 if (!key.equals("number") && !key.equals("owner") && !key.equals("otype")) { 207 int type=node.getDBType(key); 209 String stype=mmb.getTypeDef().getValue(node.getIntValue("otype")); 210 if (type==Field.TYPE_BINARY) { 211 String body="\t\t<"+key+" file=\""+stype+"/"+node.getIntValue("number")+"."+key+"\" />\n"; 212 File file = new File(targetpath+stype); 213 try { 214 file.mkdirs(); 215 } catch(Exception e) { 216 log.error("Can't create dir : "+targetpath+stype); 217 } 218 byte[] value=node.getByteValue(key); 219 saveFile(targetpath+stype+"/"+node.getIntValue("number")+"."+key,value); 220 return body; 221 } else { 222 String body="\t\t<"+key+">"+Encode.encode("ESCAPE_XML", "" + Casting.toString(node.getValue(key))) +"</"+key+">\n"; 223 return body; 224 } 225 } 226 return ""; 227 } 228 229 235 static boolean saveFile(String filename,byte[] value) { 236 File sfile = new File(filename); 237 try { 238 DataOutputStream scan = new DataOutputStream(new FileOutputStream(sfile)); 239 scan.write(value); 240 scan.flush(); 241 scan.close(); 242 } catch(Exception e) { 243 log.error(e.toString()); 244 log.error(Logging.stackTrace(e)); 245 return false; 246 } 247 return true; 248 } 249 } 250 | Popular Tags |