|
From: <mol...@us...> - 2008-12-03 15:10:24
|
Revision: 927
http://openutils.svn.sourceforge.net/openutils/?rev=927&view=rev
Author: molaschi
Date: 2008-12-03 15:10:19 +0000 (Wed, 03 Dec 2008)
Log Message:
-----------
add openutils mgnlmessages module
Modified Paths:
--------------
trunk/pom.xml
Added Paths:
-----------
trunk/openutils-mgnlmessages/
trunk/openutils-mgnlmessages/pom.xml
trunk/openutils-mgnlmessages/src/
trunk/openutils-mgnlmessages/src/main/
trunk/openutils-mgnlmessages/src/main/java/
trunk/openutils-mgnlmessages/src/main/java/info/
trunk/openutils-mgnlmessages/src/main/java/info/magnolia/
trunk/openutils-mgnlmessages/src/main/java/info/magnolia/cms/
trunk/openutils-mgnlmessages/src/main/java/info/magnolia/cms/i18n/
trunk/openutils-mgnlmessages/src/main/java/info/magnolia/cms/i18n/MessagesManager.java
trunk/openutils-mgnlmessages/src/main/java/net/
trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/
trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/
trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/
trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/configuration/
trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/configuration/MessagesConfigurationManager.java
trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/i18n/
trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/i18n/EmptyResourceBundle.java
trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/i18n/ModulePropertyMessagesImpl.java
trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/i18n/RepositoryMessagesImpl.java
trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/i18n/SimpleMessagesImpl.java
trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/lifecycle/
trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/lifecycle/MessagesModuleLifecycle.java
trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/pages/
trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/pages/DefaultMessagesImpl.java
trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/pages/ExtractMessagesFromDialogsPage.java
trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/pages/MessagesEditPage.java
trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/pages/MessagesImpExpPage.java
trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/setup/
trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/setup/MessagesModuleVersionHandler.java
trunk/openutils-mgnlmessages/src/main/resources/
trunk/openutils-mgnlmessages/src/main/resources/META-INF/
trunk/openutils-mgnlmessages/src/main/resources/META-INF/magnolia/
trunk/openutils-mgnlmessages/src/main/resources/META-INF/magnolia/messages.xml
trunk/openutils-mgnlmessages/src/main/resources/mgnl-bootstrap/
trunk/openutils-mgnlmessages/src/main/resources/mgnl-bootstrap/messages/
trunk/openutils-mgnlmessages/src/main/resources/mgnl-bootstrap/messages/config.modules.adminInterface.config.menu.messages.xml
trunk/openutils-mgnlmessages/src/main/resources/mgnl-bootstrap/messages/config.modules.adminInterface.config.menu.tools.messagesExtract.xml
trunk/openutils-mgnlmessages/src/main/resources/mgnl-bootstrap/messages/config.modules.adminInterface.config.menu.tools.messagesJCR.xml
trunk/openutils-mgnlmessages/src/main/resources/mgnl-bootstrap/messages/config.modules.messages.basenames.xml
trunk/openutils-mgnlmessages/src/main/resources/mgnl-bootstrap/messages/config.modules.messages.locales.xml
trunk/openutils-mgnlmessages/src/main/resources/mgnl-bootstrap/messages/config.modules.messages.pages.messagesEdit.xml
trunk/openutils-mgnlmessages/src/main/resources/mgnl-bootstrap/messages/config.modules.messages.pages.messagesExtract.xml
trunk/openutils-mgnlmessages/src/main/resources/mgnl-bootstrap/messages/config.modules.messages.pages.messagesImportExport.xml
trunk/openutils-mgnlmessages/src/main/resources/mgnl-bootstrap/messages/config.modules.messages.trees.xml
trunk/openutils-mgnlmessages/src/main/resources/mgnl-messages/
trunk/openutils-mgnlmessages/src/main/resources/mgnl-messages/messages/
trunk/openutils-mgnlmessages/src/main/resources/mgnl-messages/messages/messages_en.properties
trunk/openutils-mgnlmessages/src/main/resources/mgnl-messages/messages/messages_it.properties
trunk/openutils-mgnlmessages/src/main/resources/mgnl-resources/
trunk/openutils-mgnlmessages/src/main/resources/mgnl-resources/messages/
trunk/openutils-mgnlmessages/src/main/resources/mgnl-resources/messages/css/
trunk/openutils-mgnlmessages/src/main/resources/mgnl-resources/messages/css/messagespanel.css
trunk/openutils-mgnlmessages/src/main/resources/mgnl-resources/messages/icons/
trunk/openutils-mgnlmessages/src/main/resources/mgnl-resources/messages/icons/delete.gif
trunk/openutils-mgnlmessages/src/main/resources/mgnl-resources/messages/js/
trunk/openutils-mgnlmessages/src/main/resources/mgnl-resources/messages/js/MainPanel.js
trunk/openutils-mgnlmessages/src/main/resources/mgnl-resources/messages/js/MessagesPanel.js
trunk/openutils-mgnlmessages/src/main/resources/mgnl-resources/messages/js/MessagesViewer.js
trunk/openutils-mgnlmessages/src/main/resources/mgnl-resources/messages/js/TabCloseMenu.js
trunk/openutils-mgnlmessages/src/main/resources/net/
trunk/openutils-mgnlmessages/src/main/resources/net/sourceforge/
trunk/openutils-mgnlmessages/src/main/resources/net/sourceforge/openutils/
trunk/openutils-mgnlmessages/src/main/resources/net/sourceforge/openutils/mgnlmessages/
trunk/openutils-mgnlmessages/src/main/resources/net/sourceforge/openutils/mgnlmessages/pages/
trunk/openutils-mgnlmessages/src/main/resources/net/sourceforge/openutils/mgnlmessages/pages/ExtractMessagesFromDialogsPage.html
trunk/openutils-mgnlmessages/src/main/resources/net/sourceforge/openutils/mgnlmessages/pages/MessagesEditPage.html
trunk/openutils-mgnlmessages/src/main/resources/net/sourceforge/openutils/mgnlmessages/pages/MessagesImpExpPage.html
trunk/openutils-mgnlmessages/src/test/
trunk/openutils-mgnlmessages/src/test/java/
trunk/openutils-mgnlmessages/src/test/resources/
Added: trunk/openutils-mgnlmessages/pom.xml
===================================================================
--- trunk/openutils-mgnlmessages/pom.xml (rev 0)
+++ trunk/openutils-mgnlmessages/pom.xml 2008-12-03 15:10:19 UTC (rev 927)
@@ -0,0 +1,85 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>net.sourceforge.openutils</groupId>
+ <artifactId>openutils</artifactId>
+ <version>10</version>
+ <relativePath>..</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>jar</packaging>
+ <artifactId>openutils-mgnlmessages</artifactId>
+ <name>openutils-mgnlmessages</name>
+ <version>1.0-SNAPSHOT</version>
+ <licenses>
+ <license>
+ <name>GPLv3</name>
+ <url>http://www.gnu.org/licenses/gpl-3.0.txt</url>
+ </license>
+ </licenses>
+ <build>
+ <resources>
+ <resource>
+ <filtering>false</filtering>
+ <directory>src/main/resources</directory>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </resource>
+ <resource>
+ <filtering>true</filtering>
+ <directory>src/main/resources</directory>
+ <includes>
+ <include>META-INF/magnolia/*</include>
+ </includes>
+ </resource>
+ </resources>
+ </build>
+ <dependencies>
+ <dependency>
+ <groupId>info.magnolia</groupId>
+ <artifactId>magnolia-core</artifactId>
+ <version>3.6.3</version>
+ </dependency>
+ <dependency>
+ <groupId>info.magnolia</groupId>
+ <artifactId>magnolia-module-admininterface</artifactId>
+ <version>3.6.3</version>
+ </dependency>
+ <dependency>
+ <groupId>net.sourceforge.openutils</groupId>
+ <artifactId>openutils-mgnltasks</artifactId>
+ <version>3.5.5</version>
+ </dependency>
+ <dependency>
+ <groupId>net.sourceforge.openutils</groupId>
+ <artifactId>openutils-mgnlext</artifactId>
+ <version>2.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.testng</groupId>
+ <artifactId>testng</artifactId>
+ <classifier>jdk15</classifier>
+ <version>5.1</version>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ </dependencies>
+ <repositories>
+ <repository>
+ <id>repository.magnolia.info</id>
+ <name>magnolia repository</name>
+ <url>http://svn.magnolia.info/maven/m2</url>
+ <releases>
+ <enabled>true</enabled>
+ </releases>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ </repository>
+ </repositories>
+</project>
Added: trunk/openutils-mgnlmessages/src/main/java/info/magnolia/cms/i18n/MessagesManager.java
===================================================================
--- trunk/openutils-mgnlmessages/src/main/java/info/magnolia/cms/i18n/MessagesManager.java (rev 0)
+++ trunk/openutils-mgnlmessages/src/main/java/info/magnolia/cms/i18n/MessagesManager.java 2008-12-03 15:10:19 UTC (rev 927)
@@ -0,0 +1,456 @@
+/**
+ * This file Copyright (c) 2003-2008 Magnolia International
+ * Ltd. (http://www.magnolia.info). All rights reserved.
+ *
+ *
+ * This file is dual-licensed under both the Magnolia
+ * Network Agreement and the GNU General Public License.
+ * You may elect to use one or the other of these licenses.
+ *
+ * This file is distributed in the hope that it will be
+ * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
+ * Redistribution, except as permitted by whichever of the GPL
+ * or MNA you select, is prohibited.
+ *
+ * 1. For the GPL license (GPL), you can redistribute and/or
+ * modify this file under the terms of the GNU General
+ * Public License, Version 3, as published by the Free Software
+ * Foundation. You should have received a copy of the GNU
+ * General Public License, Version 3 along with this program;
+ * if not, write to the Free Software Foundation, Inc., 51
+ * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * 2. For the Magnolia Network Agreement (MNA), this file
+ * and the accompanying materials are made available under the
+ * terms of the MNA which accompanies this distribution, and
+ * is available at http://www.magnolia.info/mna.html
+ *
+ * Any modifications to this file must keep this entire header
+ * intact.
+ *
+ */
+package info.magnolia.cms.i18n;
+
+import info.magnolia.cms.core.HierarchyManager;
+import info.magnolia.cms.beans.config.ContentRepository;
+import info.magnolia.cms.core.Content;
+import info.magnolia.cms.core.ItemType;
+import info.magnolia.cms.util.NodeDataUtil;
+import info.magnolia.cms.util.ObservationUtil;
+import info.magnolia.content2bean.Content2BeanUtil;
+import info.magnolia.context.Context;
+import info.magnolia.context.MgnlContext;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.jcr.observation.EventIterator;
+import javax.jcr.observation.EventListener;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import javax.servlet.jsp.jstl.core.Config;
+
+import net.sourceforge.openutils.mgnlmessages.i18n.RepositoryMessagesImpl;
+
+import org.apache.commons.collections.Transformer;
+import org.apache.commons.collections.map.LazyMap;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * From this class you get the i18n messages. You should pass a a request, but if you can't the getMessages method will
+ * handle it properly. The get() methods are easy to use.
+ * @author philipp
+ */
+public final class MessagesManager
+{
+
+ /**
+ * Use this locale if no other provided
+ */
+ public static final String FALLBACK_LOCALE = "en"; //$NON-NLS-1$
+
+ /**
+ * Use this basename if no other is provided
+ */
+ public static final String DEFAULT_BASENAME = "info.magnolia.module.admininterface.messages"; //$NON-NLS-1$
+
+ /**
+ * Logger.
+ */
+ protected static Logger log = LoggerFactory.getLogger(AbstractMessagesImpl.class);
+
+ /**
+ * The node name where the configuration for i18n is stored
+ */
+ private static final String I18N_CONFIG_PATH = "/server/i18n/system"; //$NON-NLS-1$
+
+ /**
+ * The name of the property to store the current system language
+ */
+ private static final String FALLBACK_NODEDATA = "fallbackLanguage"; //$NON-NLS-1$
+
+ /**
+ * Under this node all the available languages are stored. They are showed in the user dialog.
+ */
+ private static final String LANGUAGES_NODE_NAME = "languages"; //$NON-NLS-1$
+
+ /**
+ * The current locale of the application
+ */
+ private static Locale applicationLocale;
+
+ /**
+ * List of the available locales
+ */
+ private static Collection availableLocales = new ArrayList();
+
+ /**
+ * The context used for the messages
+ */
+ private static ServletContext context;
+
+ /**
+ * LRU Map for the messages
+ */
+ private static Map messages;
+
+ /**
+ * Util has no public constructor
+ */
+ private MessagesManager()
+ {
+ }
+
+ static
+ {
+ // setting default language (en)
+ MessagesManager.setDefaultLocale(FALLBACK_LOCALE);
+
+ initLRUMap();
+ }
+
+ /**
+ * Called through the initialization process (startup of the container)
+ * @param context servlet context
+ */
+ public static void init(ServletContext context)
+ {
+ MessagesManager.context = context;
+
+ // setting fallback
+ context.setAttribute(Config.FMT_FALLBACK_LOCALE + ".application", FALLBACK_LOCALE); //$NON-NLS-1$
+ // setting basename
+ context.setAttribute(Config.FMT_LOCALIZATION_CONTEXT + ".application", MessagesManager.DEFAULT_BASENAME); //$NON-NLS-1$
+ // for Resin and other J2EE Containers
+ context.setAttribute(Config.FMT_LOCALIZATION_CONTEXT, MessagesManager.DEFAULT_BASENAME);
+
+ load();
+ registerEventListener();
+ }
+
+ /**
+ * The lazzy LRU Map creates messages objects with a faul back to the default locale.
+ */
+ private static void initLRUMap()
+ {
+ // FIXME use LRU
+ // Map map = new LRUMap(20);
+ Map map = new HashMap();
+ map = LazyMap.decorate(map, new Transformer()
+ {
+
+ public Object transform(Object input)
+ {
+ MessagesID id = (MessagesID) input;
+ // check http://jira.magnolia.info/browse/MAGNOLIA-1060
+ // We are now chaining current user (LOCALE) messages with system default messages
+ // so that it fallsback to default locale if string is not found instead of displaying broken
+ // ???LABELS???
+ Messages msgs = new MessagesChain(new RepositoryMessagesImpl(id.basename, id.locale))
+ .chain(new DefaultMessagesImpl(id.basename, id.locale));
+ if (!MessagesManager.getDefaultLocale().equals(id.locale))
+ {
+ msgs = new MessagesChain(msgs).chain(MessagesManager.getMessages(id.basename, MessagesManager
+ .getDefaultLocale()));
+ }
+ return msgs;
+ }
+ });
+ messages = Collections.synchronizedMap(map);
+ }
+
+ /**
+ * Load i18n configuration.
+ */
+ public static void load()
+ {
+
+ // reading the configuration from the repository, no need for context
+ HierarchyManager hm = ContentRepository.getHierarchyManager(ContentRepository.CONFIG);
+
+ try
+ {
+ log.info("Config : loading i18n configuration - " + I18N_CONFIG_PATH); //$NON-NLS-1$
+
+ // checks if node exists
+ if (!hm.isExist(I18N_CONFIG_PATH))
+ {
+ // configNode = ContentUtil.createPath(hm, I18N_CONFIG_PATH, ItemType.CONTENT, true);
+ log.warn(I18N_CONFIG_PATH + " does not exist yet; skipping.");
+ return;
+ }
+
+ final Content configNode = hm.getContent(I18N_CONFIG_PATH); //$NON-NLS-1$
+
+ MessagesManager.setDefaultLocale(NodeDataUtil.getString(configNode, FALLBACK_NODEDATA, FALLBACK_LOCALE));
+
+ // get the available languages - creates it if it does not exist - necessary to update to 3.5
+ final Content languagesNode;
+ if (configNode.hasContent(LANGUAGES_NODE_NAME))
+ {
+ languagesNode = configNode.getContent(LANGUAGES_NODE_NAME);
+ }
+ else
+ {
+ languagesNode = configNode.createContent(LANGUAGES_NODE_NAME, ItemType.CONTENT);
+ }
+
+ Map languageDefinitions = Content2BeanUtil.toMap(languagesNode, true, LocaleDefinition.class);
+
+ // clear collection for reload
+ MessagesManager.availableLocales.clear();
+
+ for (Iterator iter = languageDefinitions.values().iterator(); iter.hasNext();)
+ {
+ LocaleDefinition ld = (LocaleDefinition) iter.next();
+ if (ld.isEnabled())
+ {
+ availableLocales.add(ld.getLocale());
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ log.error("Config : Failed to load i18n configuration - " + I18N_CONFIG_PATH, e); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * Register an event listener: reload configuration when something changes.
+ */
+ private static void registerEventListener()
+ {
+
+ log.info("Registering event listener for i18n"); //$NON-NLS-1$
+ ObservationUtil.registerChangeListener(ContentRepository.CONFIG, I18N_CONFIG_PATH, new EventListener()
+ {
+
+ public void onEvent(EventIterator iterator)
+ {
+ // reload everything
+ reload();
+ }
+ });
+ }
+
+ /**
+ * Reload i18n configuration.
+ */
+ public static void reload()
+ {
+ try
+ {
+ reloadBundles();
+ }
+ catch (Exception e)
+ {
+ log.error("can't reload i18n messages", e);
+ }
+ initLRUMap();
+ load();
+ }
+
+ public static Messages getMessages()
+ {
+ return getMessages(MessagesManager.DEFAULT_BASENAME, MgnlContext.getLocale());
+ }
+
+ public static Messages getMessages(String basename)
+ {
+ return getMessages(basename, MgnlContext.getLocale());
+ }
+
+ public static Messages getMessages(Locale locale)
+ {
+ return getMessages(MessagesManager.DEFAULT_BASENAME, locale);
+ }
+
+ public static Messages getMessages(String basename, Locale locale)
+ {
+ if (StringUtils.isEmpty(basename))
+ {
+ basename = MessagesManager.DEFAULT_BASENAME;
+ }
+ return (Messages) messages.get(new MessagesID(basename, locale));
+ }
+
+ public static String get(String key)
+ {
+ return MgnlContext.getMessages().get(key);
+ }
+
+ /**
+ * Get a message with parameters inside: the value {0} must be a number
+ * @param key key to find
+ * @param args replacement strings
+ * @return message
+ */
+
+ public static String get(String key, Object[] args)
+ {
+ return MgnlContext.getMessages().get(key, args);
+ }
+
+ /**
+ * Use a default string.
+ * @param key key to find
+ * @param defaultMsg default message
+ * @return message
+ */
+
+ public static String getWithDefault(String key, String defaultMsg)
+ {
+ return MgnlContext.getMessages().getWithDefault(key, defaultMsg);
+ }
+
+ /**
+ * Get a message with parameters inside: the value {0} must be a number. Use a default message.
+ * @param key key to find
+ * @param args replacement strings
+ * @param defaultMsg default message
+ * @return message
+ */
+ public static String getWithDefault(String key, Object[] args, String defaultMsg)
+ {
+ return MgnlContext.getMessages().getWithDefault(key, args, defaultMsg);
+ }
+
+ /**
+ * @return Returns the defaultLocale.
+ */
+ public static Locale getDefaultLocale()
+ {
+ return applicationLocale;
+ }
+
+ /**
+ * Deprectated! Use MgnlContext
+ * @return Returns the current locale for the current user
+ * @deprecated
+ */
+ public static Locale getCurrentLocale(HttpServletRequest request)
+ {
+ try
+ {
+ return MgnlContext.getLocale();
+ }
+ catch (Exception e)
+ {
+ return getDefaultLocale();
+ }
+ }
+
+ /**
+ * @param defaultLocale The defaultLocale to set.
+ */
+ public static void setDefaultLocale(String defaultLocale)
+ {
+ MessagesManager.applicationLocale = new Locale(defaultLocale);
+ MgnlContext.getSystemContext().setLocale(applicationLocale);
+
+ if (context != null)
+ {
+ context.setAttribute(Config.FMT_LOCALE + ".application", defaultLocale); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * @return Returns the availableLocals.
+ */
+ public static Collection getAvailableLocales()
+ {
+ return availableLocales;
+ }
+
+ /**
+ * Set the user language in the session
+ * @param language lagnguage to ste
+ * @param session current session
+ * @deprecated since 3.5, use MgnlContext instead (this is not used - can be safely removed)
+ */
+ public static void setUserLanguage(String language, HttpSession session)
+ {
+ MgnlContext.setAttribute(Config.FMT_LOCALE + ".session", language, Context.SESSION_SCOPE); //$NON-NLS-1$
+ }
+
+ public static void reloadBundles() throws Exception
+ {
+ // reload all present
+ for (Iterator iter = messages.values().iterator(); iter.hasNext();)
+ {
+ Messages msgs = (Messages) iter.next();
+ msgs.reload();
+ }
+ }
+
+ /**
+ * Getter for <code>context</code>.
+ * @return Returns the context.
+ */
+ public static ServletContext getContext()
+ {
+ return context;
+ }
+
+ /**
+ * Used as the key in the LRUMap
+ * @author Philipp Bracher
+ * @version $Revision: 878 $ ($Author: manuel $)
+ */
+ static private class MessagesID
+ {
+
+ String basename;
+
+ Locale locale;
+
+ public MessagesID(String basename, Locale locale)
+ {
+ this.basename = basename;
+ this.locale = locale;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return basename.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object id)
+ {
+ return ((MessagesID) id).basename.equals(basename) && ((MessagesID) id).locale.equals(locale);
+ }
+ }
+}
Added: trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/configuration/MessagesConfigurationManager.java
===================================================================
--- trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/configuration/MessagesConfigurationManager.java (rev 0)
+++ trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/configuration/MessagesConfigurationManager.java 2008-12-03 15:10:19 UTC (rev 927)
@@ -0,0 +1,193 @@
+package net.sourceforge.openutils.mgnlmessages.configuration;
+
+import info.magnolia.api.MgnlException;
+import info.magnolia.cms.beans.config.ContentRepository;
+import info.magnolia.cms.beans.config.ObservedManager;
+import info.magnolia.cms.core.Content;
+import info.magnolia.cms.core.HierarchyManager;
+import info.magnolia.cms.core.ItemType;
+import info.magnolia.cms.core.NodeData;
+import info.magnolia.cms.util.ContentUtil;
+import info.magnolia.cms.util.FactoryUtil;
+import info.magnolia.cms.util.NodeDataUtil;
+import info.magnolia.context.MgnlContext;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+
+import javax.jcr.RepositoryException;
+
+import net.sourceforge.openutils.mgnlmessages.lifecycle.MessagesModuleLifecycle;
+
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * @author molaschi
+ */
+public class MessagesConfigurationManager extends ObservedManager
+{
+
+ /**
+ * Folder type
+ */
+ public static final ItemType FOLDER = ItemType.CONTENT;
+
+ private Logger log = LoggerFactory.getLogger(MessagesConfigurationManager.class);
+
+ private List<Locale> locales = new ArrayList<Locale>();
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void onClear()
+ {
+ locales.clear();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ @SuppressWarnings("unchecked")
+ protected void onRegister(Content node)
+ {
+ if (node.getNodeDataCollection() != null)
+ {
+ locales.clear();
+
+ for (Iterator iter = ContentUtil.getAllChildren(node).iterator(); iter.hasNext();)
+ {
+ Content langNode = (Content) iter.next();
+ locales.add(new Locale(NodeDataUtil.getString(langNode, "language"), NodeDataUtil.getString(
+ langNode,
+ "country")));
+ }
+
+ Collections.sort(locales, new Comparator<Locale>()
+ {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int compare(Locale o1, Locale o2)
+ {
+ if (o1.getLanguage().equals(o2.getLanguage()))
+ {
+ return o1.getCountry().compareTo(o2.getCountry());
+ }
+
+ return o1.getLanguage().compareTo(o2.getLanguage());
+ }
+
+ });
+ }
+ }
+
+ public static MessagesConfigurationManager getInstance()
+ {
+ return (MessagesConfigurationManager) FactoryUtil.getSingleton(MessagesConfigurationManager.class);
+ }
+
+ public static List<Locale> getAvaiableLocales()
+ {
+ return getInstance().getLocales();
+ }
+
+ @SuppressWarnings("unchecked")
+ public static List<String> getBaseNames()
+ {
+ HierarchyManager mgr = MgnlContext.getSystemContext().getHierarchyManager(ContentRepository.CONFIG);
+ try
+ {
+ Content basenamesNode = mgr.getContent("/modules/messages/basenames");
+ if (basenamesNode == null || !basenamesNode.hasChildren(ItemType.CONTENTNODE.getSystemName()))
+ {
+ return new ArrayList<String>();
+ }
+ List<String> basenames = new ArrayList<String>();
+ for (Iterator it = basenamesNode.getChildren(ItemType.CONTENTNODE.getSystemName()).iterator(); it.hasNext();)
+ {
+ Content bn = (Content) it.next();
+ basenames.add(NodeDataUtil.getString(bn, "basename"));
+ }
+ return basenames;
+ }
+ catch (RepositoryException e)
+ {
+ return new ArrayList<String>();
+ }
+ }
+
+ public static void saveKeyValue(String key, String value, String locale) throws RepositoryException
+ {
+ HierarchyManager mgr = MgnlContext.getSystemContext().getHierarchyManager(MessagesModuleLifecycle.REPO);
+ String path = "/" + StringUtils.replace(key, ".", "/");
+ Content content = getOrCreateFullPath(mgr, path);
+
+ if (!StringUtils.isEmpty(locale))
+ {
+ NodeData nd = NodeDataUtil.getOrCreate(content, locale);
+ if (!StringUtils.isEmpty(value))
+ {
+ nd.setValue(value);
+ }
+ else
+ {
+ nd.delete();
+ }
+ }
+
+ mgr.save();
+ }
+
+ private static Content getOrCreateFullPath(HierarchyManager mgr, String path) throws RepositoryException
+ {
+ try
+ {
+ return mgr.getContent(path);
+ }
+ catch (RepositoryException ex)
+ {
+ String parent = StringUtils.substringBeforeLast(path, "/");
+ String label = StringUtils.substringAfterLast(path, "/");
+ if (!StringUtils.isEmpty(parent))
+ {
+ getOrCreateFullPath(mgr, parent);
+ }
+ else
+ {
+ parent = "/";
+ }
+
+ return mgr.createContent(parent, label, ItemType.CONTENTNODE.getSystemName());
+ }
+ }
+
+ /**
+ * Returns the locales.
+ * @return the locales
+ */
+ public List<Locale> getLocales()
+ {
+ return locales;
+ }
+
+ /**
+ * Sets the languages.
+ * @param languages the languages to set
+ */
+ public void setLocales(List<Locale> locales)
+ {
+ this.locales = locales;
+ }
+
+}
Added: trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/i18n/EmptyResourceBundle.java
===================================================================
--- trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/i18n/EmptyResourceBundle.java (rev 0)
+++ trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/i18n/EmptyResourceBundle.java 2008-12-03 15:10:19 UTC (rev 927)
@@ -0,0 +1,63 @@
+package net.sourceforge.openutils.mgnlmessages.i18n;
+
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.ResourceBundle;
+
+
+/**
+ * @author molaschi
+ * @version $Id: $
+ */
+public class EmptyResourceBundle extends ResourceBundle
+{
+
+ /**
+ *
+ */
+ public EmptyResourceBundle()
+ {
+ super();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Enumeration<String> getKeys()
+ {
+
+ return new Enumeration<String>()
+ {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean hasMoreElements()
+ {
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String nextElement()
+ {
+ return null;
+ }
+
+ };
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected Object handleGetObject(String arg0)
+ {
+ return null;
+ }
+
+}
Added: trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/i18n/ModulePropertyMessagesImpl.java
===================================================================
--- trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/i18n/ModulePropertyMessagesImpl.java (rev 0)
+++ trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/i18n/ModulePropertyMessagesImpl.java 2008-12-03 15:10:19 UTC (rev 927)
@@ -0,0 +1,91 @@
+package net.sourceforge.openutils.mgnlmessages.i18n;
+
+import info.magnolia.cms.i18n.AbstractMessagesImpl;
+import info.magnolia.cms.i18n.Messages;
+import info.magnolia.module.ModuleRegistry;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+
+
+/**
+ * @author molaschi
+ * @version $Id: $
+ */
+public class ModulePropertyMessagesImpl extends AbstractMessagesImpl
+{
+
+ List<Messages> messages = new ArrayList<Messages>();
+
+ /**
+ * @param basename
+ * @param locale
+ */
+ @SuppressWarnings("unchecked")
+ public ModulePropertyMessagesImpl(Locale locale)
+ {
+ super("", locale);
+ ModuleRegistry reg = ModuleRegistry.Factory.getInstance();
+ for (String name : (Set<String>) reg.getModuleNames())
+ {
+ messages.add(new SimpleMessagesImpl("mgnl-messages." + name + ".messages", locale));
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String get(String key)
+ {
+ String value;
+ for (Messages m : messages)
+ {
+ value = m.get(key);
+ if (value != null)
+ {
+ return value;
+ }
+ }
+ if (key == null)
+ {
+ return "??????";
+ }
+ return "???" + key + "???";
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public Iterator keys()
+ {
+ List<String> keys = new ArrayList<String>();
+ for (Messages m : messages)
+ {
+ Iterator it = m.keys();
+ while (it.hasNext())
+ {
+ keys.add((String) it.next());
+ }
+ }
+ return keys.iterator();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void reload() throws Exception
+ {
+ for (Messages m : messages)
+ {
+ m.reload();
+ }
+ }
+
+}
Added: trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/i18n/RepositoryMessagesImpl.java
===================================================================
--- trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/i18n/RepositoryMessagesImpl.java (rev 0)
+++ trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/i18n/RepositoryMessagesImpl.java 2008-12-03 15:10:19 UTC (rev 927)
@@ -0,0 +1,134 @@
+package net.sourceforge.openutils.mgnlmessages.i18n;
+
+import info.magnolia.cms.core.Content;
+import info.magnolia.cms.core.HierarchyManager;
+import info.magnolia.cms.core.ItemType;
+import info.magnolia.cms.core.search.Query;
+import info.magnolia.cms.core.search.QueryManager;
+import info.magnolia.cms.core.search.QueryResult;
+import info.magnolia.cms.i18n.AbstractMessagesImpl;
+import info.magnolia.cms.util.NodeDataUtil;
+import info.magnolia.context.MgnlContext;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.MissingResourceException;
+
+import javax.jcr.RepositoryException;
+
+import org.apache.commons.lang.StringUtils;
+
+
+/**
+ * @author molaschi
+ * @version $Id: RepositoryMessagesImpl.java 4465 2008-09-28 10:59:58Z fgiust $
+ */
+public class RepositoryMessagesImpl extends AbstractMessagesImpl
+{
+
+ private static final String MESS_REPO = "messages";
+
+ private List<String> keys;
+
+ /**
+ * @param basename
+ * @param locale
+ */
+ public RepositoryMessagesImpl(String basename, Locale locale)
+ {
+ super(basename, locale);
+ }
+
+ /**
+ * Get the message from the bundle
+ * @param key the key
+ * @return message
+ */
+ public String get(String key)
+ {
+ if (key == null)
+ {
+ return "??????";
+ }
+ try
+ {
+ String handle = StringUtils.replace(key, ".", "/");
+ HierarchyManager hm = MgnlContext.getSystemContext().getHierarchyManager(MESS_REPO);
+ Content c = hm.getContent(handle);
+ String locale1 = this.locale.getLanguage() + "_" + this.locale.getCountry();
+ String locale2 = this.locale.getLanguage();
+ if (c == null || (!c.hasNodeData(locale1) && !c.hasNodeData(locale2)))
+ {
+ return "???" + key + "???";
+ }
+ if (c.hasNodeData(locale1))
+ {
+ return NodeDataUtil.getString(c, locale1);
+ }
+ else
+ {
+ return NodeDataUtil.getString(c, locale2);
+ }
+ }
+ catch (MissingResourceException e)
+ {
+ return "???" + key + "???";
+ }
+ catch (RepositoryException e)
+ {
+ return "???" + key + "???";
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void reload() throws Exception
+ {
+ keys = null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public Iterator keys()
+ {
+
+ long ms = System.currentTimeMillis();
+
+ if (keys == null)
+ {
+
+ keys = new ArrayList<String>();
+
+ try
+ {
+ QueryManager qm = MgnlContext.getSystemContext().getQueryManager(MESS_REPO);
+ Query q = qm.createQuery("//*", Query.XPATH);
+ QueryResult qr = q.execute();
+ for (Content c : (Collection<Content>) qr.getContent(ItemType.CONTENTNODE.getSystemName()))
+ {
+ if (c.getNodeDataCollection().size() > 0)
+ {
+ keys.add(StringUtils.replace(c.getHandle(), "/", ".").substring(1));
+ }
+ }
+ }
+ catch (RepositoryException e)
+ {
+
+ }
+ }
+
+ log.debug("Messages loaded in {} ms", System.currentTimeMillis() - ms);
+
+ return keys.iterator();
+ }
+
+}
Added: trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/i18n/SimpleMessagesImpl.java
===================================================================
--- trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/i18n/SimpleMessagesImpl.java (rev 0)
+++ trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/i18n/SimpleMessagesImpl.java 2008-12-03 15:10:19 UTC (rev 927)
@@ -0,0 +1,132 @@
+package net.sourceforge.openutils.mgnlmessages.i18n;
+
+import info.magnolia.cms.i18n.AbstractMessagesImpl;
+import info.magnolia.cms.i18n.MessagesManager;
+import info.magnolia.cms.util.ClasspathResourcesUtil;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.PropertyResourceBundle;
+import java.util.ResourceBundle;
+
+import org.apache.commons.collections.IteratorUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.io.IOUtils;
+
+
+/**
+ * @author Philipp Bracher
+ * @version $Revision: 14052 $ ($Author: gjoseph $)
+ */
+public class SimpleMessagesImpl extends AbstractMessagesImpl
+{
+
+ /**
+ * @param basename
+ * @param locale
+ */
+ protected SimpleMessagesImpl(String basename, Locale locale)
+ {
+ super(basename, locale);
+ }
+
+ /**
+ * Get the message from the bundle
+ * @param key the key
+ * @return message
+ */
+ public String get(String key)
+ {
+ if (key == null)
+ {
+ return null;
+ }
+ try
+ {
+ return getBundle().getString(key);
+ }
+ catch (MissingResourceException e)
+ {
+ return null;
+ }
+ }
+
+ /**
+ * @return Returns the bundle for the current basename
+ */
+ protected ResourceBundle getBundle()
+ {
+ if (bundle == null)
+ {
+ InputStream stream = null;
+ try
+ {
+ stream = ClasspathResourcesUtil.getStream("/"
+ + StringUtils.replace(basename, ".", "/")
+ + "_"
+ + getLocale().getLanguage()
+ + "_"
+ + getLocale().getCountry()
+ + ".properties", false);
+ if (stream == null)
+ {
+ stream = ClasspathResourcesUtil.getStream("/"
+ + StringUtils.replace(basename, ".", "/")
+ + "_"
+ + getLocale().getLanguage()
+ + ".properties", false);
+ }
+ if (stream == null)
+ {
+ stream = ClasspathResourcesUtil.getStream("/"
+ + StringUtils.replace(basename, ".", "/")
+ + "_"
+ + MessagesManager.getDefaultLocale().getLanguage()
+ + ".properties", false);
+ }
+ if (stream == null)
+ {
+ stream = ClasspathResourcesUtil.getStream("/"
+ + StringUtils.replace(basename, ".", "/")
+ + ".properties", false);
+ }
+
+ if (stream != null)
+ {
+ bundle = new PropertyResourceBundle(stream);
+ }
+ else
+ {
+ bundle = new EmptyResourceBundle();
+ }
+ }
+ catch (IOException e)
+ {
+ log.error("can't load messages for " + basename);
+ }
+ finally
+ {
+ IOUtils.closeQuietly(stream);
+ }
+ }
+ return bundle;
+ }
+
+ public void reload() throws Exception
+ {
+ this.bundle = null;
+ }
+
+ /**
+ * Iterate over the keys
+ */
+ @SuppressWarnings("unchecked")
+ public Iterator keys()
+ {
+ return IteratorUtils.asIterator(this.getBundle().getKeys());
+ }
+
+}
Added: trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/lifecycle/MessagesModuleLifecycle.java
===================================================================
--- trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/lifecycle/MessagesModuleLifecycle.java (rev 0)
+++ trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/lifecycle/MessagesModuleLifecycle.java 2008-12-03 15:10:19 UTC (rev 927)
@@ -0,0 +1,43 @@
+package net.sourceforge.openutils.mgnlmessages.lifecycle;
+
+import info.magnolia.module.ModuleLifecycle;
+import info.magnolia.module.ModuleLifecycleContext;
+import net.sourceforge.openutils.mgnlmessages.configuration.MessagesConfigurationManager;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * @author molaschi
+ */
+public class MessagesModuleLifecycle implements ModuleLifecycle
+{
+
+ /**
+ *
+ */
+ public static final String REPO = "messages";
+
+ private Logger log = LoggerFactory.getLogger(MessagesModuleLifecycle.class);
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void start(ModuleLifecycleContext ctx)
+ {
+ log.info("Starting module messages");
+ ctx.registerModuleObservingComponent("locales", MessagesConfigurationManager.getInstance());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void stop(ModuleLifecycleContext ctx)
+ {
+ log.info("Stopping module messages");
+ }
+
+}
Added: trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/pages/DefaultMessagesImpl.java
===================================================================
--- trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/pages/DefaultMessagesImpl.java (rev 0)
+++ trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/pages/DefaultMessagesImpl.java 2008-12-03 15:10:19 UTC (rev 927)
@@ -0,0 +1,95 @@
+package net.sourceforge.openutils.mgnlmessages.pages;
+
+import info.magnolia.cms.util.ClasspathResourcesUtil;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Locale;
+import java.util.PropertyResourceBundle;
+import java.util.ResourceBundle;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.StringUtils;
+
+
+/**
+ * @author molaschi
+ * @version $Id: DefaultMessagesImpl.java 4124 2008-09-22 14:56:46Z fgiust $
+ */
+public class DefaultMessagesImpl extends info.magnolia.cms.i18n.DefaultMessagesImpl
+{
+
+ /**
+ * @param basename
+ * @param locale
+ */
+ public DefaultMessagesImpl(String basename, Locale locale)
+ {
+ super(basename, locale);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String get(String key)
+ {
+ if (this.getBundle() == null)
+ {
+ return "??????";
+ }
+ return super.get(key);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected ResourceBundle getBundle()
+ {
+ if (bundle == null)
+ {
+ InputStream stream = null;
+ try
+ {
+ if (StringUtils.isEmpty(getLocale().getCountry()))
+ {
+ stream = ClasspathResourcesUtil.getStream("/"
+ + StringUtils.replace(basename, ".", "/")
+ + "_"
+ + getLocale().getLanguage()
+ + ".properties", false);
+ }
+ else
+ {
+ stream = ClasspathResourcesUtil.getStream("/"
+ + StringUtils.replace(basename, ".", "/")
+ + "_"
+ + getLocale().getLanguage()
+ + "_"
+ + getLocale().getCountry()
+ + ".properties", false);
+ }
+
+ if (stream != null)
+ {
+ bundle = new PropertyResourceBundle(stream);
+ }
+ else
+ {
+ bundle = null;
+ }
+ }
+ catch (IOException e)
+ {
+ log.error("can't load messages for " + basename);
+ }
+ finally
+ {
+ IOUtils.closeQuietly(stream);
+ }
+ }
+ return bundle;
+ }
+
+}
Added: trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/pages/ExtractMessagesFromDialogsPage.java
===================================================================
--- trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/pages/ExtractMessagesFromDialogsPage.java (rev 0)
+++ trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/pages/ExtractMessagesFromDialogsPage.java 2008-12-03 15:10:19 UTC (rev 927)
@@ -0,0 +1,207 @@
+package net.sourceforge.openutils.mgnlmessages.pages;
+
+import info.magnolia.cms.beans.config.ContentRepository;
+import info.magnolia.cms.core.Content;
+import info.magnolia.cms.core.HierarchyManager;
+import info.magnolia.cms.core.ItemType;
+import info.magnolia.cms.core.NodeData;
+import info.magnolia.cms.core.search.Query;
+import info.magnolia.cms.core.search.QueryManager;
+import info.magnolia.cms.core.search.QueryResult;
+import info.magnolia.cms.util.ContentUtil;
+import info.magnolia.cms.util.NodeDataUtil;
+import info.magnolia.context.MgnlContext;
+import info.magnolia.module.admininterface.TemplatedMVCHandler;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import javax.jcr.RepositoryException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import net.sourceforge.openutils.mgnlmessages.lifecycle.MessagesModuleLifecycle;
+
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * @author molaschi
+ * @version $Id: $
+ */
+public class ExtractMessagesFromDialogsPage extends TemplatedMVCHandler
+{
+
+ private List<String> dialogsRoot;
+
+ /**
+ * Logger.
+ */
+ private Logger log = LoggerFactory.getLogger(ExtractMessagesFromDialogsPage.class);
+
+ /**
+ * @param name
+ * @param request
+ * @param response
+ */
+ public ExtractMessagesFromDialogsPage(String name, HttpServletRequest request, HttpServletResponse response)
+ {
+ super(name, request, response);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String show()
+ {
+ dialogsRoot = new ArrayList<String>();
+ QueryManager qm = MgnlContext.getQueryManager(ContentRepository.CONFIG);
+ Query q;
+ try
+ {
+ q = qm.createQuery("//dialogs", Query.XPATH);
+
+ QueryResult qr = q.execute();
+ Collection<Content> dialogs = qr.getContent();
+ for (Content dialog : dialogs)
+ {
+ dialogsRoot.add(dialog.getHandle());
+ }
+
+ q = qm.createQuery("//paragraphs", Query.XPATH);
+
+ qr = q.execute();
+ dialogs = qr.getContent();
+ for (Content dialog : dialogs)
+ {
+ dialogsRoot.add(dialog.getHandle());
+ }
+ }
+ catch (RepositoryException e)
+ {
+
+ }
+
+ return super.show();
+ }
+
+ public String extract()
+ {
+ HierarchyManager hmConfig = MgnlContext.getHierarchyManager(ContentRepository.CONFIG);
+ QueryManager qm = hmConfig.getQueryManager();
+ HierarchyManager hm = MgnlContext.getHierarchyManager(MessagesModuleLifecycle.REPO);
+ for (String dialogRoot : this.request.getParameterValues("dialogsRoots"))
+ {
+ Query q;
+ try
+ {
+ doExtraction(dialogRoot, "label", qm, hm, hmConfig);
+ }
+ catch (RepositoryException e)
+ {
+ log.error("Error extracting labels from dialogs and paragraphs", e);
+ }
+
+ try
+ {
+ doExtraction(dialogRoot, "description", qm, hm, hmConfig);
+ }
+ catch (RepositoryException e)
+ {
+ log.error("Error extracting description from dialogs and paragraphs", e);
+ }
+
+ try
+ {
+ doExtraction(dialogRoot, "title", qm, hm, hmConfig);
+ }
+ catch (RepositoryException e)
+ {
+ log.error("Error extracting description from dialogs and paragraphs", e);
+ }
+ }
+
+ return this.show();
+ }
+
+ private void doExtraction(String root, String property, QueryManager qm, HierarchyManager hmMessages,
+ HierarchyManager hmConfig) throws RepositoryException
+ {
+ Query q = qm.createQuery(root.substring(1) + "//*[@" + property + "]", Query.XPATH);
+
+ QueryResult qr = q.execute();
+ Collection<Content> labelParents = new ArrayList<Content>();
+ labelParents.addAll(qr.getContent(ItemType.CONTENTNODE.getSystemName()));
+ labelParents.addAll(qr.getContent(ItemType.CONTENT.getSystemName()));
+ for (Content labelParent : labelParents)
+ {
+ NodeData labelNd = labelParent.getNodeData(property);
+ String label = labelNd.getString();
+ if (!StringUtils.isEmpty(label) && MgnlContext.getMessages().get(label).startsWith("???"))
+ {
+ String parentPath = labelParent.getHandle();
+ parentPath = StringUtils.replace(parentPath, "/modules", "");
+ Content parent = getOrCreateFullPath(hmMessages, parentPath);
+ Content message = ContentUtil.getOrCreateContent(parent, property, ItemType.CONTENTNODE);
+ NodeData nd = NodeDataUtil.getOrCreate(message, "en");
+ nd.setValue(label);
+ nd = NodeDataUtil.getOrCreate(message, "it");
+ nd.setValue(label);
+
+ String messageKey = message.getHandle().substring(1);
+ messageKey = StringUtils.replace(messageKey, "/", ".");
+ labelNd.setValue(messageKey);
+ }
+ }
+ hmMessages.save();
+ hmConfig.save();
+ }
+
+ private Content getOrCreateFullPath(HierarchyManager mgr, String path) throws RepositoryException
+ {
+ try
+ {
+ return mgr.getContent(path);
+ }
+ catch (RepositoryException ex)
+ {
+ String parent = StringUtils.substringBeforeLast(path, "/");
+ String label = StringUtils.substringAfterLast(path, "/");
+ if (!StringUtils.isEmpty(parent))
+ {
+ getOrCreateFullPath(mgr, parent);
+ }
+ else
+ {
+ parent = "/";
+ }
+
+ Content c = mgr.createContent(parent, label, ItemType.CONTENTNODE.getSystemName());
+ mgr.save();
+ return c;
+ }
+ }
+
+ /**
+ * Returns the dialogsRoot.
+ * @return the dialogsRoot
+ */
+ public List<String> getDialogsRoot()
+ {
+ return dialogsRoot;
+ }
+
+ /**
+ * Sets the dialogsRoot.
+ * @param dialogsRoot the dialogsRoot to set
+ */
+ public void setDialogsRoot(List<String> dialogsRoot)
+ {
+ this.dialogsRoot = dialogsRoot;
+ }
+
+}
Added: trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/pages/MessagesEditPage.java
===================================================================
--- trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/pages/MessagesEditPage.java (rev 0)
+++ trunk/openutils-mgnlmessages/src/main/java/net/sourceforge/openutils/mgnlmessages/pages/MessagesEditPage.java 2008-12-03 15:10:19 UTC (rev 927)
@@ -0,0 +1,387 @@
+package net.sourceforge.openutils.mgnlmessages.pages;
+
+import info.magnolia.cms.core.Content;
+import info.magnolia.cms.core.HierarchyManager;
+import info.magnolia.cms.core.ItemType;
+import info.magnolia.cms.core.Path;
+import info.magnolia.cms.exchange.ExchangeException;
+import info.magnolia.context.MgnlContext;
+import info.magnolia.module.admininterface.TemplatedMVCHandler;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+
+import javax.jcr.PathNotFoundException;
+import javax.jcr.RepositoryException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import net.sourceforge.openutils.mgnlmessages.configuration.MessagesConfigurationManager;
+import net.sourceforge.openutils.mgnlmessages.lifecycle.MessagesModuleLifecycle;
+
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * @author manuel
+ * @version $Id
+ */
+public class MessagesEditPage extends TemplatedMVCHandler
+{
+
+ private static final String JSON_VIEW = "js";
+
+ /**
+ * Logger.
+ */
+ private Logger log = LoggerFactory.getLogger(MessagesEditPage.class);
+
+ private List<String> keys;
+
+ private List<Locale> locales;
+
+ private String currentLanguage;
+
+ private String json;
+
+ private String key;
+
+ private String locale;
+
+ private String text;
+
+ private String newkey;
+
+ /**
+ * @param name
+ * @param request
+ * @param response
+ */
+ public MessagesEditPage(String name, HttpServletRequest request, HttpServletResponse response)
+ {
+ super(name, request, response);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public void init()
+ {
+
+ super.init();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void renderHtml(String view) throws IOException
+ {
+ if (JSON_VIEW.equals(view))
+ {
+ this.response.setContentType("text/json");
+ this.response.getWriter().write(json);
+ }
+ else
+ {
+
+ keys = new ArrayList<String>();
+ Iterator<String> it = MgnlContext.getMessages().keys();
+ while (it.hasNext())
+ {
+ keys.add(it.next());
+ }
+ Collections.sort(keys);
+
+ locales = MessagesConfigurationManager.getAvaiableLocales();
+
+ Locale loc = this.request.getLocale();
+ currentLanguage = loc.getLanguage();
+ if (loc.getCountry() != null && loc.getCountry().length() > 0)
+ {
+ currentLanguage += "_" + loc.getCountry();
+ }
+
+ super.renderHtml(view);
+ }
+ }
+
+ public String loadkey()
+ {
+ Locale locBk = MgnlContext.getLocale();
+ Locale newLoc = null;
+ if (locale.indexOf('_') > 0)
+ {
+ newLoc = new Locale(StringUtils.substringBefore(locale, "_"), StringUtils.substringAfter(locale, "_"));
+ }
+ else
+ {
+ newLoc = new Locale(locale);
+ }
+ MgnlContext.setLocale(newLoc);
+
+ json = "rootObj = {value: '"
+ + ((MgnlContext.getMessages().get(key) != null) ? StringUtils.replace(
+ MgnlContext.getMessages().get(key),
+ "'",
+ "\'") : "")
+ + "'}";
+
+ MgnlContext.setLocale(locBk);
+
+ return JSON_VIEW;
+ }
+
+ public String savekey()
+ {
+ try
+ {
+ MessagesConfigurationManager.saveKeyValue(key, text, locale);
+ json = "rootObj = {value: 'OK'}";
+ }
+ catch (RepositoryException e)
+ {
+ log.error("Error saving key", e);
+ json = "rootObj = {value: 'KO'}";
+ }
+
+ return JSON_VIEW;
+ }
+
+ public String removekey()
+ {
+ try
+ {
+ HierarchyManager mgr = MgnlContext.getSystemContext().getHierarchyManager(MessagesModuleLifecycle.REPO);
+ String path = "/" + StringUtils.replace(key, ".", "/");
+ mgr.delete(path);
+
+ mgr.save();
+
+ String parent = StringUtils.substringBeforeLast(path, "/");
+ if (!StringUtils.isEmpty(parent))
+ {
+ if (!mgr.getContent(parent).hasChildren(ItemType.CONTENTNODE.getSystemName()))
+ {
+ key = StringUtils.replace(parent.substring(1), "/", ".");
+ removekey();
+ }
+ }
+ json = "rootObj = {value: 'OK'}";
+ }
+ catch (PathNotFoundException e)
+ {
+ json = "rootObj = {value: 'NOTFOUND'}";
+ }
+ catch (RepositoryException e)
+ {
+ log.error("Error removing key", e);
+ json = "rootObj = {value: 'KO'}";
+ }
+
+ return JSON_VIEW;
+ }
+
+ public String renamekey()
+ {
+ try
+ {
+ moveNode("/" + StringUtils.replace(key, ".", "/"), "/" + StringUtils.replace(newkey, ".", "/"));
+ json = "rootObj = {value: 'OK'}";
+ }
+ catch (RepositoryException e)
+ {
+ log.error("Error removing ke...
[truncated message content] |