Saturday, December 12, 2015

Re: Linker public artifacts are not available in SDM

Oh. After reverse engineering of GWT code server I have solved my issue. My mistake was that I omitted the extension from generated filed. Now I put '.json' at the end, use 'GWT.getModuleBaseForStaticFiles()' and voila, it works. Also the code server kindly adds necessary headers so the message "No 'Access-Control-Allow-Origin' header is present..." does not appear anymore.

Thank you very much for your help.

суббота, 12 декабря 2015 г., 1:09:30 UTC+3 пользователь Vitaly Litvak написал:
Thanks for the reply. But unfortunately it does not work. In the web browser it shows:

XMLHttpRequest cannot load http://192.168.10.4:9876/traccar/i18n/org/traccar/web/client/i18n/Messages/default. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://192.168.10.4:8888' is therefore not allowed access.

This is not that bad. However, on that URL there is nothing:

curl -v http://192.168.10.4:9876/traccar/i18n/org/traccar/web/client/i18n/Messages/default
* Hostname was NOT found in DNS cache
*   Trying 192.168.10.4...
* Connected to 192.168.10.4 (192.168.10.4) port 9876 (#0)
> GET /traccar/i18n/org/traccar/web/client/i18n/Messages/default HTTP/1.1
> User-Agent: curl/7.37.1
> Host: 192.168.10.4:9876
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Length: 0
* Server Jetty(8.y.z-SNAPSHOT) is not blacklisted
< Server: Jetty(8.y.z-SNAPSHOT)
<
* Connection #0 to host 192.168.10.4 left intact

Maybe my approach to generate localized JSON objects for loading at runtime is wrong and I should stick with some kind of servlet. Just thought that for GWT this will be a blessed way. I don't know...

пятница, 11 декабря 2015 г., 22:17:42 UTC+3 пользователь Thomas Broyer написал:
In https://github.com/vitalidze/traccar-web/blob/12ceb111e20bb79aa9e046b9b9db5aae5aa84ffd/src/main/java/org/traccar/web/i18n/client/StringTranslator.java#L51 you need to use GWT.getModuleBaseForStaticFiles() instead of GWT.getModuleBaseURL().
http://www.gwtproject.org/javadoc/latest/com/google/gwt/core/client/GWT.html#getModuleBaseForStaticFiles()

On Friday, December 11, 2015 at 4:37:39 PM UTC+1, Vitaly Litvak wrote:
Hi

I am trying to reduce the compilation time of my GWT app. There are about 160 permutations done for now and the reason is big number of languages/locales supported. The main idea is to get rid of the static compilation and replace it with dynamic loading of localized data. I have almost succeeded, but now I am facing the problem with linker, which does not expose public artifacts when I run project from IntelliJ Idea. I will give more details and then point where the problem is now. 

I already have the `Messages` interface and multiple `.properties` files with defined translations and also I am using GXT library, which also uses 'static' internationalization. Thus the only way I can imagine myself is to replace the Localizable generator with my own implementation. I have defined it in a separate module:

<generate-with class="org.traccar.web.i18n.rebind.LocalizableGenerator">
<when-type-assignable class="com.google.gwt.i18n.shared.Localizable" />
</generate-with>

Then in generator I simply produce a single implementation, which will use another class to load the strings from module's resources available under {module.base.url}/i18n/path/to/package/ClassName/{locale}, for example MyModule/i18n/com/google/gwt/i18n/client/constants/NumberConstantsImpl/ru

I intend to store the localized strings as JSON object, which will be generated by the 'generator' as well. Here is the code of my 'LocalizableGenerator':

JsonFactory jsonFactory = new JsonFactory();
for (GwtLocale locale : localeParams.allLocales) {
AbstractResource.ResourceList resourceList = null;
try {
resourceList = ResourceFactory.getBundle(logger, targetClass, locale,
assignableToConstants, context);
OutputStream os = context.tryCreateResource(logger, resource + "/" + locale.toString());
if (os != null) {
JsonGenerator jg = jsonFactory.createGenerator(os, JsonEncoding.UTF8);
jg.writeStartObject();
for (String key : resourceList.keySet()) {
AbstractResource.ResourceEntry entry = resourceList.getEntry(key);
Collection<String> forms = entry.getForms();
if (forms.isEmpty()) {
jg.writeStringField(key, resourceList.getString(key));
} else {
jg.writeObjectFieldStart(key);
jg.writeStringField("null", resourceList.getString(key));
for (String form : forms) {
jg.writeStringField(form, entry.getForm(form));
}
jg.writeEndObject();
}
}
jg.writeEndObject();
jg.flush();
GeneratedResource generatedResource = context.commitResource(logger, os);
context.commitArtifact(logger, generatedResource);
}
} catch (MissingResourceException e) {
throw error(logger,
"Localization failed; there must be at least one resource accessible through"
+ " the classpath in package '" + targetClass.getPackage().getName()
+ "' whose base name is '"
+ ResourceFactory.getResourceName(targetClass) + "'");
} catch (IllegalArgumentException e) {
// A bad key can generate an illegal argument exception.
throw error(logger, e.getMessage());
} catch (IOException e) {
throw error(logger, e);
}
}

The generation works just fine. I can see produced files in a temporary folder. Looks like they are included in the .war file as well when I produce it with maven. However, they are not visible when I run my application in SDM from IntelliJ Idea.

Full source code is available on github: https://github.com/vitalidze/traccar-web/tree/dynamic_i18n

Commit with above changes: https://github.com/vitalidze/traccar-web/commit/12ceb111e20bb79aa9e046b9b9db5aae5aa84ffd

Any help appreciated.

--
You received this message because you are subscribed to the Google Groups "GWT Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-web-toolkit+unsubscribe@googlegroups.com.
To post to this group, send email to google-web-toolkit@googlegroups.com.
Visit this group at https://groups.google.com/group/google-web-toolkit.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment