1 14 package org.compiere.model; 15 16 import java.sql.*; 17 import java.util.*; 18 import javax.sql.*; 19 20 import org.compiere.util.*; 21 22 29 public class MTree extends X_AD_Tree 30 { 31 38 public MTree (Properties ctx, int AD_Tree_ID, boolean editable) 39 { 40 super(ctx, AD_Tree_ID); 41 log.info("AD_Tree_ID=" + AD_Tree_ID + ", Editable=" + editable); 42 m_editable = editable; 43 44 int AD_User_ID = Env.getContextAsInt(ctx, "AD_User_ID"); 45 loadNodes(AD_User_ID); 46 } 48 49 private boolean m_editable; 50 51 private String m_nodeTableName = "AD_TreeNode"; 52 53 private MTreeNode m_root = null; 54 55 private ArrayList m_buffer = new ArrayList(); 56 57 private RowSet m_nodeRowSet; 58 59 60 61 67 public static int getAD_Tree_ID (String keyColumnName) 68 { 69 Log.trace(Log.l4_Data, "MTree.getAD_Tree_ID", keyColumnName); 70 if (keyColumnName == null || keyColumnName.length() == 0) 71 return 0; 72 73 String TreeType = null; 74 if (keyColumnName.equals("AD_Menu_ID")) 75 TreeType = TREETYPE_Menu; 76 else if (keyColumnName.equals("C_ElementValue_ID")) 77 TreeType = TREETYPE_ElementValueAccountEtc; 78 else if (keyColumnName.equals("M_Product_ID")) 79 TreeType = TREETYPE_Product; 80 else if (keyColumnName.equals("C_BPartner_ID")) 81 TreeType = TREETYPE_BusPartner; 82 else if (keyColumnName.equals("AD_Org_ID")) 83 TreeType = TREETYPE_Organization; 84 else if (keyColumnName.equals("C_Project_ID")) 85 TreeType = TREETYPE_Project; 86 else if (keyColumnName.equals("M_ProductCategory_ID")) 87 TreeType = TREETYPE_ProductCategory; 88 else if (keyColumnName.equals("M_BOM_ID")) 89 TreeType = TREETYPE_BoM; 90 else if (keyColumnName.equals("C_SalesRegion_ID")) 91 TreeType = TREETYPE_SalesRegion; 92 else if (keyColumnName.equals("C_Campaign_ID")) 93 TreeType = TREETYPE_Campaign; 94 else if (keyColumnName.equals("C_Activity_ID")) 95 TreeType = TREETYPE_Activity; 96 else 97 { 98 Log.error("MTree.getAD_Tree_ID - Could not map " + keyColumnName); 99 return 0; 100 } 101 102 int AD_Tree_ID = 0; 103 int AD_Client_ID = Env.getContextAsInt(Env.getCtx(), "#AD_Client_ID"); 104 String sql = "SELECT AD_Tree_ID,Name FROM AD_Tree " 105 + "WHERE AD_Client_ID=? AND TreeType=? AND IsActive='Y'"; 106 try 107 { 108 PreparedStatement pstmt = DB.prepareStatement(sql); 109 pstmt.setInt(1, AD_Client_ID); 110 pstmt.setString(2, TreeType); 111 ResultSet rs = pstmt.executeQuery(); 112 if (rs.next()) 113 AD_Tree_ID = rs.getInt(1); 114 rs.close(); 115 pstmt.close(); 116 } 117 catch (SQLException e) 118 { 119 Log.error("MTree.getAD_Tree_ID", e); 120 } 121 122 return AD_Tree_ID; 123 } 125 126 132 public static MTree getTree (Properties ctx, String TreeType) 133 { 134 int AD_Tree_ID = 0; 135 int AD_Client_ID = Env.getContextAsInt(Env.getCtx(), "#AD_Client_ID"); 136 String sql = "SELECT AD_Tree_ID,Name FROM AD_Tree " 137 + "WHERE AD_Client_ID=? AND TreeType=? AND IsActive='Y'"; 138 try 139 { 140 PreparedStatement pstmt = DB.prepareStatement(sql); 141 pstmt.setInt(1, AD_Client_ID); 142 pstmt.setString(2, TreeType); 143 ResultSet rs = pstmt.executeQuery(); 144 if (rs.next()) 145 AD_Tree_ID = rs.getInt(1); 146 rs.close(); 147 pstmt.close(); 148 } 149 catch (SQLException e) 150 { 151 Log.error("MTree.getTree", e); 152 } 153 if (AD_Tree_ID == 0) 155 { 156 Log.trace(Log.l4_Data, "MTree.getTree - No AD_Tree_ID for TreeType=" + TreeType + ", AD_Client_ID=" + AD_Client_ID); 157 return null; 158 } 159 MTree tree = new MTree (ctx, AD_Tree_ID, false); 161 return tree; 162 } 164 165 171 private void loadNodes (int AD_User_ID) 172 { 173 if (getTreeType().equals(TREETYPE_Menu)) 175 ; else if (getTreeType().equals(TREETYPE_BusPartner)) 177 m_nodeTableName += "BP"; 178 else if (getTreeType().equals(TREETYPE_Product)) 179 m_nodeTableName += "PR"; 180 181 StringBuffer cmd = new StringBuffer ("SELECT " 183 + "tn.Node_ID,tn.Parent_ID,tn.SeqNo,tb.IsActive " 184 + "FROM ").append(m_nodeTableName).append(" tn" 185 + " LEFT OUTER JOIN AD_TreeBar tb ON (tn.AD_Tree_ID=tb.AD_Tree_ID" 186 + " AND tn.Node_ID=tb.Node_ID AND tb.AD_User_ID=?) " + "WHERE tn.AD_Tree_ID=?"); if (!m_editable) 189 cmd.append(" AND tn.IsActive='Y'"); 190 cmd.append(" ORDER BY COALESCE(tn.Parent_ID, -1), tn.SeqNo"); 191 Log.trace(Log.l6_Database, "MTree.loadNodes", cmd.toString()); 192 193 try 195 { 196 getNodeDetails(); 198 PreparedStatement pstmt = DB.prepareStatement(cmd.toString()); 200 pstmt.setInt(1, AD_User_ID); 201 pstmt.setInt(2, getAD_Tree_ID()); 202 ResultSet rs = pstmt.executeQuery(); 204 while (rs.next()) 205 { 206 int node_ID = rs.getInt(1); 207 int parent_ID = rs.getInt(2); 208 int seqNo = rs.getInt(3); 209 boolean onBar = (rs.getString(4) != null); 210 if (node_ID == 0 && parent_ID == 0) 212 m_root = new MTreeNode (node_ID, 0, getName(), getDescription(), 0, true, null, onBar); 213 else 214 addToTree (node_ID, parent_ID, seqNo, onBar); } 216 rs.close(); 217 pstmt.close(); 218 m_nodeRowSet.close(); 220 m_nodeRowSet = null; 221 } 222 catch (SQLException e) 223 { 224 Log.error("MTree.loadNodes", e); 225 m_nodeRowSet = null; 226 } 227 228 if (m_buffer.size() != 0) 230 { 231 Log.trace(Log.l6_Database, "MTree.loadNodes - clearing buffer"); 232 for (int i = 0; i < m_buffer.size(); i++) 233 { 234 MTreeNode node = (MTreeNode)m_buffer.get(i); 235 MTreeNode parent = m_root.findNode(node.getParent_ID()); 236 if (parent != null && parent.getAllowsChildren()) 237 { 238 parent.add(node); 239 checkBuffer(node); 240 m_buffer.remove(i); 241 i = -1; 242 } 243 } 244 } 245 246 if (m_buffer.size() != 0) 248 { 249 Log.error ("MTree.loadNodes - Nodes w/o parent - adding to root - " + m_buffer); 250 for (int i = 0; i < m_buffer.size(); i++) 251 { 252 MTreeNode node = (MTreeNode)m_buffer.get(i); 253 m_root.add(node); 254 checkBuffer(node); 255 m_buffer.remove(i); 256 i = -1; 257 } 258 if (m_buffer.size() != 0) 259 Log.error ("MTree.loadNodes - still nodes in Buffer - " + m_buffer); 260 } 262 if (!m_editable && m_root.getChildCount() > 0) 264 trimTree(); 265 } 268 276 private void addToTree (int node_ID, int parent_ID, int seqNo, boolean onBar) 277 { 278 MTreeNode child = getNodeDetail (node_ID, parent_ID, seqNo, onBar); 280 if (child == null) 281 return; 282 283 MTreeNode parent = null; 285 if (m_root != null) 286 parent = m_root.findNode (parent_ID); 287 if (parent != null && parent.getAllowsChildren()) 289 { 290 parent.add(child); 291 if (m_buffer.size() > 0) 293 checkBuffer(child); 294 } 295 else 296 m_buffer.add(child); 297 } 299 303 private void checkBuffer (MTreeNode newNode) 304 { 305 for (int i = 0; i < m_buffer.size(); i++) 306 { 307 MTreeNode node = (MTreeNode)m_buffer.get(i); 308 if (node.getParent_ID() == newNode.getID()) 309 { 310 newNode.add(node); 311 m_buffer.remove(i); 312 i--; 313 } 314 } 315 } 317 318 319 334 private void getNodeDetails () 335 { 336 StringBuffer sqlNode = new StringBuffer (); 338 String sourceTable = null; 339 if (getTreeType().equals(TREETYPE_Menu)) 340 { 341 boolean base = Env.isBaseLanguage(Env.getCtx(), "AD_Menu"); 342 sourceTable = "m"; 343 if (base) 344 sqlNode.append("SELECT m.AD_Menu_ID, m.Name,m.Description,m.IsSummary,m.Action, " 345 + "m.AD_Window_ID, m.AD_Process_ID, m.AD_Form_ID, m.AD_Workflow_ID, m.AD_Task_ID, m.AD_Workbench_ID " 346 + "FROM AD_Menu m"); 347 else 348 sqlNode.append("SELECT m_AD_Menu_ID, t.Name,t.Description,m.IsSummary,m.Action, " 349 + "m.AD_Window_ID, m.AD_Process_ID, m.AD_Form_ID, m.AD_Workflow_ID, m.AD_Task_ID, m.AD_Workbench_ID " 350 + "FROM AD_Menu m, AD_Menu_Trl t"); 351 if (!base) 352 sqlNode.append(" WHERE m.AD_Menu_ID=t.AD_Menu_ID AND t.AD_Language='") 353 .append(Env.getAD_Language(Env.getCtx())).append("'"); 354 if (!m_editable) 355 { 356 boolean hasWhere = sqlNode.indexOf(" WHERE ") != -1; 357 sqlNode.append(hasWhere ? " AND " : " WHERE ").append(" m.IsActive='Y' "); 358 } 359 } 360 else 361 { 362 if (getTreeType().equals(TREETYPE_Organization)) 363 sourceTable = "AD_Org"; 364 else if (getTreeType().equals(TREETYPE_Product)) 365 sourceTable = "M_Product"; 366 else if (getTreeType().equals(TREETYPE_ProductCategory)) 367 sourceTable = "M_Product_Category"; 368 else if (getTreeType().equals(TREETYPE_BoM)) 369 sourceTable = "M_BOM"; 370 else if (getTreeType().equals(TREETYPE_ElementValueAccountEtc)) 371 sourceTable = "C_ElementValue"; 372 else if (getTreeType().equals(TREETYPE_BusPartner)) 373 sourceTable = "C_BPartner"; 374 else if (getTreeType().equals(TREETYPE_Campaign)) 375 sourceTable = "C_Campaign"; 376 else if (getTreeType().equals(TREETYPE_Project)) 377 sourceTable = "C_Project"; 378 else if (getTreeType().equals(TREETYPE_Activity)) 379 sourceTable = "C_Activity"; 380 else if (getTreeType().equals(TREETYPE_SalesRegion)) 381 sourceTable = "C_SalesRegion"; 382 if (sourceTable == null) 383 { 384 throw new IllegalArgumentException ("MTree.prepareNodeDetail - Unknown TreeType=" + getTreeType()); 385 } 386 sqlNode.append("SELECT ").append(sourceTable).append("_ID,Name,Description,IsSummary,NULL FROM ") 387 .append(sourceTable); 388 if (!m_editable) 389 sqlNode.append(" WHERE IsActive='Y'"); 390 } 391 String sql = MRole.getDefault(getCtx(), false).addAccessSQL(sqlNode.toString(), 392 sourceTable, MRole.SQL_FULLYQUALIFIED, m_editable); 393 log.debug("getNodeDetails - " + sql); 394 m_nodeRowSet = DB.getRowSet (sql); 395 } 397 406 private MTreeNode getNodeDetail (int node_ID, int parent_ID, int seqNo, boolean onBar) 407 { 408 MTreeNode retValue = null; 409 try 410 { 411 m_nodeRowSet.beforeFirst(); 412 while (m_nodeRowSet.next()) 413 { 414 int node = m_nodeRowSet.getInt(1); 415 if (node_ID != node) continue; 417 int index = 2; 419 String name = m_nodeRowSet.getString(index++); 420 String description = m_nodeRowSet.getString(index++); 421 boolean isSummary = "Y".equals(m_nodeRowSet.getString(index++)); 422 String action = m_nodeRowSet.getString(index++); 423 if (getTreeType().equals(TREETYPE_Menu) && !isSummary) 425 { 426 int AD_Window_ID = m_nodeRowSet.getInt(index++); 427 int AD_Process_ID = m_nodeRowSet.getInt(index++); 428 int AD_Form_ID = m_nodeRowSet.getInt(index++); 429 int AD_Workflow_ID = m_nodeRowSet.getInt(index++); 430 int AD_Task_ID = m_nodeRowSet.getInt(index++); 431 int AD_Workbench_ID = m_nodeRowSet.getInt(index++); 432 MRole role = MRole.getDefault(getCtx(), false); 434 Boolean access = null; 435 if (X_AD_Menu.ACTION_Window.equals(action)) 436 access = role.getWindowAccess(AD_Window_ID); 437 else if (X_AD_Menu.ACTION_Process.equals(action) || X_AD_Menu.ACTION_Report.equals(action)) 438 access = role.getProcessAccess(AD_Process_ID); 439 else if (X_AD_Menu.ACTION_Form.equals(action)) 440 access = role.getFormAccess(AD_Form_ID); 441 else if (X_AD_Menu.ACTION_WorkFlow.equals(action)) 442 access = role.getWorkflowAccess(AD_Workflow_ID); 443 else if (X_AD_Menu.ACTION_Task.equals(action)) 444 access = role.getTaskAccess(AD_Task_ID); 445 if (access != null) { 451 retValue = new MTreeNode (node_ID, seqNo, 452 name, description, parent_ID, isSummary, 453 action, onBar); 454 } 455 } 456 else 457 { retValue = new MTreeNode (node_ID, seqNo, 459 name, description, parent_ID, isSummary, 460 action, onBar); 461 } 462 } 463 } 464 catch (SQLException e) 465 { 466 log.error("getNodeDetails", e); 467 } 468 return retValue; 469 } 471 472 473 476 private void trimTree() 477 { 478 boolean needsTrim = m_root != null; 479 while (needsTrim) 480 { 481 needsTrim = false; 482 Enumeration en = m_root.preorderEnumeration(); 483 while (en.hasMoreElements()) 484 { 485 MTreeNode nd = (MTreeNode)en.nextElement(); 486 if (nd.isSummary() && nd.getChildCount() == 0) 487 { 488 nd.removeFromParent(); 489 needsTrim = true; 490 } 491 } 492 } 493 } 495 498 private void diagPrintTree() 499 { 500 Enumeration en = m_root.preorderEnumeration(); 501 int count = 0; 502 while (en.hasMoreElements()) 503 { 504 StringBuffer sb = new StringBuffer (); 505 MTreeNode nd = (MTreeNode)en.nextElement(); 506 for (int i = 0; i < nd.getLevel(); i++) 507 sb.append(" "); 508 sb.append("ID=").append(nd.getID()) 509 .append(", SeqNo=").append(nd.getSeqNo()) 510 .append(" ").append(nd.getName()); 511 System.out.println(sb.toString()); 512 count++; 513 } 514 System.out.println("Count=" + count); 515 } 517 521 public MTreeNode getRoot() 522 { 523 return m_root; 524 } 526 530 public String getNodeTableName() 531 { 532 return m_nodeTableName; 533 } 535 539 public String toString() 540 { 541 StringBuffer sb = new StringBuffer ("MTree["); 542 sb.append("AD_Tree_ID=").append(getAD_Tree_ID()) 543 .append(", Name=").append(getName()); 544 sb.append("]"); 545 return sb.toString(); 546 } 547 } | Popular Tags |