/* ===============================================================================
*
* 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.settings.controllers;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.exolab.castor.jdo.Database;
import org.infoglue.cms.entities.management.InfoGlueProperty;
import org.infoglue.cms.util.CmsPropertyHandler;
import org.infoglue.cms.util.dom.DOMBuilder;
import org.infoglue.deliver.util.CacheController;
import org.infoglue.deliver.util.NullObject;
public class CastorSettingsController
{
private DOMBuilder domBuilder = new DOMBuilder();
private CastorSettingsPersister settingsPersister = null;
/**
* A simple factory method
*/
public static CastorSettingsController getController(CastorSettingsPersister labelsPersister)
{
return new CastorSettingsController(labelsPersister);
}
private CastorSettingsController(CastorSettingsPersister settingsPersister)
{
this.settingsPersister = settingsPersister;
}
/**
* This method returns a list (of strings) of all label-keys the system uses.
*/
public List getSystemSettings(String bundleName)
{
List labels = new ArrayList();
Properties properties = CmsPropertyHandler.getProperties();
Enumeration enumeration = properties.keys();
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 getSettingsVariations(String nameSpace, String name, Database database) throws Exception
{
List locales = new ArrayList();
Document document = getPropertyDocument(nameSpace, name, database);
if(document != null)
{
List languageNodes = document.selectNodes("/variations/variation");
Iterator languageNodesIterator = languageNodes.iterator();
while(languageNodesIterator.hasNext())
{
Node node = (Node)languageNodesIterator.next();
Element element = (Element)node;
String id = element.attributeValue("id");
locales.add(id);
}
}
return locales;
}
public Document getPropertyDocument(String nameSpace, String name, Database database) throws Exception
{
String key = "propertyDocument_" + nameSpace + "_" + name;
Object object = CacheController.getCachedObject(CacheController.SETTINGSPROPERTIESDOCUMENTCACHENAME, key);
//log.debug("Cached object:" + object);
if(object instanceof NullObject)
return null;
Document document = (Document)object;
if(document == null)
{
InfoGlueProperty property = settingsPersister.getProperty(nameSpace, name, database);
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 variationsElement = domBuilder.addElement(document, "variations");
Element languageElement = domBuilder.addElement(variationsElement, "variation");
domBuilder.addAttribute(languageElement, "id", "default");
Element labelsElement = domBuilder.addElement(languageElement, "setting");
}
}
}
else
{
//log.debug("Property was null...");
document = domBuilder.createDocument();
Element variationsElement = domBuilder.addElement(document, "variations");
Element languageElement = domBuilder.addElement(variationsElement, "variation");
domBuilder.addAttribute(languageElement, "id", "default");
Element labelsElement = domBuilder.addElement(languageElement, "setting");
String xml = domBuilder.getFormattedDocument(document, "UTF-8");
//log.debug("xml:" + xml);
settingsPersister.createProperty(nameSpace, name, xml, database);
//log.debug("Creating property:" + xml);
document = domBuilder.getDocument(xml);
}
if(document != null)
{
CacheController.cacheObject(CacheController.SETTINGSPROPERTIESDOCUMENTCACHENAME, key, document);
}
else
{
CacheController.cacheObject(CacheController.SETTINGSPROPERTIESDOCUMENTCACHENAME, key, new NullObject());
}
}
return document;
}
public void addVariation(String nameSpace, String name, String id, Database database) throws Exception
{
if(id == null || id.equals("-1"))
id = "default";
Document document = getPropertyDocument(nameSpace, name, database);
Element variationElement = (Element)document.selectSingleNode("/variations/variation[@id='" + id + "']");
if(variationElement == null)
{
Element variationsElement = (Element)document.selectSingleNode("/variations");
Element languageElement = domBuilder.addElement(variationsElement, "variation");
domBuilder.addAttribute(languageElement, "id", id);
Element labelsElement = domBuilder.addElement(languageElement, "setting");
String xml = domBuilder.getFormattedDocument(document, "UTF-8");
//log.debug("xml:" + xml);
settingsPersister.updateProperty(nameSpace, name, xml, database);
CacheController.clearCache(CacheController.SETTINGSPROPERTIESCACHENAME);
CacheController.clearCache(CacheController.SETTINGSPROPERTIESDOCUMENTCACHENAME);
}
}
public void removeVariation(String nameSpace, String name, String id, Database database) throws Exception
{
if(id == null || id.equals("-1"))
id = "default";
Document document = getPropertyDocument(nameSpace, name, database);
Element variationsElement = (Element)document.selectSingleNode("/variations/variation[@id='" + id + "']");
if(variationsElement != null)
{
variationsElement.getParent().remove(variationsElement);
String xml = domBuilder.getFormattedDocument(document, "UTF-8");
//log.debug("xml:" + xml);
settingsPersister.updateProperty(nameSpace, name, xml, database);
CacheController.clearCache(CacheController.SETTINGSPROPERTIESCACHENAME);
CacheController.clearCache(CacheController.SETTINGSPROPERTIESDOCUMENTCACHENAME);
}
}
public void removeProperty(String nameSpace, String name, String id, String key, Database database) throws Exception
{
if(id == null || id.equals("-1"))
id = "default";
Document document = getPropertyDocument(nameSpace, name, database);
Element settingElement = (Element)document.selectSingleNode("/variations/variation[@id='" + id + "']/setting/" + key);
if(settingElement != null)
{
settingElement.getParent().remove(settingElement);
String xml = domBuilder.getFormattedDocument(document, "UTF-8");
//log.debug("xml:" + xml);
settingsPersister.updateProperty(nameSpace, name, xml, database);
CacheController.clearCache(CacheController.SETTINGSPROPERTIESCACHENAME);
CacheController.clearCache(CacheController.SETTINGSPROPERTIESDOCUMENTCACHENAME);
}
}
public void updateSettings(String nameSpace, String name, String id, Map properties, Database database) throws Exception
{
if(id == null || id.equals("-1"))
id = "default";
Document document = getPropertyDocument(nameSpace, name, database);
//String xml1 = domBuilder.getFormattedDocument(document, "UTF-8");
//log.debug("xml1:" + xml1);
String xpath = "/variations/variation[@id='" + id +"']/setting";
//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 && labelsElement != null)
{
Element labelElement = labelsElement.element(key);
if(labelElement == null)
{
labelElement = domBuilder.addElement(labelsElement, key);
}
else
{
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");
settingsPersister.updateProperty(nameSpace, name, xml, database);
CacheController.clearCache(CacheController.SETTINGSPROPERTIESCACHENAME);
CacheController.clearCache(CacheController.SETTINGSPROPERTIESDOCUMENTCACHENAME);
}
/**
* This method returns a label from the label system
* @param nameSpace
* @param key
* @param locale
* @param database
* @return
* @throws Exception
*/
public String getSetting(String nameSpace, String name, String key, String id, Database database) throws Exception
{
String setting = null;
if(id == null || id.equals("-1"))
id = "default";
if(key != null && !key.equals(""))
{
if(!Character.isLetter(key.charAt(0)))
key = "NP" + key;
Document document = getPropertyDocument(nameSpace, name, database);
if(document != null)
{
if(id == null)
id = "default";
String xpath = "/variations/variation[@id='" + id +"']/setting/" + key;
Element labelElement = (Element)document.selectSingleNode(xpath);
if(labelElement != null)
setting = labelElement.getText();
}
}
return setting;
}
}