static Long firstToIdOrNull(ItemPath path) { return path != null ? path.firstToIdOrNull() : null; }
public <IV extends PrismValue,ID extends ItemDefinition,I extends Item<IV,ID>> void removeItem(ItemPath path, Class<I> itemType) { Long id = ItemPath.firstToIdOrNull(path); PrismContainerValue<C> cval = findValue(id); if (cval == null) { return; } if (path == null) { throw new IllegalStateException("null path"); // todo } ((PrismContainerValueImpl<C>) cval).removeItem(skipFirstId(path), itemType); }
@Override public <IV extends PrismValue,ID extends ItemDefinition,I extends Item<IV,ID>> I findCreateItem(ItemPath itemPath, Class<I> type, ID itemDefinition, boolean create) throws SchemaException { if (ItemPath.isEmpty(itemPath)) { throw new IllegalArgumentException("Empty path specified"); } Long id = itemPath.firstToIdOrNull(); PrismContainerValue<C> cval = findValue(id); if (cval == null) { return null; } // descent to the correct value ItemPath rest = itemPath.startsWithId() ? itemPath.rest() : itemPath; return ((PrismContainerValueImpl<C>) cval).findCreateItem(rest, type, itemDefinition, create); }
@Override public Object find(ItemPath path) { if (ItemPath.isEmpty(path)) { return this; } Long id = path.firstToIdOrNull(); PrismContainerValue<C> cval = findValue(id); if (cval == null) { return null; } // descent to the correct value ItemPath rest = path.startsWithId() ? path.rest() : path; return cval.find(rest); }
@Override public <IV extends PrismValue,ID extends ItemDefinition> PartiallyResolvedItem<IV,ID> findPartial(ItemPath path) { if (ItemPath.isEmpty(path)) { return new PartiallyResolvedItem<>((Item<IV, ID>) this, null); } Long id = path.firstToIdOrNull(); PrismContainerValue<C> cval = findValue(id); if (cval == null) { return null; } // descent to the correct value ItemPath rest = path.startsWithId() ? path.rest() : path; return cval.findPartial(rest); }
Long id = remainingPath.firstToIdOrNull(); modificationsForId.put(id, modification); iterator.remove();
@Override public void accept(Visitor visitor, ItemPath path, boolean recursive) { if (path == null || path.isEmpty()) { // We are at the end of path, continue with regular visits all the way to the bottom if (recursive) { accept(visitor); } else { visitor.visit(this); } } else { Long id = ItemPath.firstToIdOrNull(path); ItemPath rest = skipFirstId(path); if (id == null) { // visit all values for (PrismContainerValue<C> cval: getValues()) { cval.accept(visitor, rest, recursive); } } else { PrismContainerValue<C> cval = findValue(id); if (cval != null) { cval.accept(visitor, rest, recursive); } } } }
@Override public ItemDelta<?,?> getSubDelta(ItemPath path) { if (path.isEmpty()) { return this; } Long id = null; if (path.startsWithId()) { id = path.firstToIdOrNull(); path = path.rest(); } ItemDefinition itemDefinition = getDefinition().findItemDefinition(path); if (itemDefinition == null) { throw new IllegalStateException("No definition of " + path + " in " + getDefinition()); } ItemDelta<?,?> itemDelta = itemDefinition.createEmptyDelta(getPath().append(path)); itemDelta.addValuesToAdd(findItemValues(id, path, getValuesToAdd())); itemDelta.addValuesToDelete(findItemValues(id, path, getValuesToDelete())); itemDelta.setValuesToReplace(findItemValues(id, path, getValuesToReplace())); if (itemDelta.isEmpty()) { return null; } return itemDelta; }