Migrate from the Properties Plugin to Resource Bundles
To migrate from the Properties Plugin to Resource Bundles, you can use a Groovy updater script to convert your properties documents to a resource bundle.
-
Create a resource bundle document in a folder of your choice.
-
Add the Groovy script below to the script registry.
-
Set the 'path' parameter to the absolute path of the resource bundle document your created, e.g. /content/documents/myproject/labels/labels.
-
Run the script! You might want to do a dry run first. Make sure you have no conflicting keys.
-
Check your resource bundle document. All properties from all your properties documents should have been added to the resource bundle.
-
You will still need to adapt your code to use the messages from the resource bundle instead of the properties documents.
package org.hippoecm.frontend.plugins.cms.dev.updater
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import javax.jcr.query.QueryResult;
import org.onehippo.repository.update.BaseNodeUpdateVisitor;
/**
* Looks up all properties:properties documents, reads the properties in them,
* and writes them to the specified resource bundle document.
*/
class PropertiesToResourceBundleConverter extends BaseNodeUpdateVisitor {
public boolean doUpdate(Node node) {
log.debug "Updating node ${node.path}"
Map<String, Map<String, String>> labels = new HashMap<String, Map<String, String>>();
QueryManager qm = node.getSession().getWorkspace().getQueryManager();
Query query = qm.createQuery("/jcr:root/content//element(*,properties:properties)", Query.XPATH);
QueryResult result = query.execute();
NodeIterator propertyDocumentNodes = result.getNodes();
while (propertyDocumentNodes.hasNext()) {
Node propertyDocumentNode = propertyDocumentNodes.nextNode();
log.debug "Processing properties document ${propertyDocumentNode.getPath()}";
String lang = "en";
if (propertyDocumentNode.hasProperty("hippotranslation:locale")) {
String locale = propertyDocumentNode.getProperty("hippotranslation:locale").getString();
if (locale != null && locale.startsWith("fr") ) {
lang = "fr";
}
}
NodeIterator propertyNodes = propertyDocumentNode.getNodes("properties:property");
while (propertyNodes.hasNext()) {
Node propertyNode = propertyNodes.nextNode();
if (propertyNode.hasProperty("properties:name") && propertyNode.hasProperty("properties:value")) {
String name = propertyNode.getProperty("properties:name").getString();
String value = propertyNode.getProperty("properties:value").getString();
log.debug "Convert property ${name}=${value} (${lang})";
if (!labels.containsKey(name)) {
Map<String, String> values = new HashMap<String, String>();
values.put(lang, value);
labels.put(name, values);
} else {
if (labels.get(name) == null) {
labels.put(name, new HashMap<String, String>());
}
Map<String, String> values = labels.get(name);
if (!values.containsKey(lang)) {
values.put(lang, value);
} else {
// error!
log.debug "duplicate key detected ${lang}:${value}";
}
}
}
}
}
if (labels.size() > 0) {
List<String> keys = new ArrayList<String>();
List<String> messages = new ArrayList<String>();
List<String> messages_fr = new ArrayList<String>();
for (String key : labels.keySet()) {
Map<String,String> values = labels.get(key);
keys.add(key);
for (String langKey : values.keySet()) {
if ("en".equals(langKey)) {
messages.add(values.get(langKey));
} else if ("fr".equals(langKey)) {
messages_fr.add(values.get(langKey));
}
}
if (messages.size() < messages_fr.size()) {
log.debug "Missing English label for ${key}, inserting empty label"
messages.add("");
} else if (messages_fr.size() < messages.size()) {
log.debug "Missing French label for ${key}, inserting empty label"
messages_fr.add("");
}
}
log.debug "Number of keys: ${keys.size()}";
log.debug "Number of English messages: ${messages.size()}";
log.debug "Number of French messages: ${messages_fr.size()}";
node.setProperty("resourcebundle:keys", (String[]) keys.toArray());
node.setProperty("resourcebundle:messages", (String[]) messages.toArray());
node.setProperty("resourcebundle:messages_fr", (String[]) messages_fr.toArray());
}
return false;
}
public boolean undoUpdate(Node node) {
throw new UnsupportedOperationException("Updater does not implement undoUpdate method");
}
}