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] |