source: main/trunk/gli/src/org/greenstone/gatherer/gems/MetadataElementModel.java@ 22772

Last change on this file since 22772 was 12837, checked in by kjdon, 18 years ago

added a doesChildWithThisNameExist method

  • Property svn:keywords set to Author Date Id Revision
File size: 10.3 KB
Line 
1/**
2 *#########################################################################
3 *
4 * A component of the Gatherer application, part of the Greenstone digital
5 * library suite from the New Zealand Digital Library Project at the
6 * University of Waikato, New Zealand.
7 *
8 * <BR><BR>
9 *
10 * Author: Shaoqun Wu, Greenstone Digital Library, University of Waikato
11 *
12 * <BR><BR>
13 *
14 * Copyright (C) 2006 New Zealand Digital Library Project
15 *
16 * <BR><BR>
17 *
18 * This program is free software; you can redistribute it and/or modify
19 * it under the terms of the GNU General Public License as published by
20 * the Free Software Foundation; either version 2 of the License, or
21 * (at your option) any later version.
22 *
23 * <BR><BR>
24 *
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 * GNU General Public License for more details.
29 *
30 * <BR><BR>
31 *
32 * You should have received a copy of the GNU General Public License
33 * along with this program; if not, write to the Free Software
34 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
35 *########################################################################
36 */
37package org.greenstone.gatherer.gems;
38
39import org.greenstone.gatherer.util.XMLTools;
40import org.greenstone.gatherer.Configuration;
41
42import org.w3c.dom.Document;
43import org.w3c.dom.Element;
44import org.w3c.dom.Text;
45import org.w3c.dom.Node;
46
47import java.util.Observable ;
48import java.util.HashMap;
49import java.util.ArrayList;
50import java.util.Iterator;
51
52/**
53 * @author Shaoqun Wu, Greenstone Digital Library, University of Waikato
54 * @version 2.4
55 */
56public class MetadataElementModel
57 extends AttributeContainer
58{
59 private Element metadata_element;
60 private ArrayList children;
61 private MetadataElementModel parent;
62 private static ArrayList listeners = new ArrayList();
63 private MetadataSetInfo metadataSetInfo;
64 private String name;
65 private static int count = 0;
66
67 public MetadataElementModel(){}
68
69 // do we need this one?
70 public MetadataElementModel(MetadataSetInfo info){
71 this(info, null);
72 }
73
74 public MetadataElementModel(MetadataSetInfo info, String new_name){
75 super(null, GEMSConstants.ELEMENT_LANG_DEPEND_ATTR_NAMES);
76 required_attribute_names = GEMSConstants.ELEMENT_REQUIRED_ATTRIBUTES;
77 metadataSetInfo = info;
78 children = new ArrayList();
79 if (new_name != null) {
80 name = new_name;
81 } else {
82 name = GEMSConstants.NEW_ELEMENT+(count++);
83 }
84 // add name in as an attribute - lang independent
85 Attribute attr = new Attribute(GEMSConstants.NAME_ATTRIBUTE, name, true);
86 attributes.add(attr);
87 // also add in a default label attribute
88 attr = getAttributeByNameAndLanguage(GEMSConstants.LABEL_ATTRIBUTE, Configuration.getLanguage());
89 attr.setValue(name);
90
91 }
92
93 public MetadataElementModel(Element metadataElement, MetadataSetInfo info){
94 super(null, null);
95 required_attribute_names = GEMSConstants.ELEMENT_REQUIRED_ATTRIBUTES;
96 language_dependent_attribute_names = GEMSConstants.ELEMENT_LANG_DEPEND_ATTR_NAMES;
97 metadataSetInfo = info;
98 metadata_element = metadataElement;
99
100 children = new ArrayList();
101
102 constructModel(metadata_element);
103
104 ArrayList child_elements =XMLTools.getChildElementsByTagName(metadata_element,GEMSConstants.ELEMENT_ELEMENT);
105
106 for(int i=0;i<child_elements.size();i++){
107 Element element = (Element)child_elements.get(i);
108 MetadataElementModel submodel = new MetadataElementModel(element,metadataSetInfo);
109 submodel.setParent(this);
110 children.add(submodel);
111 }
112 }
113
114 private void constructModel(Element meta_element){
115 name = meta_element.getAttribute(GEMSConstants.NAME_ATTRIBUTE);
116
117 // add name in as an attribute - the only lang independent one
118 Attribute attr = new Attribute(GEMSConstants.NAME_ATTRIBUTE, name, true);
119 attributes.add(attr);
120
121 // common attributes
122 ArrayList attribute_nodes =XMLTools.getChildElementsByTagName(metadata_element,GEMSConstants.ATTRIBUTE_ELEMENT);
123
124 for(int i=0;i< attribute_nodes.size();i++){
125 Element attr_element = (Element)attribute_nodes.get(i);
126 String name = attr_element.getAttribute(GEMSConstants.NAME_ATTRIBUTE).trim();
127
128 String value = XMLTools.getElementTextValue(attr_element);
129 attr = new Attribute(name,value);
130 String lang = attr_element.getAttribute(GEMSConstants.LANGUAGE_ATTRIBUTE);
131 if (lang.equals("")) {
132 // lang independent
133 attr.setRequired(isAttributeRequired(name));
134 attributes.add(attr);
135 } else {
136 attr.setLanguage(lang);
137 attr.setRequired(isLangDependentAttributeRequired(name));
138 language_dependent_attributes.add(attr);
139 }
140 }
141
142 //language specific attribute
143 ArrayList language_elements =XMLTools.getChildElementsByTagName(metadata_element,GEMSConstants.LANGUAGE_ELEMENT);
144
145 for(int i=0;i< language_elements.size();i++){
146 Element language_element = (Element)language_elements.get(i);
147 String lang = language_element.getAttribute(GEMSConstants.CODE_ATTRIBUTE);
148 //Attribute element
149 ArrayList subattributes =XMLTools.getChildElementsByTagName(language_element,GEMSConstants.ATTRIBUTE_ELEMENT);
150
151 for(int j=0;j< subattributes.size();j++){
152 Element attr_element = (Element)subattributes.get(j);
153 String name = attr_element.getAttribute(GEMSConstants.NAME_ATTRIBUTE).trim();
154 String value = XMLTools.getElementTextValue(attr_element);
155 attr = new Attribute(name,value, isLangDependentAttributeRequired(name));
156 attr.setLanguage(lang);
157 language_dependent_attributes.add(attr);
158 }
159
160 }
161
162 }
163
164 public void addMetadataElementListener(MetadataElementListener msl){
165 if (!listeners.contains(msl))
166 listeners.add(msl);
167 }
168
169
170 public void removeMetadataElementListener(MetadataElementListener msl){
171 listeners.remove(msl);
172 }
173
174 public void removeAllMetadataElementListeners(){
175 listeners.clear();
176 }
177
178
179 public boolean doesChildWithThisNameExist(String name) {
180 for (int i=0; i<children.size(); i++) {
181 if (name.equals(((MetadataElementModel)children.get(i)).getName())) {
182 return true;
183 }
184 }
185 return false;
186 }
187
188
189 public Element getMetadataElement(){
190 return metadata_element;
191 }
192
193 public void notifyListeners(boolean isDeleted){
194
195 MetadataElementEvent mee = new MetadataElementEvent(this);
196 if (!isDeleted){
197 mee = new MetadataElementEvent(this);
198 }
199 else{
200 mee = new MetadataElementEvent(null);
201 }
202
203 for(int i=0;i<listeners.size();i++){
204 MetadataElementListener msl = (MetadataElementListener) listeners.get(i);
205 msl.metadataElementChanged(mee);
206 }
207 }
208
209 public ArrayList getChildElements(){
210 return children;
211 }
212
213 public void addChild(MetadataElementModel child){
214 metadataSetInfo.getMetadataSetModel().setChanged(true);
215 child.setParent(this);
216 children.add(child);
217 }
218
219 public void removeChild(MetadataElementModel element_model){
220 metadataSetInfo.getMetadataSetModel().setChanged(true);
221 children.remove(element_model);
222 }
223
224 public String getName(){
225 return name;
226 }
227
228 public void setName(String new_name){
229 metadataSetInfo.getMetadataSetModel().setChanged(true);
230 name = new_name;
231
232 MetadataSetModel metadata_model = metadataSetInfo.getMetadataSetModel();
233 metadata_model.valueChanged();
234 }
235
236 public String getFullName(){
237 if (parent == null){
238 return metadataSetInfo.getNamespace() +"."+name;
239 }
240 else{
241 return parent.getFullName() +"^"+ name;
242 }
243 }
244
245 public void setParent(MetadataElementModel pr){
246 parent = pr;
247 }
248
249 public MetadataElementModel getParent(){
250 return parent;
251 }
252
253
254 public boolean moveUp(MetadataElementModel child){
255 metadataSetInfo.getMetadataSetModel().setChanged(true);
256 int index = children.indexOf(child);
257 if (index-1 >=0){
258 children.remove(child);
259 children.add(index-1,child);
260 return true;
261 }
262 return false;
263 }
264
265 public boolean moveDown(MetadataElementModel child){
266 metadataSetInfo.getMetadataSetModel().setChanged(true);
267 int index = children.indexOf(child);
268 if (index+1 < children.size()){
269 children.remove(child);
270 children.add(index+1,child);
271 return true;
272 }
273
274 return false;
275 }
276
277 public void save(){
278 saveElement();
279
280 for(int i=0;i<children.size();i++){
281 MetadataElementModel model = (MetadataElementModel)children.get(i);
282 model.save();
283 }
284
285 }
286
287
288 private void saveElement(){
289 Document doc = metadataSetInfo.getMetadataSetDocument();
290
291 Node parent_element = null;
292
293 if (parent !=null){
294 parent_element = parent.getMetadataElement();
295 }
296 else{
297 parent_element = doc.getDocumentElement();
298 }
299
300
301 metadata_element = save(doc);
302
303 parent_element.appendChild(metadata_element);
304
305
306 }
307
308
309 private Element save(Document doc){
310
311 metadata_element = doc.createElement(GEMSConstants.ELEMENT_ELEMENT);
312 metadata_element.setAttribute(GEMSConstants.NAME_ATTRIBUTE,name);
313
314 //non language dependent attributes
315 for(int i=0;i<attributes.size();i++){
316 Attribute attr = (Attribute)attributes.get(i);
317 if (attr.getName() == null || attr.getName().trim().equals("")) continue;
318 if (attr.getName().equals("name")) continue;
319 Element attrElement = doc.createElement(GEMSConstants.ATTRIBUTE_ELEMENT);
320 attrElement.setAttribute(GEMSConstants.NAME_ATTRIBUTE,attr.getName());
321 attrElement.appendChild(doc.createTextNode(attr.getValue()));
322 metadata_element.appendChild(attrElement);
323 }
324
325
326 //language dependent attributes
327 ArrayList langs = getAllLanguages();
328 for (int i=0;i<langs.size();i++){
329 String lang = (String)langs.get(i);
330 Element langElement = doc.createElement(GEMSConstants.LANGUAGE_ELEMENT);
331 langElement.setAttribute(GEMSConstants.CODE_ATTRIBUTE,lang);
332 ArrayList langAttrs = getAttributesByLanguage(lang);
333 for (int j=0;j<langAttrs.size();j++){
334 Attribute attr = (Attribute)langAttrs.get(j);
335 Element attrElement = doc.createElement(GEMSConstants.ATTRIBUTE_ELEMENT);
336 attrElement.setAttribute(GEMSConstants.NAME_ATTRIBUTE,attr.getName());
337 attrElement.appendChild(doc.createTextNode(attr.getValue()));
338 langElement.appendChild(attrElement);
339
340 }
341 metadata_element.appendChild(langElement);
342 }
343
344 return metadata_element;
345
346 }
347
348
349
350}
Note: See TracBrowser for help on using the repository browser.