Changeset 6934
- Timestamp:
- Jun 22, 2015, 3:37:26 PM (8 years ago)
- Location:
- trunk/src/core/net/sf/basedb/core
- Files:
-
- 3 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/core/net/sf/basedb/core/AbstractEntityQuery.java
r6771 r6934 359 359 if (requiredFilter != null || optionalFilter != null) 360 360 { 361 filterManager = new QueryRuntimeFilterManager(dc );361 filterManager = new QueryRuntimeFilterManager(dc, getItemType()); 362 362 if (requiredFilter != null) requiredFilter.enableFilters(filterManager, this, dc); 363 363 if (optionalFilter != null) optionalFilter.enableFilters(filterManager, this, dc); -
trunk/src/core/net/sf/basedb/core/HibernateUtil.java
r6880 r6934 55 55 import java.util.ArrayList; 56 56 import java.util.Enumeration; 57 import java.util.HashMap; 57 58 import java.util.LinkedList; 58 59 import java.util.List; 59 60 import java.util.Iterator; 60 61 import java.util.Date; 62 import java.util.Map; 61 63 import java.util.jar.JarEntry; 62 64 import java.util.jar.JarFile; … … 67 69 import java.sql.DatabaseMetaData; 68 70 import java.sql.SQLException; 71 import java.io.IOException; 69 72 import java.net.URL; 70 73 … … 302 305 } 303 306 } 307 304 308 305 309 // Load the XML mapping files and register them with Hibernate 306 310 final URL dtdFile = HibernateUtil.class.getResource("/org/hibernate/hibernate-mapping-3.0.dtd"); 311 Map<String, Element> filterTemplate = loadFilterTemplate(dtdFile); 307 312 DOMOutputter out = new DOMOutputter(); 308 313 for (URL url : mappingFiles) … … 310 315 log.info("Loading mapping file: " + url); 311 316 Document dom = XmlUtil2.getValidatedXml(url, dtdFile); 312 manipulateDocument(dom );317 manipulateDocument(dom, filterTemplate); 313 318 cfg.addDocument(out.output(dom)); 314 319 } … … 334 339 335 340 */ 336 private static void manipulateDocument(Document dom) 337 { 338 // Get the <class> tag 339 Element classTag = dom.getRootElement().getChild("class"); 340 String className = classTag != null ? classTag.getAttributeValue("name") : null; 341 // We are only interested in <hibernate-mapping> with <class> elements 342 if (className == null) return; 343 344 // Extended properties 345 if (ExtendedProperties.isExtendable(className)) 346 { 347 addExtendedProperties(classTag, className); 348 } 349 350 // Permission filters 351 addFilterConditions(classTag, className); 352 353 // Unit symbol need to be case-sensitive 354 if (className.endsWith("UnitSymbolData")) 355 { 356 fixUnitSymbolColumnDefinition(classTag); 341 private static void manipulateDocument(Document dom, Map<String, Element> filterTemplate) 342 { 343 Element root = dom.getRootElement(); 344 345 // Load all <class> and <subclass> tags in the document 346 Iterator<Element> it = root.getDescendants(new org.jdom2.filter.AbstractFilter<Element>() 347 { 348 private static final long serialVersionUID = 1L; 349 350 @Override 351 public Element filter(Object obj) 352 { 353 if (!(obj instanceof Element)) return null; 354 355 Element e = (Element)obj; 356 String name = e.getName(); 357 return "class".equals(name) || "subclass".equals(name) ? e : null; 358 } 359 }); 360 361 // Copy to a list since we can't use the iterater and add elements to the 362 // document at the same time (ConcurrentModificationException) 363 List<Element> classTags = new ArrayList<Element>(); 364 while (it.hasNext()) 365 { 366 classTags.add(it.next()); 367 } 368 369 for (Element classTag: classTags) 370 { 371 String className = classTag.getAttributeValue("name"); 372 373 // Extended properties 374 if (ExtendedProperties.isExtendable(className)) 375 { 376 addExtendedProperties(classTag, className); 377 } 378 379 // Permission filters 380 addFilterConditions(classTag, className, filterTemplate); 381 382 // Unit symbol need to be case-sensitive 383 if (className.endsWith("UnitSymbolData")) 384 { 385 fixUnitSymbolColumnDefinition(classTag); 386 } 357 387 } 358 388 } … … 395 425 396 426 /** 427 Load filter definitions from 'filter-def-template.xml'. Store in map 428 using the name of the filter as key. 429 @since 3.6 430 */ 431 private static Map<String, Element> loadFilterTemplate(final URL dtdFile) 432 throws IOException 433 { 434 Document filterDef = XmlUtil2.getValidatedXml(HibernateUtil.class.getResource("/net/sf/basedb/core/filter-def-template.xml"), dtdFile); 435 Map<String, Element> filters = new HashMap<String, Element>(); 436 for (Element filter : filterDef.getRootElement().getChildren()) 437 { 438 filters.put(filter.getAttributeValue("name"), filter); 439 } 440 return filters; 441 } 442 443 /** 397 444 Add <filter> conditions to the given class tag. 398 445 @param classTag An Element representing a <class> tag … … 400 447 @since 2.17 401 448 */ 402 private static void addFilterConditions(Element classTag, String className )449 private static void addFilterConditions(Element classTag, String className, Map<String, Element> filterTemplate) 403 450 { 404 451 try 405 452 { 406 453 Class<?> c = Class.forName(className); 454 Item itemType = Item.fromClass(c); 407 455 log.info("Adding 'denyAll' filter to "+c.getName()); 408 classTag.addContent(createFilterElement("denyAll", "`id` != `id`")); 456 System.out.println("Class: " + c + "; itemType: " + itemType); 457 if (itemType == null) return; 458 459 defineFilter(classTag, itemType, "denyAll", "`id` != `id`", filterTemplate); 409 460 if (NewsData.class.isAssignableFrom(c)) 410 461 { 411 462 log.info("Adding 'todaysNews' filter to "+c.getName()); 412 classTag.addContent(createFilterElement("todaysNews",413 ":today >= `start_date` AND (:today <= `end_date` OR `end_date` IS NULL)" ));463 defineFilter(classTag, itemType, "todaysNews", 464 ":today >= `start_date` AND (:today <= `end_date` OR `end_date` IS NULL)", filterTemplate); 414 465 } 415 466 if (MessageData.class.isAssignableFrom(c)) 416 467 { 417 468 log.info("Adding 'ownedBy' filter to " + c.getName()); 418 classTag.addContent(createFilterElement("ownedBy", ":owner = `to_user_id`"));469 defineFilter(classTag, itemType, "ownedBy", ":owner = `to_user_id`", filterTemplate); 419 470 } 420 471 if (AnnotationData.class.isAssignableFrom(c)) 421 472 { 422 473 log.info("Adding 'annotationTypes' filter to " + c.getName()); 423 classTag.addContent(createFilterElement("annotationTypes", "`annotationtype_id` IN (:annotationTypes)"));474 defineFilter(classTag, itemType, "annotationTypes", "`annotationtype_id` IN (:annotationTypes)", filterTemplate); 424 475 } 425 476 if (RemovableData.class.isAssignableFrom(c)) 426 477 { 427 478 log.info("Adding 'isRemoved' filter to "+c.getName()); 428 classTag.addContent(createFilterElement("isRemoved", ":removed = `removed`"));479 defineFilter(classTag, itemType, "isRemoved", ":removed = `removed`", filterTemplate); 429 480 } 430 481 if (AnnotatableData.class.isAssignableFrom(c)) 431 482 { 432 483 log.info("Adding 'isAnnotatated' filter to "+c.getName()); 433 classTag.addContent(createFilterElement("isAnnotated", ":annotated = (`annotationset_id` IS NOT NULL)"));484 defineFilter(classTag, itemType, "isAnnotated", ":annotated = (`annotationset_id` IS NOT NULL)", filterTemplate); 434 485 } 435 486 if (OwnableData.class.isAssignableFrom(c)) 436 487 { 437 488 log.info("Adding 'ownedBy' filter to "+c.getName()); 438 classTag.addContent(createFilterElement("ownedBy", ":owner = `owner`"));489 defineFilter(classTag, itemType, "ownedBy", ":owner = `owner`", filterTemplate); 439 490 440 491 log.info("Adding 'notOwnedBy' filter to "+c.getName()); 441 classTag.addContent(createFilterElement("notOwnedBy", ":owner != `owner`"));492 defineFilter(classTag, itemType, "notOwnedBy", ":owner != `owner`", filterTemplate); 442 493 443 494 log.info("Adding 'memberOf' filter to "+c.getName()); 444 classTag.addContent(createFilterElement("memberOf", ":owner != `owner` AND `id` IN (:items)"));495 defineFilter(classTag, itemType, "memberOf", ":owner != `owner` AND `id` IN (:items)", filterTemplate); 445 496 446 497 log.info("Adding 'ownedByOrMemberOf' filter to "+c.getName()); 447 classTag.addContent(createFilterElement("ownedByOrMemberOf", "(:owner = `owner` OR `id` IN (:items))"));498 defineFilter(classTag, itemType, "ownedByOrMemberOf", "(:owner = `owner` OR `id` IN (:items))", filterTemplate); 448 499 } 449 500 else if (UserData.class.isAssignableFrom(c)) 450 501 { 451 502 log.info("Adding 'memberOf' filter to "+c.getName()); 452 classTag.addContent(createFilterElement("memberOf", "(`id` IN (:items) OR `id` = :owner)"));503 defineFilter(classTag, itemType, "memberOf", "(`id` IN (:items) OR `id` = :owner)", filterTemplate); 453 504 } 454 505 else 455 506 { 456 507 log.info("Adding 'memberOf' filter to "+c.getName()); 457 classTag.addContent(createFilterElement("memberOf", "`id` IN (:items)"));508 defineFilter(classTag, itemType, "memberOf", "`id` IN (:items)", filterTemplate); 458 509 } 459 510 if (ShareableData.class.isAssignableFrom(c)) 460 511 { 461 512 log.info("Adding 'sharedTo' filter to "+c.getName()); 462 classTag.addContent(createFilterElement("sharedTo", ":owner != `owner` AND `itemkey_id` IN (:itemKeys)"));513 defineFilter(classTag, itemType, "sharedTo", ":owner != `owner` AND `itemkey_id` IN (:itemKeys)", filterTemplate); 463 514 464 515 log.info("Adding 'inProject' filter to "+c.getName()); 465 classTag.addContent(createFilterElement("inProject", "`projectkey_id` IN (:projectKeys)"));516 defineFilter(classTag, itemType, "inProject", "`projectkey_id` IN (:projectKeys)", filterTemplate); 466 517 467 518 log.info("Adding 'ownedByOrSharedTo' filter to "+c.getName()); 468 classTag.addContent(createFilterElement("ownedByOrSharedTo", "(:owner = `owner` OR `itemkey_id` IN (:itemKeys))"));519 defineFilter(classTag, itemType, "ownedByOrSharedTo", "(:owner = `owner` OR `itemkey_id` IN (:itemKeys))", filterTemplate); 469 520 470 521 log.info("Adding 'ownedByOrInProject' filter to "+c.getName()); 471 classTag.addContent(createFilterElement("ownedByOrInProject",472 "(:owner = `owner` OR `projectkey_id` IN (:projectKeys))" ));522 defineFilter(classTag, itemType, "ownedByOrInProject", 523 "(:owner = `owner` OR `projectkey_id` IN (:projectKeys))", filterTemplate); 473 524 474 525 log.info("Adding 'sharedToOrInProject' filter to "+c.getName()); 475 classTag.addContent(createFilterElement("sharedToOrInProject",476 "((:owner != `owner` AND `itemkey_id` IN (:itemKeys)) OR `projectkey_id` IN (:projectKeys))" ));526 defineFilter(classTag, itemType, "sharedToOrInProject", 527 "((:owner != `owner` AND `itemkey_id` IN (:itemKeys)) OR `projectkey_id` IN (:projectKeys))", filterTemplate); 477 528 478 529 log.info("Adding 'ownedByOrSharedToOrInProject' filter to "+c.getName()); 479 classTag.addContent(createFilterElement("ownedByOrSharedToOrInProject",480 "(:owner = `owner` OR `itemkey_id` IN (:itemKeys) OR `projectkey_id` IN (:projectKeys))" ));530 defineFilter(classTag, itemType, "ownedByOrSharedToOrInProject", 531 "(:owner = `owner` OR `itemkey_id` IN (:itemKeys) OR `projectkey_id` IN (:projectKeys))", filterTemplate); 481 532 } 482 533 } … … 488 539 489 540 /** 490 Create a <filter> tag using the given name and condition. 491 @since 2.17 492 */ 493 private static Element createFilterElement(String name, String condition) 494 { 541 Define a filter for on the given class. 542 @since 3.6 543 */ 544 private static void defineFilter(Element classTag, Item itemType, String name, String condition, Map<String, Element> filterTemplate) 545 { 546 // Load the template 547 Element filterSource = filterTemplate.get(name); 548 if (filterSource == null) return; 549 550 // Define the filter by cloning the template onto the 551 // root element and set the name including the item type. 552 Element filterDef = filterSource.clone(); 553 filterDef.setAttribute("name", name + itemType.name()); 554 classTag.getDocument().getRootElement().addContent(filterDef); 555 556 // Second part of the filter definition goes inside the 557 // class tag 495 558 Element element = new Element("filter"); 496 element.setAttribute("name", name );559 element.setAttribute("name", name + itemType.name()); 497 560 element.setAttribute("condition", condition); 498 return element; 561 classTag.addContent(element); 562 563 System.out.println("Adding filter def: " + filterDef.getAttributeValue("name") + " to " + classTag.getAttributeValue("name")); 564 499 565 } 500 566 -
trunk/src/core/net/sf/basedb/core/QueryRuntimeFilterManager.java
r5818 r6934 49 49 private final org.hibernate.Session session; 50 50 51 private final Item itemType; 52 51 53 /** 52 54 Create a new manager for the <code>DbControl</code>. 55 The manager will only manage filters for queries returning 56 item of the given item type. 53 57 */ 54 QueryRuntimeFilterManager(DbControl dc )58 QueryRuntimeFilterManager(DbControl dc, Item itemType) 55 59 { 56 60 this.enabledFilters = new HashSet<String>(); 57 61 this.session = dc.getHibernateSession(); 62 this.itemType = itemType; 58 63 } 59 64 … … 67 72 { 68 73 org.hibernate.Filter filter = null; 69 if (!enabledFilters.contains(filterName)) 74 String name = filterName + itemType.name(); 75 if (!enabledFilters.contains(name)) 70 76 { 71 filter = HibernateUtil.enableFilter(session, filterName);72 enabledFilters.add( filterName);77 filter = HibernateUtil.enableFilter(session, name); 78 enabledFilters.add(name); 73 79 } 74 80 return filter; … … 81 87 void disableFilter(String filterName) 82 88 { 83 if (enabledFilters.contains(filterName)) 89 String name = filterName + itemType.name(); 90 if (enabledFilters.contains(name)) 84 91 { 85 HibernateUtil.disableFilter(session, filterName);86 enabledFilters.remove( filterName);92 HibernateUtil.disableFilter(session, name); 93 enabledFilters.remove(name); 87 94 } 88 95 }
Note: See TracChangeset
for help on using the changeset viewer.