diff --git a/pom.xml b/pom.xml
index 0f273d0..994be0f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,6 +1,6 @@
-
+
@@ -22,7 +22,7 @@
4.0.0
pro.projo
projo-parent
- 1.5.3
+ 1.5.4-SNAPSHOT
Projo Parent POM
https://github.com/raner/projo
pom
diff --git a/projo-jackson/pom.xml b/projo-jackson/pom.xml
index b9ce91b..d6fbe4f 100644
--- a/projo-jackson/pom.xml
+++ b/projo-jackson/pom.xml
@@ -1,6 +1,6 @@
-
+
@@ -24,7 +24,7 @@
pro.projo
projo-parent
- 1.5.3
+ 1.5.4-SNAPSHOT
projo-jackson
diff --git a/projo-jax-rs/pom.xml b/projo-jax-rs/pom.xml
index 8c2fdcf..06edc0e 100644
--- a/projo-jax-rs/pom.xml
+++ b/projo-jax-rs/pom.xml
@@ -1,6 +1,6 @@
-
+
@@ -23,7 +23,7 @@
pro.projo
projo-parent
- 1.5.3
+ 1.5.4-SNAPSHOT
Projo JAX-RS Integration for Jersey
projo-jax-rs
diff --git a/projo-runtime-code-generation/pom.xml b/projo-runtime-code-generation/pom.xml
index 4465e1f..2fea7ec 100644
--- a/projo-runtime-code-generation/pom.xml
+++ b/projo-runtime-code-generation/pom.xml
@@ -1,6 +1,6 @@
-
+
@@ -26,7 +26,7 @@
pro.projo
projo-parent
- 1.5.3
+ 1.5.4-SNAPSHOT
diff --git a/projo-template-annotation/pom.xml b/projo-template-annotation/pom.xml
index 59b0e17..86f7265 100644
--- a/projo-template-annotation/pom.xml
+++ b/projo-template-annotation/pom.xml
@@ -1,6 +1,6 @@
-
+
@@ -25,7 +25,7 @@
pro.projo
projo-parent
- 1.5.3
+ 1.5.4-SNAPSHOT
diff --git a/projo-template-configuration/pom.xml b/projo-template-configuration/pom.xml
index 6e31c9f..4c4863b 100644
--- a/projo-template-configuration/pom.xml
+++ b/projo-template-configuration/pom.xml
@@ -1,6 +1,6 @@
-
+
@@ -25,7 +25,7 @@
pro.projo
projo-parent
- 1.5.3
+ 1.5.4-SNAPSHOT
diff --git a/projo-template-generation-test/pom.xml b/projo-template-generation-test/pom.xml
index 254a876..b370558 100644
--- a/projo-template-generation-test/pom.xml
+++ b/projo-template-generation-test/pom.xml
@@ -1,6 +1,6 @@
-
+
@@ -24,7 +24,7 @@
pro.projo
projo-parent
- 1.5.3
+ 1.5.4-SNAPSHOT
projo-template-generation-test
Projo Template Generation Tests
diff --git a/projo-template-generation-test/src/main/java/pro/projo/generation/template/$test/Dimension$Dimension.java b/projo-template-generation-test/src/main/java/pro/projo/generation/template/$test/Dimension$Dimension.java
new file mode 100644
index 0000000..caf089b
--- /dev/null
+++ b/projo-template-generation-test/src/main/java/pro/projo/generation/template/$test/Dimension$Dimension.java
@@ -0,0 +1,52 @@
+// //
+// Copyright 2024 Mirko Raner //
+// //
+// Licensed under the Apache License, Version 2.0 (the "License"); //
+// you may not use this file except in compliance with the License. //
+// You may obtain a copy of the License at //
+// //
+// http://www.apache.org/licenses/LICENSE-2.0 //
+// //
+// Unless required by applicable law or agreed to in writing, software //
+// distributed under the License is distributed on an "AS IS" BASIS, //
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
+// See the License for the specific language governing permissions and //
+// limitations under the License. //
+// //
+package pro.projo.generation.template.$test;
+
+/* *#* The following imports will only appear in generated files: *#/
+import pro.projo.generation.template.exponents.Exponent;
+import pro.projo.generation.template.exponents.Minus4;
+import pro.projo.generation.template.exponents.Minus3;
+import pro.projo.generation.template.exponents.Minus2;
+import pro.projo.generation.template.exponents.Minus1;
+import pro.projo.generation.template.exponents.Zero;
+import pro.projo.generation.template.exponents.Plus1;
+import pro.projo.generation.template.exponents.Plus2;
+import pro.projo.generation.template.exponents.Plus3;
+import pro.projo.generation.template.exponents.Plus4;
+/* */
+/*#*/ // The following imports are only part of the template file:
+import pro.projo.template.annotation.Template;
+import pro.projo.test.TestDimensionTemplateConfiguration;
+/*#*/
+/**
+*#*
+* The {@link Dimension$Dimension} interface is a test type.
+*#
+* This interface defines a Dimension type.
+*
+* THIS IS A GENERATED INTERFACE.
+*
+* @author Mirko Raner
+**/
+/*#*/@Template(input=TestDimensionTemplateConfiguration.class)/*#*/
+public interface Dimension$Dimension
+{
+/* *#**#/
+#foreach ($method in $methods)
+ $method
+#end
+/* */
+}
diff --git a/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Exponent.java b/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Exponent.java
new file mode 100644
index 0000000..afcfb66
--- /dev/null
+++ b/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Exponent.java
@@ -0,0 +1,18 @@
+// //
+// Copyright 2024 Mirko Raner //
+// //
+// Licensed under the Apache License, Version 2.0 (the "License"); //
+// you may not use this file except in compliance with the License. //
+// You may obtain a copy of the License at //
+// //
+// http://www.apache.org/licenses/LICENSE-2.0 //
+// //
+// Unless required by applicable law or agreed to in writing, software //
+// distributed under the License is distributed on an "AS IS" BASIS, //
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
+// See the License for the specific language governing permissions and //
+// limitations under the License. //
+// //
+package pro.projo.generation.template.exponents;
+
+public interface Exponent {}
diff --git a/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Minus1.java b/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Minus1.java
new file mode 100644
index 0000000..cd5febe
--- /dev/null
+++ b/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Minus1.java
@@ -0,0 +1,18 @@
+// //
+// Copyright 2024 Mirko Raner //
+// //
+// Licensed under the Apache License, Version 2.0 (the "License"); //
+// you may not use this file except in compliance with the License. //
+// You may obtain a copy of the License at //
+// //
+// http://www.apache.org/licenses/LICENSE-2.0 //
+// //
+// Unless required by applicable law or agreed to in writing, software //
+// distributed under the License is distributed on an "AS IS" BASIS, //
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
+// See the License for the specific language governing permissions and //
+// limitations under the License. //
+// //
+package pro.projo.generation.template.exponents;
+
+public interface Minus1 extends Exponent {}
diff --git a/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Minus2.java b/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Minus2.java
new file mode 100644
index 0000000..c20504c
--- /dev/null
+++ b/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Minus2.java
@@ -0,0 +1,18 @@
+// //
+// Copyright 2024 Mirko Raner //
+// //
+// Licensed under the Apache License, Version 2.0 (the "License"); //
+// you may not use this file except in compliance with the License. //
+// You may obtain a copy of the License at //
+// //
+// http://www.apache.org/licenses/LICENSE-2.0 //
+// //
+// Unless required by applicable law or agreed to in writing, software //
+// distributed under the License is distributed on an "AS IS" BASIS, //
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
+// See the License for the specific language governing permissions and //
+// limitations under the License. //
+// //
+package pro.projo.generation.template.exponents;
+
+public interface Minus2 extends Exponent {}
diff --git a/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Minus3.java b/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Minus3.java
new file mode 100644
index 0000000..550241c
--- /dev/null
+++ b/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Minus3.java
@@ -0,0 +1,18 @@
+// //
+// Copyright 2024 Mirko Raner //
+// //
+// Licensed under the Apache License, Version 2.0 (the "License"); //
+// you may not use this file except in compliance with the License. //
+// You may obtain a copy of the License at //
+// //
+// http://www.apache.org/licenses/LICENSE-2.0 //
+// //
+// Unless required by applicable law or agreed to in writing, software //
+// distributed under the License is distributed on an "AS IS" BASIS, //
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
+// See the License for the specific language governing permissions and //
+// limitations under the License. //
+// //
+package pro.projo.generation.template.exponents;
+
+public interface Minus3 extends Exponent {}
diff --git a/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Minus4.java b/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Minus4.java
new file mode 100644
index 0000000..bbfaf97
--- /dev/null
+++ b/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Minus4.java
@@ -0,0 +1,18 @@
+// //
+// Copyright 2024 Mirko Raner //
+// //
+// Licensed under the Apache License, Version 2.0 (the "License"); //
+// you may not use this file except in compliance with the License. //
+// You may obtain a copy of the License at //
+// //
+// http://www.apache.org/licenses/LICENSE-2.0 //
+// //
+// Unless required by applicable law or agreed to in writing, software //
+// distributed under the License is distributed on an "AS IS" BASIS, //
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
+// See the License for the specific language governing permissions and //
+// limitations under the License. //
+// //
+package pro.projo.generation.template.exponents;
+
+public interface Minus4 extends Exponent {}
diff --git a/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Plus1.java b/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Plus1.java
new file mode 100644
index 0000000..a4e92c4
--- /dev/null
+++ b/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Plus1.java
@@ -0,0 +1,18 @@
+// //
+// Copyright 2024 Mirko Raner //
+// //
+// Licensed under the Apache License, Version 2.0 (the "License"); //
+// you may not use this file except in compliance with the License. //
+// You may obtain a copy of the License at //
+// //
+// http://www.apache.org/licenses/LICENSE-2.0 //
+// //
+// Unless required by applicable law or agreed to in writing, software //
+// distributed under the License is distributed on an "AS IS" BASIS, //
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
+// See the License for the specific language governing permissions and //
+// limitations under the License. //
+// //
+package pro.projo.generation.template.exponents;
+
+public interface Plus1 extends Exponent {}
diff --git a/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Plus2.java b/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Plus2.java
new file mode 100644
index 0000000..ca4ff46
--- /dev/null
+++ b/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Plus2.java
@@ -0,0 +1,18 @@
+// //
+// Copyright 2024 Mirko Raner //
+// //
+// Licensed under the Apache License, Version 2.0 (the "License"); //
+// you may not use this file except in compliance with the License. //
+// You may obtain a copy of the License at //
+// //
+// http://www.apache.org/licenses/LICENSE-2.0 //
+// //
+// Unless required by applicable law or agreed to in writing, software //
+// distributed under the License is distributed on an "AS IS" BASIS, //
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
+// See the License for the specific language governing permissions and //
+// limitations under the License. //
+// //
+package pro.projo.generation.template.exponents;
+
+public interface Plus2 extends Exponent {}
diff --git a/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Plus3.java b/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Plus3.java
new file mode 100644
index 0000000..a27733c
--- /dev/null
+++ b/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Plus3.java
@@ -0,0 +1,18 @@
+// //
+// Copyright 2024 Mirko Raner //
+// //
+// Licensed under the Apache License, Version 2.0 (the "License"); //
+// you may not use this file except in compliance with the License. //
+// You may obtain a copy of the License at //
+// //
+// http://www.apache.org/licenses/LICENSE-2.0 //
+// //
+// Unless required by applicable law or agreed to in writing, software //
+// distributed under the License is distributed on an "AS IS" BASIS, //
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
+// See the License for the specific language governing permissions and //
+// limitations under the License. //
+// //
+package pro.projo.generation.template.exponents;
+
+public interface Plus3 extends Exponent {}
diff --git a/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Plus4.java b/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Plus4.java
new file mode 100644
index 0000000..a001a4d
--- /dev/null
+++ b/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Plus4.java
@@ -0,0 +1,18 @@
+// //
+// Copyright 2024 Mirko Raner //
+// //
+// Licensed under the Apache License, Version 2.0 (the "License"); //
+// you may not use this file except in compliance with the License. //
+// You may obtain a copy of the License at //
+// //
+// http://www.apache.org/licenses/LICENSE-2.0 //
+// //
+// Unless required by applicable law or agreed to in writing, software //
+// distributed under the License is distributed on an "AS IS" BASIS, //
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
+// See the License for the specific language governing permissions and //
+// limitations under the License. //
+// //
+package pro.projo.generation.template.exponents;
+
+public interface Plus4 extends Exponent {}
diff --git a/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Zero.java b/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Zero.java
new file mode 100644
index 0000000..d2ea190
--- /dev/null
+++ b/projo-template-generation-test/src/main/java/pro/projo/generation/template/exponents/Zero.java
@@ -0,0 +1,18 @@
+// //
+// Copyright 2024 Mirko Raner //
+// //
+// Licensed under the Apache License, Version 2.0 (the "License"); //
+// you may not use this file except in compliance with the License. //
+// You may obtain a copy of the License at //
+// //
+// http://www.apache.org/licenses/LICENSE-2.0 //
+// //
+// Unless required by applicable law or agreed to in writing, software //
+// distributed under the License is distributed on an "AS IS" BASIS, //
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
+// See the License for the specific language governing permissions and //
+// limitations under the License. //
+// //
+package pro.projo.generation.template.exponents;
+
+public interface Zero extends Exponent {}
diff --git a/projo-template-generation-test/src/main/java/pro/projo/generation/template/options/$test/Dimension$Dimension.java b/projo-template-generation-test/src/main/java/pro/projo/generation/template/options/$test/Dimension$Dimension.java
new file mode 100644
index 0000000..df7d80f
--- /dev/null
+++ b/projo-template-generation-test/src/main/java/pro/projo/generation/template/options/$test/Dimension$Dimension.java
@@ -0,0 +1,52 @@
+// //
+// Copyright 2024 Mirko Raner //
+// //
+// Licensed under the Apache License, Version 2.0 (the "License"); //
+// you may not use this file except in compliance with the License. //
+// You may obtain a copy of the License at //
+// //
+// http://www.apache.org/licenses/LICENSE-2.0 //
+// //
+// Unless required by applicable law or agreed to in writing, software //
+// distributed under the License is distributed on an "AS IS" BASIS, //
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
+// See the License for the specific language governing permissions and //
+// limitations under the License. //
+// //
+package pro.projo.generation.template.options.$test;
+
+/* *#* The following imports will only appear in generated files: *#/
+import pro.projo.generation.template.exponents.Exponent;
+import pro.projo.generation.template.exponents.Minus4;
+import pro.projo.generation.template.exponents.Minus3;
+import pro.projo.generation.template.exponents.Minus2;
+import pro.projo.generation.template.exponents.Minus1;
+import pro.projo.generation.template.exponents.Zero;
+import pro.projo.generation.template.exponents.Plus1;
+import pro.projo.generation.template.exponents.Plus2;
+import pro.projo.generation.template.exponents.Plus3;
+import pro.projo.generation.template.exponents.Plus4;
+/* */
+/*#*/ // The following imports are only part of the template file:
+import pro.projo.template.annotation.Template;
+import pro.projo.test.options.TestDimensionTemplateOptionsConfiguration;
+/*#*/
+/**
+*#*
+* The {@link Dimension$Dimension} interface is a test type.
+*#
+* This interface defines a Dimension type.
+*
+* THIS IS A GENERATED INTERFACE.
+*
+* @author Mirko Raner
+**/
+/*#*/@Template(input=TestDimensionTemplateOptionsConfiguration.class)/*#*/
+public interface Dimension$Dimension
+{
+/* *#**#/
+#foreach ($method in $methods)
+ $method
+#end
+/* */
+}
diff --git a/projo-template-generation-test/src/test/java/pro/projo/generation/template/test/TestDimensions.java b/projo-template-generation-test/src/test/java/pro/projo/generation/template/test/TestDimensions.java
new file mode 100644
index 0000000..c0bf541
--- /dev/null
+++ b/projo-template-generation-test/src/test/java/pro/projo/generation/template/test/TestDimensions.java
@@ -0,0 +1,66 @@
+// //
+// Copyright 2024 Mirko Raner //
+// //
+// Licensed under the Apache License, Version 2.0 (the "License"); //
+// you may not use this file except in compliance with the License. //
+// You may obtain a copy of the License at //
+// //
+// http://www.apache.org/licenses/LICENSE-2.0 //
+// //
+// Unless required by applicable law or agreed to in writing, software //
+// distributed under the License is distributed on an "AS IS" BASIS, //
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
+// See the License for the specific language governing permissions and //
+// limitations under the License. //
+// //
+package pro.projo.generation.template.test;
+
+import pro.projo.generation.template.test.dimensions.Dimension;
+import pro.projo.generation.template.exponents.Minus4;
+import pro.projo.generation.template.exponents.Minus3;
+import pro.projo.generation.template.exponents.Minus2;
+import pro.projo.generation.template.exponents.Minus1;
+import pro.projo.generation.template.exponents.Zero;
+import pro.projo.generation.template.exponents.Plus1;
+import pro.projo.generation.template.exponents.Plus2;
+import pro.projo.generation.template.exponents.Plus3;
+import pro.projo.generation.template.exponents.Plus4;
+
+/**
+* {@link TestDimensions} is a non-executable test that verifies the type safety of
+* the generated dimensions API. The test is considered passing if it compiles without
+* errors. Any problems with the dimensions API will be detected at compile time.
+*
+* @author Mirko Raner
+**/
+public interface TestDimensions
+{
+ Dimension dimensions();
+
+ default void testDimensions()
+ {
+ Dimension time1 = dimensions().t();
+ Dimension time2 = dimensions().t().plus1();
+ Dimension time3 = dimensions().m().zero().t();
+ Dimension frequency = dimensions().t().minus1();
+ Dimension velocity1 = dimensions().t().minus1().l();
+ Dimension velocity2 = dimensions().t().minus1().l().plus1();
+ Dimension velocity3 = dimensions().t().minus1().l().plus1().m().zero();
+ Dimension velocity4 = dimensions().l().t().minus1();
+ Dimension velocity5 = dimensions().l().plus1().t().minus1();
+ Dimension pressure1 = dimensions().t().minus2().l().minus1().m();
+ Dimension pressure2 = dimensions().t().minus2().l().minus1().m().plus1();
+ Dimension pressure3 = dimensions().m().plus1().t().minus2().l().minus1();
+ Dimension pressure4 = dimensions().m().t().minus2().l().minus1();
+ Dimension capacitance = dimensions().t().plus4().l().minus2().m().minus1().i().plus2();
+ Dimension thermalConductance = dimensions().t().minus3().l().plus2().m().plus1().θ().minus1();
+ Dimension catalyticActivity = dimensions().n().t().minus1();
+ Dimension luminousEfficacy = dimensions().t().plus3().l().minus2().m().minus1().j().plus1();
+ Dimension jounce = dimensions().l().t().minus4();
+ use(time1, time2, time3, frequency, velocity1, velocity2, velocity3, velocity4, velocity5);
+ use(pressure1, pressure2, pressure3, pressure4, capacitance, thermalConductance, catalyticActivity);
+ use(luminousEfficacy, jounce);
+ }
+
+ void use(Dimension, ?, ?, ?, ?, ?, ?>... dimensions);
+}
diff --git a/projo-template-generation-test/src/test/java/pro/projo/generation/template/test/TestTemplateOptions.java b/projo-template-generation-test/src/test/java/pro/projo/generation/template/test/TestTemplateOptions.java
new file mode 100644
index 0000000..1867557
--- /dev/null
+++ b/projo-template-generation-test/src/test/java/pro/projo/generation/template/test/TestTemplateOptions.java
@@ -0,0 +1,37 @@
+// //
+// Copyright 2024 Mirko Raner //
+// //
+// Licensed under the Apache License, Version 2.0 (the "License"); //
+// you may not use this file except in compliance with the License. //
+// You may obtain a copy of the License at //
+// //
+// http://www.apache.org/licenses/LICENSE-2.0 //
+// //
+// Unless required by applicable law or agreed to in writing, software //
+// distributed under the License is distributed on an "AS IS" BASIS, //
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
+// See the License for the specific language governing permissions and //
+// limitations under the License. //
+// //
+package pro.projo.generation.template.test;
+
+import java.net.URL;
+import org.junit.Test;
+import static org.junit.Assert.assertNotNull;
+
+public class TestTemplateOptions
+{
+ @Test(expected=ClassNotFoundException.class)
+ public void noGeneratedJavaTypesShouldExist() throws ClassNotFoundException
+ {
+ Class.forName("pro.projo.generation.template.options.test.dimensions.Dimension");
+ }
+
+ @Test
+ public void generatedKavaFilesShouldExist()
+ {
+ ClassLoader classLoader = getClass().getClassLoader();
+ URL url = classLoader.getResource("pro/projo/generation/template/options/test/dimensions/Dimension.kava");
+ assertNotNull(url);
+ }
+}
diff --git a/projo-template-generation/pom.xml b/projo-template-generation/pom.xml
index d5c02bc..f7a2f7d 100644
--- a/projo-template-generation/pom.xml
+++ b/projo-template-generation/pom.xml
@@ -1,6 +1,6 @@
-
+
@@ -26,7 +26,7 @@
pro.projo
projo-parent
- 1.5.3
+ 1.5.4-SNAPSHOT
diff --git a/projo-template-generation/src/main/java/pro/projo/generation/ProjoTemplateFactoryProcessor.java b/projo-template-generation/src/main/java/pro/projo/generation/ProjoTemplateFactoryProcessor.java
index 0be7e34..36281e9 100644
--- a/projo-template-generation/src/main/java/pro/projo/generation/ProjoTemplateFactoryProcessor.java
+++ b/projo-template-generation/src/main/java/pro/projo/generation/ProjoTemplateFactoryProcessor.java
@@ -1,5 +1,5 @@
// //
-// Copyright 2018 - 2022 Mirko Raner //
+// Copyright 2018 - 2024 Mirko Raner //
// //
// Licensed under the Apache License, Version 2.0 (the "License"); //
// you may not use this file except in compliance with the License. //
@@ -31,7 +31,7 @@
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Elements;
import javax.tools.FileObject;
-import javax.tools.JavaFileObject;
+import pro.projo.interfaces.annotation.Options;
import pro.projo.template.annotation.Configuration;
import pro.projo.template.annotation.Template;
import static java.io.File.separatorChar;
@@ -86,7 +86,17 @@ public boolean process(Set extends TypeElement> annotations, RoundEnvironment
TypeElement typeElement = elements.getTypeElement(className);
try
{
- JavaFileObject sourceFile = filer.createSourceFile(className, typeElement);
+ Options options = configuration.options();
+ String fileExtension = configuration.options().fileExtension();
+ FileObject sourceFile = fileExtension.equals(".java")?
+ filer.createSourceFile(className, typeElement):
+ filer.createResource
+ (
+ options.outputLocation(),
+ packageName(configuration),
+ fileName(configuration),
+ typeElement
+ );
try (PrintWriter writer = new PrintWriter(sourceFile.openWriter(), true))
{
try (Reader reader = templateFile.openReader(true))
@@ -107,6 +117,20 @@ public boolean process(Set extends TypeElement> annotations, RoundEnvironment
return true;
}
+ private String packageName(Configuration configuration)
+ {
+ String name = configuration.fullyQualifiedClassName();
+ int index = name.lastIndexOf('.');
+ return name.substring(0, index);
+ }
+
+ private String fileName(Configuration configuration)
+ {
+ String name = configuration.fullyQualifiedClassName();
+ int index = name.lastIndexOf('.');
+ return name.substring(index+1) + configuration.options().fileExtension();
+ }
+
private FileObject getTemplateFile(Element element)
{
String simpleName = element.getSimpleName().toString();
diff --git a/projo/pom.xml b/projo/pom.xml
index bb5bfc6..b1e8646 100644
--- a/projo/pom.xml
+++ b/projo/pom.xml
@@ -1,6 +1,6 @@
-
+
@@ -26,7 +26,7 @@
projo-parent
pro.projo
- 1.5.3
+ 1.5.4-SNAPSHOT
diff --git a/projo/src/test/java/pro/projo/test/TestDimensionTemplateConfiguration.java b/projo/src/test/java/pro/projo/test/TestDimensionTemplateConfiguration.java
new file mode 100644
index 0000000..fa012b0
--- /dev/null
+++ b/projo/src/test/java/pro/projo/test/TestDimensionTemplateConfiguration.java
@@ -0,0 +1,126 @@
+// //
+// Copyright 2024 Mirko Raner //
+// //
+// Licensed under the Apache License, Version 2.0 (the "License"); //
+// you may not use this file except in compliance with the License. //
+// You may obtain a copy of the License at //
+// //
+// http://www.apache.org/licenses/LICENSE-2.0 //
+// //
+// Unless required by applicable law or agreed to in writing, software //
+// distributed under the License is distributed on an "AS IS" BASIS, //
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
+// See the License for the specific language governing permissions and //
+// limitations under the License. //
+// //
+package pro.projo.test;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collector;
+import java.util.stream.Stream;
+import pro.projo.interfaces.annotation.Options;
+import pro.projo.template.annotation.Configuration;
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.toCollection;
+import static java.util.stream.Collectors.toList;
+import static java.util.stream.IntStream.rangeClosed;
+
+/**
+* The {@link TestDimensionTemplateConfiguration} is used for internal testing.
+*
+* @author Mirko Raner
+**/
+public class TestDimensionTemplateConfiguration extends ArrayList
+{
+ private final static long serialVersionUID = 5849315222475315976L;
+
+ private final String[] dimensions = {"T", "L", "M", "I", "ϴ", "N", "J"};
+ private final String[] exponents = {"Minus4", "Minus3", "Minus2", "Minus1", "Zero", "Plus1", "Plus2", "Plus3", "Plus4"};
+
+ public TestDimensionTemplateConfiguration()
+ {
+ rangeClosed(0, 7).mapToObj(count -> new Configuration()
+ {
+ @Override
+ public String fullyQualifiedClassName()
+ {
+ return targetPackage() + ".Dimension" + suffix();
+ }
+
+ @Override
+ public Options options()
+ {
+ return TestDimensionTemplateConfiguration.this.options();
+ }
+
+ @Override
+ public Map parameters()
+ {
+ return new HashMap()
+ {
+ private static final long serialVersionUID = 1L;
+ {
+ put("Dimension", suffix()+typeParameters()+extend());
+ put("methods", methods());
+ put("test", subpackage());
+ }
+ };
+ }
+
+ List methods()
+ {
+ if (count == 0)
+ {
+ return Stream.of(dimensions)
+ .map(dimension -> "Dimension" + dimension + Stream.of(dimensions).map(it -> it.equals(dimension)? "Plus1":it).collect(joined()) + " " + dimension.toLowerCase() + "();")
+ .collect(toList());
+ }
+ else
+ {
+ return Stream.of(exponents)
+ .map(exponent -> "Dimension" + Stream.of(dimensions).map(it -> it.equals(suffix())? exponent:it).collect(joined()) + " " + exponent.toLowerCase() + "();")
+ .collect(toList());
+ }
+ }
+
+ String suffix()
+ {
+ return count == 0? "":dimensions[count-1];
+ }
+
+ String extend()
+ {
+ return count == 0? "":" extends Dimension" + Stream.of(dimensions).collect(joined());
+ }
+ })
+ .collect(toCollection(() -> this));
+ }
+
+ protected Options options()
+ {
+ return Configuration.defaults();
+ }
+
+ protected String targetPackage()
+ {
+ return "pro.projo.generation.template.test.dimensions";
+ }
+
+ protected String subpackage()
+ {
+ return "test.dimensions";
+ }
+
+ String typeParameters()
+ {
+ return Stream.of(dimensions).map(it -> it + " extends Exponent").collect(joined());
+ }
+
+ Collector joined()
+ {
+ return joining(", ", "<", ">");
+ }
+}
diff --git a/projo/src/test/java/pro/projo/test/options/TestDimensionTemplateOptionsConfiguration.java b/projo/src/test/java/pro/projo/test/options/TestDimensionTemplateOptionsConfiguration.java
new file mode 100644
index 0000000..7cfb258
--- /dev/null
+++ b/projo/src/test/java/pro/projo/test/options/TestDimensionTemplateOptionsConfiguration.java
@@ -0,0 +1,41 @@
+// //
+// Copyright 2024 Mirko Raner //
+// //
+// Licensed under the Apache License, Version 2.0 (the "License"); //
+// you may not use this file except in compliance with the License. //
+// You may obtain a copy of the License at //
+// //
+// http://www.apache.org/licenses/LICENSE-2.0 //
+// //
+// Unless required by applicable law or agreed to in writing, software //
+// distributed under the License is distributed on an "AS IS" BASIS, //
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
+// See the License for the specific language governing permissions and //
+// limitations under the License. //
+// //
+package pro.projo.test.options;
+
+import pro.projo.interfaces.annotation.Options;
+import pro.projo.test.TestDimensionTemplateConfiguration;
+
+/**
+* The {@link TestDimensionTemplateOptionsConfiguration} is used for internal testing.
+*
+* @author Mirko Raner
+**/
+public class TestDimensionTemplateOptionsConfiguration extends TestDimensionTemplateConfiguration
+{
+ private final static long serialVersionUID = -8492805138996252572L;
+
+ @Override
+ protected Options options()
+ {
+ return getClass().getPackage().getAnnotation(Options.class);
+ }
+
+ @Override
+ protected String targetPackage()
+ {
+ return "pro.projo.generation.template.options.test.dimensions";
+ }
+}
diff --git a/projo/src/test/java/pro/projo/test/options/package-info.java b/projo/src/test/java/pro/projo/test/options/package-info.java
new file mode 100644
index 0000000..0495be2
--- /dev/null
+++ b/projo/src/test/java/pro/projo/test/options/package-info.java
@@ -0,0 +1,27 @@
+// //
+// Copyright 2024 Mirko Raner //
+// //
+// Licensed under the Apache License, Version 2.0 (the "License"); //
+// you may not use this file except in compliance with the License. //
+// You may obtain a copy of the License at //
+// //
+// http://www.apache.org/licenses/LICENSE-2.0 //
+// //
+// Unless required by applicable law or agreed to in writing, software //
+// distributed under the License is distributed on an "AS IS" BASIS, //
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
+// See the License for the specific language governing permissions and //
+// limitations under the License. //
+// //
+@Options(fileExtension=".kava", outputLocation=CLASS_OUTPUT)
+package pro.projo.test.options;
+
+import pro.projo.interfaces.annotation.Options;
+import static javax.tools.StandardLocation.CLASS_OUTPUT;
+
+/**
+* This {@code package-info} file serves the only purpose of providing easy access
+* to an {@link Options} instance that has some custom values.
+*
+* @author Mirko Raner
+**/