ingo@340: package de.intevation.flys.themes;
ingo@340: 
ingo@340: import java.util.HashMap;
ingo@340: import java.util.Iterator;
ingo@340: import java.util.Map;
ingo@340: 
ingo@340: import org.w3c.dom.Document;
ingo@340: import org.w3c.dom.Element;
ingo@340: import org.w3c.dom.Node;
ingo@340: 
ingo@340: import de.intevation.artifacts.common.utils.XMLUtils;
ingo@340: import de.intevation.artifacts.common.utils.XMLUtils.ElementCreator;
ingo@340: 
ingo@340: 
ingo@340: /**
ingo@340:  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
ingo@340:  */
ingo@340: public class DefaultTheme implements Theme {
ingo@340: 
ingo@340:     /** The name of the theme.*/
ingo@340:     protected String name;
ingo@340: 
ingo@340:     /** The description of the theme.*/
ingo@340:     protected String description;
ingo@340: 
ingo@340: 
ingo@340:     /** The map storing the fields of this theme.*/
ingo@340:     protected Map<String, ThemeField> fields;
ingo@340: 
ingo@340:     /** The map storing the attributes of this theme.*/
ingo@340:     protected Map<String, String> attr;
ingo@340: 
ingo@340: 
ingo@340:     /**
ingo@340:      * Initializes the components of this Theme.
ingo@340:      */
ingo@340:     public DefaultTheme(String name, String description) {
ingo@340:         this.name        = name;
ingo@340:         this.description = description;
ingo@340:         this.fields      = new HashMap<String, ThemeField>();
ingo@340:         this.attr        = new HashMap<String, String>();
ingo@340:     }
ingo@340: 
ingo@340: 
ingo@340:     public void init(Node config) {
ingo@340:     }
ingo@340: 
ingo@340: 
ingo@340:     public String getName() {
ingo@340:         return name;
ingo@340:     }
ingo@340: 
ingo@340: 
ingo@340:     public String getDescription() {
ingo@340:         return description;
ingo@340:     }
ingo@340: 
ingo@340: 
ingo@340:     public void addAttribute(String name, String value) {
ingo@340:         if (name != null && value != null) {
ingo@340:             attr.put(name, value);
ingo@340:         }
ingo@340:     }
ingo@340: 
ingo@340: 
ingo@340:     public String getAttribute(String name) {
ingo@340:         return attr.get(name);
ingo@340:     }
ingo@340: 
ingo@340: 
ingo@340:     public void addField(String name, ThemeField field) {
ingo@340:         if (name != null && field != null) {
ingo@340:             fields.put(name, field);
ingo@340:         }
ingo@340:     }
ingo@340: 
ingo@340: 
ingo@340:     public void setFieldValue(String name, Object value) {
ingo@340:         if (name != null && value != null) {
ingo@340:             ThemeField field = fields.get(name);
ingo@340: 
ingo@340:             if (field != null) {
ingo@340:                 field.setValue(value);
ingo@340:             }
ingo@340:         }
ingo@340:     }
ingo@340: 
ingo@340: 
ingo@340:     public ThemeField getField(String name) {
ingo@340:         return fields.get(name);
ingo@340:     }
ingo@340: 
ingo@340: 
ingo@340:     public String getFieldType(String name) {
ingo@340:         ThemeField field = fields.get(name);
ingo@340: 
ingo@340:         return field != null ? field.getType() : null;
ingo@340:     }
ingo@340: 
ingo@340: 
ingo@340:     public Object getFieldValue(String name) {
ingo@340:         ThemeField field = fields.get(name);
ingo@340: 
ingo@340:         return field != null ? field.getValue() : null;
ingo@340:     }
ingo@340: 
ingo@340: 
ingo@340:     public Document toXML() {
ingo@340:         Document doc = XMLUtils.newDocument();
ingo@340: 
ingo@340:         ElementCreator cr = new ElementCreator(doc, null, null);
ingo@340: 
ingo@340:         Element theme = cr.create("theme");
ingo@340: 
ingo@340:         appendAttributes(cr, theme);
ingo@340:         appendFields(cr, theme);
ingo@340: 
ingo@340:         doc.appendChild(theme);
ingo@340: 
ingo@340:         return doc;
ingo@340:     }
ingo@340: 
ingo@340: 
ingo@340:     /**
ingo@340:      * Appends the attributes configured for this theme.
ingo@340:      *
ingo@340:      * @param cr The ElementCreator.
ingo@340:      * @param theme The document root element.
ingo@340:      */
ingo@340:     protected void appendAttributes(ElementCreator cr, Element theme) {
ingo@340:         Iterator<String> iter = attr.keySet().iterator();
ingo@340: 
ingo@340:         while (iter.hasNext()) {
ingo@340:             String key = iter.next();
ingo@340:             String val = getAttribute(key);
ingo@340: 
ingo@340:             if (key == null || val == null) {
ingo@340:                 continue;
ingo@340:             }
ingo@340: 
ingo@340:             cr.addAttr(theme, key, val);
ingo@340:         }
ingo@340:     }
ingo@340: 
ingo@340: 
ingo@340:     /**
ingo@340:      * Appends the fields configured for this theme.
ingo@340:      *
ingo@340:      * @param cr The ElementCreator.
ingo@340:      * @param theme The document root element.
ingo@340:      */
ingo@340:     protected void appendFields(ElementCreator cr, Element theme) {
ingo@340:         Iterator<String> iter = fields.keySet().iterator();
ingo@340: 
ingo@340:         while (iter.hasNext()) {
ingo@340:             String name = iter.next();
ingo@340: 
ingo@340:             ThemeField field = getField(name);
ingo@340: 
ingo@340:             Document doc = field.toXML();
ingo@340:             Node    root = doc.getFirstChild();
ingo@340: 
ingo@340:             theme.appendChild(theme.getOwnerDocument().importNode(root, true));
ingo@340:         }
ingo@340:     }
ingo@340: }
ingo@340: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :