| 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.util.logging.*; 16 17 import org.mmbase.module.corebuilders.*; 18 import org.mmbase.applications.packaging.projects.*; 19 20 22 public class Apps1DataWriter { 23 24 27 private static Logger log = Logging.getLoggerInstance(Apps1DataWriter.class.getName()); 28 29 public static boolean write(HashSet fb,String alias,String builder,String where,int depth,String datafile,String datapath,Target target) { 30 31 int startnode = getStartNode(alias,builder,where); 32 33 HashSet relnodes = new HashSet(); 35 HashSet nodes = new HashSet(); 36 getSubNodes(startnode,depth,fb, nodes,relnodes); 37 38 writeDataXML(fb,datafile,target); 39 writeNodes(fb,nodes,relnodes,datapath); 40 41 51 52 return true; 53 } 54 55 static void writeNodes(HashSet builders,HashSet nodes,HashSet relnodes, String targetpath) { 56 57 Hashtable nodeWriters = new Hashtable(); 59 Iterator res = builders.iterator(); 60 while (res.hasNext()) { 61 Integer i = (Integer )res.next(); 62 String nb = MMBase.getMMBase().getTypeDef().getValue(i.intValue()); 63 MMObjectBuilder bul=MMBase.getMMBase().getMMObject(nb); 64 boolean isRelation = false; 65 if (bul instanceof InsRel) isRelation = true; 66 NodeWriter nw = new NodeWriter(targetpath, nb, isRelation); 68 nodeWriters.put(nb,nw); 70 } 71 72 MMObjectBuilder bul = MMBase.getMMBase().getMMObject("typedef"); int nrofnodes=0; for (Iterator nods=nodes.iterator(); nods.hasNext(); ) { 76 int nr = ((Integer )nods.next()).intValue(); 78 MMObjectNode node = bul.getNode(nr); 79 String name = node.getName(); 80 NodeWriter nodeWriter = (NodeWriter)nodeWriters.get(name); 81 if (nodeWriter!=null) { 83 nodeWriter.write(node); 84 nrofnodes++; 85 } else { 86 log.info("error missing nodeWriter : "+name); 87 } 88 } 89 90 for (Iterator nods=relnodes.iterator(); nods.hasNext(); ) { 91 int nr = ((Integer )nods.next()).intValue(); 93 MMObjectNode node = bul.getNode(nr); 94 String name = node.getName(); 95 NodeWriter nodeWriter = (NodeWriter)nodeWriters.get(name); 96 if (nodeWriter!=null) { 98 nodeWriter.write(node); 99 nrofnodes++; 100 } else { 101 log.info("error missing nodeWriter : "+name); 102 } 103 } 104 105 for (Enumeration e = nodeWriters.keys(); e.hasMoreElements();) { 107 String name = (String )e.nextElement(); 108 NodeWriter nodeWriter; 109 nodeWriter = (NodeWriter)nodeWriters.get(name); 110 nodeWriter.done(); 111 } 112 } 113 114 120 static int getRelatedNode(int nodeNumber, MMObjectNode relationNode) { 121 int snumber = relationNode.getIntValue("snumber"); if (snumber == nodeNumber) { 123 return relationNode.getIntValue("dnumber"); } else { 125 return snumber; 126 } 127 } 128 129 static void getSubNodes(int startnodenr, int maxdepth, HashSet fb, HashSet nodesdoneSet, HashSet relationnodesSet) { 130 MMBase mmb=MMBase.getMMBase(); 131 HashSet nodesSet_current = null; HashSet nodesSet_next = new HashSet(); InsRel bul = mmb.getInsRel(); Integer type = new Integer (bul.getNodeType(startnodenr)); if (!fb.contains(type)) { return; 139 } 140 nodesSet_next.add(new Integer (startnodenr)); for (int curdepth=1;curdepth<=maxdepth;curdepth++) { 143 nodesSet_current = nodesSet_next; nodesSet_next = new HashSet(); 146 nodesdoneSet.addAll(nodesSet_current); 150 for (Iterator curlist=nodesSet_current.iterator(); curlist.hasNext();) { 152 Integer thisnodenr = (Integer )curlist.next(); 154 for (Iterator rel=bul.getRelationsVector(thisnodenr.intValue()).iterator(); rel.hasNext();) { 157 MMObjectNode relnode=(MMObjectNode)rel.next(); 159 Integer relnumber=new Integer (relnode.getIntValue("number")); 160 if (!relationnodesSet.contains(relnumber)) { 164 int nodenumber=getRelatedNode(thisnodenr.intValue(),relnode); 166 type = new Integer (bul.getNodeType(nodenumber)); 168 if (fb.contains(type)) { relationnodesSet.add(relnumber); 171 Integer nodeNumber=new Integer (nodenumber); 173 if (!nodesdoneSet.contains(nodeNumber)) { 174 nodesSet_next.add(nodeNumber); 176 } 177 } 178 } 179 } 180 } 181 } 182 nodesdoneSet.addAll(nodesSet_next); 184 return; 185 } 186 187 203 204 205 static int getStartNode(String alias,String builder,String where) { 206 if (alias!=null) { 208 OAlias bul=(OAlias)MMBase.getMMBase().getMMObject("oalias"); 210 int number=bul.getNumber(alias); 211 if (number==-1) log.error("Invalid Start Node Alias please make sure its valid"); 212 return number; 213 } else { 214 216 MMObjectBuilder bul=MMBase.getMMBase().getMMObject(builder); 218 if (bul!=null) { 219 Enumeration results=bul.search(where); 221 if (results.hasMoreElements()) { 223 MMObjectNode node=(MMObjectNode)results.nextElement(); 225 return node.getIntValue("number"); 226 } 227 } else { 228 log.error("ContextDepthWriter-> can't find builder ("+builder+")"); 229 } 230 } 231 log.error("Invalid Start Node please fix your 'where' settings or use a alias"); 232 return -1; 233 } 234 235 241 static boolean saveFile(String filename,String value) { 242 File sfile = new File(filename); 243 try { 244 DataOutputStream scan = new DataOutputStream(new FileOutputStream(sfile)); 245 scan.writeBytes(value); 246 scan.flush(); 247 scan.close(); 248 } catch(Exception e) { 249 log.error(e); 250 log.error(Logging.stackTrace(e)); 251 return false; 252 } 253 return true; 254 } 255 256 262 static boolean saveFile(String filename,byte[] value) { 263 File sfile = new File(filename); 264 try { 265 DataOutputStream scan = new DataOutputStream(new FileOutputStream(sfile)); 266 scan.write(value); 267 scan.flush(); 268 scan.close(); 269 } catch(Exception e) { 270 log.error(e); 271 log.error(Logging.stackTrace(e)); 272 return false; 273 } 274 return true; 275 } 276 277 public static boolean writeDataXML(HashSet fb,String datafile,Target target) { 278 String body="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; 279 body+="<!DOCTYPE dataset PUBLIC \"-//MMBase/DTD dataset config 1.0//EN\" \"http://www.mmbase.org/dtd/dataset_1_0.dtd\">\n"; 280 body+="<dataset>\n"; 281 288 body+="\t<objectsets>\n"; 289 Iterator res = fb.iterator(); 290 while (res.hasNext()) { 291 Integer i = (Integer )res.next(); 292 String nb = MMBase.getMMBase().getTypeDef().getValue(i.intValue()); 293 MMObjectBuilder bul=MMBase.getMMBase().getMMObject(nb); 294 if (!(bul instanceof InsRel)) { 295 body+="\t\t<objectset builder=\""+nb+"\" path=\"data/"+nb+".xml\" />\n"; 296 } 297 } 298 body+="\t</objectsets>\n"; 299 body+="\t<relationsets>\n"; 300 res = fb.iterator(); 301 while (res.hasNext()) { 302 Integer i = (Integer )res.next(); 303 String nb = MMBase.getMMBase().getTypeDef().getValue(i.intValue()); 304 MMObjectBuilder bul=MMBase.getMMBase().getMMObject(nb); 305 if (bul instanceof InsRel) { 306 body+="\t\t<relationset builder=\""+nb+"\" path=\"data/"+nb+".xml\" />\n"; 307 } 308 } 309 body+="\t</relationsets>\n"; 310 String type=(String )target.getItem("type"); 311 body+="\t<selection type=\""+type+"\">\n"; 312 if (type.equals("depth")) { 313 body+="\t\t<model name=\""+target.getItem("depthname")+"\" maintainer=\""+target.getItem("depthmaintainer")+"\" version=\""+target.getItem("depthversion")+"\" />\n"; 314 String alias=(String )target.getItem("depthalias"); 315 if (alias!=null && !alias.equals("")) { 316 body+="\t\t<startnode alias=\""+alias+"\">\n"; 317 } else { 318 body+="\t\t<startnode>\n"; 319 } 320 String builder=(String )target.getItem("depthbuilder"); 321 if (builder!=null && !builder.equals("")) { 322 body+="\t\t\t<builder>"+builder+"</builder>\n"; 323 body+="\t\t\t<where>"+target.getItem("depthwhere")+"</where>\n"; 324 } 325 body+="\t\t</startnode>\n"; 326 body+="\t\t<depth>"+target.getItem("depth")+"</depth>\n"; 327 } 328 body+="\t</selection>\n"; 329 body+="</dataset>\n"; 330 saveFile(datafile,body); 331 return true; 332 } 333 334 } 335 | Popular Tags |