We will create a simple custom function to translate words from english to Quenya (if a translation is available).
This project is part of a series of mini tutorial on Venus Fugerit Doc, here you can find the other tutorials.
- Create our custom function (refer to Apache FreeMarker documentation).
package org.fugerit.java.demo.venussamplecustomfunction.fun;
import freemarker.template.SimpleScalar;
import freemarker.template.TemplateMethodModelEx;
import freemarker.template.TemplateModelException;
import org.fugerit.java.core.util.PropsIO;
import org.fugerit.java.doc.freemarker.fun.FMFunHelper;
import java.util.List;
import java.util.Properties;
/*
* Translate a word to Quenya if available, return the same word otherwise
*
* Quenya is the language spoken by the high elves in J.R.R. Tolkien's world (https://lotr.fandom.com/wiki/Quenya).
*/
public class QuenyaFun implements TemplateMethodModelEx {
private static final Properties QUENYA = PropsIO.loadFromClassLoaderSafe( "config/quenya.properties" );
@Override
public Object exec(@SuppressWarnings("rawtypes") List arguments) throws TemplateModelException {
FMFunHelper.checkParameterNumber( arguments, 1 );
String wordToTranslate = arguments.get( 0 ).toString();
// if not found, default to the input word
String output = QUENYA.getProperty( wordToTranslate, wordToTranslate );
return new SimpleScalar(output);
}
}and the config/quenya.properties file with words translations.
- Add a config step to initialize one or more functions :
<!-- adding quenya translate function to shared chain -->
<chainStep stepType="function">
<function name="quenyaFun" value="org.fugerit.java.demo.venussamplecustomfunction.fun.QuenyaFun"/>
</chainStep>- Use the new function in document.ftl template :
<#-- using quenyaFun to translate title to Quenya if available -->
<cell><para>${quenyaFun(current.title)}</para></cell>For instance, result in MarkDown format will be :
My sample title XML
| Name | Surname | Title |
|---------------|---------------|---------------|
| Luthien | Tinuviel | Tári |
| Thorin | Oakshield | Aran |Here starts the original project readme as created by command :
mvn org.fugerit.java:fj-doc-maven-plugin:8.16.9:init \
-DgroupId=org.fugerit.java.demo \
-DartifactId=venus-sample-custom-function \
-Dextensions=base,freemarker,mod-fop \
-DaddJacoco=true \
-DprojectVersion=1.0.0 \
-Dflavour=quarkus-3Requirement :
- maven 3.9.x
- java 21+ (GraalVM for native version)
- Verify the app
mvn verify- Start the app
mvn quarkus:dev- Try the app
Open the swagger-ui
Test available paths (for instance : /doc/example.md)
NOTE:
- Powered by Quarkus 3.28.2
- Using Fugerit Venus Doc 8.16.9 (extensions : base,freemarker,mod-fop)
If you picked only native modules, you should be able to build and run the AOT version (GraalVM 21+ needed).
Further documentation :
- Build and verify
mvn package -Dnative- Start
./target/venus-sample-custom-function-1.0.0-runnerThis project has been initialized using fj-doc-maven-plugin init goal.
The quarkus 3 structure is similar to running the quarkus create goal :
mvn io.quarkus.platform:quarkus-maven-plugin:3.28.2:create \
-DprojectGroupId=org.fugerit.java.demo \
-DprojectArtifactId=venus-sample-custom-function \
-Dextensions='rest,rest-jackson,config-yaml,smallrye-openapi'From here on, this is the original quarkus readme.
This project uses Quarkus, the Supersonic Subatomic Java Framework.
If you want to learn more about Quarkus, please visit its website: https://quarkus.io/.
You can run your application in dev mode that enables live coding using:
./mvnw compile quarkus:devNOTE: Quarkus now ships with a Dev UI, which is available in dev mode only at http://localhost:8080/q/dev/.
The application can be packaged using:
./mvnw packageIt produces the quarkus-run.jar file in the target/quarkus-app/ directory.
Be aware that it’s not an über-jar as the dependencies are copied into the target/quarkus-app/lib/ directory.
The application is now runnable using java -jar target/quarkus-app/quarkus-run.jar.
If you want to build an über-jar, execute the following command:
./mvnw package -Dquarkus.package.jar.type=uber-jarThe application, packaged as an über-jar, is now runnable using java -jar target/*-runner.jar.
You can create a native executable using:
./mvnw package -DnativeOr, if you don't have GraalVM installed, you can run the native executable build in a container using:
./mvnw package -Dnative -Dquarkus.native.container-build=trueYou can then execute your native executable with: ./target/getting-started-1.0.0-SNAPSHOT-runner
If you want to learn more about building native executables, please consult https://quarkus.io/guides/maven-tooling.
- REST (guide): A Jakarta REST implementation utilizing build time processing and Vert.x. This extension is not compatible with the quarkus-resteasy extension, or any of the extensions that depend on it.
- REST Jackson (guide): Jackson serialization support for Quarkus REST. This extension is not compatible with the quarkus-resteasy extension, or any of the extensions that depend on it
- SmallRye OpenAPI (guide): Document your REST APIs with OpenAPI - comes with Swagger UI
- YAML Configuration (guide): Use YAML to configure your Quarkus application
Configure your application with YAML
The Quarkus application configuration is located in src/main/resources/application.yml.
Easily start your REST Web Services