/** * Returns true if the path starts with an object reference (@). */ default boolean startsWithObjectReference() { return !isEmpty() && ItemPath.isObjectReference(first()); }
@Override public String toString() { if (ItemPath.isObjectReference(this)) { return ObjectReferencePathSegment.SYMBOL; } else if (ItemPath.isIdentifier(this)) { return IdentifierPathSegment.SYMBOL; } else if (ItemPath.isParent(this)) { return ParentPathSegment.SYMBOL; } else { return DebugUtil.formatElementName(this); } }
@Override public DataSearchResult nextLinkDefinition(ItemPath path, ItemDefinition itemDefinition, PrismContext prismContext) { if (ItemPath.isObjectReference(path.first())) { // returning artificially created transition definition, used to allow dereferencing target object in a generic way return new DataSearchResult<>( new JpaLinkDefinition<>(SchemaConstants.PATH_OBJECT_REFERENCE, "target", null, false, referencedEntityDefinition.getResolvedEntityDefinition()), path.rest()); } else { return null; } }
public <ID extends ItemDefinition> ID findItemDefinition(@NotNull ItemPath path, @NotNull Class<ID> clazz) { for (;;) { if (path.isEmpty()) { if (clazz.isAssignableFrom(PrismContainerDefinition.class)) { return (ID) this; } else { return null; } } Object first = path.first(); if (ItemPath.isName(first)) { return findNamedItemDefinition(ItemPath.toName(first), path.rest(), clazz); } else if (ItemPath.isId(first)) { path = path.rest(); } else if (ItemPath.isParent(first)) { ItemPath rest = path.rest(); ComplexTypeDefinition parent = getSchemaRegistry().determineParentDefinition(getComplexTypeDefinition(), rest); if (rest.isEmpty()) { // requires that the parent is defined as an item (container, object) return (ID) getSchemaRegistry().findItemDefinitionByType(parent.getTypeName()); } else { return parent.findItemDefinition(rest, clazz); } } else if (ItemPath.isObjectReference(first)) { throw new IllegalStateException("Couldn't use '@' path segment in this context. PCD=" + getTypeName() + ", path=" + path); } else { throw new IllegalStateException("Unexpected path segment: " + first + " in " + path); } } }
return parent.findItemDefinition(rest, clazz); } else if (ItemPath.isObjectReference(first)) { throw new IllegalStateException("Couldn't use '@' path segment in this context. CTD=" + getTypeName() + ", path=" + path); } else if (ItemPath.isIdentifier(first)) {
@Override public DataSearchResult<?> nextLinkDefinition(ItemPath path, ItemDefinition<?> itemDefinition, PrismContext prismContext) throws QueryException { if (ItemPath.isEmpty(path)) { // doesn't fulfill precondition return null; } Object first = path.first(); if (ItemPath.isId(first)) { throw new QueryException("ID item path segments are not allowed in query: " + path); } else if (ItemPath.isObjectReference(first)) { throw new QueryException("'@' path segment cannot be used in the context of an entity " + this); } JpaLinkDefinition<?> link = findRawLinkDefinition(path, JpaDataNodeDefinition.class, false); if (link == null) { return null; } else { link.resolveEntityPointer(); return new DataSearchResult<>(link, path.rest(link.getItemPath().size())); } }