@SuppressWarnings({"unchecked", "rawtypes"}) private Mutator<BE, E, B, U, String> createMutator(Transaction<BE> tx) { return (Mutator<BE, E, B, U, String>) ElementTypeVisitor.accept( Inventory.types().byElement(context.entityClass).getSegmentType(), new ElementTypeVisitor<Mutator<BE, ?, ?, ?, String>, Void>() { @Override public Mutator<BE, ?, ?, ?, String> visitTenant(Void parameter) {
static <B extends Blueprint> SegmentType getSegmentTypeOf(B blueprint) { return Inventory.types().byBlueprint(blueprint.getClass()).getSegmentType(); }
static <B extends Blueprint> SegmentType getSegmentTypeOf(B blueprint) { return Inventory.types().byBlueprint(blueprint.getClass()).getSegmentType(); }
@SuppressWarnings("unchecked") private InventoryStructure.Builder<B> mergeDeepTree(InventoryStructure<?> currentTree, RelativePath treePath, InventoryStructure.AbstractBuilder<?> newTree, Set<SegmentType> mergedTypes) { DBG.debugf("Starting to merge shallow tree. Loading children under [%s]", treePath); try (Stream<InventoryStructure.FullNode> currentChildren = currentTree.getAllChildNodes(treePath)) { DBG.debugf("Done loading the children under [%s]", treePath); Set<Path.Segment> newChildPaths = newTree.getChildrenPaths(); currentChildren.forEach(currentChild -> { SegmentType childType = Inventory.types().byBlueprint(currentChild.getEntity().getClass()).getSegmentType(); Path.Segment childPathSegment = new Path.Segment(childType, currentChild.getEntity().getId()); if (newChildPaths.contains(childPathSegment)) { mergeDeepTree(currentTree, treePath.modified().extend(childPathSegment).get(), newTree.getChild(childPathSegment), mergedTypes); } else if (!mergedTypes.contains(childType)) { newTree.addChild(currentChild.getEntity(), currentChild.getAttachment()); mergeDeepTree(currentTree, treePath.modified().extend(childPathSegment).get(), newTree.getChild(childPathSegment), mergedTypes); } }); DBG.debugf("Done merging shallow tree of [%s]", treePath); if (newTree instanceof InventoryStructure.Builder) { return (InventoryStructure.Builder<B>) newTree; } else { return null; } } }
@SuppressWarnings("unchecked") private InventoryStructure.Builder<B> mergeShallowTree(InventoryStructure<?> currentTree, RelativePath treePath, InventoryStructure.AbstractBuilder<?> newTree, Set<SegmentType> mergedTypes) { DBG.debugf("Starting to merge shallow tree. Loading children under [%s]", treePath); try (Stream<InventoryStructure.FullNode> currentChildren = currentTree.getAllChildNodes(treePath)) { DBG.debugf("Done loading the children under [%s]", treePath); Set<Path.Segment> newChildPaths = newTree.getChildrenPaths(); currentChildren.forEach(currentChild -> { SegmentType childType = Inventory.types().byBlueprint(currentChild.getEntity().getClass()).getSegmentType(); Path.Segment childPathSegment = new Path.Segment(childType, currentChild.getEntity().getId()); if (newChildPaths.contains(childPathSegment)) { mergeShallowTree(currentTree, treePath.modified().extend(childPathSegment).get(), newTree.getChild(childPathSegment), mergedTypes); } else if (!mergedTypes.contains(childType)) { newTree.addChild(currentChild.getEntity(), currentChild.getAttachment()); } }); DBG.debugf("Done merging shallow tree of [%s]", treePath); if (newTree instanceof InventoryStructure.Builder) { return (InventoryStructure.Builder<B>) newTree; } else { return null; } } }
@SuppressWarnings({"unchecked", "rawtypes"}) default <E extends Entity<? extends B, ?>, B extends Entity.Blueprint> Stream<FullNode> getChildNodes(RelativePath parent, Class<E> childType) { SegmentType childSegmentType = Inventory.types().byElement((Class)childType).getSegmentType(); return getChildren(parent, childType).map(b -> { RelativePath childPath = parent.modified().extend(childSegmentType, b.getId()).get(); return getNode(childPath); }).filter(n -> n != null); }
@SuppressWarnings({"unchecked", "rawtypes"}) default <E extends Entity, B extends Entity.Blueprint> Stream<FullNode> getChildNodes(RelativePath parent, Class<E> childType) { SegmentType childSegmentType = Inventory.types().byElement((Class)childType).getSegmentType(); return getChildren(parent, childType).map(b -> { RelativePath childPath = parent.modified().extend(childSegmentType, b.getId()).get(); return getNode(childPath); }).filter(Objects::nonNull); }