Changeset 7599


Ignore:
Timestamp:
Feb 22, 2019, 9:54:51 AM (5 years ago)
Author:
Nicklas Nordborg
Message:

References #2150: Batch item importers in item list members view

The add/remove members modes should now work. Some more testing is probably need to check more combinations.

Location:
trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/core/net/sf/basedb/core/ItemList.java

    r7527 r7599  
    562562      write permission
    563563    @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)
    566567    throws PermissionDeniedException, InvalidDataException
    567568  {
     
    572573    boolean removed = item.getId() == 0 ? delayedRemove(item) : getData().getMembers().remove(item.getId());
    573574    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    }
    574652  }
    575653 
  • trunk/src/plugins/core/net/sf/basedb/plugins/batchimport/AbstractItemImporter.java

    r7594 r7599  
    7171import net.sf.basedb.core.Job;
    7272import net.sf.basedb.core.Kit;
     73import net.sf.basedb.core.Listable;
    7374import net.sf.basedb.core.NumberOutOfRangeException;
    7475import net.sf.basedb.core.Permission;
     
    478479
    479480        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);
    482516       
    483517        // Save context info
     
    532566  private ItemQuery<I> itemQuery;
    533567  private ItemList itemList;
    534 
     568  boolean updateMode;
     569  boolean createMode;
     570  boolean addMembersMode;
     571  boolean removeMembersMode;
     572 
    535573  private String lastIdentifier;
    536574  private I lastItem;
     
    590628    this.idMethod = getIdMethod(dc, (String)job.getValue("idMethod"));
    591629    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());
    593632    this.itemCache = new HashMap<String, BasicItem>();
    594633    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;
    597638   
    598639    // Error handling, we don't use the error handling in AbstractFlatFileImporter
     
    601642    this.failIfNotFoundItems = !createMode && "fail".equals(getErrorOption("itemNotFoundError"));
    602643    this.updateExistingItems = updateMode;
    603     this.failIfItemExists = !updateMode && "fail".equals(getErrorOption("itemExistsError"));
     644    this.failIfItemExists = createMode && "fail".equals(getErrorOption("itemExistsError"));
    604645    this.failIfMultipleFoundItems = "fail".equals(getErrorOption("multipleItemsFoundError"));
    605646    this.failIfNotFoundReference = "fail".equals(getErrorOption("referenceNotFoundError"));
     
    647688    if (Boolean.TRUE.equals((Boolean)job.getValue("includeInProject"))) includes.add(Include.IN_PROJECT);
    648689    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));
    650691    itemQuery.setIncludes(includes);
    651692   
     
    847888        }
    848889      }
     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      }
    849918      else
    850919      {
     
    884953  {
    885954    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    }
    889971    if (numError > 0) msg += "; " + numError + " items skipped because of invalid values";
    890972    if (numNotFound > 0) msg += "; " + numNotFound + " items skipped because they could not be found";
     
    24242506        List<String> allowedModes = new ArrayList<String>();
    24252507        String defaultMode = "update";
     2508
    24262509        if (list != null)
    24272510        {
    24282511          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          }
    24322518        }
    24332519        else if (context == null || sc.hasPermission(Permission.CREATE, context.getItem()))
     
    24882574        {
    24892575          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.",
    24922579            new ItemParameterType<>(ItemList.class, list, true, 1, Arrays.asList(list))
    24932580          ));
     
    26212708
    26222709      String mode = (String)job.getValue("mode");
    2623       ItemList itemList = (ItemList)job.getValue("memberOfList");
     2710      ItemList itemList = (ItemList)job.getValue("itemList");
    26242711      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'
    26262714     
    26272715      // Error handling options
     
    26342722      parameters.add(multipleItemsFoundErrorParameter);
    26352723      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      }
    26442735     
    26452736      configureOptions = new RequestInformation
  • trunk/src/test/TestItemList.java

    r6965 r7599  
    341341      {
    342342        Listable bm = (Listable)bl.getMemberType().getById(dc, itemId);
    343         bl.remove(bm);
     343        bl.removeItem(bm);
    344344      }
    345345      dc.commit();
Note: See TracChangeset for help on using the changeset viewer.