Changeset 7599
- Timestamp:
- Feb 22, 2019, 9:54:51 AM (5 years ago)
- Location:
- trunk/src
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/core/net/sf/basedb/core/ItemList.java
r7527 r7599 562 562 write permission 563 563 @throws InvalidDataException If the item is null 564 */ 565 public void remove(Listable item) 564 @since 3.15 565 */ 566 public boolean removeItem(Listable item) 566 567 throws PermissionDeniedException, InvalidDataException 567 568 { … … 572 573 boolean removed = item.getId() == 0 ? delayedRemove(item) : getData().getMembers().remove(item.getId()); 573 574 if (removed) getData().setSize(getData().getSize()-1); 575 return removed; 576 } 577 578 /** 579 Remove multiple items from this list in one go. 580 @param it An iterator that returns all items to be removed, 581 null items are ignored 582 @return The numer of removed items 583 @throws PermissionDeniedException If the logged in user doesn't have 584 write permission 585 @throws InvalidDataException If the iterator returns an item 586 of a different type than {@link #getMemberType()} 587 @since 3.15 588 */ 589 public int removeItems(Iterator<? extends Listable> it) 590 throws PermissionDeniedException, InvalidDataException 591 { 592 checkPermission(Permission.WRITE); 593 checkManualMembersAllowed(); 594 if (it == null) return 0; 595 int removed = 0; 596 Set<Integer> members = getData().getMembers(); 597 while (it.hasNext()) 598 { 599 Listable item = it.next(); 600 601 if (item == null) 602 { 603 /* #### CONTINUE-STATEMENT #### */ 604 continue; 605 } 606 607 checkMemberType(item.getType()); 608 if (item.getId() == 0) 609 { 610 if (delayedRemove(item)) removed++; 611 } 612 else 613 { 614 if (members.remove(item.getId())) removed++; 615 } 616 } 617 getData().setSize(getSize() - removed); 618 return removed; 619 } 620 621 622 /** 623 Remove an item from the list. 624 @param item The item to remove. 625 @throws PermissionDeniedException If the logged in user doesn't have 626 write permission 627 @throws InvalidDataException If the item is null 628 @deprecated In 3.15, use {@link #removeItem(Listable item)} instead 629 */ 630 @Deprecated 631 public void remove(Listable item) 632 throws PermissionDeniedException, InvalidDataException 633 { 634 removeItem(item); 635 } 636 637 /** 638 Check if the given item is a member of this list. 639 @since 3.15 640 */ 641 public boolean isMember(Listable item) 642 { 643 if (item == null || item.getType() != getMemberType()) return false; 644 if (item.getId() == 0) 645 { 646 return delayed == null ? false : delayed.queue().contains(item); 647 } 648 else 649 { 650 return getData().getMembers().contains(item.getId()); 651 } 574 652 } 575 653 -
trunk/src/plugins/core/net/sf/basedb/plugins/batchimport/AbstractItemImporter.java
r7594 r7599 71 71 import net.sf.basedb.core.Job; 72 72 import net.sf.basedb.core.Kit; 73 import net.sf.basedb.core.Listable; 73 74 import net.sf.basedb.core.NumberOutOfRangeException; 74 75 import net.sf.basedb.core.Permission; … … 478 479 479 480 File file = (File)job.getValue("file"); 480 response.setSuggestedJobName("Import " + context.getItem().toString().toLowerCase() 481 + " items from file '" + file.getName() + "'"); 481 ItemList list = (ItemList)job.getValue("itemList"); 482 String mode = (String)job.getValue("mode"); 483 String itemTypes = context.getItem().toString().toLowerCase(); 484 String jobName = ""; 485 if (list != null) 486 { 487 if (mode != null && mode.contains("add")) 488 { 489 jobName = "Add members to list '"+list.getName()+"' from file '"+file.getName() + "'"; 490 } 491 else if (mode != null && mode.contains("remove")) 492 { 493 jobName = "Remove members from list '"+list.getName()+"' using file '"+file.getName() + "'"; 494 } 495 else 496 { 497 jobName = "Update members of list '"+list.getName()+"' from file '"+file.getName() + "'"; 498 } 499 } 500 else 501 { 502 if (mode != null && mode.contains("create") && mode.contains("update")) 503 { 504 jobName = "Create and update " + itemTypes + " items from file '"+file.getName() + "'"; 505 } 506 else if (mode != null && mode.contains("create")) 507 { 508 jobName = "Create " + itemTypes + " items from file '"+file.getName() + "' (no update)"; 509 } 510 else 511 { 512 jobName = "Update " + itemTypes + " items from file '"+file.getName() + "' (no create)"; 513 } 514 } 515 response.setSuggestedJobName(jobName); 482 516 483 517 // Save context info … … 532 566 private ItemQuery<I> itemQuery; 533 567 private ItemList itemList; 534 568 boolean updateMode; 569 boolean createMode; 570 boolean addMembersMode; 571 boolean removeMembersMode; 572 535 573 private String lastIdentifier; 536 574 private I lastItem; … … 590 628 this.idMethod = getIdMethod(dc, (String)job.getValue("idMethod")); 591 629 this.idMapping = (String)job.getValue(idMethod.getColumnMappingParameterName()); 592 this.itemList = (ItemList)job.getValue("memberOfList"); 630 this.itemList = (ItemList)job.getValue("itemList"); 631 if (itemList != null) itemList = ItemList.getById(dc, itemList.getId()); 593 632 this.itemCache = new HashMap<String, BasicItem>(); 594 633 String mode = (String)job.getValue("mode"); 595 boolean updateMode = mode == null || mode.contains("update"); 596 boolean createMode = (mode == null || mode.contains("create")) && itemList == null; 634 this.updateMode = mode == null || mode.contains("update"); 635 this.createMode = (mode == null || mode.contains("create")) && itemList == null; 636 this.removeMembersMode = mode != null && mode.contains("remove-members") && itemList != null; 637 this.addMembersMode = mode != null && mode.contains("add-members") && itemList != null; 597 638 598 639 // Error handling, we don't use the error handling in AbstractFlatFileImporter … … 601 642 this.failIfNotFoundItems = !createMode && "fail".equals(getErrorOption("itemNotFoundError")); 602 643 this.updateExistingItems = updateMode; 603 this.failIfItemExists = !updateMode && "fail".equals(getErrorOption("itemExistsError"));644 this.failIfItemExists = createMode && "fail".equals(getErrorOption("itemExistsError")); 604 645 this.failIfMultipleFoundItems = "fail".equals(getErrorOption("multipleItemsFoundError")); 605 646 this.failIfNotFoundReference = "fail".equals(getErrorOption("referenceNotFoundError")); … … 647 688 if (Boolean.TRUE.equals((Boolean)job.getValue("includeInProject"))) includes.add(Include.IN_PROJECT); 648 689 if (Boolean.TRUE.equals((Boolean)job.getValue("includeOthers"))) includes.add(Include.OTHERS); 649 itemQuery = idMethod.prepareQuery(dc, createItemQuery(itemList));690 itemQuery = idMethod.prepareQuery(dc, addMembersMode ? createItemQuery() : createItemQuery(itemList)); 650 691 itemQuery.setIncludes(includes); 651 692 … … 847 888 } 848 889 } 890 else if (addMembersMode) 891 { 892 boolean added = itemList.add((Listable)item); 893 if (added) 894 { 895 log("Added to list: " + idMethod + "=" + identifier, data); 896 numUpdated++; 897 } 898 else 899 { 900 log("Already member: " + idMethod + "=" + identifier, data); 901 numExisted++; 902 } 903 } 904 else if (removeMembersMode) 905 { 906 boolean removed = itemList.removeItem((Listable)item); 907 if (removed) 908 { 909 log("Removed from list: " + idMethod + "=" + identifier, data); 910 numUpdated++; 911 } 912 else 913 { 914 log("Not member: " + idMethod + "=" + identifier, data); 915 numExisted++; 916 } 917 } 849 918 else 850 919 { … … 884 953 { 885 954 String msg = "Parsed " + ffp.getParsedLines() + " lines"; 886 if (numCreated > 0) msg += "; " + numCreated + " items created"; 887 if (numUpdated > 0) msg += "; " + numUpdated + " items updated"; 888 if (numExisted > 0) msg += "; " + numExisted + " items skipped because the already exists"; 955 if (addMembersMode) 956 { 957 if (numUpdated > 0) msg += "; " + numUpdated + " items added to list"; 958 if (numExisted > 0) msg += "; " + numExisted + " items were already members"; 959 } 960 else if (removeMembersMode) 961 { 962 if (numUpdated > 0) msg += "; " + numUpdated + " items removed from list"; 963 if (numExisted > 0) msg += "; " + numExisted + " items were not members"; 964 } 965 else 966 { 967 if (numCreated > 0) msg += "; " + numCreated + " items created"; 968 if (numUpdated > 0) msg += "; " + numUpdated + " items updated"; 969 if (numExisted > 0) msg += "; " + numExisted + " items skipped because the already exists"; 970 } 889 971 if (numError > 0) msg += "; " + numError + " items skipped because of invalid values"; 890 972 if (numNotFound > 0) msg += "; " + numNotFound + " items skipped because they could not be found"; … … 2424 2506 List<String> allowedModes = new ArrayList<String>(); 2425 2507 String defaultMode = "update"; 2508 2426 2509 if (list != null) 2427 2510 { 2428 2511 allowedModes.add(null); // To force the user to manually select a mode (BASE will auto-select the first option) 2429 allowedModes.add("add-members"); 2430 allowedModes.add("remove-members"); 2431 defaultMode = null; 2512 if (list.hasPermission(Permission.WRITE) && !list.getDisableManualMembers()) 2513 { 2514 allowedModes.add("add-members"); 2515 allowedModes.add("remove-members"); 2516 defaultMode = null; 2517 } 2432 2518 } 2433 2519 else if (context == null || sc.hasPermission(Permission.CREATE, context.getItem())) … … 2488 2574 { 2489 2575 parameters.add(new PluginParameter<ItemList>( 2490 "memberOfList", "Member of list", 2491 "In 'update' mode the plug-in will only update values for items if they are members of this list.", 2576 "itemList", "Item list", 2577 "The plug-in can either <b>add</b> or <b>remove</b> members to/from the list without updating them, " + 2578 "or <b>update</b> values for items that are members of this list.", 2492 2579 new ItemParameterType<>(ItemList.class, list, true, 1, Arrays.asList(list)) 2493 2580 )); … … 2621 2708 2622 2709 String mode = (String)job.getValue("mode"); 2623 ItemList itemList = (ItemList)job.getValue(" memberOfList");2710 ItemList itemList = (ItemList)job.getValue("itemList"); 2624 2711 boolean updateMode = mode == null || mode.contains("update"); 2625 boolean createMode = (mode == null || mode.contains("create")) && itemList == null;; 2712 boolean createMode = (mode == null || mode.contains("create")) && itemList == null; 2713 boolean membersMode = itemList != null && mode != null && mode.contains("members"); // 'add-members' or 'remove-members' 2626 2714 2627 2715 // Error handling options … … 2634 2722 parameters.add(multipleItemsFoundErrorParameter); 2635 2723 if (updateMode) parameters.add(noWritePermissionToItemErrorParameter); 2636 parameters.add(referenceNotFoundErrorParameter); 2637 parameters.add(noUsePermissionToReferenceErrorParameter); 2638 parameters.add(multipleReferencesFoundErrorParameter); 2639 parameters.add(Parameters.invalidUseOfNullError(null, null, null)); 2640 parameters.add(stringTooLongErrorParameter); 2641 parameters.add(numberFormatErrorParameter); 2642 parameters.add(numberOutOfRangeErrorParameter); 2643 addMoreErrorParameters(parameters); 2724 if (updateMode || createMode) 2725 { 2726 parameters.add(referenceNotFoundErrorParameter); 2727 parameters.add(noUsePermissionToReferenceErrorParameter); 2728 parameters.add(multipleReferencesFoundErrorParameter); 2729 parameters.add(Parameters.invalidUseOfNullError(null, null, null)); 2730 parameters.add(stringTooLongErrorParameter); 2731 parameters.add(numberFormatErrorParameter); 2732 parameters.add(numberOutOfRangeErrorParameter); 2733 addMoreErrorParameters(parameters); 2734 } 2644 2735 2645 2736 configureOptions = new RequestInformation -
trunk/src/test/TestItemList.java
r6965 r7599 341 341 { 342 342 Listable bm = (Listable)bl.getMemberType().getById(dc, itemId); 343 bl.remove (bm);343 bl.removeItem(bm); 344 344 } 345 345 dc.commit();
Note: See TracChangeset
for help on using the changeset viewer.