1 10 package org.mmbase.util.xml.applicationdata; 11 12 import java.io.*; 13 import java.util.*; 14 15 import org.mmbase.module.core.*; 16 import org.mmbase.module.corebuilders.*; 17 import org.mmbase.util.XMLContextDepthReader; 18 import org.mmbase.util.logging.*; 19 import org.mmbase.util.xml.ApplicationReader; 20 21 35 public class ContextDepthDataWriter { 36 37 40 private static Logger log = Logging.getLoggerInstance(ContextDepthDataWriter.class.getName()); 41 42 58 public static boolean writeContext(ApplicationReader app, XMLContextDepthReader capp,String targetpath, 59 MMBase mmb, Logger logger) throws IOException { 60 int startnode=getStartNode(capp,mmb); 62 if (startnode==-1) { 63 return false; 64 } 65 int depth=capp.getDepth(); 67 if (depth==-1) { 68 return false; 69 } 70 HashSet fb=getFilterBuilders(app.getNeededBuilders(),mmb.getTypeDef()); 72 73 HashSet relnodes = new HashSet(); 75 HashSet nodes = new HashSet(); 76 getSubNodes(startnode,depth,fb, nodes,relnodes,mmb); 77 78 logger.info("Context found : "+nodes.size()+" nodes in application, "+relnodes.size()+" relations."); 79 80 File file = new File(targetpath+"/"+app.getName()); 82 file.mkdirs(); 83 writeDataSources(app,nodes,targetpath,mmb,logger); 85 writeRelationSources(app,relnodes,targetpath,mmb,logger); 87 88 return true; 89 } 90 91 99 static void writeDataSources(ApplicationReader app, HashSet nodes, String targetpath,MMBase mmb, Logger logger) { 100 writeNodes(app, nodes, targetpath, mmb, logger, false); 101 } 102 103 104 112 static void writeRelationSources(ApplicationReader app, HashSet nodes, String targetpath,MMBase mmb, Logger logger) { 113 writeNodes(app, nodes, targetpath, mmb, logger, true); 114 } 115 116 125 static void writeNodes(ApplicationReader app, HashSet nodes, String targetpath, MMBase mmb, Logger logger, 126 boolean isRelation) { 127 128 List list = new Vector(); 135 list.addAll(nodes); 136 Collections.sort(list, new Comparator(){ 137 public int compare(Object o1, Object o2) { 138 return ((Integer )o1).compareTo((Integer )o2); 139 } 140 } 141 ); 142 Iterator res; 145 if (isRelation) { 146 res = app.getRelationSources().iterator(); 147 } else { 148 res = app.getDataSources().iterator(); 149 } 150 String subtargetpath=targetpath+"/"+app.getName()+"/"; 152 153 Hashtable nodeWriters = new Hashtable(); 155 while (res.hasNext()) { 156 Hashtable bset = (Hashtable)res.next(); String name = (String ) bset.get("builder"); 158 159 NodeWriter nw = new NodeWriter(mmb, logger, subtargetpath, name, isRelation); 161 nodeWriters.put(name, nw); 163 } 164 MMObjectBuilder bul = mmb.getMMObject("typedef"); int nrofnodes=0; for (Iterator nods=list.iterator(); nods.hasNext(); ) { 168 int nr = ((Integer )nods.next()).intValue(); 170 MMObjectNode node = bul.getNode(nr); 171 String name = node.getName(); 172 NodeWriter nodeWriter = (NodeWriter)nodeWriters.get(name); 173 if (nodeWriter!=null) { 175 nodeWriter.write(node); 176 nrofnodes++; 177 } 178 } 183 184 for (Enumeration e = nodeWriters.keys(); e.hasMoreElements();) { 186 String name = (String )e.nextElement(); 187 NodeWriter nodeWriter; 188 nodeWriter = (NodeWriter)nodeWriters.get(name); 189 nodeWriter.done(); 190 } 191 } 192 193 199 static int getRelatedNode(int nodeNumber, MMObjectNode relationNode) { 200 int snumber = relationNode.getIntValue("snumber"); if (snumber == nodeNumber) { 202 return relationNode.getIntValue("dnumber"); } else { 204 return snumber; 205 } 206 } 207 208 222 223 static void getSubNodes(int startnodenr, int maxdepth, HashSet fb, HashSet nodesdoneSet, HashSet relationnodesSet,MMBase mmb) { 224 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; 232 } 233 nodesSet_next.add(new Integer (startnodenr)); for (int curdepth=1;curdepth<=maxdepth;curdepth++) { 236 nodesSet_current = nodesSet_next; nodesSet_next = new HashSet(); 239 nodesdoneSet.addAll(nodesSet_current); 243 for (Iterator curlist=nodesSet_current.iterator(); curlist.hasNext();) { 245 Integer thisnodenr = (Integer )curlist.next(); 247 for (Iterator rel=bul.getRelationsVector(thisnodenr.intValue()).iterator(); rel.hasNext();) { 250 MMObjectNode relnode=(MMObjectNode)rel.next(); 252 Integer relnumber=new Integer (relnode.getIntValue("number")); 253 if (!relationnodesSet.contains(relnumber)) { 257 int nodenumber=getRelatedNode(thisnodenr.intValue(),relnode); 259 type = new Integer (bul.getNodeType(nodenumber)); 261 if (fb.contains(type)) { relationnodesSet.add(relnumber); 264 Integer nodeNumber=new Integer (nodenumber); 266 if (!nodesdoneSet.contains(nodeNumber)) { 267 nodesSet_next.add(nodeNumber); 269 } 270 } 271 } 272 } 273 } 274 } 275 nodesdoneSet.addAll(nodesSet_next); 277 return; 278 } 279 280 287 static HashSet getFilterBuilders(Vector filter,TypeDef bul) { 288 HashSet resultset=new HashSet(); 289 for(Iterator res=filter.iterator(); res.hasNext(); ) { 290 Hashtable bset=(Hashtable)res.next(); 291 String name=(String )bset.get("name"); 292 int value=bul.getIntValue(name); 293 if (value!=-1) { 294 resultset.add(new Integer (value)); 295 } else { 296 log.error("XMLContextDepthWriter -> can't get intvalue for : "+name); 297 } 298 } 299 return resultset; 300 } 301 302 303 310 static int getStartNode(XMLContextDepthReader capp, MMBase mmb) { 311 String alias=capp.getStartAlias(); 313 if (alias!=null) { 314 OAlias bul=(OAlias)mmb.getMMObject("oalias"); 316 int number=bul.getNumber(alias); 317 if (number==-1) log.error("Invalid Start Node Alias please make sure its valid"); 318 return number; 319 } else { 320 String builder=capp.getStartBuilder(); 322 String where=capp.getStartWhere(); 323 MMObjectBuilder bul=mmb.getMMObject(builder); 325 if (bul!=null) { 326 Enumeration results=bul.search(where); 328 if (results.hasMoreElements()) { 330 MMObjectNode node=(MMObjectNode)results.nextElement(); 332 return node.getIntValue("number"); 333 } 334 } else { 335 log.error("ContextDepthWriter-> can't find builder ("+builder+")"); 336 } 337 } 338 log.error("Invalid Start Node please fix your 'where' settings or use a alias"); 339 return -1; 340 } 341 342 348 static boolean saveFile(String filename,String value) { 349 File sfile = new File(filename); 350 try { 351 DataOutputStream scan = new DataOutputStream(new FileOutputStream(sfile)); 352 scan.writeBytes(value); 353 scan.flush(); 354 scan.close(); 355 } catch(Exception e) { 356 log.error(e); 357 log.error(Logging.stackTrace(e)); 358 return false; 359 } 360 return true; 361 } 362 363 369 static boolean saveFile(String filename,byte[] value) { 370 File sfile = new File(filename); 371 try { 372 DataOutputStream scan = new DataOutputStream(new FileOutputStream(sfile)); 373 scan.write(value); 374 scan.flush(); 375 scan.close(); 376 } catch(Exception e) { 377 log.error(e); 378 log.error(Logging.stackTrace(e)); 379 return false; 380 } 381 return true; 382 } 383 384 390 public static boolean writeContextXML(XMLContextDepthReader capp,String filename) { 391 String body="<contextdepth>\n"; 392 String alias=capp.getStartAlias(); 393 if (alias!=null) { 394 body+="\t<startnode alias=\""+alias+"\" />\n"; 395 } else { 396 body+="\t<startnode>\n"; 397 body+="\t\t<builder>"+capp.getStartBuilder()+"</builder>\n"; 398 body+="\t\t<where>"+capp.getStartWhere()+"</where>\n"; 399 body+="\t</startnode>\n\n"; 400 } 401 body+="\t<depth>"+capp.getDepth()+"</depth>\n"; 402 body+="</contextdepth>\n"; 403 saveFile(filename,body); 404 return true; 405 } 406 407 } 408 | Popular Tags |