1 package sourceforge.org.qmc2.options.editor.model;
2 
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.List;
6 import java.util.Map;
7 import java.util.Set;
8 
9 import org.w3c.dom.Document;
10 import org.w3c.dom.Element;
11 import org.w3c.dom.Node;
12 import org.w3c.dom.NodeList;
13 
14 public abstract class DescriptableItem {
15 
16 	private final Map<String, Description> descriptionsMap = new HashMap<String, Description>();
17 
18 	private final List<Description> descriptions = new ArrayList<Description>();
19 
20 	private static final String TAG_DESCRIPTION = "description";
21 
22 	protected static final String ATTRIBUTE_NAME = "name";
23 
24 	private static final String ATTRIBUTE_LANG = "lang";
25 
26 	private static final String ATTRIBUTE_TEXT = "text";
27 
28 	private Object parent = null;
29 
30 	private String name;
31 
32 	private int index;
33 
DescriptableItem(String name)34 	public DescriptableItem(String name) {
35 		this.name = name;
36 	}
37 
getName()38 	public String getName() {
39 		return name;
40 	}
41 
getDescription(String language)42 	public String getDescription(String language) {
43 		return descriptionsMap.get(language) != null ? descriptionsMap.get(
44 				language).getDescription() : null;
45 	}
46 
47 	/**
48 	 * Set a description to some language. Set value to null or "" to remove
49 	 *
50 	 * @param language
51 	 *            the language to set the description
52 	 * @param value
53 	 *            the description
54 	 */
setDescription(String language, String value)55 	public void setDescription(String language, String value) {
56 		if (value == null || value.trim().length() == 0) {
57 			descriptionsMap.remove(language);
58 		} else {
59 			Description descr = descriptionsMap.get(language);
60 			if (descr == null) {
61 				descr = new Description(language, null);
62 				descriptionsMap.put(language, descr);
63 				descriptions.add(descr);
64 			}
65 			descr.setDescription(value);
66 		}
67 
68 	}
69 
getLanguages()70 	public Set<String> getLanguages() {
71 		return descriptionsMap.keySet();
72 	}
73 
getParent()74 	public Object getParent() {
75 		return parent;
76 	}
77 
setParent(Object parent)78 	public void setParent(Object parent) {
79 		this.parent = parent;
80 	}
81 
parseDescriptions(Node parentNode)82 	public void parseDescriptions(Node parentNode) {
83 		NodeList children = parentNode.getChildNodes();
84 
85 		for (int i = 0; i < children.getLength(); i++) {
86 			Node node = children.item(i);
87 			if (TAG_DESCRIPTION.equals(node.getNodeName())) {
88 				String language = node.getAttributes()
89 						.getNamedItem(ATTRIBUTE_LANG).getNodeValue();
90 				String text = node.getAttributes().getNamedItem(ATTRIBUTE_TEXT)
91 						.getNodeValue();
92 				Description descr = new Description(language, text);
93 				descriptionsMap.put(language, descr);
94 				descriptions.add(descr);
95 			}
96 		}
97 
98 	}
99 
toXML(Document document)100 	public Element toXML(Document document) {
101 		Element descriptableItem = document.createElement(getTagName());
102 		descriptableItem.setAttribute(ATTRIBUTE_NAME, name);
103 
104 		for (Description description : descriptions) {
105 			if (description.getDescription() != null
106 					&& description.getDescription().trim().length() > 0) {
107 				Element descriptionElement = document
108 						.createElement(TAG_DESCRIPTION);
109 				descriptionElement.setAttribute(ATTRIBUTE_LANG,
110 						description.getLanguage());
111 				descriptionElement.setAttribute(ATTRIBUTE_TEXT,
112 						description.getDescription());
113 				descriptableItem.appendChild(descriptionElement);
114 			}
115 		}
116 
117 		return descriptableItem;
118 	}
119 
getTagName()120 	public abstract String getTagName();
121 
setName(String name)122 	public void setName(String name) {
123 		this.name = name;
124 	}
125 
getIndex()126 	public int getIndex() {
127 		return index;
128 	}
129 
setIndex(int index)130 	public void setIndex(int index) {
131 		this.index = index;
132 	}
133 
134 }
135