| 1 10 package org.mmbase.applications.packaging.projects.creators.dataapptools; 11 12 import java.io.*; 13 import java.util.*; 14 import org.mmbase.module.core.*; 15 import org.mmbase.module.corebuilders.InsRel; 16 17 import org.mmbase.core.CoreField; 18 19 import org.mmbase.util.logging.*; 20 import org.mmbase.util.*; 21 22 26 public class NodeWriter{ 27 28 private static final Logger log = Logging.getLoggerInstance(NodeWriter.class); 30 31 private MMBase mmb; 32 private String directory; 33 private String builderName; 34 private boolean isRelationNode; 35 private File file; 36 private OutputStreamWriter fw; 37 private int nrOfNodes; 38 39 50 NodeWriter(String directory, String builderName, boolean isRelationNode) { 51 this.mmb = MMBase.getMMBase(); 53 this.directory = directory; 54 this.builderName = builderName; 55 this.isRelationNode = isRelationNode; 56 file = new File(directory + builderName + ".xml"); 58 try { 59 log.debug("Opening " + file + " for writing."); 60 fw = new OutputStreamWriter(new FileOutputStream(file), "UTF-8"); 61 } catch (Exception e) { 62 } 64 write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); 66 write("<!DOCTYPE objectset PUBLIC \"-//MMBase/DTD objectset config 1.0//EN\" \"http://www.mmbase.org/dtd/objectset_1_0.dtd\">\n"); 67 Calendar cal= Calendar.getInstance(); 68 long htimestamp=cal.get(Calendar.YEAR)*10000+ 69 (cal.get(Calendar.MONTH)+1)*100+ 70 cal.get(Calendar.DAY_OF_MONTH); 71 long ltimestamp= cal.get(Calendar.AM_PM)*120000+ 72 cal.get(Calendar.HOUR)*10000+ 73 cal.get(Calendar.MINUTE)*100+ 74 cal.get(Calendar.SECOND); 75 long timestamp=(htimestamp*1000000)+ltimestamp; 76 77 if (isRelationNode) { 78 write("<relationset type=\"" + builderName + "\" exportsource=\"mmbase://"+mmb.getHost()+"/"+mmb.getStorageManagerFactory().getCatalog()+"/"+mmb.getBaseName()+"\" timestamp=\""+timestamp+"\">\n"); 79 } else { 80 write("<objectset type=\"" + builderName + "\" exportsource=\"mmbase://"+mmb.getHost()+"/"+mmb.getStorageManagerFactory().getCatalog()+"/"+mmb.getBaseName()+"\" timestamp=\""+timestamp+"\">\n"); 81 } 82 nrOfNodes = 0; 84 } 85 86 91 public void write(MMObjectNode node) { 92 int number=node.getIntValue("number"); 94 String owner=node.getStringValue("owner"); 95 if (isRelationNode) { 97 String rtype = builderName; 102 int rnumber=node.getIntValue("rnumber"); 103 MMObjectNode reldefnode=mmb.getRelDef().getNode(rnumber); 104 if (reldefnode!=null) { 105 rtype = reldefnode.getStringValue("sname"); 106 } 107 write("\t<relation number=\""+number+"\" owner=\""+owner+"\" snumber=\""+ node.getIntValue("snumber") +"\" dnumber=\""+ node.getIntValue("dnumber") +"\" rtype=\""+ rtype +"\""); 108 if (InsRel.usesdir) { 110 int dir=node.getIntValue("dir"); 111 if (dir==1) { 112 write(" dir=\"unidirectional\""); 113 } else { 114 write(" dir=\"bidirectional\""); 115 } 116 } 117 write(">\n"); 118 } else { 119 String tm=mmb.getOAlias().getAlias(number); 121 if (tm==null) { 122 write("\t<object number=\""+number+"\" owner=\""+owner+"\">\n"); 123 } else { 124 write("\t<object number=\""+number+"\" owner=\""+owner+"\" alias=\""+tm+"\">\n"); 125 } 126 } 127 MMObjectBuilder bul = node.getBuilder(); 128 Iterator nd = bul.getFields().iterator(); 129 while (nd.hasNext()) { 130 CoreField def=(CoreField)nd.next(); 131 if (def.inStorage()) { 132 String key=def.getName(); 133 if (isRelationNode) { 134 if (!key.equals("number") && !key.equals("owner") 138 && !key.equals("otype") 139 && !key.equals("snumber") && !key.equals("dnumber") 140 && !key.equals("rnumber") && !key.equals("dir") && !def.isTemporary()) { 141 write("\t\t<field name=\""+key+"\">"+node.getValue(key)+"</field>\n"); 142 } 143 } else { 144 if (!def.isTemporary()) { 148 write(writeXMLField(key, node, directory, mmb)); 149 } 150 } 151 } 152 } 153 if (isRelationNode) { 155 write("\t</relation>\n\n"); 156 } else { 157 write("\t</object>\n\n"); 158 } 159 nrOfNodes++; 160 } 161 162 165 public void done() { 166 if (isRelationNode) { 168 write("</relationset>\n"); 169 } else { 170 write("</objectset>\n"); 171 } 172 try { 173 log.debug("Closing file " + file); 174 fw.close(); 175 } catch (Exception e) { 176 } 178 } 179 180 184 private void write(String s) { 185 try { 186 fw.write(s); 187 } catch (Exception e) { 188 } 190 } 191 192 204 private static String writeXMLField(String key,MMObjectNode node, String targetpath,MMBase mmb) { 205 if (!key.equals("number") && !key.equals("owner") && !key.equals("otype")) { 206 int type=node.getDBType(key); 208 String stype=mmb.getTypeDef().getValue(node.getIntValue("otype")); 209 if (type == CoreField.TYPE_BYTE) { 210 String body="\t\t<field name=\""+key+"\" file=\""+stype+"/"+node.getIntValue("number")+"."+key+"\" />\n"; 211 File file = new File(targetpath+stype); 212 try { 213 file.mkdirs(); 214 } catch(Exception e) { 215 log.error("Can't create dir : "+targetpath+stype); 216 } 217 byte[] value=node.getByteValue(key); 218 saveFile(targetpath+stype+"/"+node.getIntValue("number")+"."+key,value); 219 return body; 220 } else { 221 String body="\t\t<field name=\""+key+"\">"+Encode.encode("ESCAPE_XML", "" + Casting.toString(node.getValue(key))) +"</field>\n"; 222 return body; 223 } 224 } 225 return ""; 226 } 227 228 234 static boolean saveFile(String filename,byte[] value) { 235 File sfile = new File(filename); 236 try { 237 DataOutputStream scan = new DataOutputStream(new FileOutputStream(sfile)); 238 scan.write(value); 239 scan.flush(); 240 scan.close(); 241 } catch(Exception e) { 242 log.error(e.toString()); 243 log.error(Logging.stackTrace(e)); 244 return false; 245 } 246 return true; 247 } 248 249 } 250 | Popular Tags |