Skip to content

Commit

Permalink
i18n transformer upgraded, xslt paths improved, selected language fixed
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelwechner committed Mar 27, 2012
1 parent 74ba14c commit f399c7f
Showing 1 changed file with 75 additions and 14 deletions.
Expand Up @@ -22,6 +22,7 @@
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

Expand All @@ -44,11 +45,13 @@
import org.wyona.yanel.core.attributes.viewable.ViewDescriptor;
import org.wyona.yanel.core.serialization.SerializerFactory;
import org.wyona.yanel.core.source.ResourceResolver;
import org.wyona.yanel.core.transformation.I18nTransformer2;
//import org.wyona.yanel.core.transformation.I18nTransformer2;
import org.wyona.yanel.core.transformation.I18nTransformer3;
import org.wyona.yanel.core.transformation.XIncludeTransformer;
import org.wyona.yanel.core.util.PathUtil;
import org.wyona.yanel.core.util.ResourceAttributeHelper;
import org.wyona.yarep.core.Repository;
import org.wyona.yanel.core.source.SourceResolver;

import org.wyona.security.core.api.Identity;

Expand All @@ -64,6 +67,7 @@ public class TranslationResource extends Resource implements ViewableV2 {
private static Logger log = Logger.getLogger(TranslationResource.class);

public static final String NS_URI = "http://www.wyona.org/yanel/1.0";

/**
*
*/
Expand All @@ -81,7 +85,7 @@ public ViewDescriptor[] getViewDescriptors() {
}

/**
* Generates view
* @see org.wyona.yanel.core.api.attributes.ViewableV2#getView(String)
*/
public View getView(String viewId) throws Exception {
View defaultView = new View();
Expand All @@ -93,22 +97,21 @@ public View getView(String viewId) throws Exception {
if (getParameters() != null) {
currentPath = (String)getParameters().get("path");
language = (String)getParameters().get("language");
//log.debug("Selected language: " + language);
}
if (currentPath == null) {
currentPath = getPath();
}
if (language == null) {
language = getLanguage();
}



try {
Resource resource = getYanel().getResourceManager().getResource(getEnvironment(), getRealm(), currentPath);

Repository repo = getRealm().getRepository();

String[] xsltPath = getXSLTPath(getPath());
String[] xsltPath = getXSLTPaths();
if (xsltPath != null) {

// create reader:
Expand Down Expand Up @@ -145,12 +148,14 @@ public View getView(String viewId) throws Exception {
log.warn("User agent is null!");
}

xsltHandlers[i].getTransformer().setParameter("language", getLanguage());
xsltHandlers[i].getTransformer().setParameter("language", language);
xsltHandlers[i].getTransformer().setParameter("currentPath", currentPath);
}

// create i18n transformer:
I18nTransformer2 i18nTransformer = new I18nTransformer2("global", getLanguage(), getRealm().getDefaultLanguage());
SourceResolver uriResolver = new SourceResolver(this);
I18nTransformer3 i18nTransformer = new I18nTransformer3(getI18NCatalogueNames(), language, getUserLanguage(), getRealm().getDefaultLanguage(), uriResolver);
//I18nTransformer2 i18nTransformer = new I18nTransformer2("global", language, getRealm().getDefaultLanguage());
i18nTransformer.setEntityResolver(catalogResolver);

// create xinclude transformer:
Expand Down Expand Up @@ -178,6 +183,8 @@ public View getView(String viewId) throws Exception {
// write result into view:
defaultView.setInputStream(new ByteArrayInputStream(baos.toByteArray()));
return defaultView;
} else {
log.warn("No XSLT paths configured, hence just return XML...");
}
log.debug("Mime-Type: " + mimeType);
defaultView.setInputStream(getTranslationXML(resource, language));
Expand All @@ -190,11 +197,12 @@ public View getView(String viewId) throws Exception {
}

/**
*
* Generate XML
* @param currentLanguage Selected language
*/
public InputStream getTranslationXML(Resource resource, String currentLanguage) throws Exception {
StringBuilder sb = new StringBuilder("<?xml version=\"1.0\"?>");
sb.append("<translations xmlns=\"" + NS_URI + "\">");
sb.append("<translations xmlns=\"" + NS_URI + "\" selected-language=\"" + currentLanguage + "\">");

String[] realmLanguages = resource.getRealm().getLanguages();

Expand Down Expand Up @@ -257,6 +265,54 @@ private String getLanguage() {
if(language != null && language.length() > 0) return language;
return getRealm().getDefaultLanguage();
}

/**
* Get user language (order: profile, browser, ...)
*/
private String getUserLanguage() throws Exception {
String language = getRequestedLanguage();
Identity identity = getEnvironment().getIdentity();
String userID = identity.getUsername(); // WARN: Do not use the protected method getUsername(), because it might be overwritten and hence backwards compatibility might fail!
if (userID != null) {
if (getRealm().getIdentityManager().getUserManager().existsUser(userID)) { // INFO: It might be possible that a user ID is still referenced by a session, but has been deleted "persistently" in the meantime
String userLanguage = getRealm().getIdentityManager().getUserManager().getUser(userID).getLanguage();
//log.debug("User language: " + userLanguage);
if(userLanguage != null) {
language = userLanguage;
log.debug("Use user profile language: " + language);
} else {
log.debug("Use requested language: " + language);
}
} else {
log.warn("No such user '" + userID + "', hence use requested language: " + language);
}
}
return language;
}

/**
* Gets the names of the i18n message catalogues used for the i18n transformation.
* Uses the following priorization:
* 1. rc config properties named 'i18n-catalogue'.
* 2. realm i18n-catalogue
* 3. 'global'
* @return i18n catalogue name
*/
protected String[] getI18NCatalogueNames() throws Exception {
ArrayList<String> catalogues = new ArrayList<String>();
String[] rcCatalogues = getResourceConfigProperties("i18n-catalogue");
if (rcCatalogues != null) {
for (int i = 0; i < rcCatalogues.length; i++) {
catalogues.add(rcCatalogues[i]);
}
}
String realmCatalogue = getRealm().getI18nCatalogue();
if (realmCatalogue != null) {
catalogues.add(realmCatalogue);
}
catalogues.add("global");
return catalogues.toArray(new String[catalogues.size()]);
}

/**
*
Expand All @@ -280,17 +336,20 @@ public Writer getWriter() throws Exception {
return null;
}


/**
* Get XSLT path
*/
private String[] getXSLTPath(String path) throws Exception {
private String[] getXSLTPaths() throws Exception {
String[] xsltPath = getResourceConfigProperties("xslt");
if (xsltPath != null) return xsltPath;
log.info("No XSLT Path within: " + path);
if (xsltPath != null && xsltPath.length > 0) return xsltPath;

log.warn("No XSLT Path(s) configured: " + getPath());
return null;
}

/**
*
*/
public boolean exists() throws Exception {
log.warn("Not implemented yet!");
return true;
Expand Down Expand Up @@ -379,8 +438,10 @@ public void setProperty(String name, Object value) {
log.warn("Not implemented yet!");
}

/**
*
*/
public String getMimeType(String viewId) throws Exception {
return "application/xml";
}

}

0 comments on commit f399c7f

Please sign in to comment.