org.infoglue.common.labels.controllers.LabelsController.java Source code

Java tutorial

Introduction

Here is the source code for org.infoglue.common.labels.controllers.LabelsController.java

Source

/* ===============================================================================
*
* Part of the InfoGlue Content Management Platform (www.infoglue.org)
*
* ===============================================================================
*
*  Copyright (C)
* 
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 2, as published by the
* Free Software Foundation. See the file LICENSE.html for more information.
* 
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY, including the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
* 
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc. / 59 Temple
* Place, Suite 330 / Boston, MA 02111-1307 / USA.
*
* ===============================================================================
*/

package org.infoglue.common.labels.controllers;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.hibernate.Session;
import org.infoglue.common.settings.entities.Property;
import org.infoglue.common.util.CacheController;
import org.infoglue.common.util.NullObject;
import org.infoglue.common.util.ResourceBundleHelper;
import org.infoglue.common.util.dom.DOMBuilder;
import org.infoglue.common.util.io.FileHelper;

public class LabelsController {
    private DOMBuilder domBuilder = new DOMBuilder();
    private LabelsPersister labelsPersister = null;

    private static final String LABELSPROPERTIESCACHENAME = "labelsPropertiesCache";

    /**
     * A simple factory method
     */

    public static LabelsController getController(LabelsPersister labelsPersister) {
        return new LabelsController(labelsPersister);
    }

    private LabelsController(LabelsPersister labelsPersister) {
        this.labelsPersister = labelsPersister;
    }

    /**
     * This method returns a list (of strings) of all label-keys the system uses.
     */

    public List getSystemLabels(String bundleName) {
        List labels = new ArrayList();

        ResourceBundle bundle = ResourceBundleHelper.getResourceBundle(bundleName, Locale.ENGLISH);

        Enumeration enumeration = bundle.getKeys();
        while (enumeration.hasMoreElements()) {
            String key = (String) enumeration.nextElement();
            labels.add(key);
        }

        Collections.sort(labels);

        return labels;
    }

    /**
     * This method returns a list (of locales) of all defined label-languages.
     */

    public List getLabelLocales(String nameSpace, Session session) throws Exception {
        List locales = new ArrayList();

        Document document = getPropertyDocument(nameSpace, session);
        if (document != null) {
            List languageNodes = document.selectNodes("/languages/language");
            Iterator languageNodesIterator = languageNodes.iterator();
            while (languageNodesIterator.hasNext()) {
                Node node = (Node) languageNodesIterator.next();
                Element element = (Element) node;
                String languageCode = element.attributeValue("languageCode");

                Locale locale = new Locale(languageCode);
                locales.add(locale);
            }
        }

        return locales;
    }

    public Document getPropertyDocument(String nameSpace, Session session) throws Exception {
        String key = "propertyDocument_" + nameSpace;

        Object object = CacheController.getCachedObject(LABELSPROPERTIESCACHENAME, key);
        //log.debug("Cached object:" + object);
        if (object instanceof NullObject)
            return null;

        Document document = (Document) object;

        if (document == null) {
            Property property = labelsPersister.getProperty(nameSpace, "systemLabels", session);
            if (property != null) {
                String xml = property.getValue();
                if (xml != null && xml.length() > 0) {
                    //log.debug("xml:" + xml);
                    try {
                        document = domBuilder.getDocument(xml);
                        //String xml2 = domBuilder.getFormattedDocument(document, false, false, "UTF-8");
                        //log.debug("xml2:" + xml2);
                    } catch (Exception e) {
                        document = domBuilder.createDocument();
                        Element languagesElement = domBuilder.addElement(document, "languages");
                        Element languageElement = domBuilder.addElement(languagesElement, "language");
                        domBuilder.addAttribute(languageElement, "languageCode", "en");
                        Element labelsElement = domBuilder.addElement(languageElement, "labels");
                    }
                }
            } else {
                document = domBuilder.createDocument();
                Element languagesElement = domBuilder.addElement(document, "languages");
                Element languageElement = domBuilder.addElement(languagesElement, "language");
                domBuilder.addAttribute(languageElement, "languageCode", "en");
                Element labelsElement = domBuilder.addElement(languageElement, "labels");
                String xml = domBuilder.getFormattedDocument(document, "UTF-8");
                //log.debug("xml:" + xml);

                labelsPersister.createProperty(nameSpace, "systemLabels", xml, session);

                document = domBuilder.getDocument(xml);
            }

            //log.debug("document before cache:" + document);
            if (document != null) {
                //log.debug("caching document:" + cacheName + ":" + key + ":" + document);
                CacheController.cacheObject(LABELSPROPERTIESCACHENAME, key, document);
            } else {
                CacheController.cacheObject(LABELSPROPERTIESCACHENAME, key, new NullObject());
            }
        }

        return document;
    }

    public void addLabelLocale(String nameSpace, String languageCode, Session session) throws Exception {
        Document document = getPropertyDocument(nameSpace, session);
        Element languagesElement = (Element) document.selectSingleNode("/languages");
        Element languageElement = domBuilder.addElement(languagesElement, "language");
        domBuilder.addAttribute(languageElement, "languageCode", languageCode);
        Element labelsElement = domBuilder.addElement(languageElement, "labels");
        String xml = domBuilder.getFormattedDocument(document, "UTF-8");
        //log.debug("xml:" + xml);

        labelsPersister.updateProperty(nameSpace, "systemLabels", xml, session);

        CacheController.clearCache(LABELSPROPERTIESCACHENAME);
    }

    public void updateLabels(String nameSpace, String languageCode, Map properties, Session session)
            throws Exception {
        Document document = getPropertyDocument(nameSpace, session);
        //String xml1 = domBuilder.getFormattedDocument(document, "UTF-8");
        //log.debug("xml1:" + xml1);
        String xpath = "/languages/language[@languageCode='" + languageCode + "']/labels";
        //String xpath = "/languages/language[@languageCode='" + languageCode +"']/labels";
        //log.debug("xpath:" + xpath);

        Element labelsElement = (Element) document.selectSingleNode(xpath);
        //log.debug("labelsElement:" + labelsElement);

        Iterator keyInterator = properties.keySet().iterator();
        while (keyInterator.hasNext()) {
            String key = (String) keyInterator.next();
            String value = (String) properties.get(key);
            if (!Character.isLetter(key.charAt(0)))
                key = "NP" + key;

            if (key != null && value != null) {
                Element labelElement = labelsElement.element(key);
                if (labelElement == null)
                    labelElement = domBuilder.addElement(labelsElement, key);

                labelElement.clearContent();

                List elements = labelElement.elements();
                Iterator elementsIterator = elements.iterator();
                while (elementsIterator.hasNext()) {
                    Element element = (Element) elementsIterator.next();
                    //log.debug("Removing element:" + element.asXML());
                    labelElement.remove(element);
                }

                domBuilder.addCDATAElement(labelElement, value);
            }
        }

        String xml = domBuilder.getFormattedDocument(document, "UTF-8");
        //log.debug("xml:" + xml);

        labelsPersister.updateProperty(nameSpace, "systemLabels", xml, session);

        CacheController.clearCache(LABELSPROPERTIESCACHENAME);
    }

    /**
     * This method returns a label from the label system
     * @param nameSpace
     * @param key
     * @param locale
     * @param session
     * @return
     * @throws Exception
     */
    public String getLabel(String nameSpace, String key, Locale locale, Session session) throws Exception {
        String label = null;

        if (!Character.isLetter(key.charAt(0)))
            key = "NP" + key;

        Document document = getPropertyDocument(nameSpace, session);
        //log.debug("key:" + key);
        //log.debug("locale.getLanguage():" + locale.getLanguage());
        if (document != null) {
            String xpath = "/languages/language[@languageCode='" + locale.getLanguage() + "']/labels/" + key;
            //log.debug("xpath:" + xpath);

            Element labelElement = (Element) document.selectSingleNode(xpath);
            //log.debug("labelElement:" + labelElement);

            if (labelElement != null)
                label = labelElement.getText();
        }

        return label;
    }

}