Skip to content

Commit 44672fc

Browse files
angelozerrfbricon
authored andcommitted
Support for Injecting Beans Directly In Templates
Fixes #546 Signed-off-by: azerr <azerr@redhat.com>
1 parent 9c48330 commit 44672fc

File tree

85 files changed

+4290
-795
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

85 files changed

+4290
-795
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.acme.qute;
2+
3+
import javax.inject.Named;
4+
5+
@Named
6+
public class InjectedData {
7+
8+
@Named
9+
private String foo;
10+
11+
@Named("bar")
12+
private String aBar;
13+
14+
@Named("user")
15+
public String getUser() {
16+
return null;
17+
}
18+
19+
@Named
20+
public String getSystemUser() {
21+
return null;
22+
}
23+
}

qute.jdt/com.redhat.qute.jdt.test/src/main/java/com/redhat/qute/jdt/template/TemplateGetDataModelProjectTest.java

Lines changed: 62 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,13 @@
2121
import org.junit.Assert;
2222
import org.junit.Test;
2323

24-
import com.redhat.qute.commons.ValueResolver;
2524
import com.redhat.qute.commons.datamodel.DataModelParameter;
2625
import com.redhat.qute.commons.datamodel.DataModelProject;
2726
import com.redhat.qute.commons.datamodel.DataModelTemplate;
2827
import com.redhat.qute.commons.datamodel.QuteDataModelProjectParams;
29-
import com.redhat.qute.jdt.QuteSupportForTemplate;
28+
import com.redhat.qute.commons.datamodel.resolvers.ValueResolverInfo;
3029
import com.redhat.qute.jdt.QuteProjectTest.QuteMavenProjectName;
30+
import com.redhat.qute.jdt.QuteSupportForTemplate;
3131

3232
/**
3333
* Tests for
@@ -51,7 +51,13 @@ public void quteQuickStart() throws Exception {
5151
// Test templates
5252
testTemplates(project);
5353
// Test value resolvers
54-
testValueResolvers(project);
54+
55+
List<ValueResolverInfo> resolvers = project.getValueResolvers();
56+
Assert.assertNotNull(resolvers);
57+
Assert.assertFalse(resolvers.isEmpty());
58+
59+
testValueResolversFomTemplateExtension(resolvers);
60+
testValueResolversFomInject(resolvers);
5561
}
5662

5763
private static void testTemplates(DataModelProject<DataModelTemplate<DataModelParameter>> project) {
@@ -105,7 +111,7 @@ private static void templateField(DataModelProject<DataModelTemplate<DataModelPa
105111
Assert.assertEquals(2, parameters2.size());
106112
assertParameter("age2", "int", true, parameters2, 0);
107113
assertParameter("name2", "java.lang.String", true, parameters2, 1);
108-
114+
109115
// Template hallo;
110116

111117
DataModelTemplate<DataModelParameter> halloTemplate = project
@@ -178,10 +184,7 @@ private static void checkedTemplate(DataModelProject<DataModelTemplate<DataModel
178184
assertParameter("name", "java.lang.String", false, hello3Parameters, 0);
179185
}
180186

181-
private static void testValueResolvers(DataModelProject<DataModelTemplate<DataModelParameter>> project) {
182-
List<ValueResolver> resolvers = project.getValueResolvers();
183-
Assert.assertNotNull(resolvers);
184-
Assert.assertFalse(resolvers.isEmpty());
187+
private static void testValueResolversFomTemplateExtension(List<ValueResolverInfo> resolvers) {
185188

186189
// Resolver from Java sources
187190
assertValueResolver(null, "discountedPrice(item : org.acme.qute.Item) : java.math.BigDecimal",
@@ -194,7 +197,7 @@ private static void testValueResolvers(DataModelProject<DataModelTemplate<DataMo
194197
"io.quarkus.qute.runtime.extensions.CollectionTemplateExtensions", resolvers);
195198

196199
// from io.quarkus.qute.runtime.extensions.ConfigTemplateExtensions
197-
assertValueResolver("config", "config:getConfigProperty(propertyName : java.lang.String) : java.lang.Object",
200+
assertValueResolver("config", "getConfigProperty(propertyName : java.lang.String) : java.lang.Object",
198201
"io.quarkus.qute.runtime.extensions.ConfigTemplateExtensions", resolvers);
199202

200203
// from io.quarkus.qute.runtime.extensions.MapTemplateExtensions
@@ -212,24 +215,69 @@ private static void testValueResolvers(DataModelProject<DataModelTemplate<DataMo
212215
"fmtInstance(format : java.lang.String, ignoredPropertyName : java.lang.String, args : java.lang.Object[]) : java.lang.String",
213216
"io.quarkus.qute.runtime.extensions.StringTemplateExtensions", resolvers);
214217
assertValueResolver("str",
215-
"str:fmt(ignoredPropertyName : java.lang.String, format : java.lang.String, args : java.lang.Object[]) : java.lang.String",
218+
"fmt(ignoredPropertyName : java.lang.String, format : java.lang.String, args : java.lang.Object[]) : java.lang.String",
216219
"io.quarkus.qute.runtime.extensions.StringTemplateExtensions", resolvers);
217220

218221
// from io.quarkus.qute.runtime.extensions.TimeTemplateExtensions
219222
assertValueResolver(null,
220223
"format(temporal : java.time.temporal.TemporalAccessor, pattern : java.lang.String) : java.lang.String",
221224
"io.quarkus.qute.runtime.extensions.TimeTemplateExtensions", resolvers);
222225
assertValueResolver("time",
223-
"time:format(dateTimeObject : java.lang.Object, pattern : java.lang.String) : java.lang.String",
226+
"format(dateTimeObject : java.lang.Object, pattern : java.lang.String) : java.lang.String",
224227
"io.quarkus.qute.runtime.extensions.TimeTemplateExtensions", resolvers);
225228

226229
}
227230

231+
private void testValueResolversFomInject(List<ValueResolverInfo> resolvers) {
232+
Assert.assertNotNull(resolvers);
233+
Assert.assertFalse(resolvers.isEmpty());
234+
235+
// from org.acme.qute.InjectedData source
236+
237+
// @Named
238+
// public class InjectedData;
239+
assertValueResolver("inject", "org.acme.qute.InjectedData", "org.acme.qute.InjectedData", //
240+
"injectedData", resolvers);
241+
242+
// @Named
243+
// private String foo;
244+
assertValueResolver("inject", "foo : java.lang.String", "org.acme.qute.InjectedData", //
245+
"foo", resolvers);
246+
247+
// @Named("bar")
248+
// private String aBar;
249+
assertValueResolver("inject", "aBar : java.lang.String", "org.acme.qute.InjectedData", //
250+
"bar", resolvers);
251+
252+
// @Named("user")
253+
// private String getUser() {...
254+
assertValueResolver("inject", "getUser() : java.lang.String", "org.acme.qute.InjectedData", //
255+
"user", resolvers);
256+
257+
// @Named
258+
// private String getSystemUser() {...
259+
assertValueResolver("inject", "getSystemUser() : java.lang.String", "org.acme.qute.InjectedData", //
260+
"systemUser", resolvers);
261+
262+
// from io.quarkus.vertx.http.runtime.CurrentRequestProducer
263+
assertValueResolver("inject",
264+
"getCurrentRequest(rc : io.vertx.ext.web.RoutingContext) : io.vertx.core.http.HttpServerRequest",
265+
"io.quarkus.vertx.http.runtime.CurrentRequestProducer", //
266+
"vertxRequest", resolvers);
267+
268+
}
269+
228270
private static void assertValueResolver(String namespace, String signature, String sourceType,
229-
List<ValueResolver> resolvers) {
230-
Optional<ValueResolver> result = resolvers.stream().filter(r -> signature.equals(r.getSignature())).findFirst();
271+
List<ValueResolverInfo> resolvers) {
272+
assertValueResolver(namespace, signature, sourceType, null, resolvers);
273+
}
274+
275+
private static void assertValueResolver(String namespace, String signature, String sourceType, String named,
276+
List<ValueResolverInfo> resolvers) {
277+
Optional<ValueResolverInfo> result = resolvers.stream().filter(r -> signature.equals(r.getSignature()))
278+
.findFirst();
231279
Assert.assertFalse("Find '" + signature + "' value resolver.", result.isEmpty());
232-
ValueResolver resolver = result.get();
280+
ValueResolverInfo resolver = result.get();
233281
Assert.assertEquals(namespace, resolver.getNamespace());
234282
Assert.assertEquals(signature, resolver.getSignature());
235283
Assert.assertEquals(sourceType, resolver.getSourceType());
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2022 Red Hat Inc. and others.
3+
* All rights reserved. This program and the accompanying materials
4+
* which accompanies this distribution, and is available at
5+
* http://www.eclipse.org/legal/epl-v20.html
6+
*
7+
* SPDX-License-Identifier: EPL-2.0
8+
*
9+
* Contributors:
10+
* Red Hat Inc. - initial API and implementation
11+
*******************************************************************************/
12+
package com.redhat.qute.jdt.utils;
13+
14+
import org.eclipse.jdt.core.IJavaElement;
15+
import org.junit.Assert;
16+
import org.junit.Test;
17+
18+
/**
19+
* Tests for {@link CDIUtils}.
20+
*
21+
* @author Angelo ZERR
22+
*
23+
*/
24+
public class CDIUtilsTest {
25+
26+
@Test
27+
public void namedWithType() {
28+
String javaType = "MyClass";
29+
30+
String name = CDIUtils.getSimpleName(javaType, null, IJavaElement.TYPE);
31+
Assert.assertEquals("myClass", name);
32+
33+
String named = "foo";
34+
name = CDIUtils.getSimpleName(javaType, named, IJavaElement.TYPE);
35+
Assert.assertEquals("foo", name);
36+
}
37+
38+
@Test
39+
public void namedWithField() {
40+
String javaType = "MyField";
41+
42+
String name = CDIUtils.getSimpleName(javaType, null, IJavaElement.FIELD);
43+
Assert.assertEquals("MyField", name);
44+
45+
String named = "foo";
46+
name = CDIUtils.getSimpleName(javaType, named, IJavaElement.FIELD);
47+
Assert.assertEquals("foo", name);
48+
}
49+
50+
@Test
51+
public void namedWithMethod() {
52+
String javaType = "MyMethod";
53+
54+
String name = CDIUtils.getSimpleName(javaType, null, IJavaElement.METHOD);
55+
Assert.assertEquals("MyMethod", name);
56+
57+
String named = "foo";
58+
name = CDIUtils.getSimpleName(javaType, named, IJavaElement.METHOD);
59+
Assert.assertEquals("foo", name);
60+
}
61+
62+
@Test
63+
public void namedWithGetterMethod() {
64+
String javaType = "getMethod";
65+
66+
String name = CDIUtils.getSimpleName(javaType, null, IJavaElement.METHOD, () -> true);
67+
Assert.assertEquals("method", name);
68+
69+
String named = "foo";
70+
name = CDIUtils.getSimpleName(javaType, named, IJavaElement.METHOD, () -> true);
71+
Assert.assertEquals("foo", name);
72+
}
73+
}

qute.jdt/com.redhat.qute.jdt/META-INF/MANIFEST.MF

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,13 @@ Bundle-RequiredExecutionEnvironment: JavaSE-11
1717
Bundle-ActivationPolicy: lazy
1818
Export-Package: com.redhat.qute.commons,
1919
com.redhat.qute.commons.datamodel,
20+
com.redhat.qute.commons.datamodel.resolvers,
21+
com.redhat.qute.commons.usertags,
2022
com.redhat.qute.jdt,
2123
com.redhat.qute.jdt.internal.java;x-friends:="com.redhat.qute.jdt.test",
2224
com.redhat.qute.jdt.internal.ls;x-friends:="com.redhat.qute.jdt.test",
2325
com.redhat.qute.jdt.internal.template;x-friends:="com.redhat.qute.jdt.test",
26+
com.redhat.qute.jdt.template.datamodel,
2427
com.redhat.qute.jdt.utils
2528
Bundle-Activator: com.redhat.qute.jdt.QutePlugin
2629

qute.jdt/com.redhat.qute.jdt/build.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ output.. = target/classes/
33
bin.includes = plugin.xml,\
44
META-INF/,\
55
.,\
6-
plugin.properties
6+
plugin.properties,\
7+
schema/

qute.jdt/com.redhat.qute.jdt/plugin.properties

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,6 @@
1111
# Red Hat Inc. - initial API and implementation
1212
###############################################################################
1313
pluginName=JDT Qute Extension
14-
providerName=Red Hat
14+
providerName=Red Hat
15+
16+
dataModelProviders.name=Data model providers

qute.jdt/com.redhat.qute.jdt/plugin.xml

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
<?eclipse version="3.5"?>
33
<plugin>
44

5+
<extension-point id="dataModelProviders"
6+
name="%dataModelProviders.name"
7+
schema="schema/dataModelProviders.exsd" />
8+
59
<!-- Delegate command handler for Qute template -->
610
<extension point="org.eclipse.jdt.ls.core.delegateCommandHandler">
711
<delegateCommandHandler class="com.redhat.qute.jdt.internal.ls.QuteSupportForTemplateDelegateCommandHandler">
@@ -23,4 +27,19 @@
2327
</delegateCommandHandler>
2428
</extension>
2529

26-
</plugin>
30+
<!-- Data model providers for Qute core -->
31+
<extension point="com.redhat.qute.jdt.dataModelProviders">
32+
<provider class="com.redhat.qute.jdt.internal.template.datamodel.CheckedTemplateSupport" />
33+
<provider class="com.redhat.qute.jdt.internal.template.datamodel.TemplateExtensionSupport" />
34+
<provider class="com.redhat.qute.jdt.internal.template.datamodel.TemplateFieldSupport" />
35+
</extension>
36+
37+
<!-- Data model providers for Quarkus integration for Qute -->
38+
<extension point="com.redhat.qute.jdt.dataModelProviders">
39+
<provider namespaces="inject,cdi"
40+
description="A CDI bean annotated with `@Named` can be referenced in any template through `cdi` and/or `inject` namespaces."
41+
url="https://quarkus.io/guides/qute-reference#injecting-beans-directly-in-templates"
42+
class="com.redhat.qute.jdt.internal.extensions.quarkus.InjectNamespaceResolverSupport" />
43+
</extension>
44+
45+
</plugin>

0 commit comments

Comments
 (0)