https://github.com/treblereel/gwt3-processors
Set of goodies for J2CL apps
https://github.com/treblereel/gwt3-processors
closure-compiler closure-library j2cl java javascript
Last synced: about 1 year ago
JSON representation
Set of goodies for J2CL apps
- Host: GitHub
- URL: https://github.com/treblereel/gwt3-processors
- Owner: treblereel
- License: apache-2.0
- Created: 2021-03-05T20:21:35.000Z (over 5 years ago)
- Default Branch: main
- Last Pushed: 2024-11-28T20:25:07.000Z (over 1 year ago)
- Last Synced: 2025-03-30T14:22:01.912Z (over 1 year ago)
- Topics: closure-compiler, closure-library, j2cl, java, javascript
- Language: Java
- Homepage:
- Size: 788 KB
- Stars: 16
- Watchers: 5
- Forks: 3
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
[](https://github.com/treblereel/gwt3-processors/blob/main/LICENSE)

[](https://gitter.im/vertispan/j2cl?utm_source=badge)
# gwt3-processors
## What is it ?
It's a set of helper processors that can speed up J2CL development by generating boiler-plate code.
The latest version: https://search.maven.org/search?q=g:org.treblereel.j2cl.processors
It contains the following features:
* *@GWT3EntryPoint* acts pretty much the same as *Gwt2 EntryPoint*, the annotated method will be called on application startup.
```java
public class App {
@GWT3EntryPoint
public void init() {
HTMLButtonElement btn = (HTMLButtonElement) DomGlobal.document.createElement("button");
btn.textContent = "PRESS ME !";
}
}
```
* *@ES6Module* allows us to use Es6 modules via JsInterop.
```java
@ES6Module
@JsType(isNative = true, namespace = "org.treblereel.j2cl.shim")
public class ES6Test {
public String id;
public native boolean isTest();
}
```
```javascript
class ES6Test {
constructor() {
/** @type {string} */
this.id = "#id"
}
/**
* @return {boolean}
*/
isTest() {
return true;
}
}
export { ES6Test };
```
* *@GWT3Export* allows a resulted JavaScript file to be called from the pure JavaScript environment.
```java
public class ExportTestClass {
@GWT3Export
public static String test(String s) {
return s;
}
@GWT3Export
public Promise promise() {
return Promise.resolve("Hello world!");
}
}
```
```javascript
var test = new org.treblereel.j2cl.exports.ExportTestClass();
test.test('INSTANCE METHOD CALL');
test.promise().then(function(result) {
});
```
* *@TranslationBundle* j2cl-maven-plugin 0.21 brings us support of Closure's `.xtb` translation bundles that are a very effective way to translate your application.
* Note: at the moment, `.xtb` support is only available for j2cl-maven-plugin 0.21 and above and works only in ADVANCED mode, otherwise default values will be used.
To use `@TranslationBundle`, you need to do the following steps:
1. In the configuration section of j2cl-maven-plugin, enable `.xtb` auto discovery:
```xml
true
```
2. To a set locale for current compilation, you need to add the following line to your `pom.xml`
```xml
en
```
3. Create an interface _MyBundle_ annotated with `@TranslationBundle`
```java
@TranslationBundle
public interface MyBundle {
...
}
```
The processor will generate the `MyBundleImpl.java` implementation in the same package where _MyBundle_ is.
4. Create a translation property bundle for _MyBundle_ with a locale declared in the following format:
* `MyBundle_en.properties` or `MyBundle_en_US.properties` containing key value pairs like:
* `hello = Hello World!` or `hello = Hello {$arg}!`
Note: `{$arg}` is a placeholder for a string argument.
5. Declare corresponding methods in your _MyBundle_ interface.
```java
@TranslationBundle
public interface MyBundle {
@TranslationKey(defaultValue = "Hello World!")
String hello();
@TranslationKey(defaultValue = "Hello {$arg}!")
String hello(String arg);
}
```
Default value is used if no translation property value is found for a given locale and key.
If a value contains the `{$arg}` placeholder, it will be replaced with the argument provided to the method. Placeholder is surrounded with curly brackets and a corresponding method argument must be named the same;
6. Values can be in HTML, in this case HTML will be escaped. To unescape it, set `unescapeHtmlEntities = true` in the `@TranslationKey` annotation.
```java
@TranslationKey(defaultValue = "
HELLO", unescapeHtmlEntities = true)
String hello();
```
7. Each method should have a corresponding key value pair in a translation property file. Otherwise, a default value will be used. A method name can be overridden in `@TranslationKey` annotation.
```java
@TranslationKey(key = "greetings", defaultValue = "Hello World!")
String hello();
```
* *@GWT3Resource* is a lightweight port of GWT2 resources. Its main purpose is to embed various resources into the JavaScript bundle.
Here we declared a bundle of the resources that will be embedded into the JavaScript bundle:
```java
@GWT3Resource
public interface CombinedClientBundle extends ClientBundle {
@Source("logo.png")
ImageResource linuxLogo();
TextResource welcome();
@DataResource.MimeType("audio/mpeg")
@Source("alarmloop.mp3")
DataResource resourceMimeTypeAnnotationAudioOgg();
}
```
Later, we can use it like this:
```java
CombinedClientBundle resources = CombinedClientBundleImpl.INSTANCE;
DomGlobal.document.body.appendChild(resources.linuxLogo().getImage());
HTMLDivElement container = (HTMLDivElement) DomGlobal.document.createElement("div");
DomGlobal.document.body.appendChild(container);
container.textContent = resources.welcome().getText();
HTMLAudioElement audio = (HTMLAudioElement) DomGlobal.document.createElement("audio");
DomGlobal.document.body.appendChild(audio);
audio.src = resources.resourceMimeTypeAnnotationAudioOgg().asString();
audio.controls = true;
```
Take a look at tests for more details.