source: other-projects/FileTransfer-WebSocketPair/testGXTWithGreenstone/src/org/greenstone/gatherer/gems/MetadataElementModel.java@ 33053

Last change on this file since 33053 was 33053, checked in by ak19, 5 years ago

I still had some stuff of Nathan Kelly's (FileTransfer-WebSocketPair) sitting on my USB. Had already commited the Themes folder at the time, 2 years back. Not sure if he wanted this additional folder commited. But I didn't want to delete it and decided it will be better off on SVN. When we use his project, if we find we didn't need this test folder, we can remove it from svn then.

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.