Skip to content

Commit

Permalink
TemplateExtension match any support
Browse files Browse the repository at this point in the history
Signed-off-by: azerr <azerr@redhat.com>
  • Loading branch information
angelozerr committed Oct 18, 2024
1 parent 5ea83f1 commit ddeed8d
Show file tree
Hide file tree
Showing 13 changed files with 1,088 additions and 97 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1118,13 +1118,21 @@ public MethodValueResolver findValueResolver(ResolvedJavaTypeInfo baseType, Stri
}
List<MethodValueResolver> resolvers = getResolversFor(baseType);
for (MethodValueResolver resolver : resolvers) {
if (isMatchMethod(resolver, property)) {
if (isMatchMethod(resolver, property) || isMatchMethodResolver(resolver, property)) {
return resolver;
}
}
return null;
}

private boolean isMatchMethodResolver(MethodValueResolver resolver, String property) {
String matchName = resolver.getMatchName();
if (matchName == null) {
return false;
}
return ValueResolver.MATCH_NAME_ANY.equals(matchName) || matchName.equals(property);
}

public List<MethodValueResolver> getResolversFor(ResolvedJavaTypeInfo javaType) {
// Search in static value resolvers (ex : orEmpty, take, etc)
List<MethodValueResolver> matches = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
/*******************************************************************************
* Copyright (c) 2024 Red Hat Inc. and others.
* All rights reserved. This program and the accompanying materials
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Red Hat Inc. - initial API and implementation
*******************************************************************************/
package com.redhat.qute.project;

import java.util.Arrays;
import java.util.List;

import com.redhat.qute.commons.InvalidMethodReason;
import com.redhat.qute.commons.JavaTypeInfo;
import com.redhat.qute.commons.JavaTypeKind;
import com.redhat.qute.commons.ProjectInfo;
import com.redhat.qute.commons.ResolvedJavaTypeInfo;

/**
* Base class for project which initializes JDK resolved Java types.
*/
public abstract class BaseQuteProject extends MockQuteProject {

public BaseQuteProject(ProjectInfo projectInfo, QuteProjectRegistry projectRegistry) {
super(projectInfo, projectRegistry);
}

@Override
protected void fillJavaTypes(List<JavaTypeInfo> cache) {
createJavaTypeInfo("java.util.List<E>", JavaTypeKind.Interface, cache);
createJavaTypeInfo("java.util.Map<K,V>", JavaTypeKind.Interface, cache);
}

@Override
protected void fillResolvedJavaTypes(List<ResolvedJavaTypeInfo> resolvedJavaTypes) {
createBinaryTypes(resolvedJavaTypes);
}

private void createBinaryTypes(List<ResolvedJavaTypeInfo> cache) {
// Java type primitives
createResolvedJavaTypeInfo("java.lang.Object", cache, true);
createResolvedJavaTypeInfo("java.lang.Boolean", cache, true);
createResolvedJavaTypeInfo("java.lang.Integer", cache, true);
createResolvedJavaTypeInfo("java.lang.Double", cache, true);
createResolvedJavaTypeInfo("java.lang.Long", cache, true);
createResolvedJavaTypeInfo("java.lang.Float", cache, true);
createResolvedJavaTypeInfo("java.math.BigDecimal", cache, true);

// String
ResolvedJavaTypeInfo string = createResolvedJavaTypeInfo("java.lang.String", cache, true);
registerField("UTF16 : byte", string);
registerMethod("isEmpty() : boolean", string);
registerMethod("codePointCount(beginIndex : int,endIndex : int) : int", string);
string.setInvalidMethod("getChars", InvalidMethodReason.VoidReturn); // void getChars(int srcBegin, int srcEnd,
// char dst[], int dstBegin)
registerMethod("charAt(index : int) : char", string);
registerMethod("getBytes(charsetName : java.lang.String) : byte[]", string);
registerMethod("getBytes() : byte[]", string);

// BigInteger
ResolvedJavaTypeInfo bigInteger = createResolvedJavaTypeInfo("java.math.BigInteger", cache, true);
registerMethod("divide(val : java.math.BigInteger) : java.math.BigInteger", bigInteger);

// Iterator
ResolvedJavaTypeInfo iterator = createResolvedJavaTypeInfo("java.util.Iterator<E>", cache, true);
registerMethod("hasNext() : boolean", iterator);
registerMethod("next() : E", iterator);

// Iterable
ResolvedJavaTypeInfo iterable = createResolvedJavaTypeInfo("java.lang.Iterable<T>", cache, true);
registerMethod("iterator() : java.util.Iterator<T>", iterable);

// Collection
ResolvedJavaTypeInfo collection = createResolvedJavaTypeInfo("java.util.Collection<E>", cache, true);
collection.setExtendedTypes(Arrays.asList("java.lang.Iterable<E>"));

// List
ResolvedJavaTypeInfo list = createResolvedJavaTypeInfo("java.util.List<E>", cache, true);
list.setExtendedTypes(Arrays.asList("java.util.Collection<E>"));
registerMethod("size() : int", list);
registerMethod("get(index : int) : E", list);
registerMethod("subList(fromIndex : int, toIndex: int) : java.util.List<E>", list);

// Set
ResolvedJavaTypeInfo set = createResolvedJavaTypeInfo("java.util.Set<E>", cache, true);
set.setExtendedTypes(Arrays.asList("java.lang.Iterable<E>"));

// Map
ResolvedJavaTypeInfo map = createResolvedJavaTypeInfo("java.util.Map<K,V>", cache, true);
registerMethod("keySet() : java.util.Set<K>", map);
registerMethod("values() : java.util.Collection<V>", map);
registerMethod("entrySet() : java.util.Set<java.util.Map$Entry<K,V>>", map);
registerMethod("get(key : K) : V", map);

// Map.Entry
ResolvedJavaTypeInfo mapEntry = createResolvedJavaTypeInfo("java.util.Map$Entry<K,V>", cache, true);
registerMethod("getKey() : K", mapEntry);
registerMethod("getValue() : V", mapEntry);

// AbstractMap
ResolvedJavaTypeInfo abstractMap = createResolvedJavaTypeInfo("java.util.AbstractMap<K,V>", cache, true);
abstractMap.setExtendedTypes(Arrays.asList("java.util.Map<K,V>"));

// HashMap
ResolvedJavaTypeInfo hashMap = createResolvedJavaTypeInfo("java.util.HashMap<K,V>", cache, true);
hashMap.setExtendedTypes(Arrays.asList("java.util.AbstractMap<K,V>", "java.util.Map<K,V>"));

// https://quarkus.io/guides/qute-reference#evaluation-of-completionstage-and-uni-objects
createResolvedJavaTypeInfo("java.util.concurrent.CompletionStage<T>", cache, true);
ResolvedJavaTypeInfo completableFuture = createResolvedJavaTypeInfo("java.util.concurrent.CompletableFuture<T>",
cache, true);
completableFuture.setExtendedTypes(Arrays.asList("java.util.concurrent.CompletionStage<T>"));
createResolvedJavaTypeInfo("io.smallrye.mutiny.Uni<T>", cache, true);
ResolvedJavaTypeInfo asyncResultUni = createResolvedJavaTypeInfo("io.smallrye.mutiny.vertx.AsyncResultUni<T>",
cache, true);
asyncResultUni.setExtendedTypes(Arrays.asList("io.smallrye.mutiny.Uni<T>"));

// RawString for raw and safe resolver tests
ResolvedJavaTypeInfo rawString = createResolvedJavaTypeInfo("io.quarkus.qute.RawString", cache, true);
registerMethod("getValue() : java.lang.String", rawString);
registerMethod("toString() : java.lang.String", rawString);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import com.redhat.qute.commons.usertags.UserTagInfo;
import com.redhat.qute.project.multiple.QuteProjectA;
import com.redhat.qute.project.multiple.QuteProjectB;
import com.redhat.qute.project.roq.RoqProject;

public class MockQuteProjectRegistry extends QuteProjectRegistry {

Expand Down Expand Up @@ -64,6 +65,9 @@ protected QuteProject createProject(ProjectInfo projectInfo) {
if (QuteProjectB.PROJECT_URI.equals(projectInfo.getUri())) {
return new QuteProjectB(this);
}
if (RoqProject.PROJECT_URI.equals(projectInfo.getUri())) {
return new RoqProject(projectInfo, this);
}
return super.createProject(projectInfo);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
import com.redhat.qute.commons.InvalidMethodReason;
import com.redhat.qute.commons.JavaMemberInfo;
import com.redhat.qute.commons.JavaMethodInfo;
import com.redhat.qute.commons.JavaTypeInfo;
import com.redhat.qute.commons.JavaTypeKind;
import com.redhat.qute.commons.ProjectInfo;
import com.redhat.qute.commons.ResolvedJavaTypeInfo;
Expand All @@ -42,7 +41,7 @@
* @author Angelo ZERR
*
*/
public class QuteQuickStartProject extends MockQuteProject {
public class QuteQuickStartProject extends BaseQuteProject {

public final static String PROJECT_URI = "qute-quickstart";

Expand All @@ -56,95 +55,9 @@ public QuteQuickStartProject(ProjectInfo projectInfo, QuteProjectRegistry projec

@Override
protected void fillResolvedJavaTypes(List<ResolvedJavaTypeInfo> cache) {
createBinaryTypes(cache);
super.fillResolvedJavaTypes(cache);
createSourceTypes(cache);
}

private void createBinaryTypes(List<ResolvedJavaTypeInfo> cache) {
// Java type primitives
createResolvedJavaTypeInfo("java.lang.Object", cache, true);
createResolvedJavaTypeInfo("java.lang.Boolean", cache, true);
createResolvedJavaTypeInfo("java.lang.Integer", cache, true);
createResolvedJavaTypeInfo("java.lang.Double", cache, true);
createResolvedJavaTypeInfo("java.lang.Long", cache, true);
createResolvedJavaTypeInfo("java.lang.Float", cache, true);
createResolvedJavaTypeInfo("java.math.BigDecimal", cache, true);

// String
ResolvedJavaTypeInfo string = createResolvedJavaTypeInfo("java.lang.String", cache, true);
registerField("UTF16 : byte", string);
registerMethod("isEmpty() : boolean", string);
registerMethod("codePointCount(beginIndex : int,endIndex : int) : int", string);
string.setInvalidMethod("getChars", InvalidMethodReason.VoidReturn); // void getChars(int srcBegin, int srcEnd,
// char dst[], int dstBegin)
registerMethod("charAt(index : int) : char", string);
registerMethod("getBytes(charsetName : java.lang.String) : byte[]", string);
registerMethod("getBytes() : byte[]", string);

// BigInteger
ResolvedJavaTypeInfo bigInteger = createResolvedJavaTypeInfo("java.math.BigInteger", cache, true);
registerMethod("divide(val : java.math.BigInteger) : java.math.BigInteger", bigInteger);

// Iterator
ResolvedJavaTypeInfo iterator = createResolvedJavaTypeInfo("java.util.Iterator<E>", cache, true);
registerMethod("hasNext() : boolean", iterator);
registerMethod("next() : E", iterator);

// Iterable
ResolvedJavaTypeInfo iterable = createResolvedJavaTypeInfo("java.lang.Iterable<T>", cache, true);
registerMethod("iterator() : java.util.Iterator<T>", iterable);

// Collection
ResolvedJavaTypeInfo collection = createResolvedJavaTypeInfo("java.util.Collection<E>", cache, true);
collection.setExtendedTypes(Arrays.asList("java.lang.Iterable<E>"));

// List
ResolvedJavaTypeInfo list = createResolvedJavaTypeInfo("java.util.List<E>", cache, true);
list.setExtendedTypes(Arrays.asList("java.util.Collection<E>"));
registerMethod("size() : int", list);
registerMethod("get(index : int) : E", list);
registerMethod("subList(fromIndex : int, toIndex: int) : java.util.List<E>", list);

// Set
ResolvedJavaTypeInfo set = createResolvedJavaTypeInfo("java.util.Set<E>", cache, true);
set.setExtendedTypes(Arrays.asList("java.lang.Iterable<E>"));

// Map
ResolvedJavaTypeInfo map = createResolvedJavaTypeInfo("java.util.Map<K,V>", cache, true);
registerMethod("keySet() : java.util.Set<K>", map);
registerMethod("values() : java.util.Collection<V>", map);
registerMethod("entrySet() : java.util.Set<java.util.Map$Entry<K,V>>", map);
registerMethod("get(key : K) : V", map);

// Map.Entry
ResolvedJavaTypeInfo mapEntry = createResolvedJavaTypeInfo("java.util.Map$Entry<K,V>", cache, true);
registerMethod("getKey() : K", mapEntry);
registerMethod("getValue() : V", mapEntry);

// AbstractMap
ResolvedJavaTypeInfo abstractMap = createResolvedJavaTypeInfo("java.util.AbstractMap<K,V>", cache, true);
abstractMap.setExtendedTypes(Arrays.asList("java.util.Map<K,V>"));

// HashMap
ResolvedJavaTypeInfo hashMap = createResolvedJavaTypeInfo("java.util.HashMap<K,V>", cache, true);
hashMap.setExtendedTypes(Arrays.asList("java.util.AbstractMap<K,V>", "java.util.Map<K,V>"));

// https://quarkus.io/guides/qute-reference#evaluation-of-completionstage-and-uni-objects
createResolvedJavaTypeInfo("java.util.concurrent.CompletionStage<T>", cache, true);
ResolvedJavaTypeInfo completableFuture = createResolvedJavaTypeInfo("java.util.concurrent.CompletableFuture<T>",
cache, true);
completableFuture.setExtendedTypes(Arrays.asList("java.util.concurrent.CompletionStage<T>"));
createResolvedJavaTypeInfo("io.smallrye.mutiny.Uni<T>", cache, true);
ResolvedJavaTypeInfo asyncResultUni = createResolvedJavaTypeInfo("io.smallrye.mutiny.vertx.AsyncResultUni<T>",
cache, true);
asyncResultUni.setExtendedTypes(Arrays.asList("io.smallrye.mutiny.Uni<T>"));

// RawString for raw and safe resolver tests
ResolvedJavaTypeInfo rawString = createResolvedJavaTypeInfo("io.quarkus.qute.RawString", cache, true);
registerMethod("getValue() : java.lang.String", rawString);
registerMethod("toString() : java.lang.String", rawString);
}

private void createSourceTypes(List<ResolvedJavaTypeInfo> cache) {
createResolvedJavaTypeInfo("org.acme", cache, true).setJavaTypeKind(JavaTypeKind.Package);

Expand Down Expand Up @@ -339,7 +252,7 @@ private void createSourceTypes(List<ResolvedJavaTypeInfo> cache) {

// void method
registerMethod("timeoutGame() : void", renardeLogin);

// https://quarkus.io/guides/qute-reference#evaluation-of-completionstage-and-uni-objects
ResolvedJavaTypeInfo completionStagePOJO = createResolvedJavaTypeInfo("org.acme.CompletionStagePOJO", cache,
false);
Expand Down Expand Up @@ -529,12 +442,6 @@ protected void fillValueResolvers(List<ValueResolverInfo> resolvers) {

}

@Override
protected void fillJavaTypes(List<JavaTypeInfo> cache) {
createJavaTypeInfo("java.util.List<E>", JavaTypeKind.Interface, cache);
createJavaTypeInfo("java.util.Map<K,V>", JavaTypeKind.Interface, cache);
}

@Override
protected void fillNamespaceResolverInfos(Map<String, NamespaceResolverInfo> infos) {
NamespaceResolverInfo inject = new NamespaceResolverInfo();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"signature": "io.quarkiverse.roq.frontmatter.runtime.model.DocumentPage",
"extendedTypes": [
"java.lang.Record",
"io.quarkiverse.roq.frontmatter.runtime.model.Page"
],
"fields": [
{
"signature": "collection : java.lang.String"
},
{
"signature": "url : io.quarkiverse.roq.frontmatter.runtime.model.RoqUrl"
},
{
"signature": "info : io.quarkiverse.roq.frontmatter.runtime.model.PageInfo"
},
{
"signature": "data : io.vertx.core.json.JsonObject"
},
{
"signature": "hidden : boolean"
}
],
"methods": [],
"binary": false,
"templateDataAnnotations": [
{}
],
"typeKind": 0,
"invalidMethods": {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
{
"signature": "io.quarkiverse.roq.frontmatter.runtime.model.Paginator",
"extendedTypes": [
"java.lang.Record"
],
"fields": [
{
"signature": "collection : java.lang.String"
},
{
"signature": "collectionSize : int"
},
{
"signature": "limit : int"
},
{
"signature": "total : int"
},
{
"signature": "currentIndex : int"
},
{
"signature": "previousIndex : java.lang.Integer"
},
{
"signature": "previous : io.quarkiverse.roq.frontmatter.runtime.model.RoqUrl"
},
{
"signature": "nextIndex : java.lang.Integer"
},
{
"signature": "next : io.quarkiverse.roq.frontmatter.runtime.model.RoqUrl"
}
],
"methods": [
{
"signature": "prevIndex() : java.lang.Integer"
},
{
"signature": "prev() : io.quarkiverse.roq.frontmatter.runtime.model.RoqUrl"
},
{
"signature": "isFirst() : boolean"
},
{
"signature": "isSecond() : boolean"
}
],
"binary": false,
"templateDataAnnotations": [
{}
],
"typeKind": 0,
"invalidMethods": {}
}
Loading

0 comments on commit ddeed8d

Please sign in to comment.