source: gli/branches/rtl-gli/src/org/greenstone/gatherer/cdm/CollectionConfiguration.java@ 18368

Last change on this file since 18368 was 18352, checked in by kjdon, 15 years ago

updated the rtl-gli branch with files from trunk. Result of a merge 14807:18318

  • Property svn:keywords set to Author Date Id Revision
File size: 207.7 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 * Author: John Thompson, Greenstone Digital Library, University of Waikato
9 *
10 * Copyright (C) 1999 New Zealand Digital Library Project
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 *########################################################################
26 */
27package org.greenstone.gatherer.cdm;
28
29import java.awt.*;
30import java.awt.event.*;
31import java.io.*;
32import java.util.*;
33import javax.swing.*;
34import org.greenstone.gatherer.Configuration;
35import org.greenstone.gatherer.DebugStream;
36import org.greenstone.gatherer.Gatherer;
37import org.greenstone.gatherer.collection.CollectionManager;
38import org.greenstone.gatherer.greenstone.LocalLibraryServer;
39import org.greenstone.gatherer.gui.GLIButton;
40import org.greenstone.gatherer.metadata.MetadataElement;
41import org.greenstone.gatherer.metadata.MetadataSetManager;
42import org.greenstone.gatherer.metadata.MetadataTools;
43import org.greenstone.gatherer.remote.RemoteGreenstoneServer;
44import org.greenstone.gatherer.util.DOMTree;
45import org.greenstone.gatherer.util.Codec;
46import org.greenstone.gatherer.util.StaticStrings;
47import org.greenstone.gatherer.util.XMLTools;
48import org.greenstone.gatherer.util.Utility;
49import org.w3c.dom.*;
50
51/** This class provides access to an xml-type view of the collect.cfg file. This is useful as it allows the manipulation and free form editing of a collect.cfg file while still allowing the various CDM data managers to base themselves directly on this model (whereas they used to be independant ListModels which clobbered the ordering of unparsed commands).
52 * @author John Thompson, Greenstone Digital Library, University of Waikato
53 * @version 2.3d
54 */
55public class CollectionConfiguration {
56 static final private String ENCODING = "UTF-8";
57 static final private String NEWLINE_ELEMENT = "NewLine";
58 static final private String PLUGOUT_ELEMENT = "plugout";//used by building flax collections
59
60 static private Document document;
61 static private StringBuffer saved_collect_cfg_string_buffer = null;
62
63
64 static public Element createElement (String element_name) {
65 return document.createElement (element_name);
66 }
67
68
69 /** Find the best insertion position for the given DOM Element. This should try to match command tag, and if found should then try to group by name or type (eg CollectionMeta), or append to end is no such grouping exists (eg Plugins). Failing a command match it will check against the command order for the best insertion location.
70 * @param target_element the command Element to be inserted
71 * @return the Element which the given command should be inserted before, or null to append to end of list
72 */
73 static public Node findInsertionPoint (Element target_element) {
74 ///ystem.err.println("Find insertion point: " + target_element.getNodeName());
75 String target_element_name = target_element.getNodeName ();
76 Element document_element = document.getDocumentElement ();
77 // Try to find commands with the same tag.
78 NodeList matching_elements = document_element.getElementsByTagName (target_element_name);
79 // If we found matching elements, then we have our most likely insertion location, so check within for groupings
80 if(matching_elements.getLength () != 0) {
81 ///ystem.err.println("Found matching elements.");
82 // Only CollectionMeta are grouped.
83 if(target_element_name.equals (StaticStrings.COLLECTIONMETADATA_ELEMENT)) {
84 ///ystem.err.println("Dealing with collection metadata");
85 // Special case: CollectionMeta can be added at either the start or end of a collection configuration file. However the start position is reserved for special metadata, so if no non-special metadata can be found we must append to the end.
86 // So if the command to be added is special add it immediately after any other special command
87 if(target_element.getAttribute (StaticStrings.SPECIAL_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
88 int index = 0;
89 Element matched_element = (Element) matching_elements.item (index);
90 Element sibling_element = (Element) matched_element.getNextSibling ();
91 while(sibling_element.getAttribute (StaticStrings.SPECIAL_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
92 index++;
93 matched_element = (Element) matching_elements.item (index);
94 sibling_element = (Element) matched_element.getNextSibling ();
95 }
96 if(sibling_element.getNodeName ().equals (NEWLINE_ELEMENT)) {
97 Element newline_element = document.createElement (NEWLINE_ELEMENT);
98 document_element.insertBefore (newline_element, sibling_element);
99 }
100 return sibling_element;
101 }
102 // Otherwise try to find a matching 'name' and add after the last one in that group.
103 else {
104 int index = 0;
105 target_element_name = target_element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
106 boolean found = false;
107 // Skip all of the special metadata
108 Element matched_element = (Element) matching_elements.item (index);
109 while(matched_element.getAttribute (StaticStrings.SPECIAL_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
110 index++;
111 matched_element = (Element) matching_elements.item (index);
112 }
113 // Begin search
114 while(!found && matched_element != null) {
115 if(matched_element.getAttribute (StaticStrings.NAME_ATTRIBUTE).equals (target_element_name)) {
116 found = true;
117 }
118 else {
119 index++;
120 matched_element = (Element) matching_elements.item (index);
121 }
122 }
123 // If we found a match, we need to continue checking until we find the last name match.
124 if(found) {
125 index++;
126 Element previous_sibling = matched_element;
127 Element sibling_element = (Element) matching_elements.item (index);
128 while(sibling_element != null && sibling_element.getAttribute (StaticStrings.NAME_ATTRIBUTE).equals (target_element_name)) {
129 previous_sibling = sibling_element;
130 index++;
131 sibling_element = (Element) matching_elements.item (index);
132 }
133 // Previous sibling now holds the command immediately before where we want to add, so find its next sibling and add to that. In this one case we can ignore new lines!
134 return previous_sibling.getNextSibling ();
135 }
136 // If not found we just add after last metadata element
137 else {
138 Element last_element = (Element) matching_elements.item (matching_elements.getLength () - 1);
139 return last_element.getNextSibling ();
140 }
141 }
142
143 }
144 else {
145 ///ystem.err.println("Not dealing with collection meta.");
146 Element matched_element = (Element) matching_elements.item (matching_elements.getLength () - 1);
147 // One final quick test. If the matched element is immediately followed by a NewLine command, then we insert another NewLine after the matched command, then return the NewLine instead (thus the about to be inserted command will be placed between the two NewLines)
148 Node sibling_element = matched_element.getNextSibling ();
149 if(sibling_element != null && sibling_element.getNodeName ().equals (NEWLINE_ELEMENT)) {
150 Element newline_element = document.createElement (NEWLINE_ELEMENT);
151 document_element.insertBefore (newline_element, sibling_element);
152 }
153 return sibling_element; // Note that this may be null
154 }
155 }
156 ///ystem.err.println("No matching elements found.");
157 // Locate where this command is in the ordering
158 int command_index = -1;
159 for(int i = 0; command_index == -1 && i < COMMAND_ORDER.length; i++) {
160 if(COMMAND_ORDER[i].equals (target_element_name)) {
161 command_index = i;
162 }
163 }
164 ///ystem.err.println("Command index is: " + command_index);
165 // Now move forward, checking for existing elements in each of the preceeding command orders.
166 int preceeding_index = command_index - 1;
167 ///ystem.err.println("Searching before the target command.");
168 while(preceeding_index >= 0) {
169 matching_elements = document_element.getElementsByTagName (COMMAND_ORDER[preceeding_index]);
170 // If we've found a match
171 if(matching_elements.getLength () > 0) {
172 // We add after the last element
173 Element matched_element = (Element) matching_elements.item (matching_elements.getLength () - 1);
174 // One final quick test. If the matched element is immediately followed by a NewLine command, then we insert another NewLine after the matched command, then return the NewLine instead (thus the about to be inserted command will be placed between the two NewLines)
175 Node sibling_element = matched_element.getNextSibling ();
176 if(sibling_element != null && sibling_element.getNodeName ().equals (NEWLINE_ELEMENT)) {
177 Element newline_element = document.createElement (NEWLINE_ELEMENT);
178 document_element.insertBefore (newline_element, sibling_element);
179 }
180 return sibling_element; // Note that this may be null
181 }
182 preceeding_index--;
183 }
184 // If all that fails, we now move backwards through the commands
185 int susceeding_index = command_index + 1;
186 ///ystem.err.println("Searching after the target command.");
187 while(susceeding_index < COMMAND_ORDER.length) {
188 matching_elements = document_element.getElementsByTagName (COMMAND_ORDER[susceeding_index]);
189 // If we've found a match
190 if(matching_elements.getLength () > 0) {
191 // We add before the first element
192 Element matched_element = (Element) matching_elements.item (0);
193 // One final quick test. If the matched element is immediately preceeded by a NewLine command, then we insert another NewLine before the matched command, then return this new NewLine instead (thus the about to be inserted command will be placed between the two NewLines)
194 Node sibling_element = matched_element.getPreviousSibling ();
195 if(sibling_element != null && sibling_element.getNodeName ().equals (NEWLINE_ELEMENT)) {
196 Element newline_element = document.createElement (NEWLINE_ELEMENT);
197 document_element.insertBefore (newline_element, sibling_element);
198 }
199 return sibling_element; // Note that this may be null
200 }
201 susceeding_index++;
202 }
203 // Well. Apparently there are no other commands in this collection configuration. So append away...
204 return null;
205 }
206
207
208 static public NodeList getElementsByTagName (String element_name) {
209 return document.getDocumentElement ().getElementsByTagName (element_name);
210 }
211
212
213 static public String toString (Element command_element, boolean show_extracted_namespace) {
214 String command_element_name = command_element.getNodeName ();
215 if(command_element_name.equals (StaticStrings.CLASSIFY_ELEMENT)) {
216 return classifyToString (command_element, show_extracted_namespace);
217 }
218 else if(command_element_name.equals (StaticStrings.FORMAT_ELEMENT)) {
219 return formatToString (command_element, show_extracted_namespace);
220 }
221 else if(command_element_name.equals (StaticStrings.INDEXES_ELEMENT)) {
222 return indexesToString (command_element, show_extracted_namespace);
223 }
224 else if(command_element_name.equals (StaticStrings.INDEX_DEFAULT_ELEMENT)) {
225 return indexDefaultToString (command_element, show_extracted_namespace);
226 }
227 else if(command_element_name.equals (StaticStrings.LANGUAGES_ELEMENT)) {
228 return languagesToString (command_element);
229 }
230 else if(command_element_name.equals (StaticStrings.LANGUAGE_DEFAULT_ELEMENT)) {
231 return languageDefaultToString (command_element);
232 }
233 else if (command_element_name.equals (StaticStrings.LANGUAGE_METADATA_ELEMENT)) {
234 return languageMetadataToString (command_element, show_extracted_namespace);
235 }
236 else if(command_element_name.equals (StaticStrings.INDEXOPTIONS_ELEMENT)) {
237 return indexOptionsToString (command_element);
238 }
239 else if(command_element_name.equals (StaticStrings.INDEXOPTION_DEFAULT_ELEMENT)) {
240 return indexOptionDefaultToString (command_element);
241 }
242 else if(command_element_name.equals (StaticStrings.COLLECTIONMETADATA_ELEMENT)) {
243 return metadataToString (command_element, show_extracted_namespace);
244 }
245 else if(command_element_name.equals (StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT)) {
246 return metadataToString (command_element, show_extracted_namespace);
247 }
248 else if(command_element_name.equals (StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT)) {
249 return metadataToString (command_element, show_extracted_namespace);
250 }
251 else if(command_element_name.equals (StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT)) {
252 return metadataToString (command_element, show_extracted_namespace);
253 }
254 else if (command_element_name.equals (StaticStrings.BUILDTYPE_ELEMENT)) {
255 return metadataToString (command_element, show_extracted_namespace);
256 }
257 else if(command_element_name.equals (StaticStrings.PLUGIN_ELEMENT)) {
258 return pluginToString (command_element, show_extracted_namespace);
259 }
260 else if(command_element_name.equals (StaticStrings.SUBCOLLECTION_ELEMENT)) {
261 return subcollectionToString (command_element, show_extracted_namespace);
262 }
263 else if(command_element_name.equals (StaticStrings.SUBCOLLECTION_DEFAULT_INDEX_ELEMENT)) {
264 return subcollectionDefaultIndexToString (command_element);
265 }
266 else if(command_element_name.equals (StaticStrings.SUBCOLLECTION_INDEXES_ELEMENT)) {
267 return subcollectionIndexesToString (command_element);
268 }
269 else if(command_element_name.equals (StaticStrings.SUPERCOLLECTION_ELEMENT)) {
270 return supercollectionToString (command_element);
271 }
272 else if(command_element_name.equals (StaticStrings.UNKNOWN_ELEMENT)) {
273 return unknownToString (command_element);
274 }
275 return "";
276 }
277
278 /** Parses arguments from a tokenizer and returns a HashMap of mappings. The tricky bit here is that not all entries in the HashMap are name->value pairs, as some arguments are boolean and are turned on by their presence. Arguments are denoted by a '-' prefix.
279 * @param tokenizer a CommandTokenizer based on the unconsumed portion of a command string
280 * @return a HashMap containing the arguments parsed
281 */
282 static public HashMap parseArguments (CommandTokenizer tokenizer) {
283 HashMap arguments = new HashMap ();
284 String name = null;
285 String value = null;
286 while(tokenizer.hasMoreTokens () || name != null) {
287 // First we retrieve a name if we need one.
288 if(name == null) {
289 name = tokenizer.nextToken ();
290 }
291 // Now we attempt to retrieve a value
292 if(tokenizer.hasMoreTokens ()) {
293 value = tokenizer.nextToken ();
294 // Test if the value is actually a name, and if so add the name by itself, then put value into name so that it is parsed correctly during the next loop.
295 // The value is not a name if it contains a space character: it's a quoted value
296 if (value.startsWith(StaticStrings.MINUS_CHARACTER) && value.indexOf(StaticStrings.SPACE_CHARACTER) == -1) {
297 arguments.put (name, null);
298 name = value;
299 }
300 // Otherwise we have a typical name->value pair ready to go
301 else {
302 arguments.put (name, value);
303 name = null;
304 }
305 }
306 // Otherwise its a binary flag
307 else {
308 arguments.put (name, null);
309 name = null;
310 }
311 }
312 return arguments;
313 }
314
315 /** Gives the preferred ordering of commands */
316 static final private String[] COMMAND_ORDER =
317 {StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT, StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT, StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT, StaticStrings.BUILDTYPE_ELEMENT, StaticStrings.PLUGIN_ELEMENT, StaticStrings.INDEXES_ELEMENT, StaticStrings.INDEX_DEFAULT_ELEMENT, StaticStrings.INDEXOPTIONS_ELEMENT, StaticStrings.INDEXOPTION_DEFAULT_ELEMENT, StaticStrings.LANGUAGES_ELEMENT, StaticStrings.LANGUAGE_DEFAULT_ELEMENT, StaticStrings.LANGUAGE_METADATA_ELEMENT, StaticStrings.SUBCOLLECTION_ELEMENT, StaticStrings.SUBCOLLECTION_INDEXES_ELEMENT, StaticStrings.SUBCOLLECTION_DEFAULT_INDEX_ELEMENT, StaticStrings.SUPERCOLLECTION_ELEMENT, StaticStrings.CLASSIFY_ELEMENT, StaticStrings.FORMAT_ELEMENT, StaticStrings.COLLECTIONMETADATA_ELEMENT};
318
319 /** ************************** Public Data Members ***************************/
320
321 /** ************************** Private Data Members ***************************/
322
323 private File collect_cfg_file;
324
325 /** ************************** Public Methods ***************************/
326
327
328 /** This debug facility shows the currently loaded collect.cfg or CollectConfig.xml file as a DOM tree. */
329 public void display () {
330 JDialog dialog = new JDialog (Gatherer.g_man, "Collection Configuration", false);
331 dialog.setSize (400,400);
332 JPanel content_pane = (JPanel) dialog.getContentPane ();
333 final DOMTree tree = new DOMTree (document);
334 JButton refresh_button = new GLIButton ("Refresh Tree");
335 refresh_button.addActionListener (new ActionListener () {
336 public void actionPerformed (ActionEvent event) {
337 tree.setDocument (document);
338 }
339 });
340 content_pane.setBorder (BorderFactory.createEmptyBorder (5,5,5,5));
341 content_pane.setLayout (new BorderLayout ());
342 content_pane.add (new JScrollPane (tree), BorderLayout.CENTER);
343 content_pane.add (refresh_button, BorderLayout.SOUTH);
344 dialog.setVisible (true);
345 }
346
347
348 public Element getCreator () {
349 Element element = getOrCreateElementByTagName (StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT, null, null);
350 element.setAttribute (StaticStrings.NAME_ATTRIBUTE, StaticStrings.COLLECTIONMETADATA_CREATOR_STR);
351 element.setAttribute (StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR);
352 return element;
353 }
354
355 public Element getDocumentElement () {
356 return document.getDocumentElement ();
357 }
358
359 public File getFile () {
360 return collect_cfg_file;
361 }
362
363 /** Retrieve or create the languages Element. */
364 public Element getLanguages () {
365 return getOrCreateElementByTagName (StaticStrings.LANGUAGES_ELEMENT, null, null);
366 }
367
368 public Element getLanguageMetadata () {
369 return getOrCreateElementByTagName (StaticStrings.LANGUAGE_METADATA_ELEMENT, null, null);
370 }
371
372 public Element getLevels () {
373 return getOrCreateElementByTagName (StaticStrings.INDEXOPTIONS_ELEMENT, StaticStrings.NAME_ATTRIBUTE, StaticStrings.LEVELS_STR);
374 }
375
376 public Element getLevelDefault () {
377 return getOrCreateElementByTagName (StaticStrings.INDEXOPTION_DEFAULT_ELEMENT, StaticStrings.NAME_ATTRIBUTE, StaticStrings.LEVEL_DEFAULT_STR);
378 }
379
380 public Element getStemOptions () {
381 return getOrCreateElementByTagName (StaticStrings.INDEXOPTIONS_ELEMENT, StaticStrings.NAME_ATTRIBUTE, StaticStrings.STEMOPTIONS_STR);
382 }
383
384
385 public Element getMaintainer () {
386 Element element = getOrCreateElementByTagName (StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT, null, null);
387 element.setAttribute (StaticStrings.NAME_ATTRIBUTE, StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR);
388 element.setAttribute (StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR);
389 return element;
390 }
391
392 /** Retrieve or create the indexes Element. Note that this method behaves differently from the other getBlah methods, in that it also has to keep in mind that indexes come in two flavours, MG and MGPP. */
393 public Element getMGIndexes () {
394 return getOrCreateElementByTagName (StaticStrings.INDEXES_ELEMENT, StaticStrings.MGPP_ATTRIBUTE, StaticStrings.FALSE_STR);
395 }
396
397 public Element getMGPPIndexes () {
398 return getOrCreateElementByTagName (StaticStrings.INDEXES_ELEMENT, StaticStrings.MGPP_ATTRIBUTE, StaticStrings.TRUE_STR);
399 }
400
401 public Element getPublic () {
402 Element element = getOrCreateElementByTagName (StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT, null, null);
403 element.setAttribute (StaticStrings.NAME_ATTRIBUTE, StaticStrings.COLLECTIONMETADATA_PUBLIC_STR);
404 element.setAttribute (StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR);
405 return element;
406 }
407
408 public Element getBuildType () {
409 Element element = getOrCreateElementByTagName (StaticStrings.BUILDTYPE_ELEMENT, null, null);
410 element.setAttribute (StaticStrings.NAME_ATTRIBUTE, StaticStrings.BUILDTYPE_STR);
411 element.setAttribute (StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR);
412 return element;
413
414 }
415
416 /** Retrieve or create the subindexes Element. */
417 public Element getSubIndexes () {
418 return getOrCreateElementByTagName (StaticStrings.SUBCOLLECTION_INDEXES_ELEMENT, null, null);
419 }
420
421 /** Retrieve or create the supercollections Element. */
422 public Element getSuperCollection () {
423 return getOrCreateElementByTagName (StaticStrings.SUPERCOLLECTION_ELEMENT, null, null);
424 }
425
426 public boolean ready () {
427 return document != null;
428 }
429
430
431
432
433 /** ************************** Private Methods ***************************/
434
435 static private String classifyToString (Element command_element, boolean show_extracted_namespace) {
436 StringBuffer text = new StringBuffer (StaticStrings.CLASSIFY_STR);
437 text.append (StaticStrings.TAB_CHARACTER);
438 text.append (command_element.getAttribute (StaticStrings.TYPE_ATTRIBUTE));
439 NodeList option_elements = command_element.getElementsByTagName (StaticStrings.OPTION_ELEMENT);
440 int option_elements_length = option_elements.getLength ();
441 for(int j = 0; j < option_elements_length; j++) {
442 Element option_element = (Element) option_elements.item (j);
443 if(option_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
444 text.append (StaticStrings.SPACE_CHARACTER);
445 text.append (StaticStrings.MINUS_CHARACTER);
446 text.append (option_element.getAttribute (StaticStrings.NAME_ATTRIBUTE));
447 String value_str = XMLTools.getValue (option_element);
448
449 // Convert metadata element names to internal names, and remove extracted metadata namespaces
450 if (value_str.length () > 0) {
451 StringTokenizer string_tokenizer = new StringTokenizer (value_str, ",");
452 StringBuffer value_buffer = new StringBuffer ();
453 while (string_tokenizer.hasMoreElements ()) {
454 String raw_token = (String) string_tokenizer.nextElement ();
455 String token = raw_token.trim ();
456 MetadataElement metadata_element = MetadataTools.getMetadataElementWithDisplayName (token);
457 if (metadata_element != null) {
458 token = metadata_element.getFullName ();
459 }
460
461 if (token.startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
462 token = token.substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
463 }
464 value_buffer.append (token);
465 if (string_tokenizer.hasMoreElements ()) {
466 value_buffer.append (",");
467 }
468 }
469 value_str = value_buffer.toString ();
470 }
471
472 text.append (StaticStrings.SPACE_CHARACTER);
473 if (value_str.indexOf (StaticStrings.SPACE_CHARACTER) == -1) {
474 text.append (value_str);
475 }
476 else {
477 text.append (StaticStrings.SPEECH_CHARACTER);
478 text.append (value_str);
479 text.append (StaticStrings.SPEECH_CHARACTER);
480 }
481 value_str = null;
482 }
483 option_element = null;
484 }
485 option_elements = null;
486 return text.toString ();
487 }
488
489 static private String formatToString (Element command_element, boolean show_extracted_namespace) {
490 StringBuffer text = new StringBuffer (StaticStrings.FORMAT_STR);
491 text.append (StaticStrings.SPACE_CHARACTER);
492 text.append (command_element.getAttribute (StaticStrings.NAME_ATTRIBUTE));
493 text.append (StaticStrings.SPACE_CHARACTER);
494 String value_str = command_element.getAttribute (StaticStrings.VALUE_ATTRIBUTE);
495 if(value_str.length () != 0) {
496 text.append (value_str);
497 }
498 else {
499 // Remember to encode format string to Greenstone specification
500 value_str = Codec.transform (XMLTools.getValue (command_element), Codec.DOM_TO_GREENSTONE);
501 // Remove any references to a namespace for extracted metadata
502 if (!show_extracted_namespace) {
503 String match_string = "\\[" + MetadataSetManager.EXTRACTED_METADATA_NAMESPACE + "\\.";
504 value_str = value_str.replaceAll (match_string, "[");
505 }
506
507 text.append (StaticStrings.SPEECH_CHARACTER);
508 text.append (value_str);
509 text.append (StaticStrings.SPEECH_CHARACTER);
510 }
511 value_str = null;
512 return text.toString ();
513 }
514
515 /** Retrieve or create the indexes Element. */
516 static private Element getOrCreateElementByTagName (String name, String conditional_attribute, String required_value) {
517 Element document_element = document.getDocumentElement ();
518 NodeList elements = document_element.getElementsByTagName (name);
519 int elements_length = elements.getLength ();
520 if(elements_length > 0) {
521 if(conditional_attribute == null) {
522 document_element = null;
523 return (Element) elements.item (0);
524 }
525 else {
526 for(int i = 0; i < elements_length; i++) {
527 Element element = (Element) elements.item (i);
528 if(element.getAttribute (conditional_attribute).equals (required_value)) {
529 document_element = null;
530 return element;
531 }
532 element = null;
533 }
534 }
535 }
536 // Create the element
537 Element element = document.createElement (name);
538 // If there was a property set it
539 if(conditional_attribute != null) {
540 element.setAttribute (conditional_attribute, required_value);
541 }
542 Node target_node = findInsertionPoint (element);
543 if(target_node != null) {
544 document_element.insertBefore (element, target_node);
545 }
546 else {
547 document_element.appendChild (element);
548 }
549 document_element = null;
550 return element;
551 }
552
553 static private String indexesToString (Element command_element, boolean show_extracted_namespace) {
554 boolean comment_only = false;
555 StringBuffer text = new StringBuffer ("");
556 if(command_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
557 text.append ("#");
558 comment_only = true;
559 }
560 text.append (StaticStrings.INDEX_STR);
561 text.append (StaticStrings.TAB_CHARACTER);
562 if(!comment_only) {
563 text.append (StaticStrings.TAB_CHARACTER);
564 }
565 NodeList index_elements = command_element.getElementsByTagName (StaticStrings.INDEX_ELEMENT);
566 if (index_elements.getLength () == 0) { // no indexes
567 return "";
568 }
569 // For each index, write its level, a colon, then concatenate its child content elements into a single comma separated list
570 int index_elements_length = index_elements.getLength ();
571 for(int j = 0; j < index_elements_length; j++) {
572 Element index_element = (Element) index_elements.item (j);
573 String level_str = index_element.getAttribute (StaticStrings.LEVEL_ATTRIBUTE);
574 if(level_str.length () > 0) {
575 text.append (level_str);
576 text.append (StaticStrings.COLON_CHARACTER);
577 }
578 NodeList content_elements = index_element.getElementsByTagName (StaticStrings.CONTENT_ELEMENT);
579 int content_elements_length = content_elements.getLength ();
580 // Don't output anything if no indexes are set
581 if(content_elements_length == 0) {
582 return null;
583 }
584 for(int k = 0; k < content_elements_length; k++) {
585 Element content_element = (Element) content_elements.item (k);
586 String name_str = content_element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
587 if(!show_extracted_namespace && name_str.startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
588 name_str = name_str.substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
589 }
590 text.append (name_str);
591 name_str = null;
592 if(k < content_elements_length - 1) {
593 text.append (StaticStrings.COMMA_CHARACTER);
594 }
595 content_element = null;
596 }
597 if(j < index_elements_length - 1) {
598 text.append (StaticStrings.SPACE_CHARACTER);
599 }
600 content_elements = null;
601 index_element = null;
602 }
603 index_elements = null;
604 return text.toString ();
605 }
606
607 static private String indexDefaultToString (Element command_element, boolean show_extracted_namespace) {
608 StringBuffer text = new StringBuffer ("");
609 if(command_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
610 text.append ("#");
611 }
612 text.append (StaticStrings.INDEX_DEFAULT_STR);
613 text.append (StaticStrings.TAB_CHARACTER);
614 if (!command_element.getAttribute (StaticStrings.LEVEL_ATTRIBUTE).equals ("")) {
615 text.append (command_element.getAttribute (StaticStrings.LEVEL_ATTRIBUTE));
616 text.append (StaticStrings.COLON_CHARACTER);
617 }
618 NodeList content_elements = command_element.getElementsByTagName (StaticStrings.CONTENT_ELEMENT);
619 int content_elements_length = content_elements.getLength ();
620 for(int j = 0; j < content_elements_length; j++) {
621 Element content_element = (Element) content_elements.item (j);
622 String name_str = content_element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
623 if(!show_extracted_namespace && name_str.startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
624 name_str = name_str.substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
625 }
626 text.append (name_str);
627 name_str = null;
628 if(j < content_elements_length - 1) {
629 text.append (StaticStrings.COMMA_CHARACTER);
630 }
631 content_element = null;
632 }
633 content_elements = null;
634 return text.toString ();
635 }
636
637 static private String languagesToString (Element command_element) {
638 StringBuffer text = new StringBuffer (StaticStrings.LANGUAGES_STR);
639 text.append (StaticStrings.TAB_CHARACTER);
640 // Retrieve all the languages and write them out in a space separated list
641 NodeList language_elements = command_element.getElementsByTagName (StaticStrings.LANGUAGE_ELEMENT);
642 int language_elements_length = language_elements.getLength ();
643 if(language_elements_length == 0) {
644 return null;
645 }
646 for(int j = 0; j < language_elements_length; j++) {
647 Element language_element = (Element) language_elements.item (j);
648 text.append (language_element.getAttribute (StaticStrings.NAME_ATTRIBUTE));
649 if(j < language_elements_length - 1) {
650 text.append (StaticStrings.SPACE_CHARACTER);
651 }
652 }
653 return text.toString ();
654 }
655
656 static private String languageDefaultToString (Element command_element) {
657 StringBuffer text = new StringBuffer (StaticStrings.LANGUAGE_DEFAULT_STR);
658 text.append (StaticStrings.TAB_CHARACTER);
659 text.append (command_element.getAttribute (StaticStrings.NAME_ATTRIBUTE));
660 return text.toString ();
661 }
662
663 static private String languageMetadataToString (Element command_element, boolean show_extracted_namespace) {
664 if (!command_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
665 return "";
666 }
667 StringBuffer text = new StringBuffer (StaticStrings.LANGUAGE_METADATA_STR);
668 text.append (StaticStrings.TAB_CHARACTER);
669 String name_str = command_element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
670 if(!show_extracted_namespace && name_str.startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
671 name_str = name_str.substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
672 }
673 text.append (name_str);
674 return text.toString ();
675 }
676
677 static private String indexOptionsToString (Element command_element) {
678 StringBuffer text = new StringBuffer ("");
679 if(command_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
680 text.append ("#");
681 }
682 text.append (command_element.getAttribute (StaticStrings.NAME_ATTRIBUTE));
683 text.append (StaticStrings.TAB_CHARACTER);
684 NodeList content_elements = command_element.getElementsByTagName (StaticStrings.INDEXOPTION_ELEMENT);
685 int content_elements_length = content_elements.getLength ();
686 // Don't output anything if no options are set.
687 if(content_elements_length == 0) {
688 return null;
689 }
690 for(int i = 0; i < content_elements_length; i++) {
691 Element content_element = (Element) content_elements.item (i);
692 text.append (content_element.getAttribute (StaticStrings.NAME_ATTRIBUTE));
693 text.append (StaticStrings.SPACE_CHARACTER);
694 }
695 return text.substring (0, text.length () - 1);
696 }
697
698 static private String indexOptionDefaultToString (Element command_element) {
699 // Don't bother if there is no value
700 if (command_element.getAttribute (StaticStrings.VALUE_ATTRIBUTE).equals ("")) {
701 return "";
702 }
703 StringBuffer text = new StringBuffer ("");
704 if(command_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
705 text.append ("#");
706 }
707 text.append (command_element.getAttribute (StaticStrings.NAME_ATTRIBUTE));
708 text.append (StaticStrings.TAB_CHARACTER);
709 text.append (command_element.getAttribute (StaticStrings.VALUE_ATTRIBUTE));
710 return text.toString ();
711 }
712
713 static private String metadataToString (Element command_element, boolean text_value) {
714 // lets first check the value - if its empty, don't bother sticking it in the config file
715 String value_str = XMLTools.getValue (command_element);
716 if (value_str.equals ("")) {
717 return "";
718 }
719 boolean special = false;
720
721 StringBuffer text = new StringBuffer ("");
722 String name_str = command_element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
723 // If the name is one of the special four, we don't write the collectionmeta first. Note maintainer and buildtype are singled out for 'prittying' reasons.
724 if(name_str.equals (StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR)|| name_str.equals (StaticStrings.BUILDTYPE_STR) ) {
725 text.append (name_str);
726 text.append (StaticStrings.TAB_CHARACTER);
727 special = true;
728 }
729 else if (name_str.equals (StaticStrings.COLLECTIONMETADATA_CREATOR_STR) || name_str.equals (StaticStrings.COLLECTIONMETADATA_PUBLIC_STR) ) {
730 text.append (name_str);
731 text.append (StaticStrings.TAB_CHARACTER);
732 text.append (StaticStrings.TAB_CHARACTER);
733 special = true;
734 }
735 else {
736 text.append (StaticStrings.COLLECTIONMETADATA_STR);
737 text.append (StaticStrings.TAB_CHARACTER);
738 text.append (name_str);
739 text.append (StaticStrings.SPACE_CHARACTER);
740 String language_str = command_element.getAttribute (StaticStrings.LANGUAGE_ATTRIBUTE);
741 text.append (StaticStrings.LBRACKET_CHARACTER);
742 text.append (StaticStrings.LANGUAGE_ARGUMENT);
743 text.append (language_str);
744 text.append (StaticStrings.RBRACKET_CHARACTER);
745 text.append (StaticStrings.SPACE_CHARACTER);
746 }
747 name_str = null;
748
749 // The value string we retrieved will be encoded for xml, so we now decode it - to text if text_value set. This parameter was originally show_extracted_namespace, but sincethis is only true for 'toString()' commands from within the CDM, its good enough to determine if this toString() will be used to display on screen, or write to collect.cfg
750 if(text_value == CollectionMeta.TEXT) {
751 value_str = Codec.transform (value_str, Codec.DOM_TO_TEXT);
752 }
753 else {
754 value_str = Codec.transform (value_str, Codec.DOM_TO_GREENSTONE);
755 }
756
757 // We don't wrap the email addresses in quotes, nor the other special metadata
758 if(special) {
759 text.append (value_str);
760 }
761 else {
762 text.append (StaticStrings.SPEECH_CHARACTER);
763 text.append (value_str);
764 text.append (StaticStrings.SPEECH_CHARACTER);
765 }
766 value_str = null;
767 return text.toString ();
768 }
769
770 /** Parse a collect.cfg into a DOM model representation.
771 * note we are ignoring 2.39 compatibility now. */
772 private void parse (File collect_cfg_file) {
773 // hack for pre 2.71 compatibility - we need to add in a
774 // build type if there is not one there
775 boolean search_types_parsed = false;
776 boolean build_types_parsed = false;
777 try {
778 saved_collect_cfg_string_buffer = new StringBuffer ();
779
780 Element collect_cfg_element = document.getDocumentElement ();
781 // Read in the file one command at a time.
782 InputStream istream = new FileInputStream (collect_cfg_file);
783 Reader in_reader = new InputStreamReader (istream, ENCODING);
784 BufferedReader in = new BufferedReader (in_reader);
785 String command_str = null;
786 while((command_str = in.readLine ()) != null) {
787 saved_collect_cfg_string_buffer.append (command_str + "\n");
788
789 boolean append_element = true;
790 Element command_element = null;
791 // A command may be broken over several lines.
792 command_str = command_str.trim ();
793 boolean eof = false;
794 while(!eof && command_str.endsWith (StaticStrings.NEWLINE_CHARACTER)) {
795 String next_line = in.readLine ();
796 if(next_line != null) {
797 next_line = next_line.trim ();
798 if(next_line.length () > 0) {
799 // Remove the new line character
800 command_str = command_str.substring (0, command_str.lastIndexOf (StaticStrings.NEWLINE_CHARACTER));
801 // And append the next line, which due to the test above must be non-zero length
802 command_str = command_str + next_line;
803 }
804 next_line = null;
805 }
806 // If we've reached the end of the file theres nothing more we can do
807 else {
808 eof = true;
809 }
810 }
811 // If there is still a new line character, then we remove it and hope for the best
812 if(command_str.endsWith (StaticStrings.NEWLINE_CHARACTER)) {
813 command_str = command_str.substring (0, command_str.lastIndexOf (StaticStrings.NEWLINE_CHARACTER));
814 }
815 // Now we've either got a command to parse...
816 if(command_str.length () != 0) {
817 // Start trying to figure out what it is
818 //StringTokenizer tokenizer = new StringTokenizer(command_str);
819 // Instead of a standard string tokenizer I'm going to use the new version of CommandTokenizer, which is not only smart enough to correctly notice speech marks and correctly parse them out, but now also takes the input stream so it can rebuild tokens that stretch over several lines.
820 CommandTokenizer tokenizer = new CommandTokenizer (command_str, in);
821 String command_type = tokenizer.nextToken ().toLowerCase ();
822 // Why can't you switch on strings eh? We pass it to the various subparsers who each have a bash at parsing the command. If none can parse the command, an unknown element is created
823 if(command_element == null && command_type.equals (StaticStrings.CLASSIFY_STR)) {
824 command_element = parseClassify (command_str);
825 }
826 if(command_element == null && command_type.equals (StaticStrings.FORMAT_STR)) {
827 command_element = parseFormat (tokenizer); // Revised to handle multiple lines
828 }
829 if(command_element == null && (command_type.equals (StaticStrings.INDEX_STR) || command_type.equals (StaticStrings.COMMENTED_INDEXES_STR))) {
830 command_element = parseIndex (command_str);
831 }
832 if(command_element == null && (command_type.equals (StaticStrings.INDEX_DEFAULT_STR) || command_type.equals (StaticStrings.COMMENTED_INDEX_DEFAULT_STR))) {
833
834 command_element = parseIndexDefault (command_str);
835 }
836 if(command_element == null && command_type.equals (StaticStrings.LANGUAGES_STR)) {
837 command_element = parseLanguage (command_str);
838 }
839 if(command_element == null && command_type.equals (StaticStrings.LANGUAGE_DEFAULT_STR)) {
840 command_element = parseLanguageDefault (command_str);
841 }
842 if (command_element == null && command_type.equals (StaticStrings.LANGUAGE_METADATA_STR)) {
843 command_element = parseLanguageMetadata (command_str);
844 }
845 if(command_element == null && command_type.equals (StaticStrings.LEVELS_STR)) {
846 command_element = parseIndexOptions (command_str, StaticStrings.LEVELS_STR, true);
847 }
848 if (command_element == null && command_type.equals (StaticStrings.COMMENTED_LEVELS_STR)) {
849 command_element = parseIndexOptions (command_str, StaticStrings.LEVELS_STR, false);
850 }
851 if(command_element == null && command_type.equals (StaticStrings.LEVEL_DEFAULT_STR)) {
852 command_element = parseIndexOptionDefault (command_str, StaticStrings.LEVEL_DEFAULT_STR, true);
853 }
854 if(command_element == null && command_type.equals (StaticStrings.COMMENTED_LEVEL_DEFAULT_STR)) {
855 command_element = parseIndexOptionDefault (command_str, StaticStrings.LEVEL_DEFAULT_STR, false);
856 }
857 if (command_element == null && command_type.equals (StaticStrings.STEMOPTIONS_STR)) {
858 command_element = parseIndexOptions (command_str, StaticStrings.STEMOPTIONS_STR, true);
859 }
860 if (command_element == null && command_type.equals (StaticStrings.COMMENTED_STEMOPTIONS_STR)) {
861 command_element = parseIndexOptions (command_str, StaticStrings.STEMOPTIONS_STR, false);
862 }
863 if(command_element == null && command_type.equals (StaticStrings.COLLECTIONMETADATA_STR)) {
864 command_element = parseMetadata (tokenizer); // Revised to handle multiple lines
865 }
866 if(command_element == null && (command_type.equals (StaticStrings.COLLECTIONMETADATA_PUBLIC_STR) || command_type.equals (StaticStrings.COLLECTIONMETADATA_CREATOR_STR) || command_type.equals (StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR) || command_type.equals (StaticStrings.BUILDTYPE_STR))) {
867 command_element = parseMetadataSpecial (command_str);
868 // pre 2.71 hack
869 if (command_type.equals (StaticStrings.BUILDTYPE_STR)) {
870 build_types_parsed = true;
871 }
872 }
873 if(command_element == null && command_type.equals (StaticStrings.PLUGIN_STR)) {
874 command_element = parsePlugin (command_str);
875 }
876 // leave here for backwards compatibility
877 if(command_element == null && command_type.equals (StaticStrings.SEARCHTYPE_STR)) {
878 command_element = parseSearchType (command_str);
879 // pre 2.71 hack
880 search_types_parsed = true;
881
882 }
883 if(command_element == null && command_type.equals (StaticStrings.SUBCOLLECTION_STR)) {
884 command_element = parseSubCollection (command_str);
885 }
886 if(command_element == null && command_type.equals (StaticStrings.SUBCOLLECTION_DEFAULT_INDEX_STR)) {
887 command_element = parseSubCollectionDefaultIndex (command_str);
888 }
889 if(command_element == null && command_type.equals (StaticStrings.SUBCOLLECTION_INDEX_STR)) {
890 command_element = parseSubCollectionIndex (command_str);
891 }
892 if(command_element == null && (command_type.equals (StaticStrings.SUPERCOLLECTION_STR) || command_type.equals (StaticStrings.CCS_STR))) {
893 command_element = parseSuperCollection (command_str);
894 }
895 // Doesn't match any known type
896 command_type = null;
897 if(command_element == null) {
898 // No-one knows what to do with this command, so we create an Unknown command element
899 command_element = document.createElement (StaticStrings.UNKNOWN_ELEMENT);
900 XMLTools.setValue (command_element, command_str);
901 }
902 }
903 // Or an empty line to remember for later
904 else {
905 command_element = document.createElement (NEWLINE_ELEMENT);
906 }
907 // Now command element shouldn't be null so we append it to the collection config DOM, but only if we haven't been told not to add it
908 //if(append_element) {
909 collect_cfg_element.appendChild (command_element);
910 //}
911 }
912 if (!build_types_parsed) {
913 String buildtype_type = BuildTypeManager.BUILD_TYPE_MG;
914 if (search_types_parsed) {
915 buildtype_type = BuildTypeManager.BUILD_TYPE_MGPP;
916 }
917 Element command_element = parseMetadataSpecial (StaticStrings.BUILDTYPE_STR+" "+buildtype_type);
918 Node target_node = findInsertionPoint (command_element);
919 if(target_node != null) {
920 collect_cfg_element.insertBefore (command_element, target_node);
921 }
922 else {
923 collect_cfg_element.appendChild (command_element);
924 }
925
926 }
927 }
928 catch(Exception exception) {
929 DebugStream.println ("Error in CollectionConfiguration.parse(java.io.File): " + exception);
930 DebugStream.printStackTrace (exception);
931 }
932 }
933
934
935 private Element parseClassify (String command_str) {
936 Element command_element = null;
937 try {
938 CommandTokenizer tokenizer = new CommandTokenizer (command_str);
939 // Check the token count. The token count from a command tokenizer isn't guarenteed to be correct, but it does give the maximum number of available tokens according to the underlying StringTokenizer (some of which may actually be append together by the CommandTokenizer as being a single argument).
940 if(tokenizer.countTokens () >= 2) { // Must support "classify Phind" (no args)
941 command_element = document.createElement (StaticStrings.CLASSIFY_ELEMENT);
942 // First token is classify
943 tokenizer.nextToken ();
944 // The next token is the classifier type
945 command_element.setAttribute (StaticStrings.TYPE_ATTRIBUTE, tokenizer.nextToken ());
946 // Now we parse out the remaining arguments into a hashmapping from name to value
947 HashMap arguments = parseArguments (tokenizer);
948 // Assign the arguments as Option elements, but watch out for the metadata argument as we treat that differently
949 Iterator names = arguments.keySet ().iterator ();
950 while(names.hasNext ()) {
951 String name = (String) names.next ();
952 String value = (String) arguments.get (name); // Can be null
953 // The metadata argument gets added as the content attribute
954 if (name.equals (StaticStrings.METADATA_ARGUMENT) && value != null) {
955 // Add the extracted namespace onto un-namespaced metadata names
956 StringTokenizer string_tokenizer = new StringTokenizer (value, ",");
957 value = "";
958 while (string_tokenizer.hasMoreElements ()) {
959 String token = (String) string_tokenizer.nextElement ();
960
961 if (token.indexOf (StaticStrings.NS_SEP) == -1) {
962 token = StaticStrings.EXTRACTED_NAMESPACE + token;
963 }
964 else {
965 MetadataElement metadata_element = MetadataTools.getMetadataElementWithName (token);
966 if (metadata_element != null) {
967 token = metadata_element.getDisplayName ();
968 }
969 }
970
971 if (!value.equals ("")) {
972 value = value + ",";
973 }
974 value = value + token;
975 }
976 }
977 // Everything else is an Option Element
978 Element option_element = document.createElement (StaticStrings.OPTION_ELEMENT);
979 option_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name.substring (1));
980 if(value != null) {
981 // Remove any speech marks appended in strings containing whitespace
982 if(value.startsWith (StaticStrings.SPEECH_CHARACTER) && value.endsWith (StaticStrings.SPEECH_CHARACTER)) {
983 value = value.substring (1, value.length () - 1);
984 }
985 XMLTools.setValue (option_element, value);
986 }
987 option_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
988 command_element.appendChild (option_element);
989 option_element = null;
990 name = null;
991 value = null;
992 }
993 names = null;
994 arguments = null;
995 }
996 tokenizer = null;
997 }
998 catch(Exception error) {
999 }
1000 return command_element;
1001 }
1002
1003 private Element parseFormat (CommandTokenizer tokenizer) {
1004 Element command_element = null;
1005 try {
1006 command_element = document.createElement (StaticStrings.FORMAT_ELEMENT);
1007 String name_str = tokenizer.nextToken ();
1008 String value_str = tokenizer.nextToken ();
1009 if(name_str != null && value_str != null) {
1010 command_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
1011 // If the value is true or false we add it as an attribute
1012 if(value_str.equalsIgnoreCase (StaticStrings.TRUE_STR) || value_str.equalsIgnoreCase (StaticStrings.FALSE_STR)) {
1013 command_element.setAttribute (StaticStrings.VALUE_ATTRIBUTE, value_str.toLowerCase ());
1014 }
1015 // Otherwise it gets added as a text node
1016 else {
1017 // Ready the value str (which can contain all sorts of funky characters) for writing as a DOM value
1018 value_str = Codec.transform (value_str, Codec.GREENSTONE_TO_DOM);
1019 XMLTools.setValue (command_element, value_str);
1020 }
1021 }
1022 else {
1023 command_element = null;
1024 }
1025 name_str = null;
1026 value_str = null;
1027 }
1028 catch (Exception exception) {
1029 DebugStream.printStackTrace (exception);
1030 command_element = null;
1031 }
1032 return command_element;
1033 }
1034
1035 private Element parseIndex (String command_str) {
1036 Element command_element = null;
1037 try {
1038 StringTokenizer tokenizer = new StringTokenizer (command_str);
1039 String command = tokenizer.nextToken ();
1040 command_element = document.createElement (StaticStrings.INDEXES_ELEMENT);
1041 command_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, (command.equals (StaticStrings.INDEX_STR) ? StaticStrings.TRUE_STR : StaticStrings.FALSE_STR));
1042 command = null;
1043 if(!tokenizer.hasMoreTokens ()) {
1044
1045 // there are no indexes
1046 command_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR);
1047 command_element.setAttribute (StaticStrings.MGPP_ATTRIBUTE, StaticStrings.FALSE_STR); // for now
1048 tokenizer = null;
1049 return command_element;
1050 }
1051
1052 while(tokenizer.hasMoreTokens ()) {
1053 Element index_element = document.createElement (StaticStrings.INDEX_ELEMENT);
1054 String index_str = tokenizer.nextToken ();
1055 // There are two types of index we have to consider. Old G2.38 and earlier use level:source tuplets while G2.39+ have just a single, non-comma separated list where order is important.
1056 boolean old_index;
1057 if(index_str.indexOf (StaticStrings.COLON_CHARACTER) != -1) {
1058 old_index = true;
1059 index_element.setAttribute (StaticStrings.LEVEL_ATTRIBUTE, index_str.substring (0, index_str.indexOf (StaticStrings.COLON_CHARACTER)));
1060 index_str = index_str.substring (index_str.indexOf (StaticStrings.COLON_CHARACTER) + 1);
1061 command_element.setAttribute (StaticStrings.MGPP_ATTRIBUTE, StaticStrings.FALSE_STR);
1062 }
1063 else {
1064 command_element.setAttribute (StaticStrings.MGPP_ATTRIBUTE, StaticStrings.TRUE_STR);
1065 old_index = false;
1066 }
1067 StringTokenizer content_tokenizer = new StringTokenizer (index_str, StaticStrings.COMMA_CHARACTER);
1068 while(content_tokenizer.hasMoreTokens ()) {
1069 Element content_element = document.createElement (StaticStrings.CONTENT_ELEMENT);
1070 String content_str = content_tokenizer.nextToken ();
1071 // Since the contents of indexes have to be certain keywords, or metadata elements, if the content isn't a keyword and doesn't yet have a namespace, append the extracted metadata namespace.
1072 if(content_str.indexOf (StaticStrings.NS_SEP) == -1) {
1073 if(content_str.equals (StaticStrings.TEXT_STR) || (!old_index && content_str.equals (StaticStrings.ALLFIELDS_STR))) {
1074 // Our special strings are OK.
1075 }
1076 else {
1077 content_str = StaticStrings.EXTRACTED_NAMESPACE + content_str;
1078 }
1079 }
1080 content_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, content_str);
1081 index_element.appendChild (content_element);
1082 content_element = null;
1083 }
1084 content_tokenizer = null;
1085 index_str = null;
1086 command_element.appendChild (index_element);
1087 index_element = null;
1088 }
1089 tokenizer = null;
1090 }
1091 catch (Exception exception) {
1092 exception.printStackTrace ();
1093 }
1094 return command_element;
1095 }
1096
1097 private Element parseIndexDefault (String command_str) {
1098 Element command_element = null;
1099 try {
1100 StringTokenizer tokenizer = new StringTokenizer (command_str);
1101 if(tokenizer.countTokens () >= 2) {
1102 command_element = document.createElement (StaticStrings.INDEX_DEFAULT_ELEMENT);
1103 command_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, ((tokenizer.nextToken ()).equals (StaticStrings.INDEX_DEFAULT_STR) ? StaticStrings.TRUE_STR : StaticStrings.FALSE_STR));
1104 String index_str = tokenizer.nextToken ();
1105 String level="";
1106 if (index_str.indexOf (StaticStrings.COLON_CHARACTER) !=-1) {
1107 level = index_str.substring (0, index_str.indexOf (StaticStrings.COLON_CHARACTER));
1108 }
1109
1110 command_element.setAttribute (StaticStrings.LEVEL_ATTRIBUTE,level);
1111
1112 String content_str = index_str;
1113
1114 if (index_str.indexOf (StaticStrings.COLON_CHARACTER) !=-1) {
1115 content_str = index_str.substring (index_str.indexOf (StaticStrings.COLON_CHARACTER) + 1);
1116 }
1117
1118 StringTokenizer content_tokenizer = new StringTokenizer (content_str, StaticStrings.COMMA_CHARACTER);
1119 while(content_tokenizer.hasMoreTokens ()) {
1120 Element content_element = document.createElement (StaticStrings.CONTENT_ELEMENT);
1121 content_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, content_tokenizer.nextToken ());
1122 command_element.appendChild (content_element);
1123 content_element = null;
1124 }
1125 content_tokenizer = null;
1126 content_str = null;
1127 content_str = null;
1128 index_str = null;
1129 }
1130 tokenizer = null;
1131 }
1132 catch (Exception exception) {
1133 }
1134 return command_element;
1135 }
1136
1137 private Element parseLanguage (String command_str) {
1138 Element command_element = null;
1139 try {
1140 StringTokenizer tokenizer = new StringTokenizer (command_str);
1141 tokenizer.nextToken ();
1142 if(tokenizer.hasMoreTokens ()) {
1143 command_element = document.createElement (StaticStrings.LANGUAGES_ELEMENT);
1144 while(tokenizer.hasMoreTokens ()) {
1145 Element language_element = document.createElement (StaticStrings.LANGUAGE_ELEMENT);
1146 language_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, tokenizer.nextToken ());
1147 command_element.appendChild (language_element);
1148 language_element = null;
1149 }
1150 }
1151 tokenizer = null;
1152 }
1153 catch (Exception exception) {
1154 }
1155 return command_element;
1156 }
1157
1158 private Element parseLanguageDefault (String command_str) {
1159 Element command_element = null;
1160 try {
1161 StringTokenizer tokenizer = new StringTokenizer (command_str);
1162 if(tokenizer.countTokens () >= 2) {
1163 command_element = document.createElement (StaticStrings.LANGUAGE_DEFAULT_ELEMENT);
1164 tokenizer.nextToken ();
1165 String default_language_str = tokenizer.nextToken ();
1166 command_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, default_language_str);
1167 command_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1168 default_language_str = null;
1169 }
1170 tokenizer = null;
1171 }
1172 catch (Exception exception) {
1173 }
1174 return command_element;
1175 }
1176
1177 private Element parseLanguageMetadata (String command_str) {
1178 Element command_element = null;
1179 try {
1180 StringTokenizer tokenizer = new StringTokenizer (command_str);
1181 if(tokenizer.countTokens () >= 2) {
1182 command_element = document.createElement (StaticStrings.LANGUAGE_METADATA_ELEMENT);
1183 tokenizer.nextToken ();
1184 String language_metadata_str = tokenizer.nextToken ();
1185 if (language_metadata_str.indexOf (StaticStrings.NS_SEP) == -1) {
1186 language_metadata_str = StaticStrings.EXTRACTED_NAMESPACE + language_metadata_str;
1187 }
1188 command_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, language_metadata_str);
1189 command_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1190 language_metadata_str = null;
1191 }
1192 tokenizer = null;
1193
1194 }
1195 catch (Exception exception) {
1196 }
1197 return command_element;
1198 }
1199
1200 private Element parseIndexOptions (String command_str, String type, boolean assigned) {
1201 Element command_element = null;
1202 try {
1203 StringTokenizer tokenizer = new StringTokenizer (command_str);
1204 // First token is command type
1205 String command = tokenizer.nextToken ();
1206 if(tokenizer.hasMoreTokens ()) {
1207 command_element = document.createElement (StaticStrings.INDEXOPTIONS_ELEMENT);
1208 command_element.setAttribute (StaticStrings.NAME_ATTRIBUTE,type);
1209 command_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, (assigned ? StaticStrings.TRUE_STR : StaticStrings.FALSE_STR));
1210 while(tokenizer.hasMoreTokens ()) {
1211 Element option_element = document.createElement (StaticStrings.INDEXOPTION_ELEMENT);
1212 option_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, tokenizer.nextToken ());
1213 command_element.appendChild (option_element);
1214 option_element = null;
1215 }
1216 }
1217 command = null;
1218 }
1219 catch(Exception exception) {
1220 }
1221 return command_element;
1222 }
1223
1224 private Element parseIndexOptionDefault (String command_str, String type, boolean assigned) {
1225 Element command_element = null;
1226 try {
1227 StringTokenizer tokenizer = new StringTokenizer (command_str);
1228 // First token is command type
1229 String command = tokenizer.nextToken ();
1230 if(tokenizer.hasMoreTokens ()) {
1231 command_element = document.createElement (StaticStrings.INDEXOPTION_DEFAULT_ELEMENT);
1232 command_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, (assigned ? StaticStrings.TRUE_STR : StaticStrings.FALSE_STR)); // is it commented out or not?
1233 command_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, type);
1234 command_element.setAttribute (StaticStrings.VALUE_ATTRIBUTE, tokenizer.nextToken ());
1235 }
1236
1237 tokenizer = null;
1238 }
1239 catch (Exception exception) {
1240 }
1241 return command_element;
1242 }
1243
1244 private Element parseMetadata (CommandTokenizer tokenizer) {
1245 Element command_element = null;
1246 try {
1247 command_element = document.createElement (StaticStrings.COLLECTIONMETADATA_ELEMENT);
1248 String name_str = tokenizer.nextToken ();
1249 String value_str = tokenizer.nextToken ();
1250 if(name_str != null && value_str != null) {
1251 String language_str = Configuration.getLanguage ();
1252 // Check if the value string is actually a language string
1253 if(value_str.startsWith (StaticStrings.LBRACKET_CHARACTER) && value_str.endsWith (StaticStrings.RBRACKET_CHARACTER)) {
1254 language_str = value_str.substring (value_str.indexOf (StaticStrings.LANGUAGE_ARGUMENT) + 2, value_str.length () - 1);
1255 value_str = tokenizer.nextToken ();
1256 }
1257 if(value_str != null) {
1258 // Ready the value str (which can contain all sorts of funky characters) for writing as a DOM value
1259 value_str = Codec.transform (value_str, Codec.GREENSTONE_TO_DOM);
1260 command_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
1261 command_element.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, language_str);
1262 command_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1263 XMLTools.setValue (command_element, value_str);
1264 }
1265 else {
1266 command_element = null;
1267 }
1268 language_str = null;
1269 }
1270 else {
1271 command_element = null;
1272 }
1273 name_str = null;
1274 value_str = null;
1275 }
1276 catch (Exception exception) {
1277 DebugStream.printStackTrace (exception);
1278 command_element = null;
1279 }
1280 return command_element;
1281 }
1282
1283 private Element parseMetadataSpecial (String command_str) {
1284 Element command_element = null;
1285 try {
1286 StringTokenizer tokenizer = new StringTokenizer (command_str);
1287 if(tokenizer.countTokens () >= 2) {
1288 String name_str = tokenizer.nextToken ();
1289 String value_str = tokenizer.nextToken ();
1290 if (name_str.equals (StaticStrings.COLLECTIONMETADATA_CREATOR_STR)) {
1291 command_element = document.createElement (StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT);
1292 }
1293 else if(name_str.equals (StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR)) {
1294 command_element = document.createElement (StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT);
1295 }
1296 else if(name_str.equals (StaticStrings.COLLECTIONMETADATA_PUBLIC_STR)) {
1297 command_element = document.createElement (StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT);
1298 }
1299 else if (name_str.equals (StaticStrings.BUILDTYPE_STR)) {
1300 command_element = document.createElement (StaticStrings.BUILDTYPE_ELEMENT);
1301 }
1302 if(command_element != null) {
1303 command_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
1304 command_element.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, StaticStrings.ENGLISH_LANGUAGE_STR);
1305 command_element.setAttribute (StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR);
1306 command_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1307 if(value_str.startsWith (StaticStrings.SPEECH_CHARACTER) && value_str.endsWith (StaticStrings.SPEECH_CHARACTER)) {
1308 value_str = value_str.substring (1, value_str.length () - 1);
1309 }
1310 XMLTools.setValue (command_element, value_str);
1311 }
1312 value_str = null;
1313 name_str = null;
1314 }
1315 tokenizer = null;
1316 }
1317 catch (Exception exception) {
1318 }
1319 return command_element;
1320 }
1321
1322 private Element parsePlugin (String command_str) {
1323 Element command_element = null;
1324 try {
1325 CommandTokenizer tokenizer = new CommandTokenizer (command_str);
1326 // Check the token count. The token count from a command tokenizer isn't guarenteed to be correct, but it does give the maximum number of available tokens according to the underlying StringTokenizer (some of which may actually be append together by the CommandTokenizer as being a single argument).
1327 if(tokenizer.countTokens () >= 2) {
1328 command_element = document.createElement (StaticStrings.PLUGIN_ELEMENT);
1329 // First token is plugin
1330 tokenizer.nextToken ();
1331 // The next token is the type
1332 String type = tokenizer.nextToken ();
1333 type = ensureNewPluginName(type);
1334 command_element.setAttribute (StaticStrings.TYPE_ATTRIBUTE, type);
1335 // Now we parse out the remaining arguments into a hashmapping from name to value
1336 HashMap arguments = parseArguments (tokenizer);
1337 // Assign the arguments as Option elements, but watch out for the metadata argument as we treat that differently
1338 // also watch out for the deprecated -use_metadata_files option to RecPlug and remove it
1339 Iterator names = arguments.keySet ().iterator ();
1340 while(names.hasNext ()) {
1341 String name = (String) names.next ();
1342 String value = (String) arguments.get (name); // Can be null
1343
1344 if(type.equals (StaticStrings.RECPLUG_STR) && name.substring (1).equals (StaticStrings.USE_METADATA_FILES_ARGUMENT)) {
1345 continue; // ignore this option
1346 }
1347 Element option_element = document.createElement (StaticStrings.OPTION_ELEMENT);
1348 option_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name.substring (1));
1349 option_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1350 if(value != null) {
1351 // Remove any speech marks appended in strings containing whitespace
1352 if(value.startsWith (StaticStrings.SPEECH_CHARACTER) && value.endsWith (StaticStrings.SPEECH_CHARACTER)) {
1353 value = value.substring (1, value.length () - 1);
1354 }
1355 if(name.equals (StaticStrings.METADATA_ARGUMENT)) {
1356 // The metadata argument must be the fully qualified name of a metadata element, so if it doesn't yet have a namespace, append the extracted metadata namespace.
1357 if(value.indexOf (StaticStrings.NS_SEP) == -1) {
1358 value = StaticStrings.EXTRACTED_NAMESPACE + value;
1359 }
1360 }
1361 XMLTools.setValue (option_element, value);
1362 }
1363 command_element.appendChild (option_element);
1364 option_element = null;
1365 name = null;
1366 value = null;
1367 }
1368
1369 type = null;
1370 names = null;
1371 arguments = null;
1372 }
1373 tokenizer = null;
1374 }
1375 catch(Exception exception) {
1376 // This catch clause had been left empty. If this is deliberate then
1377 // we should have a comment here explaining why there is no need to
1378 // print anything out. Am assuming this is mistake for now, and
1379 // have added in a call to printStackTrace()
1380 System.err.println("Malformed plugin statement");
1381 exception.printStackTrace();
1382 }
1383 return command_element;
1384 }
1385
1386 /* search types are now handled as formats - leave this here to convert in case we have an old config file */
1387 private Element parseSearchType (String command_str) {
1388 Element command_element = null;
1389 try {
1390 StringTokenizer tokenizer = new StringTokenizer (command_str);
1391 // First token is command type (searchtype)
1392 tokenizer.nextToken ();
1393 if(tokenizer.hasMoreTokens ()) {
1394 command_element = document.createElement (StaticStrings.FORMAT_ELEMENT);
1395 command_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, "SearchTypes");
1396 String value = tokenizer.nextToken ();
1397 while(tokenizer.hasMoreTokens ()) {
1398 value += ","+tokenizer.nextToken ();
1399 }
1400 value = Codec.transform (value, Codec.GREENSTONE_TO_DOM);
1401 XMLTools.setValue (command_element, value);
1402 }
1403 }
1404 catch(Exception exception) {
1405 }
1406 return command_element;
1407 }
1408
1409 private Element parseSubCollection (String command_str) {
1410 Element command_element = null;
1411 try {
1412 CommandTokenizer tokenizer = new CommandTokenizer (command_str);
1413 if(tokenizer.countTokens () >= 3) {
1414 command_element = document.createElement (StaticStrings.SUBCOLLECTION_ELEMENT);
1415 // First token is command type
1416 tokenizer.nextToken ();
1417 // Then subcollection identifier
1418 command_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, tokenizer.nextToken ());
1419 // Then finally the pattern used to build the subcollection partition
1420 String full_pattern_str = tokenizer.nextToken ();
1421 // Set inclusion/exclusion flag and remove any exclamation mark
1422 boolean exclusion = full_pattern_str.startsWith (StaticStrings.EXCLAMATION_CHARACTER);
1423 if (exclusion) {
1424 full_pattern_str = full_pattern_str.substring (1, full_pattern_str.length ());
1425 command_element.setAttribute (StaticStrings.TYPE_ATTRIBUTE, StaticStrings.EXCLUDE_STR);
1426 }
1427 else {
1428 command_element.setAttribute (StaticStrings.TYPE_ATTRIBUTE, StaticStrings.INCLUDE_STR);
1429 }
1430
1431 // Let's make sure it is a valid Greenstone configuration line
1432 String[] results = full_pattern_str.split("\\" + StaticStrings.SEPARATOR_CHARACTER, 3);
1433
1434 if (results.length >= 2) {
1435 String content_str = results[0];
1436 // Since the contents of indexes have to be certain keywords, or metadata elements, if the content isn't a keyword and doesn't yet have a namespace, append the extracted metadata namespace.
1437 if (!content_str.equals (StaticStrings.FILENAME_STR) && content_str.indexOf (StaticStrings.NS_SEP) == -1) {
1438 content_str = StaticStrings.EXTRACTED_NAMESPACE + content_str;
1439 }
1440 command_element.setAttribute (StaticStrings.CONTENT_ATTRIBUTE, content_str);
1441 XMLTools.setValue (command_element, results[1]);
1442 if (results.length >= 3) {
1443 command_element.setAttribute (StaticStrings.OPTIONS_ATTRIBUTE, results[2]);
1444 }
1445 }
1446 }
1447 }
1448 catch(Exception exception) {
1449 exception.printStackTrace ();
1450 }
1451 return command_element;
1452 }
1453
1454 private Element parseSubCollectionDefaultIndex (String command_str) {
1455 Element command_element = null;
1456 try {
1457 StringTokenizer tokenizer = new StringTokenizer (command_str);
1458 if(tokenizer.countTokens () == 2) {
1459 command_element = document.createElement (StaticStrings.SUBCOLLECTION_DEFAULT_INDEX_ELEMENT);
1460 tokenizer.nextToken ();
1461 //command_element.setAttribute(CONTENT_ATTRIBUTE, tokenizer.nextToken());
1462 String content_str = tokenizer.nextToken ();
1463 StringTokenizer content_tokenizer = new StringTokenizer (content_str, StaticStrings.COMMA_CHARACTER);
1464 while(content_tokenizer.hasMoreTokens ()) {
1465 Element content_element = document.createElement (StaticStrings.CONTENT_ELEMENT);
1466 content_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, content_tokenizer.nextToken ());
1467 command_element.appendChild (content_element);
1468 content_element = null;
1469 }
1470 content_tokenizer = null;
1471 content_str = null;
1472 }
1473 tokenizer = null;
1474 }
1475 catch(Exception exception) {
1476 }
1477 return command_element;
1478 }
1479
1480 private Element parseSubCollectionIndex (String command_str) {
1481 Element command_element = null;
1482 try {
1483 StringTokenizer tokenizer = new StringTokenizer (command_str);
1484 tokenizer.nextToken ();
1485 if(tokenizer.hasMoreTokens ()) {
1486 command_element = document.createElement (StaticStrings.SUBCOLLECTION_INDEXES_ELEMENT);
1487 }
1488 while(tokenizer.hasMoreTokens ()) {
1489 Element subcollectionindex_element = document.createElement (StaticStrings.INDEX_ELEMENT);
1490 //command_element.setAttribute(CONTENT_ATTRIBUTE, tokenizer.nextToken());
1491 String content_str = tokenizer.nextToken ();
1492 StringTokenizer content_tokenizer = new StringTokenizer (content_str, StaticStrings.COMMA_CHARACTER);
1493 while(content_tokenizer.hasMoreTokens ()) {
1494 Element content_element = document.createElement (StaticStrings.CONTENT_ELEMENT);
1495 content_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, content_tokenizer.nextToken ());
1496 subcollectionindex_element.appendChild (content_element);
1497 content_element = null;
1498 }
1499 content_tokenizer = null;
1500 content_str = null;
1501 command_element.appendChild (subcollectionindex_element);
1502 subcollectionindex_element = null;
1503 }
1504 tokenizer = null;
1505 }
1506 catch (Exception exception) {
1507 }
1508 return command_element;
1509 }
1510
1511 private Element parseSuperCollection (String command_str) {
1512 Element command_element = null;
1513 try {
1514 StringTokenizer tokenizer = new StringTokenizer (command_str);
1515 if(tokenizer.countTokens () >= 3) {
1516 command_element = document.createElement (StaticStrings.SUPERCOLLECTION_ELEMENT);
1517 tokenizer.nextToken ();
1518 while(tokenizer.hasMoreTokens ()) {
1519 Element collection_element = document.createElement (StaticStrings.COLLECTION_ELEMENT);
1520 collection_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, tokenizer.nextToken ());
1521 command_element.appendChild (collection_element);
1522 collection_element = null;
1523 }
1524 }
1525 tokenizer = null;
1526 }
1527 catch(Exception exception) {
1528 }
1529 return command_element;
1530 }
1531
1532 static private String pluginToString (Element command_element, boolean show_extracted_namespace) {
1533 if(command_element.getAttribute (StaticStrings.SEPARATOR_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
1534 return "";
1535 }
1536 StringBuffer text = new StringBuffer (StaticStrings.PLUGIN_STR);
1537 text.append (StaticStrings.TAB_CHARACTER);
1538 text.append (command_element.getAttribute (StaticStrings.TYPE_ATTRIBUTE));
1539 // Retrieve, and output, the arguments
1540 NodeList option_elements = command_element.getElementsByTagName (StaticStrings.OPTION_ELEMENT);
1541 int option_elements_length = option_elements.getLength ();
1542 if(option_elements_length > 0) {
1543 for(int j = 0; j < option_elements_length; j++) {
1544 Element option_element = (Element) option_elements.item (j);
1545 if(option_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
1546 text.append (StaticStrings.SPACE_CHARACTER);
1547 text.append (StaticStrings.MINUS_CHARACTER);
1548 text.append (option_element.getAttribute (StaticStrings.NAME_ATTRIBUTE));
1549 String value_str = XMLTools.getValue (option_element);
1550
1551
1552 // Convert metadata element names to internal names, and remove extracted metadata namespaces
1553 if (value_str.length () > 0) {
1554 StringTokenizer string_tokenizer = new StringTokenizer (value_str, ",");
1555 StringBuffer value_buffer = new StringBuffer ();
1556 while (string_tokenizer.hasMoreElements ()) {
1557 String raw_token = (String) string_tokenizer.nextElement ();
1558 String token = raw_token.trim ();
1559 MetadataElement metadata_element = MetadataTools.getMetadataElementWithDisplayName (token);
1560 if (metadata_element != null) {
1561 token = metadata_element.getFullName ();
1562 }
1563
1564 if (token.startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
1565 token = token.substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
1566 }
1567 value_buffer.append (token);
1568 if (string_tokenizer.hasMoreElements ()) {
1569 value_buffer.append (",");
1570 }
1571 }
1572 value_str = value_buffer.toString ();
1573 }
1574
1575 // if(!show_extracted_namespace && value_str.startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
1576 // value_str = value_str.substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
1577 // }
1578 if(value_str.length () > 0) {
1579 text.append (StaticStrings.SPACE_CHARACTER);
1580 if(value_str.indexOf (StaticStrings.SPACE_CHARACTER) == -1) {
1581 text.append (value_str);
1582 }
1583 else {
1584 text.append (StaticStrings.SPEECH_CHARACTER);
1585 text.append (value_str);
1586 text.append (StaticStrings.SPEECH_CHARACTER);
1587 }
1588 }
1589 value_str = null;
1590 }
1591 option_element = null;
1592 }
1593 }
1594 option_elements = null;
1595
1596 return text.toString ();
1597 }
1598
1599 static private String searchtypeToString (Element command_element) {
1600 if(command_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
1601 StringBuffer text = new StringBuffer (StaticStrings.SEARCHTYPE_STR);
1602 text.append (StaticStrings.TAB_CHARACTER);
1603 NodeList search_elements = command_element.getElementsByTagName (StaticStrings.CONTENT_ELEMENT);
1604 int search_elements_length = search_elements.getLength ();
1605 for(int i = 0; i < search_elements_length; i++) {
1606 Element search_element = (Element) search_elements.item (i);
1607 text.append (search_element.getAttribute (StaticStrings.NAME_ATTRIBUTE));
1608 text.append (StaticStrings.SPACE_CHARACTER);
1609 }
1610 return text.substring (0, text.length () - 1);
1611 }
1612 else {
1613 return null;
1614 }
1615 }
1616
1617 static private String subcollectionToString (Element command_element, boolean show_extracted_namespace) {
1618 StringBuffer text = new StringBuffer (StaticStrings.SUBCOLLECTION_STR);
1619 text.append (StaticStrings.SPACE_CHARACTER);
1620 text.append (command_element.getAttribute (StaticStrings.NAME_ATTRIBUTE));
1621 text.append (StaticStrings.SPACE_CHARACTER);
1622 text.append (StaticStrings.TAB_CHARACTER);
1623 text.append (StaticStrings.SPEECH_CHARACTER);
1624 if(command_element.getAttribute (StaticStrings.TYPE_ATTRIBUTE).equals (StaticStrings.EXCLUDE_STR)) {
1625 text.append (StaticStrings.EXCLAMATION_CHARACTER);
1626 }
1627 String content_str = command_element.getAttribute (StaticStrings.CONTENT_ATTRIBUTE);
1628 if(!show_extracted_namespace && content_str.startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
1629 content_str = content_str.substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
1630 }
1631 text.append (content_str);
1632 content_str = null;
1633 text.append (StaticStrings.SEPARATOR_CHARACTER);
1634 text.append (XMLTools.getValue (command_element));
1635 text.append (StaticStrings.SEPARATOR_CHARACTER);
1636 String options_str = command_element.getAttribute (StaticStrings.OPTIONS_ATTRIBUTE);
1637 if(options_str.length () > 0) {
1638 text.append (options_str);
1639 }
1640 options_str = null;
1641 text.append (StaticStrings.SPEECH_CHARACTER);
1642 return text.toString ();
1643 }
1644
1645 static private String subcollectionDefaultIndexToString (Element command_element) {
1646 StringBuffer text = new StringBuffer (StaticStrings.SUBCOLLECTION_DEFAULT_INDEX_STR);
1647 text.append (StaticStrings.TAB_CHARACTER);
1648 NodeList content_elements = command_element.getElementsByTagName (StaticStrings.CONTENT_ELEMENT);
1649 int content_elements_length = content_elements.getLength ();
1650 for(int j = 0; j < content_elements_length; j++) {
1651 Element content_element = (Element) content_elements.item (j);
1652 text.append (content_element.getAttribute (StaticStrings.NAME_ATTRIBUTE));
1653 if(j < content_elements_length - 1) {
1654 text.append (StaticStrings.COMMA_CHARACTER);
1655 }
1656 }
1657 return text.toString ();
1658 }
1659
1660 static private String subcollectionIndexesToString (Element command_element) {
1661 StringBuffer text = new StringBuffer (StaticStrings.SUBCOLLECTION_INDEX_STR);
1662 text.append (StaticStrings.TAB_CHARACTER);
1663 // Retrieve all of the subcollection index partitions
1664 NodeList subcollectionindex_elements = command_element.getElementsByTagName (StaticStrings.INDEX_ELEMENT);
1665 int subcollectionindex_elements_length = subcollectionindex_elements.getLength ();
1666 if(subcollectionindex_elements_length == 0) {
1667 return null;
1668 }
1669 for(int j = 0; j < subcollectionindex_elements_length; j++) {
1670 Element subcollectionindex_element = (Element) subcollectionindex_elements.item (j);
1671 NodeList content_elements = subcollectionindex_element.getElementsByTagName (StaticStrings.CONTENT_ELEMENT);
1672 int content_elements_length = content_elements.getLength ();
1673 for(int k = 0; k < content_elements_length; k++) {
1674 Element content_element = (Element) content_elements.item (k);
1675 text.append (content_element.getAttribute (StaticStrings.NAME_ATTRIBUTE));
1676 if(k < content_elements_length - 1) {
1677 text.append (StaticStrings.COMMA_CHARACTER);
1678 }
1679 }
1680 if(j < subcollectionindex_elements_length - 1) {
1681 text.append (StaticStrings.SPACE_CHARACTER);
1682 }
1683 }
1684 return text.toString ();
1685 }
1686
1687 static private String supercollectionToString (Element command_element) {
1688 NodeList content_elements = command_element.getElementsByTagName (StaticStrings.COLLECTION_ELEMENT);
1689 int content_elements_length = content_elements.getLength ();
1690 if(content_elements_length > 1) {
1691 StringBuffer text = new StringBuffer (StaticStrings.SUPERCOLLECTION_STR);
1692 text.append (StaticStrings.TAB_CHARACTER);
1693 for(int j = 0; j < content_elements_length; j++) {
1694 Element content_element = (Element) content_elements.item (j);
1695 text.append (content_element.getAttribute (StaticStrings.NAME_ATTRIBUTE));
1696 if(j < content_elements_length - 1) {
1697 text.append (StaticStrings.SPACE_CHARACTER);
1698 }
1699 }
1700 return text.toString ();
1701 }
1702 return null;
1703 }
1704
1705 static private String unknownToString (Element command_element) {
1706 return XMLTools.getValue (command_element);
1707 }
1708
1709 /** Write the text to the buffer. This is used so we don't have to worry about storing intermediate String values just so we can calaulate length and offset.
1710 * @param writer the BufferedWriter to which the str will be written
1711 * @param str the String to be written
1712 */
1713 private void write (BufferedWriter writer, String str)
1714 throws IOException {
1715 writer.write (str, 0, str.length ());
1716 }
1717
1718 /** ********************************************************************************************************
1719 The code from this point below are used for greenstone 3 collection configuration, i.e., read ColletionConfig.xml
1720 * into the internal DOM tree, and convert the internal DOM tree back to CollectionConfig.xml.
1721 *
1722 Methods named 'doXXXX' are for convert collectionConfig.xml into the internal configuration xml structure;
1723 Methods named 'convertXXXX' are for convert the internal configuration xml structure back to collectionConfig.xml.
1724 ************************************************************************************************************ */
1725
1726 /**Arguments: metadataListNode->the 'displayItemList' element in collectionConfig.xml
1727 name_value->the value of the 'name' attribute of 'index' element;
1728 att_value->the value of the 'name' attribute of 'displayItem' element
1729 return: an ArrayList of the contructed 'CollectionMetadata' elements
1730 */
1731 private ArrayList doDisplayItemList (Document to, Node displayListNode, String att_value, String name_value) {
1732 Element toElement = to.getDocumentElement ();
1733 ArrayList display_item_list = new ArrayList ();
1734 ArrayList item_list = XMLTools.getNamedElementList ((Element)displayListNode,
1735 StaticStrings.DISPLAYITEM_STR, StaticStrings.NAME_ATTRIBUTE, att_value);
1736 if (item_list == null) {
1737 return null;
1738 }
1739
1740 for (int i=0; i<item_list.size (); i++) {
1741 Element item = (Element)item_list.get (i);
1742 String text = XMLTools.getNodeText (item);
1743
1744 //If there is nothing to display, don't bother creating the element
1745 if (text == "") {
1746 continue;
1747 }
1748 //get the value in 'lang=value'
1749 String lang = item.getAttribute (StaticStrings.LANG_STR);
1750
1751 Element e = to.createElement (StaticStrings.COLLECTIONMETADATA_ELEMENT);
1752 e.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1753 e.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_value);
1754 e.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, lang);
1755 XMLTools.setNodeText (e, text);
1756 display_item_list.add (e);
1757 }
1758 return display_item_list;
1759 }
1760
1761 private ArrayList doMetadataList (Document to, Node metadataListNode, String ele_name, String att_value) {
1762 Element toElement = to.getDocumentElement ();
1763 ArrayList metadata_list = new ArrayList ();
1764
1765 ArrayList item_list = XMLTools.getNamedElementList ((Element)metadataListNode,
1766 StaticStrings.METADATA_STR, StaticStrings.NAME_ATTRIBUTE, att_value);
1767 if (item_list == null) {
1768 return null;
1769 }
1770
1771 for (int i=0; i<item_list.size (); i++) {
1772 Element item = (Element)item_list.get (i);
1773 String text = XMLTools.getNodeText (item);
1774
1775 //If there is nothing to display, don't bother creating the element
1776 if (text == "") {
1777 continue;
1778 }
1779 //get the value in 'lang=value'
1780 String lang = item.getAttribute (StaticStrings.LANG_STR);
1781
1782 Element element = to.createElement (ele_name);
1783 element.setAttribute (StaticStrings.NAME_ATTRIBUTE, att_value);
1784 element.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, lang);
1785 element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1786 element.setAttribute (StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR);
1787 XMLTools.setNodeText (element, text);
1788
1789 metadata_list.add (element);
1790 }
1791 return metadata_list;
1792 }
1793 // 'to' is the internal structure
1794 private void doMGIndexes (Document to, Node searchNode) {
1795 Element toElement = to.getDocumentElement ();
1796 Element indexes_element = to.createElement (StaticStrings.INDEXES_ELEMENT);//<Indexes>
1797 indexes_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1798 indexes_element.setAttribute (StaticStrings.MGPP_ATTRIBUTE, StaticStrings.FALSE_STR);
1799
1800 NodeList index_children = ((Element)searchNode).getElementsByTagName (StaticStrings.INDEX_LOW_STR);//index
1801 int num_nodes = index_children.getLength ();
1802
1803 for (int i=0; i<num_nodes; i++) {
1804 Element e = (Element)index_children.item (i);
1805 String index_str = e.getAttribute (StaticStrings.NAME_ATTRIBUTE);
1806 String index_str_display = index_str;//used for creating collectionmetadata for this index
1807 Element index_element = to.createElement (StaticStrings.INDEX_ELEMENT);//<Index>
1808
1809 // For mg, it's the 'Old G2.38 and earlier' that use level:source tuplets, but we double check it anyway
1810 boolean old_index = true;
1811 if(index_str.indexOf (StaticStrings.COLON_CHARACTER) == -1) {
1812 // It doesn't contain ':' character
1813 System.err.println ("Something is wrong! the index should be level:source tuplets.");
1814 old_index = false;
1815 }
1816 else {
1817 // Handling 'index' element
1818 index_element.setAttribute (StaticStrings.LEVEL_ATTRIBUTE,
1819 index_str.substring (0, index_str.indexOf (StaticStrings.COLON_CHARACTER)));
1820 index_str = index_str.substring (index_str.indexOf (StaticStrings.COLON_CHARACTER) + 1);
1821
1822 //Each index may have a list of comma-separated strings.
1823 //split them into 'content' elements in the internal structure
1824 StringTokenizer content_tokenizer = new StringTokenizer (index_str, StaticStrings.COMMA_CHARACTER);
1825 //index_str = "";
1826 while(content_tokenizer.hasMoreTokens ()) {
1827 // Replace index_str to be qualified name, eg. dc.Subject and keywords insread of dc.Subject.
1828
1829
1830 Element content_element = to.createElement (StaticStrings.CONTENT_ELEMENT);
1831 String content_str = content_tokenizer.nextToken ();
1832 // Since the contents of indexes have to be certain keywords, or metadata elements,
1833 //if the content isn't a keyword and doesn't yet have a namespace, append the extracted metadata namespace.
1834 if(content_str.indexOf (StaticStrings.NS_SEP) == -1) {
1835 if(content_str.equals (StaticStrings.TEXT_STR) ||
1836 (!old_index && content_str.equals (StaticStrings.ALLFIELDS_STR))) {
1837 // in this case, do nothing
1838 }
1839 else {
1840 content_str = StaticStrings.EXTRACTED_NAMESPACE + content_str;
1841 }
1842 }
1843
1844 content_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, content_str);
1845 index_element.appendChild (content_element);
1846 content_element = null;
1847 } // while ends
1848
1849 indexes_element.appendChild (index_element);
1850
1851 // Handling 'displayItem' elements and Constructing 'collectionmetadata' elements
1852 // Use the fully qualified index names
1853 ArrayList collectionmetadata_list = doDisplayItemList (to, e, StaticStrings.NAME_ATTRIBUTE, index_str_display);
1854 appendArrayList (toElement, collectionmetadata_list);
1855 } //else ends
1856 } //for loop ends
1857 appendProperly (toElement, indexes_element);
1858
1859 //***//
1860 // create another set of <indexes> which will be used when user switches to MGPP/LUCENE
1861 // i.e. we build a default index set for a start
1862
1863 String []index_strs =
1864 {StaticStrings.TEXT_STR,
1865 StaticStrings.EXTRACTED_NAMESPACE + StaticStrings.TITLE_ELEMENT,
1866 StaticStrings.EXTRACTED_NAMESPACE + StaticStrings.SOURCE_ELEMENT};
1867
1868 Element mgpp_indexes = to.createElement (StaticStrings.INDEXES_ELEMENT);//<Indexes>
1869 mgpp_indexes.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR);
1870 mgpp_indexes.setAttribute (StaticStrings.MGPP_ATTRIBUTE, StaticStrings.TRUE_STR);
1871 for (int i=0; i<index_strs.length; i++) {
1872 Element index_element = to.createElement (StaticStrings.INDEX_ELEMENT);//<Index>
1873 Element content_element = to.createElement (StaticStrings.CONTENT_ELEMENT);
1874 content_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, index_strs[i]);
1875 index_element.appendChild (content_element);
1876 mgpp_indexes.appendChild (index_element);
1877
1878 // Contructing 'collectionmetadata' elements for 'mgpp' indexes
1879 Element collectionmetadata = to.createElement (StaticStrings.COLLECTIONMETADATA_ELEMENT);
1880 collectionmetadata.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1881 collectionmetadata.setAttribute (StaticStrings.NAME_ATTRIBUTE, index_strs[i]);
1882 collectionmetadata.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, StaticStrings.ENGLISH_LANGUAGE_STR);
1883 if (index_strs[i].indexOf (StaticStrings.NS_SEP) != -1) {
1884 index_strs[i] = index_strs[i].substring (index_strs[i].indexOf (StaticStrings.NS_SEP) + 1);
1885 }
1886 XMLTools.setNodeText (collectionmetadata, index_strs[i]);
1887
1888 appendProperly (toElement, collectionmetadata);
1889
1890 }
1891 appendProperly (toElement, mgpp_indexes);
1892 }
1893
1894 //This is actually doing indexes for both mgpp and lucene
1895 private void doMGPPIndexes (Document to, Node searchNode) {
1896 Element toElement = to.getDocumentElement ();
1897 Element indexes_element = to.createElement (StaticStrings.INDEXES_ELEMENT);//<Indexes>
1898 indexes_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1899 indexes_element.setAttribute (StaticStrings.MGPP_ATTRIBUTE, StaticStrings.TRUE_STR);
1900
1901 NodeList index_children = ((Element)searchNode).getElementsByTagName (StaticStrings.INDEX_LOW_STR);//index
1902 int num_nodes = index_children.getLength ();
1903
1904 for (int i=0; i<num_nodes; i++) {
1905
1906 Element index_element = to.createElement (StaticStrings.INDEX_ELEMENT);//<Index>
1907 Element e = (Element)index_children.item (i);
1908 String index_str = e.getAttribute (StaticStrings.NAME_ATTRIBUTE);
1909 String index_str_display = index_str;//for creating collectionmetadata for this index
1910
1911 // Handling 'index' element
1912 // Double check to make sure it's not colon separated style index.
1913 boolean old_index = false;
1914 if(index_str.indexOf (StaticStrings.COLON_CHARACTER) != -1) {
1915 System.err.println ("Something is wrong! the index should NOT be level:source tuplets style.");
1916 old_index = true;
1917 }
1918 //Each index may have a list of comma-separated strings.
1919 //split them into 'content' elements in the internal structure
1920 StringTokenizer content_tokenizer = new StringTokenizer (index_str, StaticStrings.COMMA_CHARACTER);
1921 //index_str = "";
1922 while(content_tokenizer.hasMoreTokens ()) {
1923 // Replace index_str to be qualified name, eg. dc.Subject and keywords insread of dc.Subject.
1924
1925 Element content_element = to.createElement (StaticStrings.CONTENT_ELEMENT);
1926 String content_str = content_tokenizer.nextToken ();
1927 // Since the contents of indexes have to be certain keywords, or metadata elements, if the content isn't a keyword and doesn't yet have a namespace, append the extracted metadata namespace.
1928 if(content_str.indexOf (StaticStrings.NS_SEP) == -1) {
1929 if(content_str.equals (StaticStrings.TEXT_STR)) {
1930 // in this case, do nothing
1931 }
1932 else {
1933 content_str = StaticStrings.EXTRACTED_NAMESPACE + content_str;
1934 }
1935 }
1936 content_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, content_str);
1937 index_element.appendChild (content_element);
1938 content_element = null;
1939 } //while ends
1940
1941 indexes_element.appendChild (index_element);
1942
1943
1944 index_element = null;
1945
1946 // Handling 'displayItem' element of this 'index' element
1947 // 'e' is the parent element 'index' of 'displayItem' element
1948 ArrayList collectionmetadata_list = doDisplayItemList (to, e, StaticStrings.NAME_ATTRIBUTE, index_str_display);
1949 appendArrayList (toElement, collectionmetadata_list);
1950
1951
1952 } // for loop ends
1953 toElement.appendChild (indexes_element);
1954
1955 // create another set of <indexes> which will be used when user switches to MG
1956 // i.e. we build a default index set for a start
1957 Element mg_indexes = to.createElement (StaticStrings.INDEXES_ELEMENT);//<Indexes>
1958 mg_indexes.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR);
1959 mg_indexes.setAttribute (StaticStrings.MGPP_ATTRIBUTE, StaticStrings.FALSE_STR);
1960
1961 //put the namespace '.ex' as prefix to the indexes
1962 String []index_strs =
1963 {StaticStrings.TEXT_STR,
1964 StaticStrings.EXTRACTED_NAMESPACE + StaticStrings.TITLE_ELEMENT,
1965 StaticStrings.EXTRACTED_NAMESPACE + StaticStrings.SOURCE_ELEMENT};
1966 for (int i=0; i<index_strs.length; i++) {
1967 Element index_element = to.createElement (StaticStrings.INDEX_ELEMENT);//<Index>
1968 index_element.setAttribute (StaticStrings.LEVEL_ATTRIBUTE, StaticStrings.DOCUMENT_STR);
1969 Element content_element = to.createElement (StaticStrings.CONTENT_ELEMENT);
1970 content_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, index_strs[i]);
1971 index_element.appendChild (content_element);
1972
1973 mg_indexes.appendChild (index_element);
1974
1975 // Contructing 'collectionmetadata' elements for 'mg' indexes
1976 Element collectionmetadata = to.createElement (StaticStrings.COLLECTIONMETADATA_ELEMENT);
1977 collectionmetadata.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1978 String temp = StaticStrings.DOCUMENT_STR.concat (StaticStrings.COLON_CHARACTER).concat (index_strs[i]);
1979 collectionmetadata.setAttribute (StaticStrings.NAME_ATTRIBUTE, temp);
1980 collectionmetadata.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, StaticStrings.ENGLISH_LANGUAGE_STR);
1981 if (index_strs[i].indexOf (StaticStrings.NS_SEP) != -1) {
1982 index_strs[i] = index_strs[i].substring (index_strs[i].indexOf (StaticStrings.NS_SEP) + 1);
1983 }
1984 XMLTools.setNodeText (collectionmetadata, index_strs[i]);
1985
1986 appendProperly (toElement, collectionmetadata);
1987
1988 }
1989 toElement.appendChild (mg_indexes);
1990
1991 }
1992
1993 private void doDisplayFormat (Document to, Element from) {
1994 //display element in the xml file
1995 Element de = (Element)XMLTools.getChildByTagName (from, StaticStrings.DISPLAY_STR);
1996 if (de == null) {
1997 return;
1998 }
1999 //format element in the display element
2000 Element fe = (Element)XMLTools.getChildByTagName (de, StaticStrings.FORMAT_STR);
2001
2002 to.getDocumentElement ().appendChild (doFormat(to, fe, StaticStrings.DISPLAY_STR));
2003 }
2004
2005 //construct 'DefaultIndex' element in the internal structure from collectionConfig.xml
2006 private void doDefaultIndex (Document to, Node searchNode) {
2007 Element toElement = to.getDocumentElement ();
2008 Element default_index_element = to.createElement (StaticStrings.INDEX_DEFAULT_ELEMENT);
2009 default_index_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2010
2011 Element e = (Element)XMLTools.getChildByTagName (searchNode, StaticStrings.INDEX_DEFAULT_ELEMENT_LOWERCASE);//defaultIndex
2012 if (e == null) {
2013 return;
2014 }
2015 String index_str = e.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2016
2017 boolean old_index = false;
2018 if(index_str.indexOf (StaticStrings.COLON_CHARACTER) != -1) {
2019 //The index is 'level:source tuplets' which is for mg. Take out 'level'
2020 old_index = true;
2021 default_index_element.setAttribute (StaticStrings.LEVEL_ATTRIBUTE,
2022 index_str.substring (0, index_str.indexOf (StaticStrings.COLON_CHARACTER)));
2023 index_str = index_str.substring (index_str.indexOf (StaticStrings.COLON_CHARACTER) + 1);
2024 } else {
2025 default_index_element.setAttribute (StaticStrings.LEVEL_ATTRIBUTE, "");
2026 }
2027
2028 //Each index may have a list of comma-separated strings.
2029 //split them into 'content' elements in the internal structure
2030 StringTokenizer content_tokenizer = new StringTokenizer (index_str, StaticStrings.COMMA_CHARACTER);
2031 while(content_tokenizer.hasMoreTokens ()) {
2032 Element content_element = to.createElement (StaticStrings.CONTENT_ELEMENT);
2033 String content_str = content_tokenizer.nextToken ();
2034 // Since the contents of indexes have to be certain keywords, or metadata elements, if the content isn't a keyword and doesn't yet have a namespace, append the extracted metadata namespace.
2035 if(content_str.indexOf (StaticStrings.NS_SEP) == -1) {
2036 if(content_str.equals (StaticStrings.TEXT_STR) ||
2037 (!old_index && content_str.equals (StaticStrings.ALLFIELDS_STR))) {
2038 // in this case, do nothing
2039 }
2040 else {
2041 content_str = StaticStrings.EXTRACTED_NAMESPACE + content_str;
2042 }
2043 }
2044
2045 content_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, content_str);
2046 default_index_element.appendChild (content_element);
2047 content_element = null;
2048 }
2049 appendProperly (toElement, default_index_element);
2050 }
2051 // For mg, this method is still called, but make it 'assigned=false'
2052 private void doDefaultLevel (Document to, Node searchNode) {
2053 Element toElement = to.getDocumentElement ();
2054 Element default_index_option = to.createElement (StaticStrings.INDEXOPTION_DEFAULT_ELEMENT);
2055 default_index_option.setAttribute (StaticStrings.NAME_STR, StaticStrings.LEVEL_DEFAULT_STR);
2056
2057 Element e = (Element)XMLTools.getChildByTagName (searchNode, StaticStrings.LEVEL_DEFAULT_ELEMENT);
2058 if (e != null) {
2059 default_index_option.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2060 String level = e.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2061 default_index_option.setAttribute (StaticStrings.VALUE_ATTRIBUTE, level);
2062 } else {
2063 //In the case of mg, there's no level! build a default one using 'assigned=false value=document'
2064 default_index_option.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR);
2065 default_index_option.setAttribute (StaticStrings.VALUE_ATTRIBUTE, StaticStrings.DOCUMENT_STR);
2066 }
2067 appendProperly (toElement, default_index_option);
2068 }
2069
2070 // Transform plugins (pluginListNode) of collectionConfig.xml into the internal structure (i.e. Document to)
2071 private void doPlugin (Document to, Node pluginListNode) {
2072 Element toElement = to.getDocumentElement ();
2073 NodeList plugin_children = ((Element)pluginListNode).getElementsByTagName (StaticStrings.PLUGIN_STR);
2074 int plugin_nodes = plugin_children.getLength ();
2075
2076 if (plugin_nodes < 1) {
2077 return;
2078 }
2079
2080 for (int i=0; i<plugin_nodes; i++) {
2081 Element e = (Element)plugin_children.item (i);
2082 String str = e.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2083 str = ensureNewPluginName(str);
2084 Element plugin_element = to.createElement (StaticStrings.PLUGIN_ELEMENT);
2085 plugin_element.setAttribute (StaticStrings.TYPE_ATTRIBUTE, str);
2086
2087
2088 NodeList option_children = e.getElementsByTagName (StaticStrings.OPTION_STR);
2089
2090 for (int j=0; j<option_children.getLength (); j++) {
2091 Element el = (Element)option_children.item (j);
2092 String name_str = el.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2093 if (name_str.startsWith (StaticStrings.MINUS_CHARACTER)) {
2094 name_str = name_str.substring (1);
2095 }
2096 String value_str = el.getAttribute (StaticStrings.VALUE_ATTRIBUTE);
2097 Element option_element = null;
2098
2099 if (name_str.equals ("") && !value_str.equals ("")) {
2100 continue;
2101 }
2102
2103
2104 option_element = to.createElement (StaticStrings.OPTION_ELEMENT);
2105 option_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2106 if(name_str.equals (StaticStrings.RECPLUG_STR) && value_str.equals (StaticStrings.USE_METADATA_FILES_ARGUMENT)) {
2107 continue; // ignore this option
2108 }
2109
2110 if(value_str != null) {
2111 // Remove any speech marks appended in strings containing whitespace
2112 if(value_str.startsWith (StaticStrings.SPEECH_CHARACTER) && value_str.endsWith (StaticStrings.SPEECH_CHARACTER)) {
2113 value_str = value_str.substring (1, value_str.length () - 1);
2114 }
2115 if(name_str.equals (StaticStrings.METADATA_STR)) {
2116 // The metadata argument must be the fully qualified name of a metadata element, so if it doesn't yet have a namespace, append the extracted metadata namespace.
2117 String[] values = value_str.split (StaticStrings.COMMA_CHARACTER);
2118 value_str = "";
2119 for (int k=0; k<=values.length-1; k++) {
2120 if (values[k].indexOf (StaticStrings.NS_SEP) == -1) {
2121 values[k] = StaticStrings.EXTRACTED_NAMESPACE + values[k];
2122 }
2123
2124 if (k < values.length-1) {
2125 value_str = value_str + values[k] + StaticStrings.COMMA_CHARACTER;
2126
2127 } else {
2128 value_str = value_str + values[k];
2129 }
2130 }
2131 }
2132 }
2133 if (!name_str.equals ("")) {
2134 option_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
2135 }
2136 if (!value_str.equals ("")) {
2137 XMLTools.setNodeText (option_element, value_str);
2138 }
2139 plugin_element.appendChild (option_element);
2140
2141 }
2142
2143 appendProperly (toElement, plugin_element);
2144 }
2145
2146 }
2147
2148 //Handle classifiers
2149 private void doClassifier (Document to, Node browseNode) {
2150 Element toElement = to.getDocumentElement ();
2151 NodeList classifier_children = ((Element)browseNode).getElementsByTagName (StaticStrings.CLASSIFIER_STR);
2152 int num_nodes = classifier_children.getLength ();
2153
2154 if (num_nodes < 1) {
2155 return;
2156 }
2157
2158 for (int i=0; i<num_nodes; i++) {
2159 Element e = (Element)classifier_children.item (i);
2160 String str = e.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2161 Element classify_element = to.createElement (StaticStrings.CLASSIFY_ELEMENT);
2162 classify_element.setAttribute (StaticStrings.TYPE_ATTRIBUTE, str);
2163
2164 String options_str = "";
2165 NodeList option_children = e.getElementsByTagName (StaticStrings.OPTION_STR);
2166 for (int j=0; j<option_children.getLength (); j++) {
2167 Element el = (Element)option_children.item (j);
2168 String name_str = el.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2169 options_str = options_str + ((name_str.equals(""))? "" : (" " + name_str));
2170 if (name_str.startsWith (StaticStrings.MINUS_CHARACTER)) {
2171 name_str = name_str.substring (1);
2172 }
2173 String value_str = el.getAttribute (StaticStrings.VALUE_ATTRIBUTE);
2174 options_str = options_str + ((name_str.equals(""))? "" : (" " + value_str));
2175 Element option_element = null;
2176
2177 if (name_str.equals ("") && !value_str.equals ("")) {
2178 continue; //invalid condition
2179 }
2180
2181 option_element = to.createElement (StaticStrings.OPTION_ELEMENT);
2182 option_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2183
2184 if (!name_str.equals ("")) {
2185 option_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
2186 }
2187
2188 if (!value_str.equals ("") && name_str.equals (StaticStrings.METADATA_STR)) {
2189 // The metadata argument must be the fully qualified name of a metadata element, so if it doesn't yet have a namespace, append the extracted metadata namespace.
2190 String[] values = value_str.split (StaticStrings.COMMA_CHARACTER);
2191 value_str = "";
2192 for (int k=0; k<=values.length-1; k++) {
2193 if (values[k].indexOf (StaticStrings.NS_SEP) == -1) {
2194 values[k] = StaticStrings.EXTRACTED_NAMESPACE + values[k];
2195 }
2196 else {
2197 MetadataElement metadata_element = MetadataTools.getMetadataElementWithName (values[k]);
2198 if (metadata_element != null) {
2199 values[k] = metadata_element.getDisplayName ();
2200 }
2201 }
2202 if (k < values.length-1) {
2203 value_str = value_str + values[k] + StaticStrings.COMMA_CHARACTER;
2204 } else {
2205 value_str = value_str + values[k];
2206 }
2207 }
2208 }
2209
2210 if (value_str != null && !value_str.equals ("")) {
2211 XMLTools.setNodeText (option_element, value_str);
2212 }
2213 classify_element.appendChild (option_element);
2214 }
2215 //format element for this classifier
2216 Element format = (Element)XMLTools.getChildByTagName (e, StaticStrings.FORMAT_STR);
2217 if(format != null) {
2218 classify_element.appendChild (doFormat(to, format, null));
2219 }
2220 appendProperly (toElement, classify_element);
2221 }
2222
2223 // default format statement for all classifiers
2224 Element default_classifier_format = (Element)XMLTools.getChildByTagName (browseNode, StaticStrings.FORMAT_STR);
2225
2226 to.getDocumentElement ().appendChild (doFormat(to, default_classifier_format, StaticStrings.BROWSE_STR));
2227 }
2228 private Element doFormat(Document to, Element format, String name_str) {
2229 Element format_element = to.createElement (StaticStrings.FORMAT_STR);
2230 if (name_str != null) {
2231 format_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
2232 }
2233 if (format != null) {
2234 String gsf_text = XMLTools.xmlNodeToStringWithoutIndenting(format);
2235
2236 if (gsf_text.startsWith("<") && (gsf_text.indexOf("<") != gsf_text.lastIndexOf("<"))) {
2237 gsf_text = gsf_text.substring(gsf_text.indexOf("<gsf"),
2238 gsf_text.indexOf(StaticStrings.FORMAT_END_TAG));
2239 }
2240
2241 XMLTools.setNodeText(format_element, gsf_text);
2242 }
2243 return format_element;
2244 }
2245 // Handling 'subcollection' elements in 'search' element of 'collectionConfig.xml'
2246 private void doSubcollection (Document to, Node searchNode) {
2247 Element toElement = to.getDocumentElement ();
2248 NodeList sub_children = ((Element)searchNode).getElementsByTagName (StaticStrings.SUBCOLLECTION_STR);
2249 int sub_nodes = sub_children.getLength ();
2250
2251 // There is no subcollection
2252 if (sub_nodes < 1) {
2253 return;
2254 }
2255
2256 for (int i=0; i<sub_nodes; i++) {
2257 Element sub_child = (Element)sub_children.item (i);
2258 String name_str = sub_child.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2259 String filter_str = sub_child.getAttribute (StaticStrings.FILTER_ATTRIBUTE);
2260
2261 // filter_str is in the form '<! (if set)><metadata>/<metadata value>/<flag (if any)>'
2262
2263 int pos = filter_str.indexOf (StaticStrings.SEPARATOR_CHARACTER);
2264 String meta_str = "";
2265 String meta_value_str = "";
2266 String clude_str = "";
2267 String flag_str = "";
2268 if (pos == -1) {
2269
2270 meta_str = meta_value_str = filter_str;
2271 clude_str = StaticStrings.INCLUDE_STR;
2272 } else {
2273 clude_str = StaticStrings.INCLUDE_STR;
2274 if (filter_str.startsWith (StaticStrings.EXCLAMATION_CHARACTER)) {
2275 clude_str = StaticStrings.EXCLUDE_STR;
2276 // Peel off "!"
2277 filter_str = filter_str.substring (StaticStrings.EXCLAMATION_CHARACTER.length ());
2278 }
2279
2280 String[] strs = filter_str.split (StaticStrings.SEPARATOR_CHARACTER);
2281 if (strs[0] != null && strs[0] != "") {
2282 meta_str = strs[0];
2283 }
2284 if(!meta_str.equals (StaticStrings.FILENAME_STR) && meta_str.indexOf (StaticStrings.NS_SEP) == -1) {
2285 meta_str = StaticStrings.EXTRACTED_NAMESPACE + meta_str;
2286 }
2287
2288 if (strs[1] != null && strs[1] != "") {
2289 meta_value_str = strs[1];
2290 }
2291 if (strs.length > 2) {
2292 //This means there has been set a flag
2293 if (strs[2] != null && strs[2] != "") {
2294 flag_str = strs[2];
2295 }
2296 }
2297 }
2298 Element subcollection_element = to.createElement (StaticStrings.SUBCOLLECTION_ELEMENT);
2299 subcollection_element.setAttribute (StaticStrings.NAME_STR, name_str);
2300 subcollection_element.setAttribute (StaticStrings.CONTENT_ATTRIBUTE, meta_str);
2301 subcollection_element.setAttribute (StaticStrings.TYPE_ATTRIBUTE, clude_str);
2302 if (flag_str != "") {
2303 subcollection_element.setAttribute (StaticStrings.OPTIONS_ATTRIBUTE, flag_str);
2304 }
2305 XMLTools.setNodeText (subcollection_element, meta_value_str);
2306
2307 toElement.appendChild (subcollection_element);
2308 }
2309 }
2310 //Handle levels (document, section). In the internal structure, the element is called 'IndexOption'
2311 private void doLevel (Document to, Node searchNode) {
2312 Element toElement = to.getDocumentElement ();
2313 NodeList level_children = ((Element)searchNode).getElementsByTagName (StaticStrings.LEVEL_ATTRIBUTE);
2314 int level_nodes = level_children.getLength ();
2315
2316 // it's mg, there's no level. So we construct a default 'indexOption' in the internal structure
2317 if (level_nodes < 1) {
2318 Element index_option = to.createElement (StaticStrings.INDEXOPTIONS_ELEMENT);
2319 index_option.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR);
2320 index_option.setAttribute (StaticStrings.NAME_STR, StaticStrings.LEVELS_STR);
2321
2322 Element option_element = to.createElement (StaticStrings.OPTION_ELEMENT);
2323 option_element.setAttribute (StaticStrings.NAME_STR, StaticStrings.DOCUMENT_STR);
2324 index_option.appendChild (option_element);
2325
2326 appendProperly (toElement, index_option);
2327
2328 return;
2329 }
2330
2331 Element index_option = to.createElement (StaticStrings.INDEXOPTIONS_ELEMENT);
2332 index_option.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2333 index_option.setAttribute (StaticStrings.NAME_STR, StaticStrings.LEVELS_STR);
2334
2335 for (int i=0; i<level_nodes; i++) {
2336 Element level_element = (Element)level_children.item (i);
2337 String level_str = level_element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2338 Element option_element = to.createElement (StaticStrings.OPTION_ELEMENT);
2339 option_element.setAttribute (StaticStrings.NAME_STR, level_str);
2340 index_option.appendChild (option_element);
2341
2342
2343 // Contructing 'collectionmetadata' elements from the 'displayItem' of this 'level' element
2344 ArrayList displayItem_list = XMLTools.getNamedElementList (level_element,
2345 StaticStrings.DISPLAYITEM_STR, StaticStrings.NAME_ATTRIBUTE, StaticStrings.NAME_STR);
2346 if (displayItem_list == null) {
2347 return ;
2348 }
2349 for (int j=0; j<displayItem_list.size (); j++) {
2350 Element item = (Element)displayItem_list.get (j);
2351 String text = XMLTools.getNodeText (item);
2352 String lang = item.getAttribute (StaticStrings.LANG_ATTRIBUTE);
2353
2354 //If there is nothing to display, don't bother creating the element
2355 if (text == "") {
2356 continue;
2357 }
2358 Element collectionmetadata = to.createElement (StaticStrings.COLLECTIONMETADATA_ELEMENT);
2359 collectionmetadata.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2360 collectionmetadata.setAttribute (StaticStrings.NAME_ATTRIBUTE, level_str);
2361 collectionmetadata.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, lang);
2362 XMLTools.setNodeText (collectionmetadata, text);
2363
2364 appendProperly (toElement, collectionmetadata);
2365 }
2366 }
2367 appendProperly (toElement, index_option);
2368 }
2369 //Handle 'indexSubcollection' element of collectionConfig.xml, which is called 'SubcollectionIndexes' in the internal structure. These contain the subcollection indexes (i.e. the filter or filter combinations), and displayed words for the filter names.
2370 private void doIndexSubcollection (Document to, Node searchNode) {
2371 Element toElement = to.getDocumentElement ();
2372 NodeList index_sub_children = ((Element)searchNode).getElementsByTagName (StaticStrings.SUBCOLLECTION_INDEX_ELEMENT);
2373 int num_nodes = index_sub_children.getLength ();
2374
2375 // there is no subcollection index
2376 if (num_nodes < 1) {
2377 return;
2378 }
2379
2380 Element subcollection_indexes = to.createElement (StaticStrings.SUBCOLLECTION_INDEXES_ELEMENT);
2381
2382 for (int i=0; i<num_nodes; i++) {
2383 Element index_element = to.createElement (StaticStrings.INDEX_ELEMENT);
2384 Element index_sub_child = (Element)index_sub_children.item (i);
2385 String name_str = index_sub_child.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2386
2387 // name_str is in the form of comma separated strings, each of which is a subcollection filter name
2388 String[] filters = name_str.split (StaticStrings.COMMA_CHARACTER);
2389 for (int j=0; j<filters.length; j++) {
2390
2391 Element content_element = to.createElement (StaticStrings.CONTENT_ELEMENT);
2392 content_element.setAttribute (StaticStrings.NAME_STR, filters[j]);
2393 index_element.appendChild (content_element);
2394 }
2395 subcollection_indexes.appendChild (index_element);
2396
2397 // Contructing 'collectionmetadata' elements from the 'displayItem' of this 'indexSubcollection' element
2398 ArrayList displayItem_list = XMLTools.getNamedElementList (index_sub_child,
2399 StaticStrings.DISPLAYITEM_STR, StaticStrings.NAME_ATTRIBUTE, StaticStrings.NAME_STR);
2400 if (displayItem_list == null) {
2401 // there is no display item for this element
2402 continue;
2403 }
2404 for (int j=0; j<displayItem_list.size (); j++) {
2405 Element item = (Element)displayItem_list.get (j);
2406 String text = XMLTools.getNodeText (item);
2407 String lang = item.getAttribute (StaticStrings.LANG_ATTRIBUTE);
2408
2409 //If there is nothing to display, don't bother creating the element
2410 if (text == "") {
2411 continue;
2412 }
2413 Element collectionmetadata = to.createElement (StaticStrings.COLLECTIONMETADATA_ELEMENT);
2414 collectionmetadata.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2415 collectionmetadata.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
2416 collectionmetadata.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, lang);
2417 XMLTools.setNodeText (collectionmetadata, text);
2418
2419 appendProperly (toElement, collectionmetadata);
2420 }
2421 }
2422 appendProperly (toElement, subcollection_indexes);
2423 }
2424 //Handle 'indexLanguage' element of collectionConfig.xml, which is called 'Languages' in the internal structure. These contain the language indexes, and displayed words for those language index names.
2425 private void doIndexLanguage (Document to, Node searchNode) {
2426 Element toElement = to.getDocumentElement ();
2427 NodeList index_sub_children = ((Element)searchNode).getElementsByTagName (StaticStrings.LANGUAGE_INDEX_ELEMENT);
2428 int num_nodes = index_sub_children.getLength ();
2429
2430 // there is no subcollection index
2431 if (num_nodes < 1) {
2432 return;
2433 }
2434
2435 Element language_indexes = to.createElement (StaticStrings.LANGUAGES_ELEMENT);
2436
2437 for (int i=0; i<num_nodes; i++) {
2438 Element language_element = to.createElement (StaticStrings.LANGUAGE_ELEMENT);
2439 Element index_sub_child = (Element)index_sub_children.item (i);
2440 String name_str = index_sub_child.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2441 language_element.setAttribute (StaticStrings.NAME_STR, name_str);
2442 language_indexes.appendChild (language_element);
2443
2444 // Contructing 'collectionmetadata' elements from the 'displayItem' of this 'indexLanguage' element
2445 ArrayList displayItem_list = XMLTools.getNamedElementList (index_sub_child,
2446 StaticStrings.DISPLAYITEM_STR, StaticStrings.NAME_ATTRIBUTE, StaticStrings.NAME_STR);
2447 if (displayItem_list == null) {
2448 // there is no display item for this element
2449 continue;
2450 }
2451 for (int j=0; j<displayItem_list.size (); j++) {
2452 Element item = (Element)displayItem_list.get (j);
2453 String text = XMLTools.getNodeText (item);
2454 String lang = item.getAttribute (StaticStrings.LANG_ATTRIBUTE);
2455
2456 //If there is nothing to display, don't bother creating the element
2457 if (text == "") {
2458 continue;
2459 }
2460 Element collectionmetadata = to.createElement (StaticStrings.COLLECTIONMETADATA_ELEMENT);
2461 collectionmetadata.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2462 collectionmetadata.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
2463 collectionmetadata.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, lang);
2464 XMLTools.setNodeText (collectionmetadata, text);
2465
2466 appendProperly (toElement, collectionmetadata);
2467 }
2468 }
2469 toElement.appendChild (language_indexes);
2470 }
2471 // Handling both searchType and search format statement
2472 private void doSearchFormat (Document to, Node searchNode) {
2473 //There are two elements called <format> in <search>: one is for searchType; another is for format statement
2474 NodeList format_children = ((Element)searchNode).getElementsByTagName (StaticStrings.FORMAT_STR);
2475 int format_nodes = format_children.getLength ();
2476 if (format_nodes < 1) {
2477 return;
2478 }
2479 Element format = null;
2480 Element search_type = null;
2481 for(int i=0; i<format_nodes; i++) {
2482 Node e = format_children.item (i);
2483 if (e.hasAttributes () == false) {
2484 //The format element for format statement has no any attribute
2485 format = (Element)e;
2486 }
2487 else if (((Element)e).getAttribute (StaticStrings.NAME_ATTRIBUTE).equals(StaticStrings.SEARCHTYPE_ELEMENT)) {
2488 search_type = (Element)e;
2489 }
2490 }
2491 //format statement for search
2492 if (format != null) {
2493 (to.getDocumentElement ()).appendChild (doFormat(to, format, StaticStrings.SEARCH_STR));
2494 }
2495 // searchType in search
2496 if(search_type != null) {
2497 String searchtype_str = XMLTools.getNodeText(search_type);
2498
2499 Element search_type_element = to.createElement (StaticStrings.FORMAT_STR);
2500 search_type_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, StaticStrings.SEARCHTYPE_ELEMENT);
2501 XMLTools.setNodeText(search_type_element, searchtype_str);
2502
2503
2504 appendProperly (to.getDocumentElement (), search_type_element);
2505 }
2506 }
2507 // Handling defaultIndexLanguage and languageMetadata in collectionConfig.xml ('elementNameFrom'); in the internal structure, they are called 'DefaultLanguage' and 'LanguageMetadata' ('elementNameTo') respectively.
2508 // Converting from collectionConfig.xml to the internal xml structure.
2509 private void doLanguageMetadata (Document to, Node searchNode) {
2510 Element toElement = to.getDocumentElement ();
2511 String elementNameFrom = StaticStrings.LANGUAGE_METADATA_ELEMENT_STR;
2512 String elementNameTo = StaticStrings.LANGUAGE_METADATA_ELEMENT;
2513 Node from_element = XMLTools.getChildByTagName (searchNode, elementNameFrom);
2514 if (from_element == null) {
2515 return; // such an element not found
2516 }
2517
2518 Element to_element = to.createElement (elementNameTo);
2519
2520 String name_str = ((Element)from_element).getAttribute (StaticStrings.NAME_ATTRIBUTE);
2521 if (name_str.indexOf (StaticStrings.NS_SEP) == -1) {
2522 name_str = StaticStrings.EXTRACTED_NAMESPACE + name_str;
2523 }
2524 to_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
2525 to_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2526
2527 toElement.appendChild (to_element);
2528 }
2529 private void doReplaceListRef (Document to, Element from) {
2530 Element toElement = to.getDocumentElement ();
2531
2532 Node replace_element = XMLTools.getChildByTagName (from, StaticStrings.REPLACELISTREF_STR);
2533 if (replace_element == null) {
2534 return; // such an element not found
2535 }
2536
2537 Element to_element = XMLTools.duplicateElement (to, (Element)replace_element, true);
2538 toElement.appendChild (to_element);
2539 }
2540 private void convertReplaceListRef (Document from, Document to) {
2541 Element toElement = to.getDocumentElement ();
2542
2543 Node replace_element = XMLTools.getChildByTagName (from.getDocumentElement (), StaticStrings.REPLACELISTREF_STR);
2544 if (replace_element == null) {
2545 return; // such an element not found
2546 }
2547
2548 Element to_element = XMLTools.duplicateElement (to, (Element)replace_element, true);
2549 toElement.appendChild (to_element);
2550 }
2551 private void doOAIElement (Document to, Element from) {
2552 Element toElement = to.getDocumentElement ();
2553
2554 Node oai_element = XMLTools.getChildByTagName (from, StaticStrings.OAI_ELEMENT);
2555 if (oai_element == null) {
2556 return; // such an element not found
2557 }
2558
2559 Element to_element = XMLTools.duplicateElement (to, (Element)oai_element, true);
2560 toElement.appendChild (to_element);
2561 }
2562 private void convertOAIElement (Document from, Document to) {
2563 Element toElement = to.getDocumentElement ();
2564
2565 Node oai_element = XMLTools.getChildByTagName (from.getDocumentElement (), StaticStrings.OAI_ELEMENT);
2566 if (oai_element == null) {
2567 return; // such an element not found
2568 }
2569
2570 Element to_element = XMLTools.duplicateElement (to, (Element)oai_element, true);
2571 toElement.appendChild (to_element);
2572 }
2573 private void doDefaultIndexLanguage (Document to, Node searchNode) {
2574 Element toElement = to.getDocumentElement ();
2575 String elementNameFrom = StaticStrings.LANGUAGE_DEFAULT_INDEX_ELEMENT;
2576 String elementNameTo = StaticStrings.LANGUAGE_DEFAULT_ELEMENT;
2577 Node from_element = XMLTools.getChildByTagName (searchNode, elementNameFrom);
2578 if (from_element == null) {
2579 return; // such an element not found
2580 }
2581
2582 Element to_element = to.createElement (elementNameTo);
2583
2584 String name_str = ((Element)from_element).getAttribute (StaticStrings.NAME_ATTRIBUTE);
2585 to_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
2586 to_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2587
2588 toElement.appendChild (to_element);
2589 }
2590
2591 //Handle 'indexOption' (i.e. casefold, stem etc). In the internal structure, the element is called 'IndexOption'
2592 private void doIndexOption (Document to, Node searchNode) {
2593 Element toElement = to.getDocumentElement ();
2594 Node index_option_node = XMLTools.getChildByTagName (searchNode, StaticStrings.INDEXOPTION_STR);
2595 if (index_option_node == null) {
2596 return;
2597 }
2598 NodeList option_children = ((Element)index_option_node).getElementsByTagName (StaticStrings.OPTION_STR);
2599 int option_nodes = option_children.getLength ();
2600
2601 // for lucene, there is no 'indexOption'. We build a default 'indexOption' and 'assigned=false' in case the user switches to mg or mgpp
2602 if (option_nodes < 1) {
2603 Element index_option = to.createElement (StaticStrings.INDEXOPTIONS_ELEMENT);
2604 index_option.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR);
2605 index_option.setAttribute (StaticStrings.NAME_STR, StaticStrings.INDEXOPTIONS_STR);
2606 String[] option_str =
2607 { StaticStrings.CASEFOLD_OPTION_STR, StaticStrings.STEM_OPTION_STR };
2608 for (int i=0; i<option_str.length; i++) {
2609 Element option_element = to.createElement (StaticStrings.OPTION_ELEMENT);
2610 option_element.setAttribute (StaticStrings.NAME_STR, option_str[i]);
2611 index_option.appendChild (option_element);
2612 }
2613 appendProperly (toElement, index_option);
2614 return;
2615 }
2616
2617 Element index_option = to.createElement (StaticStrings.INDEXOPTIONS_ELEMENT);
2618 index_option.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2619 index_option.setAttribute (StaticStrings.NAME_STR, StaticStrings.INDEXOPTIONS_STR);
2620
2621 for (int i=0; i<option_nodes; i++) {
2622 String option_str = ((Element)option_children.item (i)).getAttribute (StaticStrings.NAME_ATTRIBUTE);
2623 Element option_element = to.createElement (StaticStrings.OPTION_ELEMENT);
2624 option_element.setAttribute (StaticStrings.NAME_STR, option_str);
2625 index_option.appendChild (option_element);
2626 }
2627 appendProperly (toElement, index_option);
2628 }
2629
2630 private Element doBuildType (Document to, String att_value) {
2631
2632 //construct 'BuildType' element
2633 Element element = to.createElement (StaticStrings.BUILDTYPE_ELEMENT);
2634 element.setAttribute (StaticStrings.NAME_ATTRIBUTE, StaticStrings.BUILDTYPE_STR);
2635 element.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, StaticStrings.ENGLISH_LANGUAGE_STR);
2636 element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2637 element.setAttribute (StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR);
2638
2639 XMLTools.setNodeText (element, att_value);
2640
2641 return element;
2642 }
2643
2644 // Convert 'description', 'smallicon' etc.
2645 private void convertDisplayItemList (Document from, Document to) {
2646 Element displayItemList = to.createElement (StaticStrings.DISPLAYITEMLIST_STR);
2647 Element destination = to.getDocumentElement ();
2648
2649 String []att_values =
2650 {StaticStrings.COLLECTIONMETADATA_COLLECTIONEXTRA_STR,
2651 StaticStrings.COLLECTIONMETADATA_ICONCOLLECTIONSMALL_STR,
2652 StaticStrings.COLLECTIONMETADATA_ICONCOLLECTION_STR,
2653 StaticStrings.COLLECTIONMETADATA_COLLECTIONNAME_STR};
2654
2655 String []map_attrs =
2656 {StaticStrings.DESCRIPTION_STR,
2657 StaticStrings.SMALLICON_STR,
2658 StaticStrings.ICON_STR,
2659 StaticStrings.NAME_STR};
2660
2661 for (int i=0; i<att_values.length; i++) {
2662
2663 //dOc
2664 ArrayList e_list = XMLTools.getNamedElementList (from.getDocumentElement (),
2665 StaticStrings.COLLECTIONMETADATA_ELEMENT,
2666 StaticStrings.NAME_ATTRIBUTE, att_values[i]);
2667 // if such elements don't exist, don't bother
2668 if (e_list == null) {
2669 continue;
2670 }
2671 for (int j=0; j<e_list.size (); j++) {
2672 Element e = (Element)e_list.get (j);
2673 if (e.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
2674 continue;
2675 }
2676 String text = XMLTools.getNodeText (e);
2677 String lang = e.getAttribute (StaticStrings.LANGUAGE_ATTRIBUTE);
2678
2679 Element displayItem = constructElement (StaticStrings.DISPLAYITEM_STR, map_attrs[i],
2680 StaticStrings.LANG_STR, lang, text, to);
2681 displayItemList.appendChild (displayItem);
2682 }
2683
2684 }
2685 destination.appendChild (displayItemList);
2686 }
2687 // This method creates a DisplayItem element of the type of 'to' by using the ingredients from the element 'e'
2688 private Element constructDisplayItem (Element e, Document to) {
2689 String lang_string = e.getAttribute (StaticStrings.LANGUAGE_ATTRIBUTE);
2690 String text = XMLTools.getNodeText (e);
2691 Element displayItem = to.createElement (StaticStrings.DISPLAYITEM_STR);
2692 displayItem.setAttribute (StaticStrings.NAME_ATTRIBUTE, StaticStrings.NAME_ATTRIBUTE);
2693 displayItem.setAttribute (StaticStrings.LANG_STR, lang_string);
2694 XMLTools.setNodeText (displayItem, text);
2695 return displayItem;
2696 }
2697 private void convertMetadataList (Document from, Document to) {
2698 Element metadataList = to.createElement (StaticStrings.METADATALIST_STR);
2699 Element destination = to.getDocumentElement ();
2700
2701 String []ele_names =
2702 {StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT,
2703 StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT,
2704 StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT};
2705 String []att_names =
2706 {StaticStrings.COLLECTIONMETADATA_CREATOR_STR,
2707 StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR,
2708 StaticStrings.COLLECTIONMETADATA_PUBLIC_STR};
2709 for (int i=0; i<ele_names.length; i++) {
2710 Element e = XMLTools.getNamedElement (from.getDocumentElement (),
2711 ele_names[i], StaticStrings.NAME_ATTRIBUTE, att_names[i]);
2712 if (e == null) {
2713 continue;
2714 }
2715 String text = XMLTools.getNodeText (e);
2716 Element metadata = to.createElement (StaticStrings.METADATA_STR);
2717 metadata.setAttribute (StaticStrings.NAME_ATTRIBUTE, att_names[i]);
2718 metadata.setAttribute (StaticStrings.LANG_STR, StaticStrings.ENGLISH_LANGUAGE_STR);
2719 XMLTools.setNodeText (metadata, text);
2720 metadataList.appendChild (metadata);
2721 }
2722
2723 destination.appendChild (metadataList);
2724 }
2725 // This method creates an element with the name 'element_name' of the type of 'to' by using the other three strings
2726 private Element constructElement (String element_name, String name_value, String lang_att, String lang_value, String text, Document to) {
2727 Element e = to.createElement (element_name);
2728 e.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2729 e.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_value);
2730 e.setAttribute (lang_att, lang_value);
2731 XMLTools.setNodeText (e, text);
2732
2733 return e;
2734 }
2735 // Convert classify in the internal(i.e. Document from) to collectionconfig.xml (i.e. Document to)
2736 private void convertClassifier (Document from, Document to) {
2737 Element browse_element = to.createElement (StaticStrings.BROWSE_STR);
2738 NodeList children = from.getDocumentElement ().getElementsByTagName (StaticStrings.CLASSIFY_ELEMENT);
2739
2740 int num_children = (children == null)? 0 : children.getLength ();
2741
2742 if (num_children == 0) {
2743 return ;
2744 }
2745
2746 for (int i=0; i<num_children; i++) {
2747
2748 Element child = (Element)children.item (i);
2749 if (child.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
2750 continue;
2751 }
2752 String str = child.getAttribute (StaticStrings.TYPE_ATTRIBUTE);
2753 Element classifier_element = to.createElement (StaticStrings.CLASSIFIER_STR);
2754 classifier_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, str);
2755
2756 NodeList option_children = child.getElementsByTagName (StaticStrings.OPTION_ELEMENT);
2757 for (int j=0; j<option_children.getLength (); j++) {
2758 Element el = (Element)option_children.item (j);
2759 if (el.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
2760 continue;
2761 }
2762 String name_str = el.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2763 String value_str = XMLTools.getNodeText (el);
2764
2765
2766 if (name_str == null && value_str == null) {
2767 continue;
2768 }
2769 Element option_element = to.createElement (StaticStrings.OPTION_STR);
2770 if (name_str != null && name_str.equals (StaticStrings.METADATA_STR)) {
2771
2772 // The metadata argument is the fully qualified name of a metadata element, so if it contains a namespace, remove the extracted metadata namespace as the build process doesn't know about it.
2773 String[] values = value_str.split (StaticStrings.COMMA_CHARACTER);
2774 value_str = "";
2775 for (int k=0; k<=values.length-1; k++) {
2776 if(values[k].startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
2777 values[k] = values[k].substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
2778 }
2779 else {
2780 MetadataElement metadata_element = MetadataTools.getMetadataElementWithDisplayName (values[k]);
2781 if (metadata_element != null) {
2782 values[k] = metadata_element.getFullName ();
2783 }
2784 }
2785 if (k < values.length-1) {
2786 value_str = value_str + values[k] + StaticStrings.COMMA_CHARACTER;
2787 } else {
2788 value_str = value_str + values[k];
2789 }
2790 }
2791 }
2792
2793 if (!name_str.equals ("")) {
2794 if (!name_str.startsWith (StaticStrings.MINUS_CHARACTER)) {
2795 name_str = StaticStrings.MINUS_CHARACTER + name_str;
2796 }
2797 option_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
2798 }
2799
2800 if (!value_str.equals ("")) {
2801 option_element.setAttribute (StaticStrings.VALUE_ATTRIBUTE, value_str);
2802 }
2803
2804 classifier_element.appendChild (option_element);
2805 }
2806
2807 //format element for this classifier
2808 Element e = (Element)XMLTools.getChildByTagName (child, StaticStrings.FORMAT_STR);
2809
2810 if (e != null) {
2811 classifier_element.appendChild (convertFormat(to, e));
2812 }
2813 browse_element.appendChild (classifier_element);
2814 }
2815
2816 //convert default classifier format
2817 Element e = XMLTools.getNamedElement (from.getDocumentElement (), StaticStrings.FORMAT_STR,
2818 StaticStrings.NAME_ATTRIBUTE, StaticStrings.BROWSE_STR);
2819 browse_element.appendChild (convertFormat(to, e));
2820
2821 to.getDocumentElement ().appendChild (browse_element);
2822 }
2823 private Element convertFormat(Document to, Element e) {
2824 String format_str = XMLTools.getNodeText(e);
2825 Element format = to.createElement (StaticStrings.FORMAT_STR);
2826 //XMLTools.copyAllChildren (format, e);
2827 XMLTools.setNodeText(format, format_str);
2828 return format;
2829 }
2830 //convert format statement for search
2831 private void convertSearchFormat (Document from, Document to) {
2832 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR);
2833 Element e = XMLTools.getNamedElement (from.getDocumentElement (), StaticStrings.FORMAT_STR,
2834 StaticStrings.NAME_ATTRIBUTE, StaticStrings.SEARCH_STR);
2835
2836 search.appendChild (convertFormat(to, e));
2837
2838 }
2839 //convert format statement for display of the documents
2840 private void convertDisplayFormat (Document from, Document to) {
2841 Element e = XMLTools.getNamedElement (from.getDocumentElement (), StaticStrings.FORMAT_STR,
2842 StaticStrings.NAME_ATTRIBUTE, StaticStrings.DISPLAY_STR);
2843 if (e == null) {
2844 return;
2845 }
2846 Element display = to.createElement (StaticStrings.DISPLAY_STR);
2847 display.appendChild (convertFormat(to, e));
2848 to.getDocumentElement ().appendChild (display);
2849 }
2850 // Convert plugins in the internal(i.e. Document from) to collectionconfig.xml (i.e. Document to)
2851 private void convertPlugin (Document from, Document to) {
2852 Element import_element = to.createElement (StaticStrings.IMPORT_STR);
2853 Element plugin_list_element = to.createElement (StaticStrings.PLUGINLIST_STR);
2854
2855 NodeList children = from.getDocumentElement ().getElementsByTagName (StaticStrings.PLUGIN_ELEMENT);
2856 int num_children = (children == null)? 0 : children.getLength ();
2857 if (num_children == 0) {
2858 return ;
2859 }
2860
2861 for (int i=0; i<num_children; i++) {
2862
2863 Element child = (Element)children.item (i);
2864 if (child.getAttribute (StaticStrings.SEPARATOR_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
2865 continue;
2866 }
2867 if (child.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
2868 continue;
2869 }
2870
2871 String str = child.getAttribute (StaticStrings.TYPE_ATTRIBUTE);
2872 Element plugin_element = to.createElement (StaticStrings.PLUGIN_STR);
2873 plugin_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, str);
2874
2875 NodeList option_children = child.getElementsByTagName (StaticStrings.OPTION_ELEMENT);
2876 for (int j=0; j<option_children.getLength (); j++) {
2877 Element el = (Element)option_children.item (j);
2878 if(!el.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
2879 continue;
2880 }
2881 String name_str = el.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2882 String value_str = XMLTools.getNodeText (el);
2883
2884
2885 if (name_str == null && value_str == null) {
2886 continue;
2887 }
2888 Element option_element = to.createElement (StaticStrings.OPTION_STR);
2889 if (name_str != null && name_str.equals (StaticStrings.METADATA_STR)) {
2890
2891 // The metadata argument is the fully qualified name of a metadata element, so if it contains a namespace, remove the extracted metadata namespace as the build process doesn't know about it.
2892 String[] values = value_str.split (StaticStrings.COMMA_CHARACTER);
2893 value_str = "";
2894 for (int k=0; k<=values.length-1; k++) {
2895 if(values[k].startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
2896 values[k] = values[k].substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
2897 }
2898
2899 if (k < values.length-1) {
2900 value_str = value_str + values[k] + StaticStrings.COMMA_CHARACTER;
2901 } else {
2902 value_str = value_str + values[k];
2903 }
2904 }
2905 }
2906
2907 if (!name_str.equals ("")) {
2908 if (!name_str.startsWith (StaticStrings.MINUS_CHARACTER)) {
2909 name_str = StaticStrings.MINUS_CHARACTER + name_str;
2910 }
2911 option_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
2912 }
2913
2914 if (!value_str.equals ("")) {
2915 option_element.setAttribute (StaticStrings.VALUE_ATTRIBUTE, value_str);
2916 }
2917
2918 plugin_element.appendChild (option_element);
2919 }//for loop ends
2920
2921 plugin_list_element.appendChild (plugin_element);
2922 }//for loop ends
2923
2924 import_element.appendChild (plugin_list_element);
2925
2926 //do the plugout element (used by building flax collections)
2927 Node plugout = XMLTools.getChildByTagNameIndexed (from.getDocumentElement (), PLUGOUT_ELEMENT, 0);
2928 if (plugout != null) {
2929 Element to_element = XMLTools.duplicateElement (to, (Element)plugout, true);
2930 import_element.appendChild (to_element);
2931 }
2932
2933 to.getDocumentElement ().appendChild (import_element);
2934 }
2935
2936 //Handle 'searchType' of collectionConfig.xml. In the internal structure, its also called 'searchType', eg. plain, form
2937 private void convertSearchType (Document from, Document to) {
2938 Element e = XMLTools.getNamedElement (from.getDocumentElement (), StaticStrings.FORMAT_STR,
2939 StaticStrings.NAME_ATTRIBUTE, StaticStrings.SEARCHTYPE_ELEMENT);//searchType
2940
2941 if (e == null) {
2942 return;
2943 }
2944 Element search_type_element = to.createElement (StaticStrings.FORMAT_STR);
2945
2946// String searchtype_str = e.getAttribute (StaticStrings.VALUE_ATTRIBUTE);
2947// search_type_element.setAttribute (StaticStrings.VALUE_ATTRIBUTE, searchtype_str);
2948 String searchtype_str = XMLTools.getNodeText(e);
2949 XMLTools.setNodeText(search_type_element, searchtype_str);
2950
2951 search_type_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, StaticStrings.SEARCHTYPE_ELEMENT);
2952 //Get the 'search' element from 'to'
2953 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR);
2954 search.appendChild (search_type_element);
2955 }
2956
2957 private void convertBuildType (Document from, Document to) {
2958 Element e = XMLTools.getNamedElement (from.getDocumentElement (),
2959 StaticStrings.BUILDTYPE_ELEMENT,
2960 StaticStrings.NAME_ATTRIBUTE, StaticStrings.BUILDTYPE_STR);
2961 if (e == null) {
2962 return;
2963 }
2964 String indexer = XMLTools.getNodeText (e);
2965 Element search = to.createElement (StaticStrings.SEARCH_STR);
2966 search.setAttribute (StaticStrings.TYPE_ATTRIBUTE, indexer);
2967 to.getDocumentElement ().appendChild (search);
2968 }
2969 private void convertDefaultIndex (Document from, Document to, Element search) {
2970 Element source = from.getDocumentElement ();
2971
2972 Element default_index_element = (Element)XMLTools.getChildByTagName (source, StaticStrings.INDEX_DEFAULT_ELEMENT);
2973 if (default_index_element == null) {
2974 return;
2975 }
2976
2977 String indexer = search.getAttribute (StaticStrings.TYPE_ATTRIBUTE);
2978 String level_str = default_index_element.getAttribute (StaticStrings.LEVEL_ATTRIBUTE);
2979 // Debugging purposes
2980 if (level_str.equals ("") && indexer.equals (StaticStrings.MG_STR) ) {
2981 System.out.println ("Bug: DefaultIndex should have its level attribute not empty.");
2982 }
2983
2984 NodeList content_elements = default_index_element.getElementsByTagName (StaticStrings.CONTENT_ELEMENT);
2985 int content_elements_length = content_elements.getLength ();
2986
2987 // Don't output anything if no indexes are set
2988 if(content_elements_length == 0) {
2989 return ;//
2990 }
2991
2992 String index_str = "";
2993
2994 if (indexer.equals (StaticStrings.MG_STR)) {
2995 //combine level with indexes
2996 index_str = level_str + StaticStrings.COLON_CHARACTER;
2997 }
2998 else { //for mgpp/lucene, just take index
2999 //do nothing
3000 }
3001
3002 for(int k = 0; k < content_elements_length; k++) {
3003 Element content_element = (Element) content_elements.item (k);
3004 if (content_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3005 continue;
3006 }
3007 String name_str = content_element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3008
3009 if(name_str.startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
3010 name_str = name_str.substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
3011 }
3012
3013 index_str = index_str + name_str;
3014
3015 // Make it comma separated string
3016 if(k < content_elements_length - 1) {
3017 index_str = index_str + StaticStrings.COMMA_CHARACTER;
3018 }
3019 content_element = null;
3020 }//for loop ends
3021
3022
3023 Element default_index = to.createElement (StaticStrings.INDEX_DEFAULT_ELEMENT_LOWERCASE);
3024 default_index.setAttribute (StaticStrings.NAME_ATTRIBUTE, index_str);
3025 search.appendChild (default_index);
3026
3027 }
3028 private void convertSubcollection (Document from, Document to) {
3029 Element source = from.getDocumentElement ();
3030 //Get the 'search' element from 'to' which has already been created in 'convertBuildType'
3031 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR);
3032
3033 // Get the Subcollection element from the internal structure
3034 NodeList subcollection_elements = source.getElementsByTagName (StaticStrings.SUBCOLLECTION_ELEMENT);
3035 if (subcollection_elements == null) {
3036 return;
3037 }
3038 int subcollection_elements_length = subcollection_elements.getLength ();
3039
3040 if (subcollection_elements_length == 0) { // no
3041 return ;
3042 }
3043
3044 for(int j = 0; j < subcollection_elements_length; j++) {
3045
3046 Element e = (Element) subcollection_elements.item (j);
3047 if (e.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3048 continue;
3049 }
3050 String content = e.getAttribute (StaticStrings.CONTENT_ATTRIBUTE);
3051 String name = e.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3052 String options = e.getAttribute (StaticStrings.OPTIONS_ATTRIBUTE);
3053 String type = e.getAttribute (StaticStrings.TYPE_ATTRIBUTE);
3054 String text = XMLTools.getNodeText (e);
3055
3056 String filter = "";
3057 if (type.equals (StaticStrings.EXCLUDE_STR)) {
3058 filter = StaticStrings.EXCLAMATION_CHARACTER;
3059 }
3060
3061 if(content.startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
3062 content = content.substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
3063 }
3064 filter = filter + content + StaticStrings.SEPARATOR_CHARACTER + text;
3065 if (options != null && options != "") {
3066 filter = filter + StaticStrings.SEPARATOR_CHARACTER + options;
3067 }
3068 Element subcollection = to.createElement (StaticStrings.SUBCOLLECTION_STR);
3069 subcollection.setAttribute (StaticStrings.FILTER_ATTRIBUTE, filter);
3070 subcollection.setAttribute (StaticStrings.NAME_ATTRIBUTE, name);
3071
3072 search.appendChild (subcollection);
3073 }
3074 }
3075 private void convertSubcollectionIndexes (Document from, Document to) {
3076 Element source = from.getDocumentElement ();
3077 //Get the 'search' element from 'to' which has already been created in 'convertBuildType'
3078 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR);
3079
3080 // Get the SubcollectionIndexes element from the internal structure
3081 Element subcollection_indexes = (Element)XMLTools.getChildByTagName (source, StaticStrings.SUBCOLLECTION_INDEXES_ELEMENT);
3082 if (subcollection_indexes == null) {
3083 return;
3084 }
3085 NodeList index_elements = subcollection_indexes.getElementsByTagName (StaticStrings.INDEX_ELEMENT);
3086 int index_elements_length = index_elements.getLength ();
3087
3088 if (index_elements_length == 0) { // no indexes
3089 return ;
3090 }
3091
3092 for(int j = 0; j < index_elements_length; j++) {
3093 Element index_element = (Element) index_elements.item (j);
3094 if (index_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3095 continue;
3096 }
3097
3098 Element index = to.createElement (StaticStrings.SUBCOLLECTION_INDEX_ELEMENT);
3099
3100 String index_value = "";
3101
3102 NodeList content_elements = index_element.getElementsByTagName (StaticStrings.CONTENT_ELEMENT);
3103 int content_elements_length = content_elements.getLength ();
3104
3105 for(int k = 0; k < content_elements_length; k++) {
3106 Element content_element = (Element) content_elements.item (k);
3107 if (content_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3108 continue;
3109 }
3110 String name_str = content_element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3111 index_value += name_str;
3112 // Make it comma separated string
3113 if(k < content_elements_length - 1) {
3114 index_value += StaticStrings.COMMA_CHARACTER;
3115 }
3116 content_element = null;
3117 }//for loop ends
3118
3119 index.setAttribute (StaticStrings.NAME_ATTRIBUTE, index_value);
3120
3121 // Now constructing 'displayItem' element for this 'indexSubcollection' element
3122 // from the collectionmetadata element
3123 ArrayList collectionmetadata_list = XMLTools.getNamedElementList (source,
3124 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3125 StaticStrings.NAME_ATTRIBUTE, index_value);
3126
3127 if (collectionmetadata_list != null) {
3128
3129 for(int k = 0; k < collectionmetadata_list.size (); k++) {
3130 Element collectionmetadata = (Element)collectionmetadata_list.get (k);
3131 if (collectionmetadata.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3132 continue;
3133 }
3134 Element displayItem = constructDisplayItem (collectionmetadata, to);
3135 index.appendChild (displayItem);
3136 }
3137 }
3138
3139 search.appendChild (index);
3140
3141 } //for loop ends
3142 }
3143
3144 private void convertLanguages (Document from, Document to) {
3145 Element source = from.getDocumentElement ();
3146 //Get the 'search' element from 'to' which has already been created in 'convertBuildType'
3147 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR);
3148
3149 // Get the Languages element from the internal structure
3150 Element languages = (Element)XMLTools.getChildByTagName (source, StaticStrings.LANGUAGES_ELEMENT);
3151 if (languages == null) {
3152 return;
3153 }
3154 NodeList language_elements = languages.getElementsByTagName (StaticStrings.LANGUAGE_ELEMENT);
3155 int language_elements_length = language_elements.getLength ();
3156
3157 if (language_elements_length == 0) {
3158 return ;
3159 }
3160
3161 for(int j = 0; j < language_elements_length; j++) {
3162 Element element = (Element) language_elements.item (j);
3163 if (element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3164 continue;
3165 }
3166
3167 // Create indexLanguage element
3168 Element index_language = to.createElement (StaticStrings.LANGUAGE_INDEX_ELEMENT);
3169
3170 String name_str = element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3171 index_language.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
3172
3173 // Now constructing 'displayItem' element for this 'indexLanguage' element
3174 // from the collectionmetadata element
3175 ArrayList collectionmetadata_list = XMLTools.getNamedElementList (source,
3176 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3177 StaticStrings.NAME_ATTRIBUTE, name_str);
3178
3179 if (collectionmetadata_list != null) {
3180
3181 for(int k = 0; k < collectionmetadata_list.size (); k++) {
3182 Element collectionmetadata = (Element)collectionmetadata_list.get (k);
3183 if (collectionmetadata.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3184 continue;
3185 }
3186 Element displayItem = constructDisplayItem (collectionmetadata, to);
3187 index_language.appendChild (displayItem);
3188 }
3189 }
3190
3191 search.appendChild (index_language);
3192
3193 } //for loop ends
3194
3195 // Convert DefaultLanguage
3196 // Get the DefaultLanguage element from the internal structure
3197 Element default_language = (Element)XMLTools.getChildByTagName (source, StaticStrings.LANGUAGE_DEFAULT_ELEMENT);
3198 if(default_language != null) {
3199 String lang_name = default_language.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3200 Element default_index_language = to.createElement (StaticStrings.LANGUAGE_DEFAULT_INDEX_ELEMENT);
3201 default_index_language.setAttribute (StaticStrings.NAME_ATTRIBUTE, lang_name);
3202 search.appendChild (default_index_language);
3203 }
3204 // Convert LanguageMetadata
3205 // Get the LanguageMetadata element from the internal structure
3206 Element language_metadata = (Element)XMLTools.getChildByTagName (source, StaticStrings.LANGUAGE_METADATA_ELEMENT);
3207 if(language_metadata != null) {
3208 String meta_name = language_metadata.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3209 Element language_meta = to.createElement (StaticStrings.LANGUAGE_METADATA_ELEMENT_STR);
3210 if(meta_name.startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
3211 meta_name = meta_name.substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
3212 }
3213 language_meta.setAttribute (StaticStrings.NAME_ATTRIBUTE, meta_name);
3214 search.appendChild (language_meta);
3215 }
3216 }
3217
3218 //convert indexes and their displayItems, which go in 'search' element in collectionConfig.xml
3219 //parameter 'to' is the document to be saved as collectionConfig.xml
3220 //parameter 'from' is the internal xml structure
3221 private void convertIndex (Document from, Document to) {
3222 Element source = from.getDocumentElement ();
3223 //Get the 'search' element from 'to' which has already been created in 'convertBuildType'
3224 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR);
3225
3226 //THere are two sets of indexes elements, find the one which is assigned 'true'
3227 Element indexes = XMLTools.getNamedElement (source,
3228 StaticStrings.INDEXES_ELEMENT,
3229 StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
3230 if (indexes == null) {
3231 return;
3232 }
3233 NodeList index_elements = indexes.getElementsByTagName (StaticStrings.INDEX_ELEMENT);
3234 int index_elements_length = index_elements.getLength ();
3235
3236 if (index_elements_length == 0) { // no indexes
3237 return ;
3238 }
3239
3240 //find out it's mg or mgpp/lucene
3241 String mg = search.getAttribute (StaticStrings.TYPE_ATTRIBUTE);
3242 boolean mg_indexer = false;
3243 if (mg.equals (StaticStrings.MG_STR)) {
3244 mg_indexer = true;//it's mg, then the level is set as attribute of
3245 }
3246 if (mg_indexer == false) {
3247 // It's mgpp. Construct 'level' and 'defaultLevel' elements separately.
3248 convertLevels (from, to, search);
3249 }
3250
3251 for(int j = 0; j < index_elements_length; j++) {
3252 Element index_element = (Element) index_elements.item (j);
3253 if (index_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3254 continue;
3255 }
3256
3257 Element index_ele = to.createElement (StaticStrings.INDEX_LOW_STR);//index
3258
3259 // Used for creating displayItem for this element 'index_ele' further below
3260 // full_index_names contain 'ex.'
3261 String full_index_name = "";
3262 String level_str = "";
3263
3264 StringBuffer index_value = new StringBuffer ();
3265 if (mg_indexer == true) {
3266 // For mg indexer, there is a 'level' attribute in the index element of the internal structure
3267 // But mgpp/lucene don't
3268 level_str = index_element.getAttribute (StaticStrings.LEVEL_ATTRIBUTE);
3269 if(level_str.length () > 0) {
3270 index_value.append (level_str).append (StaticStrings.COLON_CHARACTER);
3271 //index_value = index_value.StaticStrings.COLON_CHARACTER;
3272 }
3273 }
3274
3275 NodeList content_elements = index_element.getElementsByTagName (StaticStrings.CONTENT_ELEMENT);
3276 int content_elements_length = content_elements.getLength ();
3277
3278 for(int k = 0; k < content_elements_length; k++) {
3279 Element content_element = (Element) content_elements.item (k);
3280 if (content_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3281 continue;
3282 }
3283 String name_str = content_element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3284
3285 full_index_name = full_index_name + name_str;
3286 if (k < content_elements_length - 1) {
3287 full_index_name = full_index_name + StaticStrings.COMMA_CHARACTER;
3288 }
3289
3290 if(name_str.startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
3291 name_str = name_str.substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
3292 }
3293
3294 index_value.append (name_str);
3295 name_str = null;
3296 // Make it comma separated string
3297 if(k < content_elements_length - 1) {
3298 index_value.append (StaticStrings.COMMA_CHARACTER);
3299 }
3300 content_element = null;
3301 }//for loop ends
3302
3303 String temp_str = index_value.toString ();
3304 index_ele.setAttribute (StaticStrings.NAME_ATTRIBUTE, temp_str);
3305
3306 // Now constructing 'displayItem' element for this 'index_ele' element
3307 // The index names in the collectionmetadata elements in the internal structure are not the names that
3308 // are used in the content elements (i.e. ex.Source or dc.Subject and keywords), but the names that are
3309 // in the configuration files (i.e. Source or dc.Subject)
3310 ArrayList collectionmetadata_list = XMLTools.getNamedElementList (source,
3311 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3312 StaticStrings.NAME_ATTRIBUTE, temp_str);
3313
3314 if (collectionmetadata_list == null) {
3315 //try the full name, i.e. with 'ex.'
3316 if (mg_indexer == true) {
3317 // but first append level info if we are mg
3318 full_index_name = level_str+StaticStrings.COLON_CHARACTER+full_index_name;
3319 }
3320 collectionmetadata_list = XMLTools.getNamedElementList (source,
3321 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3322 StaticStrings.NAME_ATTRIBUTE, full_index_name);
3323 }
3324
3325 if (collectionmetadata_list != null) {
3326
3327 for(int k = 0; k < collectionmetadata_list.size (); k++) {
3328 Element collectionmetadata = (Element)collectionmetadata_list.get (k);
3329 if (collectionmetadata.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3330 continue;
3331 }
3332 Element displayItem = constructDisplayItem (collectionmetadata, to);
3333
3334 index_ele.appendChild (displayItem);
3335 }
3336 }
3337
3338 search.appendChild (index_ele);
3339
3340 } //for loop ends
3341
3342 //Convert default index
3343 convertDefaultIndex (from, to, search);
3344 convertIndexOptions(from, to, search);
3345 }
3346 // Convert levels for mgpp/lucene. This method is called by converIndex() when mgpp indexer is detected.
3347 private void convertLevels (Document from, Document to, Element search) {
3348 Element source = from.getDocumentElement ();
3349 Element index_option = XMLTools.getNamedElement (source,
3350 StaticStrings.INDEXOPTIONS_ELEMENT,
3351 StaticStrings.NAME_ATTRIBUTE, StaticStrings.LEVELS_STR);
3352 if (index_option == null) {
3353 return;
3354 }
3355 //Debugging purposes
3356 if (index_option.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3357 DebugStream.println ("For mgpp, there should be an IndexOption element for levels which is assigned 'true': possible bug.");
3358 }
3359
3360 NodeList option_elements = index_option.getElementsByTagName (StaticStrings.OPTION_ELEMENT);
3361 int num_elements = option_elements.getLength ();
3362
3363 // Don't output anything if no indexes are set
3364 if(num_elements == 0) {
3365 return ;//
3366 }
3367
3368 for(int k = 0; k < num_elements; k++) {
3369 Element e = (Element) option_elements.item (k);
3370 String name_str = e.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3371 Element level_element = to.createElement (StaticStrings.LEVEL_ELEMENT);
3372 level_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
3373
3374 //Now construct displayItem for this level element from collectionmetadata
3375 ArrayList collectionmetadata_list = XMLTools.getNamedElementList (source,
3376 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3377 StaticStrings.NAME_ATTRIBUTE, name_str);
3378
3379 if (collectionmetadata_list != null) {
3380
3381 for(int j = 0; j < collectionmetadata_list.size (); j++) {
3382 Element collectionmetadata = (Element)collectionmetadata_list.get (j);
3383
3384 Element displayItem = constructDisplayItem (collectionmetadata, to);
3385 level_element.appendChild (displayItem);
3386 }
3387 }
3388 search.appendChild (level_element);
3389 }
3390
3391 //Convert default level
3392 Element default_index_option = XMLTools.getNamedElement (source,
3393 StaticStrings.INDEXOPTION_DEFAULT_ELEMENT,
3394 StaticStrings.NAME_ATTRIBUTE, StaticStrings.LEVEL_DEFAULT_STR);
3395 if (default_index_option == null) {
3396 return;
3397 }
3398 Element default_level = to.createElement (StaticStrings.LEVEL_DEFAULT_ELEMENT);
3399 String default_level_str = default_index_option.getAttribute (StaticStrings.VALUE_ATTRIBUTE);
3400 default_level.setAttribute (StaticStrings.NAME_ATTRIBUTE, default_level_str);
3401 search.appendChild (default_level);
3402
3403 }
3404 // Convert indexoptions for mg/mgpp/lucene. This method is called by convertIndex().
3405 private void convertIndexOptions (Document from, Document to, Element search) {
3406 Element source = from.getDocumentElement ();
3407 Element index_option = XMLTools.getNamedElement (source,
3408 StaticStrings.INDEXOPTIONS_ELEMENT,
3409 StaticStrings.NAME_ATTRIBUTE, StaticStrings.INDEXOPTIONS_STR);
3410 if (index_option == null) {
3411 return;
3412 }
3413 //Debugging purposes
3414 if (index_option.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3415 DebugStream.println ("There should be an IndexOption element which is assigned 'true': possible bug.");
3416 }
3417 Element indexOptionEl = to.createElement(StaticStrings.INDEXOPTION_STR);
3418 NodeList option_elements = index_option.getElementsByTagName (StaticStrings.OPTION_ELEMENT);
3419 int num_elements = option_elements.getLength ();
3420 // Don't output anything if no index
3421 if(num_elements == 0) {
3422 return ;//
3423 }
3424 search.appendChild (indexOptionEl);
3425
3426 for(int k = 0; k < num_elements; k++) {
3427 Element e = (Element) option_elements.item (k);
3428 String name_att = e.getAttribute(StaticStrings.NAME_ATTRIBUTE);
3429 Element optionEl = to.createElement(StaticStrings.OPTION_STR);
3430 optionEl.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_att);
3431 indexOptionEl.appendChild(optionEl);
3432 }
3433
3434 }
3435 // Append the element son to the element mother in the appropriate position.
3436 static public void appendProperly (Element mother, Element son) {
3437 if (son == null)
3438 return;
3439
3440 Node reference_node = findInsertionPoint (mother, son);
3441 if(reference_node != null) {
3442 mother.insertBefore (son, reference_node);
3443 }
3444 else {
3445 mother.appendChild (son);
3446 }
3447 }
3448 /** Find the best insertion position for the given DOM Element 'target_element' in the DOM Element 'document_element'. This should try to match command tag, and if found should then try to group by name or type (eg CollectionMeta), or append to end is no such grouping exists (eg Plugins). Failing a command match it will check against the command order for the best insertion location.
3449 * @param target_element the command Element to be inserted
3450 * @return the Element which the given command should be inserted before, or null to append to end of list
3451 */
3452 static public Node findInsertionPoint (Element document_element, Element target_element) {
3453 ///ystem.err.println("Find insertion point: " + target_element.getNodeName());
3454 String target_element_name = target_element.getNodeName ();
3455
3456 // Try to find commands with the same tag.
3457 NodeList matching_elements = document_element.getElementsByTagName (target_element_name);
3458 // If we found matching elements, then we have our most likely insertion location, so check within for groupings
3459 if(matching_elements.getLength () != 0) {
3460 ///ystem.err.println("Found matching elements.");
3461 // Only CollectionMeta are grouped.
3462 if(target_element_name.equals (StaticStrings.COLLECTIONMETADATA_ELEMENT)) {
3463 ///ystem.err.println("Dealing with collection metadata");
3464 // Special case: CollectionMeta can be added at either the start or end of a collection configuration file. However the start position is reserved for special metadata, so if no non-special metadata can be found we must append to the end.
3465 // So if the command to be added is special add it immediately after any other special command
3466 if(target_element.getAttribute (StaticStrings.SPECIAL_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
3467 int index = 0;
3468 Element matched_element = (Element) matching_elements.item (index);
3469 Element sibling_element = (Element) matched_element.getNextSibling ();
3470 while(sibling_element.getAttribute (StaticStrings.SPECIAL_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
3471 index++;
3472 matched_element = (Element) matching_elements.item (index);
3473 sibling_element = (Element) matched_element.getNextSibling ();
3474 }
3475 if(sibling_element.getNodeName ().equals (NEWLINE_ELEMENT)) {
3476 Element newline_element = document.createElement (NEWLINE_ELEMENT);
3477 document_element.insertBefore (newline_element, sibling_element);
3478 }
3479 return sibling_element;
3480 }
3481 // Otherwise try to find a matching 'name' and add after the last one in that group.
3482 else {
3483 int index = 0;
3484 target_element_name = target_element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3485 boolean found = false;
3486 // Skip all of the special metadata
3487 Element matched_element = (Element) matching_elements.item (index);
3488 while(matched_element.getAttribute (StaticStrings.SPECIAL_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
3489 index++;
3490 matched_element = (Element) matching_elements.item (index);
3491 }
3492 // Begin search
3493 while(!found && matched_element != null) {
3494 if(matched_element.getAttribute (StaticStrings.NAME_ATTRIBUTE).equals (target_element_name)) {
3495 found = true;
3496 }
3497 else {
3498 index++;
3499 matched_element = (Element) matching_elements.item (index);
3500 }
3501 }
3502 // If we found a match, we need to continue checking until we find the last name match.
3503 if(found) {
3504 index++;
3505 Element previous_sibling = matched_element;
3506 Element sibling_element = (Element) matching_elements.item (index);
3507 while(sibling_element != null && sibling_element.getAttribute (StaticStrings.NAME_ATTRIBUTE).equals (target_element_name)) {
3508 previous_sibling = sibling_element;
3509 index++;
3510 sibling_element = (Element) matching_elements.item (index);
3511 }
3512 // Previous sibling now holds the command immediately before where we want to add, so find its next sibling and add to that. In this one case we can ignore new lines!
3513 return previous_sibling.getNextSibling ();
3514 }
3515 // If not found we just add after last metadata element
3516 else {
3517 Element last_element = (Element) matching_elements.item (matching_elements.getLength () - 1);
3518 return last_element.getNextSibling ();
3519 }
3520 }
3521
3522 }
3523 else {
3524 ///ystem.err.println("Not dealing with collection meta.");
3525 Element matched_element = (Element) matching_elements.item (matching_elements.getLength () - 1);
3526 // One final quick test. If the matched element is immediately followed by a NewLine command, then we insert another NewLine after the matched command, then return the NewLine instead (thus the about to be inserted command will be placed between the two NewLines)
3527 Node sibling_element = matched_element.getNextSibling ();
3528 if(sibling_element != null && sibling_element.getNodeName ().equals (NEWLINE_ELEMENT)) {
3529 Element newline_element = document.createElement (NEWLINE_ELEMENT);
3530 document_element.insertBefore (newline_element, sibling_element);
3531 }
3532 return sibling_element; // Note that this may be null
3533 }
3534 }
3535 ///ystem.err.println("No matching elements found.");
3536 // Locate where this command is in the ordering
3537 int command_index = -1;
3538 for(int i = 0; command_index == -1 && i < COMMAND_ORDER.length; i++) {
3539 if(COMMAND_ORDER[i].equals (target_element_name)) {
3540 command_index = i;
3541 }
3542 }
3543 ///ystem.err.println("Command index is: " + command_index);
3544 // Now move forward, checking for existing elements in each of the preceeding command orders.
3545 int preceeding_index = command_index - 1;
3546 ///ystem.err.println("Searching before the target command.");
3547 while(preceeding_index >= 0) {
3548 matching_elements = document_element.getElementsByTagName (COMMAND_ORDER[preceeding_index]);
3549 // If we've found a match
3550 if(matching_elements.getLength () > 0) {
3551 // We add after the last element
3552 Element matched_element = (Element) matching_elements.item (matching_elements.getLength () - 1);
3553 // One final quick test. If the matched element is immediately followed by a NewLine command, then we insert another NewLine after the matched command, then return the NewLine instead (thus the about to be inserted command will be placed between the two NewLines)
3554 Node sibling_element = matched_element.getNextSibling ();
3555 if(sibling_element != null && sibling_element.getNodeName ().equals (NEWLINE_ELEMENT)) {
3556 Element newline_element = document.createElement (NEWLINE_ELEMENT);
3557 document_element.insertBefore (newline_element, sibling_element);
3558 }
3559 return sibling_element; // Note that this may be null
3560 }
3561 preceeding_index--;
3562 }
3563 // If all that fails, we now move backwards through the commands
3564 int susceeding_index = command_index + 1;
3565 ///ystem.err.println("Searching after the target command.");
3566 while(susceeding_index < COMMAND_ORDER.length) {
3567 matching_elements = document_element.getElementsByTagName (COMMAND_ORDER[susceeding_index]);
3568 // If we've found a match
3569 if(matching_elements.getLength () > 0) {
3570 // We add before the first element
3571 Element matched_element = (Element) matching_elements.item (0);
3572 // One final quick test. If the matched element is immediately preceeded by a NewLine command, then we insert another NewLine before the matched command, then return this new NewLine instead (thus the about to be inserted command will be placed between the two NewLines)
3573 Node sibling_element = matched_element.getPreviousSibling ();
3574 if(sibling_element != null && sibling_element.getNodeName ().equals (NEWLINE_ELEMENT)) {
3575 Element newline_element = document.createElement (NEWLINE_ELEMENT);
3576 document_element.insertBefore (newline_element, sibling_element);
3577 }
3578 return sibling_element; // Note that this may be null
3579 }
3580 susceeding_index++;
3581 }
3582 // Well. Apparently there are no other commands in this collection configuration. So append away...
3583 return null;
3584 }
3585 // From collectionConfig.xml to internal structure:add 'ex.' namespace (if none).
3586 // From internal structure to collectionConfig.xml:always peel off 'ex.' namespace (if any), except for format statement
3587 //This method parses 'xml_file_doc' into 'dOc'
3588 public void parseCollectionConfigXML (File xml_file, Document dOc) {
3589
3590 Document xml_file_doc = XMLTools.parseXMLFile (xml_file);
3591 Element fromElement = xml_file_doc.getDocumentElement ();
3592 Element toElement = dOc.getDocumentElement ();
3593
3594 // It's deliberately set that 'creator', 'maintainer', and 'public' are only in English (as they are just names).
3595 // So the following ArrayList have only one element.
3596 Node metadataListNode = XMLTools.getChildByTagNameIndexed (fromElement, StaticStrings.METADATALIST_STR, 0);
3597 if (metadataListNode != null) {
3598 ArrayList creator = doMetadataList (dOc, metadataListNode, StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT,
3599 StaticStrings.COLLECTIONMETADATA_CREATOR_STR);
3600 ArrayList maintainer = doMetadataList (dOc, metadataListNode,
3601 StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT,
3602 StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR);
3603 ArrayList is_public = doMetadataList (dOc, metadataListNode, StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT,
3604 StaticStrings.COLLECTIONMETADATA_PUBLIC_STR);
3605
3606 appendArrayList (toElement, creator);
3607 appendArrayList (toElement, maintainer);
3608 appendArrayList (toElement, is_public);
3609 }
3610
3611 Node searchNode = XMLTools.getChildByTagNameIndexed (fromElement, StaticStrings.SEARCH_STR, 0);
3612 String buildtype_value = ((Element)searchNode).getAttribute (StaticStrings.TYPE_ATTRIBUTE);//might be mg|mgpp|lucene
3613 Element buildtype = doBuildType (dOc, buildtype_value);
3614 appendProperly (toElement, buildtype);
3615
3616
3617 Node importNode = XMLTools.getChildByTagNameIndexed (fromElement, StaticStrings.IMPORT_STR, 0);
3618 if (importNode == null) {
3619 System.out.println ("There is no content in the 'import' block.");
3620 }
3621 if (importNode != null) {
3622 //do plugin list nodes
3623 Node pluginListNode = XMLTools.getChildByTagNameIndexed ((Element)importNode, StaticStrings.PLUGINLIST_STR, 0);
3624 if (pluginListNode == null) {
3625 System.out.println ("There is no pluginlist set.");
3626 }
3627 if (pluginListNode != null) {
3628
3629 doPlugin (dOc, pluginListNode);
3630 }
3631
3632 //do the plugout element (used by building flax collections)
3633 Node plugout = XMLTools.getChildByTagNameIndexed ((Element)importNode, PLUGOUT_ELEMENT, 0);
3634 if (plugout != null) {
3635 Element to_element = XMLTools.duplicateElement (dOc, (Element)plugout, true);
3636 toElement.appendChild (to_element);
3637 }
3638 }
3639
3640 Node browseNode = XMLTools.getChildByTagNameIndexed (fromElement, StaticStrings.BROWSE_STR, 0);
3641 if (browseNode != null) {
3642 if (browseNode == null) {
3643 System.out.println ("There is no classifier.");
3644 }
3645 doClassifier (dOc, browseNode);
3646 }
3647
3648 Node displayItemListNode = XMLTools.getChildByTagNameIndexed (fromElement, StaticStrings.DISPLAYITEMLIST_STR, 0);
3649 if (displayItemListNode != null) {
3650 ArrayList description = doDisplayItemList (dOc, displayItemListNode, StaticStrings.DESCRIPTION_STR,
3651 StaticStrings.COLLECTIONMETADATA_COLLECTIONEXTRA_STR);
3652 ArrayList smallicon = doDisplayItemList (dOc, displayItemListNode, StaticStrings.SMALLICON_STR,
3653 StaticStrings.COLLECTIONMETADATA_ICONCOLLECTIONSMALL_STR);
3654 ArrayList icon = doDisplayItemList (dOc, displayItemListNode, StaticStrings.ICON_STR,
3655 StaticStrings.COLLECTIONMETADATA_ICONCOLLECTION_STR);
3656 ArrayList name = doDisplayItemList (dOc, displayItemListNode, StaticStrings.NAME_STR,
3657 StaticStrings.COLLECTIONMETADATA_COLLECTIONNAME_STR);
3658
3659 appendArrayList (toElement, description);
3660 appendArrayList (toElement, smallicon);
3661 appendArrayList (toElement, icon);
3662 appendArrayList (toElement, name);
3663 }
3664
3665 if (buildtype_value.equalsIgnoreCase ("mg")) {
3666 doMGIndexes (dOc, searchNode);
3667 }
3668 else {
3669 doMGPPIndexes (dOc, searchNode);
3670 }
3671
3672 doDefaultIndex (dOc, searchNode);
3673 //doSearchType (dOc, searchNode);
3674 doDefaultLevel (dOc, searchNode);
3675 doLevel (dOc, searchNode);
3676 doIndexOption (dOc, searchNode);
3677 doSubcollection (dOc, searchNode);
3678 doIndexSubcollection (dOc, searchNode);
3679 doIndexLanguage (dOc, searchNode);
3680 doDefaultIndexLanguage (dOc, searchNode);
3681 doLanguageMetadata (dOc, searchNode);
3682 doSearchFormat (dOc, searchNode);
3683 doDisplayFormat (dOc, fromElement);
3684 doReplaceListRef (dOc, fromElement);
3685 doOAIElement (dOc, fromElement);
3686
3687 }
3688
3689
3690 public void saveCollectionConfigXML (File collect_cfg_file, Document doc) {
3691 //In this method, the file collect_cfg_file must be 'collectionConfig.xml'
3692
3693
3694 //Compare the internal structure (doc) with the saved structure from collectionConfig.xml and see if it has changed
3695 StringBuffer collect_cfg_string_buffer = new StringBuffer (XMLTools.xmlNodeToString (doc));
3696 String collect_cfg_string = collect_cfg_string_buffer.toString ();
3697 if (saved_collect_cfg_string_buffer != null) {
3698 String saved_collect_cfg_string = saved_collect_cfg_string_buffer.toString ();
3699 if (collect_cfg_string.equals (saved_collect_cfg_string)) {
3700 DebugStream.println ("'collectionConfig.xml' file hasn't changed so no save necessary...");
3701 return;
3702 }
3703 }
3704
3705 DebugStream.println ("'collectionConfig.xml' file has changed, saving now...");
3706
3707 // If we're using the Local Library we must release the collection before writing to the collect.cfg file
3708 String collection_name = Gatherer.c_man.getCollection ().getName ();
3709 boolean collection_released = false;
3710 if (Gatherer.c_man.built () && LocalLibraryServer.isRunning () == true) {
3711 // Release the collection
3712 LocalLibraryServer.releaseCollection (collection_name);
3713 collection_released = true;
3714 }
3715
3716 // Make a backup of the collectionConfig.xml file so that the user can manully change back
3717 if (collect_cfg_file.exists ()) {
3718
3719 File original_file = new File (collect_cfg_file.getParentFile (), Utility.COLLECTION_CONFIG_XML);
3720 File backup_file = new File (collect_cfg_file.getParentFile (), Utility.COLLECTION_CONFIG_BAK);
3721 if (backup_file.exists ()) {
3722 backup_file.delete ();
3723 }
3724 if (!original_file.renameTo (backup_file)) {
3725 System.err.println ("Warning: can't rename collectionConfig.xml to collectionConfig.bak.");
3726 }
3727 }
3728
3729 Document collection_config_xml_document = convertInternalToCollectionConfig (doc);
3730 String[] nonEscapingTagNames = {StaticStrings.FORMAT_STR};
3731 XMLTools.writeXMLFile (collect_cfg_file, collection_config_xml_document, nonEscapingTagNames);
3732 saved_collect_cfg_string_buffer = collect_cfg_string_buffer;
3733
3734 // If we're using a remote Greenstone server, upload the new 'collectionConfig.xml' file
3735 if (Gatherer.isGsdlRemote) {
3736 Gatherer.remoteGreenstoneServer.uploadCollectionFile (collection_name, collect_cfg_file);
3737 }
3738
3739 // Now re-add the collection to the Local Library server
3740 if (collection_released) {
3741 LocalLibraryServer.addCollection (collection_name);
3742 }
3743
3744 }
3745 public void saveIfNecessary () {
3746 if (Gatherer.GS3 == true) {
3747 saveCollectionConfigXML (collect_cfg_file, document);
3748 return;
3749 }
3750 // Convert the collection configuration XML tree to the collect.cfg version
3751 StringBuffer collect_cfg_string_buffer = new StringBuffer ();
3752 NodeList command_elements = document.getDocumentElement ().getChildNodes ();
3753 boolean just_wrote_blank_line = false; // Prevent two or more blank lines in a row
3754 for (int i = 0; i < command_elements.getLength (); i++) {
3755 Node command_node = command_elements.item (i);
3756 if (!(command_node instanceof Element)) {
3757 // We're only interested in Elements
3758 continue;
3759 }
3760 Element command_element = (Element) command_node;
3761
3762 // Handle NewLine elements (blank lines)
3763 if (command_element.getNodeName ().equals (NEWLINE_ELEMENT) && !just_wrote_blank_line) {
3764 collect_cfg_string_buffer.append ("\n");
3765 just_wrote_blank_line = true;
3766 }
3767
3768 // Anything else we write to file, but only if it has been assigned, except for index and level commands
3769 // (which just get commented out if unassigned -- a side effect of MG & MGPP compatibility)
3770 else if (!command_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR) || command_element.getNodeName ().equals (StaticStrings.INDEXES_ELEMENT) || command_element.getNodeName ().equals (StaticStrings.INDEX_DEFAULT_ELEMENT) || command_element.getNodeName ().equals (StaticStrings.INDEXOPTIONS_ELEMENT) || command_element.getNodeName ().equals (StaticStrings.INDEXOPTION_DEFAULT_ELEMENT)) {
3771 String command;
3772 if (command_element.getNodeName ().equals (StaticStrings.FORMAT_ELEMENT)) {
3773 // Format statements we write out with ex. still present
3774 command = toString (command_element, true);
3775 }
3776 else {
3777 command = toString (command_element, false);
3778 }
3779
3780 if (command != null && command.length ()> 0 ) {
3781 collect_cfg_string_buffer.append (command + "\n");
3782 just_wrote_blank_line = false;
3783 }
3784 }
3785 }
3786
3787 String collect_cfg_string = collect_cfg_string_buffer.toString ();
3788 String saved_collect_cfg_string = saved_collect_cfg_string_buffer.toString ();
3789 if (collect_cfg_string.equals (saved_collect_cfg_string)) {
3790 DebugStream.println ("Collect.cfg file hasn't changed so no save necessary...");
3791 return;
3792 }
3793
3794 DebugStream.println ("Collect.cfg file has changed, saving now...");
3795
3796 // If we're using the Local Library we must release the collection before writing to the collect.cfg file
3797 String collection_name = CollectionManager.getLoadedCollectionName ();
3798 boolean collection_released = false;
3799 if (Gatherer.c_man.built () && LocalLibraryServer.isRunning () == true) {
3800 // Release the collection
3801 LocalLibraryServer.releaseCollection (collection_name);
3802 collection_released = true;
3803 }
3804
3805 // Make a backup of the collect.cfg file
3806 if (collect_cfg_file.exists ()) {
3807 File original_file = new File (collect_cfg_file.getParentFile (), StaticStrings.COLLECT_CFG);
3808 File backup_file = new File (collect_cfg_file.getParentFile (), Utility.COLLECT_BAK);
3809 if (backup_file.exists ()) {
3810 backup_file.delete ();
3811 }
3812 if (!original_file.renameTo (backup_file)) {
3813 System.err.println ("Warning: can't rename collect.cfg to collect.bak.");
3814 }
3815 }
3816
3817 try {
3818 OutputStream ostream = new FileOutputStream (collect_cfg_file);
3819 Writer file_writer = new OutputStreamWriter (ostream, ENCODING);
3820 BufferedWriter buffered_writer = new BufferedWriter (file_writer);
3821 buffered_writer.write (collect_cfg_string);
3822 buffered_writer.close ();
3823
3824 saved_collect_cfg_string_buffer = collect_cfg_string_buffer;
3825
3826 // If we're using a remote Greenstone server, upload the new collect.cfg file
3827 if (Gatherer.isGsdlRemote) {
3828 Gatherer.remoteGreenstoneServer.uploadCollectionFile (collection_name, collect_cfg_file);
3829 }
3830 }
3831 catch (Exception exception) {
3832 DebugStream.println ("Error in CollectionConfiguration.save(): " + exception);
3833 DebugStream.printStackTrace (exception);
3834 }
3835
3836 // Now re-add the collection to the Local Library server
3837 if (collection_released) {
3838 LocalLibraryServer.addCollection (collection_name);
3839 }
3840 }
3841 // This method is initilised in CollectionDesignManager.java constructor
3842 public CollectionConfiguration (File collect_cfg_file) {
3843 this.collect_cfg_file = collect_cfg_file;
3844
3845 // parse the XML template
3846 document = XMLTools.parseXMLFile ("xml/CollectionConfig.xml", true);
3847 String filename = collect_cfg_file.getName ().toLowerCase ();
3848
3849 if (filename.endsWith (".cfg")) {
3850 parse (collect_cfg_file);
3851 }
3852 if (filename.endsWith (".xml")) {
3853 parseCollectionConfigXML (collect_cfg_file, document);
3854 }
3855
3856 //XMLTools.printXMLNode(document.getDocumentElement());
3857 }
3858
3859 // Append the elements, which are of Element type, in 'list' to Element 'to'
3860 private void appendArrayList (Element to, ArrayList list) {
3861 if (list == null) return;
3862
3863 for (int i=0; i<list.size (); i++) {
3864 appendProperly (to, (Element)list.get (i));
3865 }
3866 }
3867 //Convert the internal XML DOM tree (dOc) into that of collectionConfig.xml (skeleton)
3868 public Document convertInternalToCollectionConfig (Document dOc) {
3869 //first parse an empty skeleton of xml config file
3870 //The aim is to convert the internal structure into this skeleton
3871 Document skeleton = XMLTools.parseXMLFile ("xml/CollectionConfig.xml", true);
3872 //Element internal = dOc.getDocumentElement();
3873 convertMetadataList (dOc, skeleton);
3874 convertDisplayItemList (dOc, skeleton);
3875 convertBuildType (dOc, skeleton);
3876 convertIndex (dOc, skeleton);
3877 convertPlugin (dOc, skeleton);//also do the plugout element
3878 convertClassifier (dOc, skeleton);
3879 convertSubcollectionIndexes (dOc, skeleton);
3880 convertLanguages (dOc, skeleton);
3881 convertSubcollection (dOc, skeleton);
3882 convertSearchType (dOc, skeleton);
3883 convertSearchFormat (dOc, skeleton);
3884 convertDisplayFormat (dOc, skeleton);
3885 convertReplaceListRef (dOc, skeleton);
3886 convertOAIElement(dOc, skeleton);
3887
3888 return skeleton;
3889 }
3890
3891 static private HashMap plugin_map = null;
3892
3893 private void setUpPluginNameMap() {
3894 plugin_map = new HashMap();
3895 plugin_map.put("GAPlug", "GreenstoneXMLPlugin");
3896 plugin_map.put("RecPlug", "DirectoryPlugin");
3897 plugin_map.put("ArcPlug","ArchivesInfPlugin");
3898 plugin_map.put("TEXTPlug","TextPlugin");
3899 plugin_map.put("XMLPlug","ReadXMLFile");
3900 plugin_map.put("EMAILPlug","EmailPlugin");
3901 plugin_map.put("SRCPlug","SourceCodePlugin");
3902 plugin_map.put("NULPlug","NulPlugin");
3903 plugin_map.put("W3ImgPlug","HTMLImagePlugin");
3904 plugin_map.put("PagedImgPlug","PagedImagePlugin");
3905 plugin_map.put("METSPlug", "GreenstoneMETSPlugin");
3906 plugin_map.put("DBPlug", "DatabasePlugin");
3907 plugin_map.put("PPTPlug", "PowerPointPlugin");
3908 plugin_map.put("PSPlug", "PostScriptPlugin");
3909 }
3910
3911 private String ensureNewPluginName(String plugin) {
3912 if (plugin.endsWith("Plugin")) return plugin;
3913 if (plugin_map == null) {
3914 setUpPluginNameMap();
3915 }
3916 String new_name = (String)plugin_map.get(plugin);
3917 if (new_name != null) return new_name;
3918 new_name = plugin.replaceAll("Plug", "Plugin");
3919 return new_name;
3920 }
3921
3922
3923 ///*********************************************************************************************************///
3924}
3925
Note: See TracBrowser for help on using the repository browser.