/** * Create a new PathMetadata for collection any access * * @param parent * @return */ public static PathMetadata<?> forCollectionAny(Path<?> parent) { return new PathMetadata<String>(parent, "", PathType.COLLECTION_ANY); }
/** * Create a new PathMetadata for property access * * @param parent * @param property * @return */ public static PathMetadata<String> forProperty(Path<?> parent, String property) { return new PathMetadata<String>(parent, property, PathType.PROPERTY); }
/** * Create a new PathMetadata for indexed list access * * @param parent * @param index * @return */ public static PathMetadata<Integer> forListAccess(Path<?> parent, Expression<Integer> index) { return new PathMetadata<Integer>(parent, index, PathType.LISTVALUE); }
/** * Create a new PathMetadata for for key based map access * * @param parent * @param key * @return */ public static <KT> PathMetadata<KT> forMapAccess(Path<?> parent, KT key) { return new PathMetadata<KT>(parent, key, PathType.MAPVALUE_CONSTANT); }
/** * Create a new PathMetadata for a variable * * @param variable * @return */ public static PathMetadata<String> forVariable(String variable) { return new PathMetadata<String>(null, variable, PathType.VARIABLE); }
/** * Create a new PathMetadata for indexed array access * * @param parent * @param index * @return */ public static PathMetadata<Integer> forArrayAccess(Path<?> parent, Expression<Integer> index) { return new PathMetadata<Integer>(parent, index, PathType.ARRAYVALUE); }
/** * Create a new PathMetadata for delegate access * * @param delegate * @return */ public static <T> PathMetadata<T> forDelegate(Path<T> delegate) { return new PathMetadata<T>(delegate, delegate, PathType.DELEGATE); }
/** * Create a new PathMetadata for key based map access * * @param parent * @param key * @return */ public static <KT> PathMetadata<KT> forMapAccess(Path<?> parent, Expression<KT> key) { return new PathMetadata<KT>(parent, key, PathType.MAPVALUE); }
/** * Create a new PathMetadata for indexed array access * * @param parent * @param index * @return */ public static PathMetadata<Integer> forArrayAccess(Path<?> parent, @Nonnegative int index) { return new PathMetadata<Integer>(parent, index, PathType.ARRAYVALUE_CONSTANT); }
/** * Create a new PathMetadata for indexed list access * * @param parent * @param index * @return */ public static PathMetadata<Integer> forListAccess(Path<?> parent, @Nonnegative int index) { return new PathMetadata<Integer>(parent, index, PathType.LISTVALUE_CONSTANT); }
@SuppressWarnings("unchecked") private static <T> Path<T> replaceParent(Path<T> path, Path<?> parent) { PathMetadata<?> metadata = new PathMetadata(parent, path.getMetadata().getElement(), path.getMetadata().getPathType()); return new PathImpl<T>(path.getType(), metadata); }
@Override public Expression<?> visit(Path<?> expr, @Nullable Void context) { if (expr.getMetadata().isRoot()) { return expr; } else { PathMetadata metadata = expr.getMetadata(); Path<?> parent = (Path)metadata.getParent().accept(this, null); Object element = metadata.getElement(); if (element instanceof Expression<?>) { element = ((Expression) element).accept(this, null); } if (parent.equals(metadata.getParent()) && Objects.equal(element, metadata.getElement())) { return expr; } else { metadata = new PathMetadata(parent, element, metadata.getPathType()); return new PathImpl(expr.getType(), metadata); } } }
@SuppressWarnings("rawtypes") private static <T> Path<T> replaceParent(Path<T> path, Path<?> parent) { PathMetadata<?> metadata = new PathMetadata<Object>(parent, path.getMetadata().getElement(), path.getMetadata().getPathType()); if (path instanceof CollectionExpression) { CollectionExpression<?,?> col = (CollectionExpression<?,?>)path; return new ListPath(col.getParameter(0), SimplePath.class, metadata); } else { return new PathImpl<T>(path.getType(), metadata); } }