source: gli/trunk/src/org/greenstone/gatherer/cdm/CollectionConfiguration.java@ 15031

Last change on this file since 15031 was 15031, checked in by mdewsnip, 16 years ago

Fixed bug when parsing quoted arguments starting with a minus character.

  • Property svn:keywords set to Author Date Id Revision
File size: 207.8 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 command_element.setAttribute (StaticStrings.TYPE_ATTRIBUTE, type);
1334 // Now we parse out the remaining arguments into a hashmapping from name to value
1335 HashMap arguments = parseArguments (tokenizer);
1336 // Assign the arguments as Option elements, but watch out for the metadata argument as we treat that differently
1337 // also watch out for the deprecated -use_metadata_files option to RecPlug and remove it
1338 Iterator names = arguments.keySet ().iterator ();
1339 while(names.hasNext ()) {
1340 String name = (String) names.next ();
1341 String value = (String) arguments.get (name); // Can be null
1342
1343 if(type.equals (StaticStrings.RECPLUG_STR) && name.substring (1).equals (StaticStrings.USE_METADATA_FILES_ARGUMENT)) {
1344 continue; // ignore this option
1345 }
1346 Element option_element = document.createElement (StaticStrings.OPTION_ELEMENT);
1347 option_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name.substring (1));
1348 option_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1349 if(value != null) {
1350 // Remove any speech marks appended in strings containing whitespace
1351 if(value.startsWith (StaticStrings.SPEECH_CHARACTER) && value.endsWith (StaticStrings.SPEECH_CHARACTER)) {
1352 value = value.substring (1, value.length () - 1);
1353 }
1354 if(name.equals (StaticStrings.METADATA_ARGUMENT)) {
1355 // 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.
1356 if(value.indexOf (StaticStrings.NS_SEP) == -1) {
1357 value = StaticStrings.EXTRACTED_NAMESPACE + value;
1358 }
1359 }
1360 XMLTools.setValue (option_element, value);
1361 }
1362 command_element.appendChild (option_element);
1363 option_element = null;
1364 name = null;
1365 value = null;
1366 }
1367
1368 type = null;
1369 names = null;
1370 arguments = null;
1371 }
1372 tokenizer = null;
1373 }
1374 catch(Exception exception) {
1375 }
1376 return command_element;
1377 }
1378
1379 /* search types are now handled as formats - leave this here to convert in case we have an old config file */
1380 private Element parseSearchType (String command_str) {
1381 Element command_element = null;
1382 try {
1383 StringTokenizer tokenizer = new StringTokenizer (command_str);
1384 // First token is command type (searchtype)
1385 tokenizer.nextToken ();
1386 if(tokenizer.hasMoreTokens ()) {
1387 command_element = document.createElement (StaticStrings.FORMAT_ELEMENT);
1388 command_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, "SearchTypes");
1389 String value = tokenizer.nextToken ();
1390 while(tokenizer.hasMoreTokens ()) {
1391 value += ","+tokenizer.nextToken ();
1392 }
1393 value = Codec.transform (value, Codec.GREENSTONE_TO_DOM);
1394 XMLTools.setValue (command_element, value);
1395 }
1396 }
1397 catch(Exception exception) {
1398 }
1399 return command_element;
1400 }
1401
1402 private Element parseSubCollection (String command_str) {
1403 Element command_element = null;
1404 try {
1405 CommandTokenizer tokenizer = new CommandTokenizer (command_str);
1406 if(tokenizer.countTokens () >= 3) {
1407 command_element = document.createElement (StaticStrings.SUBCOLLECTION_ELEMENT);
1408 // First token is command type
1409 tokenizer.nextToken ();
1410 // Then subcollection identifier
1411 command_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, tokenizer.nextToken ());
1412 // Then finally the pattern used to build the subcollection partition
1413 String full_pattern_str = tokenizer.nextToken ();
1414 // Set inclusion/exclusion flag and remove any exclamation mark
1415 boolean exclusion = full_pattern_str.startsWith (StaticStrings.EXCLAMATION_CHARACTER);
1416 if (exclusion) {
1417 full_pattern_str = full_pattern_str.substring (1, full_pattern_str.length ());
1418 command_element.setAttribute (StaticStrings.TYPE_ATTRIBUTE, StaticStrings.EXCLUDE_STR);
1419 }
1420 else {
1421 command_element.setAttribute (StaticStrings.TYPE_ATTRIBUTE, StaticStrings.INCLUDE_STR);
1422 }
1423 StringTokenizer pattern_tokenizer = new StringTokenizer (full_pattern_str, StaticStrings.SEPARATOR_CHARACTER);
1424 if(pattern_tokenizer.countTokens () >= 2) {
1425 String content_str = pattern_tokenizer.nextToken ();
1426 // 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.
1427 if(!content_str.equals (StaticStrings.FILENAME_STR) && content_str.indexOf (StaticStrings.NS_SEP) == -1) {
1428 content_str = StaticStrings.EXTRACTED_NAMESPACE + content_str;
1429 }
1430 command_element.setAttribute (StaticStrings.CONTENT_ATTRIBUTE, content_str);
1431 XMLTools.setValue (command_element, pattern_tokenizer.nextToken ());
1432 if(pattern_tokenizer.hasMoreTokens ()) {
1433 command_element.setAttribute (StaticStrings.OPTIONS_ATTRIBUTE, pattern_tokenizer.nextToken ());
1434 }
1435 }
1436 pattern_tokenizer = null;
1437 }
1438 }
1439 catch(Exception exception) {
1440 exception.printStackTrace ();
1441 }
1442 return command_element;
1443 }
1444
1445 private Element parseSubCollectionDefaultIndex (String command_str) {
1446 Element command_element = null;
1447 try {
1448 StringTokenizer tokenizer = new StringTokenizer (command_str);
1449 if(tokenizer.countTokens () == 2) {
1450 command_element = document.createElement (StaticStrings.SUBCOLLECTION_DEFAULT_INDEX_ELEMENT);
1451 tokenizer.nextToken ();
1452 //command_element.setAttribute(CONTENT_ATTRIBUTE, tokenizer.nextToken());
1453 String content_str = tokenizer.nextToken ();
1454 StringTokenizer content_tokenizer = new StringTokenizer (content_str, StaticStrings.COMMA_CHARACTER);
1455 while(content_tokenizer.hasMoreTokens ()) {
1456 Element content_element = document.createElement (StaticStrings.CONTENT_ELEMENT);
1457 content_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, content_tokenizer.nextToken ());
1458 command_element.appendChild (content_element);
1459 content_element = null;
1460 }
1461 content_tokenizer = null;
1462 content_str = null;
1463 }
1464 tokenizer = null;
1465 }
1466 catch(Exception exception) {
1467 }
1468 return command_element;
1469 }
1470
1471 private Element parseSubCollectionIndex (String command_str) {
1472 Element command_element = null;
1473 try {
1474 StringTokenizer tokenizer = new StringTokenizer (command_str);
1475 tokenizer.nextToken ();
1476 if(tokenizer.hasMoreTokens ()) {
1477 command_element = document.createElement (StaticStrings.SUBCOLLECTION_INDEXES_ELEMENT);
1478 }
1479 while(tokenizer.hasMoreTokens ()) {
1480 Element subcollectionindex_element = document.createElement (StaticStrings.INDEX_ELEMENT);
1481 //command_element.setAttribute(CONTENT_ATTRIBUTE, tokenizer.nextToken());
1482 String content_str = tokenizer.nextToken ();
1483 StringTokenizer content_tokenizer = new StringTokenizer (content_str, StaticStrings.COMMA_CHARACTER);
1484 while(content_tokenizer.hasMoreTokens ()) {
1485 Element content_element = document.createElement (StaticStrings.CONTENT_ELEMENT);
1486 content_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, content_tokenizer.nextToken ());
1487 subcollectionindex_element.appendChild (content_element);
1488 content_element = null;
1489 }
1490 content_tokenizer = null;
1491 content_str = null;
1492 command_element.appendChild (subcollectionindex_element);
1493 subcollectionindex_element = null;
1494 }
1495 tokenizer = null;
1496 }
1497 catch (Exception exception) {
1498 }
1499 return command_element;
1500 }
1501
1502 private Element parseSuperCollection (String command_str) {
1503 Element command_element = null;
1504 try {
1505 StringTokenizer tokenizer = new StringTokenizer (command_str);
1506 if(tokenizer.countTokens () >= 3) {
1507 command_element = document.createElement (StaticStrings.SUPERCOLLECTION_ELEMENT);
1508 tokenizer.nextToken ();
1509 while(tokenizer.hasMoreTokens ()) {
1510 Element collection_element = document.createElement (StaticStrings.COLLECTION_ELEMENT);
1511 collection_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, tokenizer.nextToken ());
1512 command_element.appendChild (collection_element);
1513 collection_element = null;
1514 }
1515 }
1516 tokenizer = null;
1517 }
1518 catch(Exception exception) {
1519 }
1520 return command_element;
1521 }
1522
1523 static private String pluginToString (Element command_element, boolean show_extracted_namespace) {
1524 StringBuffer text = new StringBuffer ();
1525 if(!command_element.getAttribute (StaticStrings.SEPARATOR_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
1526 text.append (StaticStrings.PLUGIN_STR);
1527 text.append (StaticStrings.TAB_CHARACTER);
1528 text.append (StaticStrings.TAB_CHARACTER);
1529 text.append (command_element.getAttribute (StaticStrings.TYPE_ATTRIBUTE));
1530 // Retrieve, and output, the arguments
1531 NodeList option_elements = command_element.getElementsByTagName (StaticStrings.OPTION_ELEMENT);
1532 int option_elements_length = option_elements.getLength ();
1533 if(option_elements_length > 0) {
1534 for(int j = 0; j < option_elements_length; j++) {
1535 Element option_element = (Element) option_elements.item (j);
1536 if(option_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
1537 text.append (StaticStrings.SPACE_CHARACTER);
1538 text.append (StaticStrings.MINUS_CHARACTER);
1539 text.append (option_element.getAttribute (StaticStrings.NAME_ATTRIBUTE));
1540 String value_str = XMLTools.getValue (option_element);
1541 if(!show_extracted_namespace && value_str.startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
1542 value_str = value_str.substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
1543 }
1544 if(value_str.length () > 0) {
1545 text.append (StaticStrings.SPACE_CHARACTER);
1546 if(value_str.indexOf (StaticStrings.SPACE_CHARACTER) == -1) {
1547 text.append (value_str);
1548 }
1549 else {
1550 text.append (StaticStrings.SPEECH_CHARACTER);
1551 text.append (value_str);
1552 text.append (StaticStrings.SPEECH_CHARACTER);
1553 }
1554 }
1555 value_str = null;
1556 }
1557 option_element = null;
1558 }
1559 }
1560 option_elements = null;
1561 }
1562 return text.toString ();
1563 }
1564
1565 static private String searchtypeToString (Element command_element) {
1566 if(command_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
1567 StringBuffer text = new StringBuffer (StaticStrings.SEARCHTYPE_STR);
1568 text.append (StaticStrings.TAB_CHARACTER);
1569 NodeList search_elements = command_element.getElementsByTagName (StaticStrings.CONTENT_ELEMENT);
1570 int search_elements_length = search_elements.getLength ();
1571 for(int i = 0; i < search_elements_length; i++) {
1572 Element search_element = (Element) search_elements.item (i);
1573 text.append (search_element.getAttribute (StaticStrings.NAME_ATTRIBUTE));
1574 text.append (StaticStrings.SPACE_CHARACTER);
1575 }
1576 return text.substring (0, text.length () - 1);
1577 }
1578 else {
1579 return null;
1580 }
1581 }
1582
1583 static private String subcollectionToString (Element command_element, boolean show_extracted_namespace) {
1584 StringBuffer text = new StringBuffer (StaticStrings.SUBCOLLECTION_STR);
1585 text.append (StaticStrings.SPACE_CHARACTER);
1586 text.append (command_element.getAttribute (StaticStrings.NAME_ATTRIBUTE));
1587 text.append (StaticStrings.SPACE_CHARACTER);
1588 text.append (StaticStrings.TAB_CHARACTER);
1589 text.append (StaticStrings.SPEECH_CHARACTER);
1590 if(command_element.getAttribute (StaticStrings.TYPE_ATTRIBUTE).equals (StaticStrings.EXCLUDE_STR)) {
1591 text.append (StaticStrings.EXCLAMATION_CHARACTER);
1592 }
1593 String content_str = command_element.getAttribute (StaticStrings.CONTENT_ATTRIBUTE);
1594 if(!show_extracted_namespace && content_str.startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
1595 content_str = content_str.substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
1596 }
1597 text.append (content_str);
1598 content_str = null;
1599 text.append (StaticStrings.SEPARATOR_CHARACTER);
1600 text.append (XMLTools.getValue (command_element));
1601 text.append (StaticStrings.SEPARATOR_CHARACTER);
1602 String options_str = command_element.getAttribute (StaticStrings.OPTIONS_ATTRIBUTE);
1603 if(options_str.length () > 0) {
1604 text.append (options_str);
1605 }
1606 options_str = null;
1607 text.append (StaticStrings.SPEECH_CHARACTER);
1608 return text.toString ();
1609 }
1610
1611 static private String subcollectionDefaultIndexToString (Element command_element) {
1612 StringBuffer text = new StringBuffer (StaticStrings.SUBCOLLECTION_DEFAULT_INDEX_STR);
1613 text.append (StaticStrings.TAB_CHARACTER);
1614 NodeList content_elements = command_element.getElementsByTagName (StaticStrings.CONTENT_ELEMENT);
1615 int content_elements_length = content_elements.getLength ();
1616 for(int j = 0; j < content_elements_length; j++) {
1617 Element content_element = (Element) content_elements.item (j);
1618 text.append (content_element.getAttribute (StaticStrings.NAME_ATTRIBUTE));
1619 if(j < content_elements_length - 1) {
1620 text.append (StaticStrings.COMMA_CHARACTER);
1621 }
1622 }
1623 return text.toString ();
1624 }
1625
1626 static private String subcollectionIndexesToString (Element command_element) {
1627 StringBuffer text = new StringBuffer (StaticStrings.SUBCOLLECTION_INDEX_STR);
1628 text.append (StaticStrings.TAB_CHARACTER);
1629 // Retrieve all of the subcollection index partitions
1630 NodeList subcollectionindex_elements = command_element.getElementsByTagName (StaticStrings.INDEX_ELEMENT);
1631 int subcollectionindex_elements_length = subcollectionindex_elements.getLength ();
1632 if(subcollectionindex_elements_length == 0) {
1633 return null;
1634 }
1635 for(int j = 0; j < subcollectionindex_elements_length; j++) {
1636 Element subcollectionindex_element = (Element) subcollectionindex_elements.item (j);
1637 NodeList content_elements = subcollectionindex_element.getElementsByTagName (StaticStrings.CONTENT_ELEMENT);
1638 int content_elements_length = content_elements.getLength ();
1639 for(int k = 0; k < content_elements_length; k++) {
1640 Element content_element = (Element) content_elements.item (k);
1641 text.append (content_element.getAttribute (StaticStrings.NAME_ATTRIBUTE));
1642 if(k < content_elements_length - 1) {
1643 text.append (StaticStrings.COMMA_CHARACTER);
1644 }
1645 }
1646 if(j < subcollectionindex_elements_length - 1) {
1647 text.append (StaticStrings.SPACE_CHARACTER);
1648 }
1649 }
1650 return text.toString ();
1651 }
1652
1653 static private String supercollectionToString (Element command_element) {
1654 NodeList content_elements = command_element.getElementsByTagName (StaticStrings.COLLECTION_ELEMENT);
1655 int content_elements_length = content_elements.getLength ();
1656 if(content_elements_length > 1) {
1657 StringBuffer text = new StringBuffer (StaticStrings.SUPERCOLLECTION_STR);
1658 text.append (StaticStrings.TAB_CHARACTER);
1659 for(int j = 0; j < content_elements_length; j++) {
1660 Element content_element = (Element) content_elements.item (j);
1661 text.append (content_element.getAttribute (StaticStrings.NAME_ATTRIBUTE));
1662 if(j < content_elements_length - 1) {
1663 text.append (StaticStrings.SPACE_CHARACTER);
1664 }
1665 }
1666 return text.toString ();
1667 }
1668 return null;
1669 }
1670
1671 static private String unknownToString (Element command_element) {
1672 return XMLTools.getValue (command_element);
1673 }
1674
1675 /** 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.
1676 * @param writer the BufferedWriter to which the str will be written
1677 * @param str the String to be written
1678 */
1679 private void write (BufferedWriter writer, String str)
1680 throws IOException {
1681 writer.write (str, 0, str.length ());
1682 }
1683
1684 /** ********************************************************************************************************
1685 The code from this point below are used for greenstone 3 collection configuration, i.e., read ColletionConfig.xml
1686 * into the internal DOM tree, and convert the internal DOM tree back to CollectionConfig.xml.
1687 *
1688 Methods named 'doXXXX' are for convert collectionConfig.xml into the internal configuration xml structure;
1689 Methods named 'convertXXXX' are for convert the internal configuration xml structure back to collectionConfig.xml.
1690 ************************************************************************************************************ */
1691
1692 /**Arguments: metadataListNode->the 'displayItemList' element in collectionConfig.xml
1693 name_value->the value of the 'name' attribute of 'index' element;
1694 att_value->the value of the 'name' attribute of 'displayItem' element
1695 return: an ArrayList of the contructed 'CollectionMetadata' elements
1696 */
1697 private ArrayList doDisplayItemList (Document to, Node displayListNode, String att_value, String name_value) {
1698 Element toElement = to.getDocumentElement ();
1699 ArrayList display_item_list = new ArrayList ();
1700 ArrayList item_list = XMLTools.getNamedElementList ((Element)displayListNode,
1701 StaticStrings.DISPLAYITEM_STR, StaticStrings.NAME_ATTRIBUTE, att_value);
1702 if (item_list == null) {
1703 return null;
1704 }
1705
1706 for (int i=0; i<item_list.size (); i++) {
1707 Element item = (Element)item_list.get (i);
1708 String text = XMLTools.getNodeText (item);
1709
1710 //If there is nothing to display, don't bother creating the element
1711 if (text == "") {
1712 continue;
1713 }
1714 //get the value in 'lang=value'
1715 String lang = item.getAttribute (StaticStrings.LANG_STR);
1716
1717 Element e = to.createElement (StaticStrings.COLLECTIONMETADATA_ELEMENT);
1718 e.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1719 e.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_value);
1720 e.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, lang);
1721 XMLTools.setNodeText (e, text);
1722
1723 display_item_list.add (e);
1724 }
1725 return display_item_list;
1726 }
1727
1728 private ArrayList doMetadataList (Document to, Node metadataListNode, String ele_name, String att_value) {
1729 Element toElement = to.getDocumentElement ();
1730 ArrayList metadata_list = new ArrayList ();
1731
1732 ArrayList item_list = XMLTools.getNamedElementList ((Element)metadataListNode,
1733 StaticStrings.METADATA_STR, StaticStrings.NAME_ATTRIBUTE, att_value);
1734 if (item_list == null) {
1735 return null;
1736 }
1737
1738 for (int i=0; i<item_list.size (); i++) {
1739 Element item = (Element)item_list.get (i);
1740 String text = XMLTools.getNodeText (item);
1741
1742 //If there is nothing to display, don't bother creating the element
1743 if (text == "") {
1744 continue;
1745 }
1746 //get the value in 'lang=value'
1747 String lang = item.getAttribute (StaticStrings.LANG_STR);
1748
1749 Element element = to.createElement (ele_name);
1750 element.setAttribute (StaticStrings.NAME_ATTRIBUTE, att_value);
1751 element.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, lang);
1752 element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1753 element.setAttribute (StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR);
1754 XMLTools.setNodeText (element, text);
1755
1756 metadata_list.add (element);
1757 }
1758 return metadata_list;
1759 }
1760 // 'to' is the internal structure
1761 private void doMGIndexes (Document to, Node searchNode) {
1762 Element toElement = to.getDocumentElement ();
1763 Element indexes_element = to.createElement (StaticStrings.INDEXES_ELEMENT);//<Indexes>
1764 indexes_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1765 indexes_element.setAttribute (StaticStrings.MGPP_ATTRIBUTE, StaticStrings.FALSE_STR);
1766
1767 NodeList index_children = ((Element)searchNode).getElementsByTagName (StaticStrings.INDEX_LOW_STR);//index
1768 int num_nodes = index_children.getLength ();
1769
1770 for (int i=0; i<num_nodes; i++) {
1771 Element e = (Element)index_children.item (i);
1772 String index_str = e.getAttribute (StaticStrings.NAME_ATTRIBUTE);
1773 String index_str_display = index_str;//used for creating collectionmetadata for this index
1774 Element index_element = to.createElement (StaticStrings.INDEX_ELEMENT);//<Index>
1775
1776 // For mg, it's the 'Old G2.38 and earlier' that use level:source tuplets, but we double check it anyway
1777 boolean old_index = true;
1778 if(index_str.indexOf (StaticStrings.COLON_CHARACTER) == -1) {
1779 // It doesn't contain ':' character
1780 System.err.println ("Something is wrong! the index should be level:source tuplets.");
1781 old_index = false;
1782 }
1783 else {
1784 // Handling 'index' element
1785 index_element.setAttribute (StaticStrings.LEVEL_ATTRIBUTE,
1786 index_str.substring (0, index_str.indexOf (StaticStrings.COLON_CHARACTER)));
1787 index_str = index_str.substring (index_str.indexOf (StaticStrings.COLON_CHARACTER) + 1);
1788
1789 //Each index may have a list of comma-separated strings.
1790 //split them into 'content' elements in the internal structure
1791 StringTokenizer content_tokenizer = new StringTokenizer (index_str, StaticStrings.COMMA_CHARACTER);
1792 //index_str = "";
1793 while(content_tokenizer.hasMoreTokens ()) {
1794 // Replace index_str to be qualified name, eg. dc.Subject and keywords insread of dc.Subject.
1795
1796
1797 Element content_element = to.createElement (StaticStrings.CONTENT_ELEMENT);
1798 String content_str = content_tokenizer.nextToken ();
1799 // Since the contents of indexes have to be certain keywords, or metadata elements,
1800 //if the content isn't a keyword and doesn't yet have a namespace, append the extracted metadata namespace.
1801 if(content_str.indexOf (StaticStrings.NS_SEP) == -1) {
1802 if(content_str.equals (StaticStrings.TEXT_STR) ||
1803 (!old_index && content_str.equals (StaticStrings.ALLFIELDS_STR))) {
1804 // in this case, do nothing
1805 }
1806 else {
1807 content_str = StaticStrings.EXTRACTED_NAMESPACE + content_str;
1808 }
1809 }
1810
1811 content_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, content_str);
1812 index_element.appendChild (content_element);
1813 content_element = null;
1814 } // while ends
1815
1816 indexes_element.appendChild (index_element);
1817
1818 // Handling 'displayItem' elements and Constructing 'collectionmetadata' elements
1819 // Use the fully qualified index names
1820 ArrayList collectionmetadata_list = doDisplayItemList (to, e, StaticStrings.NAME_ATTRIBUTE, index_str_display);
1821 appendArrayList (toElement, collectionmetadata_list);
1822 } //else ends
1823 } //for loop ends
1824 appendProperly (toElement, indexes_element);
1825
1826 //***//
1827 // create another set of <indexes> which will be used when user switches to MGPP/LUCENE
1828 // i.e. we build a default index set for a start
1829
1830 String []index_strs =
1831 {StaticStrings.TEXT_STR,
1832 StaticStrings.EXTRACTED_NAMESPACE + StaticStrings.TITLE_ELEMENT,
1833 StaticStrings.EXTRACTED_NAMESPACE + StaticStrings.SOURCE_ELEMENT};
1834
1835 Element mgpp_indexes = to.createElement (StaticStrings.INDEXES_ELEMENT);//<Indexes>
1836 mgpp_indexes.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR);
1837 mgpp_indexes.setAttribute (StaticStrings.MGPP_ATTRIBUTE, StaticStrings.TRUE_STR);
1838 for (int i=0; i<index_strs.length; i++) {
1839 Element index_element = to.createElement (StaticStrings.INDEX_ELEMENT);//<Index>
1840 Element content_element = to.createElement (StaticStrings.CONTENT_ELEMENT);
1841 content_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, index_strs[i]);
1842 index_element.appendChild (content_element);
1843 mgpp_indexes.appendChild (index_element);
1844
1845 // Contructing 'collectionmetadata' elements for 'mgpp' indexes
1846 Element collectionmetadata = to.createElement (StaticStrings.COLLECTIONMETADATA_ELEMENT);
1847 collectionmetadata.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1848 collectionmetadata.setAttribute (StaticStrings.NAME_ATTRIBUTE, index_strs[i]);
1849 collectionmetadata.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, StaticStrings.ENGLISH_LANGUAGE_STR);
1850 if (index_strs[i].indexOf (StaticStrings.NS_SEP) != -1) {
1851 index_strs[i] = index_strs[i].substring (index_strs[i].indexOf (StaticStrings.NS_SEP) + 1);
1852 }
1853 XMLTools.setNodeText (collectionmetadata, index_strs[i]);
1854
1855 appendProperly (toElement, collectionmetadata);
1856
1857 }
1858 appendProperly (toElement, mgpp_indexes);
1859 }
1860
1861 //This is actually doing indexes for both mgpp and lucene
1862 private void doMGPPIndexes (Document to, Node searchNode) {
1863 Element toElement = to.getDocumentElement ();
1864 Element indexes_element = to.createElement (StaticStrings.INDEXES_ELEMENT);//<Indexes>
1865 indexes_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1866 indexes_element.setAttribute (StaticStrings.MGPP_ATTRIBUTE, StaticStrings.TRUE_STR);
1867
1868 NodeList index_children = ((Element)searchNode).getElementsByTagName (StaticStrings.INDEX_LOW_STR);//index
1869 int num_nodes = index_children.getLength ();
1870
1871 for (int i=0; i<num_nodes; i++) {
1872
1873 Element index_element = to.createElement (StaticStrings.INDEX_ELEMENT);//<Index>
1874 Element e = (Element)index_children.item (i);
1875 String index_str = e.getAttribute (StaticStrings.NAME_ATTRIBUTE);
1876 String index_str_display = index_str;//for creating collectionmetadata for this index
1877
1878 // Handling 'index' element
1879 // Double check to make sure it's not colon separated style index.
1880 boolean old_index = false;
1881 if(index_str.indexOf (StaticStrings.COLON_CHARACTER) != -1) {
1882 System.err.println ("Something is wrong! the index should NOT be level:source tuplets style.");
1883 old_index = true;
1884 }
1885 //Each index may have a list of comma-separated strings.
1886 //split them into 'content' elements in the internal structure
1887 StringTokenizer content_tokenizer = new StringTokenizer (index_str, StaticStrings.COMMA_CHARACTER);
1888 //index_str = "";
1889 while(content_tokenizer.hasMoreTokens ()) {
1890 // Replace index_str to be qualified name, eg. dc.Subject and keywords insread of dc.Subject.
1891
1892 Element content_element = to.createElement (StaticStrings.CONTENT_ELEMENT);
1893 String content_str = content_tokenizer.nextToken ();
1894 // 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.
1895 if(content_str.indexOf (StaticStrings.NS_SEP) == -1) {
1896 if(content_str.equals (StaticStrings.TEXT_STR)) {
1897 // in this case, do nothing
1898 }
1899 else {
1900 content_str = StaticStrings.EXTRACTED_NAMESPACE + content_str;
1901 }
1902 }
1903 content_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, content_str);
1904 index_element.appendChild (content_element);
1905 content_element = null;
1906 } //while ends
1907
1908 indexes_element.appendChild (index_element);
1909
1910
1911 index_element = null;
1912
1913 // Handling 'displayItem' element of this 'index' element
1914 // 'e' is the parent element 'index' of 'displayItem' element
1915 ArrayList collectionmetadata_list = doDisplayItemList (to, e, StaticStrings.NAME_ATTRIBUTE, index_str_display);
1916 appendArrayList (toElement, collectionmetadata_list);
1917
1918
1919 } // for loop ends
1920 toElement.appendChild (indexes_element);
1921
1922 // create another set of <indexes> which will be used when user switches to MG
1923 // i.e. we build a default index set for a start
1924 Element mg_indexes = to.createElement (StaticStrings.INDEXES_ELEMENT);//<Indexes>
1925 mg_indexes.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR);
1926 mg_indexes.setAttribute (StaticStrings.MGPP_ATTRIBUTE, StaticStrings.FALSE_STR);
1927
1928 //put the namespace '.ex' as prefix to the indexes
1929 String []index_strs =
1930 {StaticStrings.TEXT_STR,
1931 StaticStrings.EXTRACTED_NAMESPACE + StaticStrings.TITLE_ELEMENT,
1932 StaticStrings.EXTRACTED_NAMESPACE + StaticStrings.SOURCE_ELEMENT};
1933 for (int i=0; i<index_strs.length; i++) {
1934 Element index_element = to.createElement (StaticStrings.INDEX_ELEMENT);//<Index>
1935 index_element.setAttribute (StaticStrings.LEVEL_ATTRIBUTE, StaticStrings.DOCUMENT_STR);
1936 Element content_element = to.createElement (StaticStrings.CONTENT_ELEMENT);
1937 content_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, index_strs[i]);
1938 index_element.appendChild (content_element);
1939
1940 mg_indexes.appendChild (index_element);
1941
1942 // Contructing 'collectionmetadata' elements for 'mg' indexes
1943 Element collectionmetadata = to.createElement (StaticStrings.COLLECTIONMETADATA_ELEMENT);
1944 collectionmetadata.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1945 String temp = StaticStrings.DOCUMENT_STR.concat (StaticStrings.COLON_CHARACTER).concat (index_strs[i]);
1946 collectionmetadata.setAttribute (StaticStrings.NAME_ATTRIBUTE, temp);
1947 collectionmetadata.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, StaticStrings.ENGLISH_LANGUAGE_STR);
1948 if (index_strs[i].indexOf (StaticStrings.NS_SEP) != -1) {
1949 index_strs[i] = index_strs[i].substring (index_strs[i].indexOf (StaticStrings.NS_SEP) + 1);
1950 }
1951 XMLTools.setNodeText (collectionmetadata, index_strs[i]);
1952
1953 appendProperly (toElement, collectionmetadata);
1954
1955 }
1956 toElement.appendChild (mg_indexes);
1957
1958 }
1959
1960 private void doDisplayFormat (Document to, Element from) {
1961 //display element in the xml file
1962 Element de = (Element)XMLTools.getChildByTagName (from, StaticStrings.DISPLAY_STR);
1963 if (de == null) {
1964 return;
1965 }
1966 //format element in the display element
1967 Element fe = (Element)XMLTools.getChildByTagName (de, StaticStrings.FORMAT_STR);
1968
1969 to.getDocumentElement ().appendChild (doFormat(to, fe, StaticStrings.DISPLAY_STR));
1970 }
1971
1972 //construct 'DefaultIndex' element in the internal structure from collectionConfig.xml
1973 private void doDefaultIndex (Document to, Node searchNode) {
1974 Element toElement = to.getDocumentElement ();
1975 Element default_index_element = to.createElement (StaticStrings.INDEX_DEFAULT_ELEMENT);
1976 default_index_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1977
1978 Element e = (Element)XMLTools.getChildByTagName (searchNode, StaticStrings.INDEX_DEFAULT_ELEMENT_LOWERCASE);//defaultIndex
1979 if (e == null) {
1980 return;
1981 }
1982 String index_str = e.getAttribute (StaticStrings.NAME_ATTRIBUTE);
1983
1984 boolean old_index = false;
1985 if(index_str.indexOf (StaticStrings.COLON_CHARACTER) != -1) {
1986 //The index is 'level:source tuplets' which is for mg. Take out 'level'
1987 old_index = true;
1988 default_index_element.setAttribute (StaticStrings.LEVEL_ATTRIBUTE,
1989 index_str.substring (0, index_str.indexOf (StaticStrings.COLON_CHARACTER)));
1990 index_str = index_str.substring (index_str.indexOf (StaticStrings.COLON_CHARACTER) + 1);
1991 } else {
1992 default_index_element.setAttribute (StaticStrings.LEVEL_ATTRIBUTE, "");
1993 }
1994
1995 //Each index may have a list of comma-separated strings.
1996 //split them into 'content' elements in the internal structure
1997 StringTokenizer content_tokenizer = new StringTokenizer (index_str, StaticStrings.COMMA_CHARACTER);
1998 while(content_tokenizer.hasMoreTokens ()) {
1999 Element content_element = to.createElement (StaticStrings.CONTENT_ELEMENT);
2000 String content_str = content_tokenizer.nextToken ();
2001 // 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.
2002 if(content_str.indexOf (StaticStrings.NS_SEP) == -1) {
2003 if(content_str.equals (StaticStrings.TEXT_STR) ||
2004 (!old_index && content_str.equals (StaticStrings.ALLFIELDS_STR))) {
2005 // in this case, do nothing
2006 }
2007 else {
2008 content_str = StaticStrings.EXTRACTED_NAMESPACE + content_str;
2009 }
2010 }
2011
2012 content_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, content_str);
2013 default_index_element.appendChild (content_element);
2014 content_element = null;
2015 }
2016 appendProperly (toElement, default_index_element);
2017 }
2018 // For mg, this method is still called, but make it 'assigned=false'
2019 private void doDefaultLevel (Document to, Node searchNode) {
2020 Element toElement = to.getDocumentElement ();
2021 Element default_index_option = to.createElement (StaticStrings.INDEXOPTION_DEFAULT_ELEMENT);
2022 default_index_option.setAttribute (StaticStrings.NAME_STR, StaticStrings.LEVEL_DEFAULT_STR);
2023
2024 Element e = (Element)XMLTools.getChildByTagName (searchNode, StaticStrings.LEVEL_DEFAULT_ELEMENT);
2025 if (e != null) {
2026 default_index_option.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2027 String level = e.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2028 default_index_option.setAttribute (StaticStrings.VALUE_ATTRIBUTE, level);
2029 } else {
2030 //In the case of mg, there's no level! build a default one using 'assigned=false value=document'
2031 default_index_option.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR);
2032 default_index_option.setAttribute (StaticStrings.VALUE_ATTRIBUTE, StaticStrings.DOCUMENT_STR);
2033 }
2034 appendProperly (toElement, default_index_option);
2035 }
2036
2037 // Transform plugins (pluginListNode) of collectionConfig.xml into the internal structure (i.e. Document to)
2038 private void doPlugin (Document to, Node pluginListNode) {
2039 Element toElement = to.getDocumentElement ();
2040 NodeList plugin_children = ((Element)pluginListNode).getElementsByTagName (StaticStrings.PLUGIN_STR);
2041 int plugin_nodes = plugin_children.getLength ();
2042
2043 if (plugin_nodes < 1) {
2044 return;
2045 }
2046
2047 for (int i=0; i<plugin_nodes; i++) {
2048 Element e = (Element)plugin_children.item (i);
2049 String str = e.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2050 Element plugin_element = to.createElement (StaticStrings.PLUGIN_ELEMENT);
2051 plugin_element.setAttribute (StaticStrings.TYPE_ATTRIBUTE, str);
2052
2053
2054 NodeList option_children = e.getElementsByTagName (StaticStrings.OPTION_STR);
2055
2056 for (int j=0; j<option_children.getLength (); j++) {
2057 Element el = (Element)option_children.item (j);
2058 String name_str = el.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2059 if (name_str.startsWith (StaticStrings.MINUS_CHARACTER)) {
2060 name_str = name_str.substring (1);
2061 }
2062 String value_str = el.getAttribute (StaticStrings.VALUE_ATTRIBUTE);
2063 Element option_element = null;
2064
2065 if (name_str.equals ("") && !value_str.equals ("")) {
2066 continue;
2067 }
2068
2069
2070 option_element = to.createElement (StaticStrings.OPTION_ELEMENT);
2071 option_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2072 if(name_str.equals (StaticStrings.RECPLUG_STR) && value_str.equals (StaticStrings.USE_METADATA_FILES_ARGUMENT)) {
2073 continue; // ignore this option
2074 }
2075
2076 if(value_str != null) {
2077 // Remove any speech marks appended in strings containing whitespace
2078 if(value_str.startsWith (StaticStrings.SPEECH_CHARACTER) && value_str.endsWith (StaticStrings.SPEECH_CHARACTER)) {
2079 value_str = value_str.substring (1, value_str.length () - 1);
2080 }
2081 if(name_str.equals (StaticStrings.METADATA_STR)) {
2082 // 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.
2083 String[] values = value_str.split (StaticStrings.COMMA_CHARACTER);
2084 value_str = "";
2085 for (int k=0; k<=values.length-1; k++) {
2086 if (values[k].indexOf (StaticStrings.NS_SEP) == -1) {
2087 values[k] = StaticStrings.EXTRACTED_NAMESPACE + values[k];
2088 }
2089
2090 if (k < values.length-1) {
2091 value_str = value_str + values[k] + StaticStrings.COMMA_CHARACTER;
2092
2093 } else {
2094 value_str = value_str + values[k];
2095 }
2096 }
2097 }
2098 }
2099 if (!name_str.equals ("")) {
2100 option_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
2101 }
2102 if (!value_str.equals ("")) {
2103 XMLTools.setNodeText (option_element, value_str);
2104 }
2105 plugin_element.appendChild (option_element);
2106
2107 }
2108
2109 appendProperly (toElement, plugin_element);
2110 }
2111
2112 }
2113
2114 //Handle classifiers
2115 private void doClassifier (Document to, Node browseNode) {
2116 Element toElement = to.getDocumentElement ();
2117 NodeList classifier_children = ((Element)browseNode).getElementsByTagName (StaticStrings.CLASSIFIER_STR);
2118 int num_nodes = classifier_children.getLength ();
2119
2120 if (num_nodes < 1) {
2121 return;
2122 }
2123
2124 for (int i=0; i<num_nodes; i++) {
2125 Element e = (Element)classifier_children.item (i);
2126 String str = e.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2127 Element classify_element = to.createElement (StaticStrings.CLASSIFY_ELEMENT);
2128 classify_element.setAttribute (StaticStrings.TYPE_ATTRIBUTE, str);
2129
2130 String options_str = "";
2131 NodeList option_children = e.getElementsByTagName (StaticStrings.OPTION_STR);
2132 for (int j=0; j<option_children.getLength (); j++) {
2133 Element el = (Element)option_children.item (j);
2134 String name_str = el.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2135 options_str = options_str + ((name_str.equals(""))? "" : (" " + name_str));
2136 if (name_str.startsWith (StaticStrings.MINUS_CHARACTER)) {
2137 name_str = name_str.substring (1);
2138 }
2139 String value_str = el.getAttribute (StaticStrings.VALUE_ATTRIBUTE);
2140 options_str = options_str + ((name_str.equals(""))? "" : (" " + value_str));
2141 Element option_element = null;
2142
2143 if (name_str.equals ("") && !value_str.equals ("")) {
2144 continue; //invalid condition
2145 }
2146
2147 option_element = to.createElement (StaticStrings.OPTION_ELEMENT);
2148 option_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2149
2150 if (!name_str.equals ("")) {
2151 option_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
2152 }
2153
2154 if (!value_str.equals ("") && name_str.equals (StaticStrings.METADATA_STR)) {
2155 // 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.
2156 String[] values = value_str.split (StaticStrings.COMMA_CHARACTER);
2157 value_str = "";
2158 for (int k=0; k<=values.length-1; k++) {
2159 if (values[k].indexOf (StaticStrings.NS_SEP) == -1) {
2160 values[k] = StaticStrings.EXTRACTED_NAMESPACE + values[k];
2161 }
2162 else {
2163 MetadataElement metadata_element = MetadataTools.getMetadataElementWithName (values[k]);
2164 if (metadata_element != null) {
2165 values[k] = metadata_element.getDisplayName ();
2166 }
2167 }
2168 if (k < values.length-1) {
2169 value_str = value_str + values[k] + StaticStrings.COMMA_CHARACTER;
2170 } else {
2171 value_str = value_str + values[k];
2172 }
2173 }
2174 }
2175
2176 if (value_str != null && !value_str.equals ("")) {
2177 XMLTools.setNodeText (option_element, value_str);
2178 }
2179 classify_element.appendChild (option_element);
2180 }
2181 //format element for this classifier
2182 Element format = (Element)XMLTools.getChildByTagName (e, StaticStrings.FORMAT_STR);
2183 if(format != null) {
2184 classify_element.appendChild (doFormat(to, format, null));
2185 }
2186 appendProperly (toElement, classify_element);
2187 }
2188
2189 // default format statement for all classifiers
2190 Element default_classifier_format = (Element)XMLTools.getChildByTagName (browseNode, StaticStrings.FORMAT_STR);
2191
2192 to.getDocumentElement ().appendChild (doFormat(to, default_classifier_format, StaticStrings.BROWSE_STR));
2193 }
2194 private Element doFormat(Document to, Element format, String name_str) {
2195 Element format_element = to.createElement (StaticStrings.FORMAT_STR);
2196 if (name_str != null) {
2197 format_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
2198 }
2199 if (format != null) {
2200 String gsf_text = XMLTools.xmlNodeToStringWithoutNewline(format);
2201
2202 if (gsf_text.startsWith("<") && (gsf_text.indexOf("<") != gsf_text.lastIndexOf("<"))) {
2203 gsf_text = gsf_text.substring(gsf_text.indexOf("<gsf"),
2204 gsf_text.indexOf(StaticStrings.FORMAT_END_TAG));
2205 }
2206
2207 XMLTools.setNodeText(format_element, gsf_text);
2208 }
2209 return format_element;
2210 }
2211 // Handling 'subcollection' elements in 'search' element of 'collectionConfig.xml'
2212 private void doSubcollection (Document to, Node searchNode) {
2213 Element toElement = to.getDocumentElement ();
2214 NodeList sub_children = ((Element)searchNode).getElementsByTagName (StaticStrings.SUBCOLLECTION_STR);
2215 int sub_nodes = sub_children.getLength ();
2216
2217 // There is no subcollection
2218 if (sub_nodes < 1) {
2219 return;
2220 }
2221
2222 for (int i=0; i<sub_nodes; i++) {
2223 Element sub_child = (Element)sub_children.item (i);
2224 String name_str = sub_child.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2225 String filter_str = sub_child.getAttribute (StaticStrings.FILTER_ATTRIBUTE);
2226
2227 // filter_str is in the form '<! (if set)><metadata>/<metadata value>/<flag (if any)>'
2228
2229 int pos = filter_str.indexOf (StaticStrings.SEPARATOR_CHARACTER);
2230 String meta_str = "";
2231 String meta_value_str = "";
2232 String clude_str = "";
2233 String flag_str = "";
2234 if (pos == -1) {
2235
2236 meta_str = meta_value_str = filter_str;
2237 clude_str = StaticStrings.INCLUDE_STR;
2238 } else {
2239 clude_str = StaticStrings.INCLUDE_STR;
2240 if (filter_str.startsWith (StaticStrings.EXCLAMATION_CHARACTER)) {
2241 clude_str = StaticStrings.EXCLUDE_STR;
2242 // Peel off "!"
2243 filter_str = filter_str.substring (StaticStrings.EXCLAMATION_CHARACTER.length ());
2244 }
2245
2246 String[] strs = filter_str.split (StaticStrings.SEPARATOR_CHARACTER);
2247 if (strs[0] != null && strs[0] != "") {
2248 meta_str = strs[0];
2249 }
2250 if(!meta_str.equals (StaticStrings.FILENAME_STR) && meta_str.indexOf (StaticStrings.NS_SEP) == -1) {
2251 meta_str = StaticStrings.EXTRACTED_NAMESPACE + meta_str;
2252 }
2253
2254 if (strs[1] != null && strs[1] != "") {
2255 meta_value_str = strs[1];
2256 }
2257 if (strs.length > 2) {
2258 //This means there has been set a flag
2259 if (strs[2] != null && strs[2] != "") {
2260 flag_str = strs[2];
2261 }
2262 }
2263 }
2264 Element subcollection_element = to.createElement (StaticStrings.SUBCOLLECTION_ELEMENT);
2265 subcollection_element.setAttribute (StaticStrings.NAME_STR, name_str);
2266 subcollection_element.setAttribute (StaticStrings.CONTENT_ATTRIBUTE, meta_str);
2267 subcollection_element.setAttribute (StaticStrings.TYPE_ATTRIBUTE, clude_str);
2268 if (flag_str != "") {
2269 subcollection_element.setAttribute (StaticStrings.OPTIONS_ATTRIBUTE, flag_str);
2270 }
2271 XMLTools.setNodeText (subcollection_element, meta_value_str);
2272
2273 toElement.appendChild (subcollection_element);
2274 }
2275 }
2276 //Handle levels (document, section). In the internal structure, the element is called 'IndexOption'
2277 private void doLevel (Document to, Node searchNode) {
2278 Element toElement = to.getDocumentElement ();
2279 NodeList level_children = ((Element)searchNode).getElementsByTagName (StaticStrings.LEVEL_ATTRIBUTE);
2280 int level_nodes = level_children.getLength ();
2281
2282 // it's mg, there's no level. So we construct a default 'indexOption' in the internal structure
2283 if (level_nodes < 1) {
2284 Element index_option = to.createElement (StaticStrings.INDEXOPTIONS_ELEMENT);
2285 index_option.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR);
2286 index_option.setAttribute (StaticStrings.NAME_STR, StaticStrings.LEVELS_STR);
2287
2288 Element option_element = to.createElement (StaticStrings.OPTION_ELEMENT);
2289 option_element.setAttribute (StaticStrings.NAME_STR, StaticStrings.DOCUMENT_STR);
2290 index_option.appendChild (option_element);
2291
2292 appendProperly (toElement, index_option);
2293
2294 return;
2295 }
2296
2297 Element index_option = to.createElement (StaticStrings.INDEXOPTIONS_ELEMENT);
2298 index_option.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2299 index_option.setAttribute (StaticStrings.NAME_STR, StaticStrings.LEVELS_STR);
2300
2301 for (int i=0; i<level_nodes; i++) {
2302 Element level_element = (Element)level_children.item (i);
2303 String level_str = level_element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2304 Element option_element = to.createElement (StaticStrings.OPTION_ELEMENT);
2305 option_element.setAttribute (StaticStrings.NAME_STR, level_str);
2306 index_option.appendChild (option_element);
2307
2308
2309 // Contructing 'collectionmetadata' elements from the 'displayItem' of this 'level' element
2310 ArrayList displayItem_list = XMLTools.getNamedElementList (level_element,
2311 StaticStrings.DISPLAYITEM_STR, StaticStrings.NAME_ATTRIBUTE, StaticStrings.NAME_STR);
2312 if (displayItem_list == null) {
2313 return ;
2314 }
2315 for (int j=0; j<displayItem_list.size (); j++) {
2316 Element item = (Element)displayItem_list.get (j);
2317 String text = XMLTools.getNodeText (item);
2318 String lang = item.getAttribute (StaticStrings.LANG_ATTRIBUTE);
2319
2320 //If there is nothing to display, don't bother creating the element
2321 if (text == "") {
2322 continue;
2323 }
2324 Element collectionmetadata = to.createElement (StaticStrings.COLLECTIONMETADATA_ELEMENT);
2325 collectionmetadata.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2326 collectionmetadata.setAttribute (StaticStrings.NAME_ATTRIBUTE, level_str);
2327 collectionmetadata.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, lang);
2328 XMLTools.setNodeText (collectionmetadata, text);
2329
2330 appendProperly (toElement, collectionmetadata);
2331 }
2332 }
2333 appendProperly (toElement, index_option);
2334 }
2335 //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.
2336 private void doIndexSubcollection (Document to, Node searchNode) {
2337 Element toElement = to.getDocumentElement ();
2338 NodeList index_sub_children = ((Element)searchNode).getElementsByTagName (StaticStrings.SUBCOLLECTION_INDEX_ELEMENT);
2339 int num_nodes = index_sub_children.getLength ();
2340
2341 // there is no subcollection index
2342 if (num_nodes < 1) {
2343 return;
2344 }
2345
2346 Element subcollection_indexes = to.createElement (StaticStrings.SUBCOLLECTION_INDEXES_ELEMENT);
2347
2348 for (int i=0; i<num_nodes; i++) {
2349 Element index_element = to.createElement (StaticStrings.INDEX_ELEMENT);
2350 Element index_sub_child = (Element)index_sub_children.item (i);
2351 String name_str = index_sub_child.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2352
2353 // name_str is in the form of comma separated strings, each of which is a subcollection filter name
2354 String[] filters = name_str.split (StaticStrings.COMMA_CHARACTER);
2355 for (int j=0; j<filters.length; j++) {
2356
2357 Element content_element = to.createElement (StaticStrings.CONTENT_ELEMENT);
2358 content_element.setAttribute (StaticStrings.NAME_STR, filters[j]);
2359 index_element.appendChild (content_element);
2360 }
2361 subcollection_indexes.appendChild (index_element);
2362
2363 // Contructing 'collectionmetadata' elements from the 'displayItem' of this 'indexSubcollection' element
2364 ArrayList displayItem_list = XMLTools.getNamedElementList (index_sub_child,
2365 StaticStrings.DISPLAYITEM_STR, StaticStrings.NAME_ATTRIBUTE, StaticStrings.NAME_STR);
2366 if (displayItem_list == null) {
2367 // there is no display item for this element
2368 continue;
2369 }
2370 for (int j=0; j<displayItem_list.size (); j++) {
2371 Element item = (Element)displayItem_list.get (j);
2372 String text = XMLTools.getNodeText (item);
2373 String lang = item.getAttribute (StaticStrings.LANG_ATTRIBUTE);
2374
2375 //If there is nothing to display, don't bother creating the element
2376 if (text == "") {
2377 continue;
2378 }
2379 Element collectionmetadata = to.createElement (StaticStrings.COLLECTIONMETADATA_ELEMENT);
2380 collectionmetadata.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2381 collectionmetadata.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
2382 collectionmetadata.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, lang);
2383 XMLTools.setNodeText (collectionmetadata, text);
2384
2385 appendProperly (toElement, collectionmetadata);
2386 }
2387 }
2388 appendProperly (toElement, subcollection_indexes);
2389 }
2390 //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.
2391 private void doIndexLanguage (Document to, Node searchNode) {
2392 Element toElement = to.getDocumentElement ();
2393 NodeList index_sub_children = ((Element)searchNode).getElementsByTagName (StaticStrings.LANGUAGE_INDEX_ELEMENT);
2394 int num_nodes = index_sub_children.getLength ();
2395
2396 // there is no subcollection index
2397 if (num_nodes < 1) {
2398 return;
2399 }
2400
2401 Element language_indexes = to.createElement (StaticStrings.LANGUAGES_ELEMENT);
2402
2403 for (int i=0; i<num_nodes; i++) {
2404 Element language_element = to.createElement (StaticStrings.LANGUAGE_ELEMENT);
2405 Element index_sub_child = (Element)index_sub_children.item (i);
2406 String name_str = index_sub_child.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2407 language_element.setAttribute (StaticStrings.NAME_STR, name_str);
2408 language_indexes.appendChild (language_element);
2409
2410 // Contructing 'collectionmetadata' elements from the 'displayItem' of this 'indexLanguage' element
2411 ArrayList displayItem_list = XMLTools.getNamedElementList (index_sub_child,
2412 StaticStrings.DISPLAYITEM_STR, StaticStrings.NAME_ATTRIBUTE, StaticStrings.NAME_STR);
2413 if (displayItem_list == null) {
2414 // there is no display item for this element
2415 continue;
2416 }
2417 for (int j=0; j<displayItem_list.size (); j++) {
2418 Element item = (Element)displayItem_list.get (j);
2419 String text = XMLTools.getNodeText (item);
2420 String lang = item.getAttribute (StaticStrings.LANG_ATTRIBUTE);
2421
2422 //If there is nothing to display, don't bother creating the element
2423 if (text == "") {
2424 continue;
2425 }
2426 Element collectionmetadata = to.createElement (StaticStrings.COLLECTIONMETADATA_ELEMENT);
2427 collectionmetadata.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2428 collectionmetadata.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
2429 collectionmetadata.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, lang);
2430 XMLTools.setNodeText (collectionmetadata, text);
2431
2432 appendProperly (toElement, collectionmetadata);
2433 }
2434 }
2435 toElement.appendChild (language_indexes);
2436 }
2437 // Handling both searchType and search format statement
2438 private void doSearchFormat (Document to, Node searchNode) {
2439 //There are two elements called <format> in <search>: one is for searchType; another is for format statement
2440 NodeList format_children = ((Element)searchNode).getElementsByTagName (StaticStrings.FORMAT_STR);
2441 int format_nodes = format_children.getLength ();
2442 if (format_nodes < 1) {
2443 return;
2444 }
2445 Element format = null;
2446 Element search_type = null;
2447 for(int i=0; i<format_nodes; i++) {
2448 Node e = format_children.item (i);
2449 if (e.hasAttributes () == false) {
2450 //The format element for format statement has no any attribute
2451 format = (Element)e;
2452 }
2453 else if (((Element)e).getAttribute (StaticStrings.NAME_ATTRIBUTE).equals(StaticStrings.SEARCHTYPE_ELEMENT)) {
2454 search_type = (Element)e;
2455 }
2456 }
2457 //format statement for search
2458 if (format != null) {
2459 (to.getDocumentElement ()).appendChild (doFormat(to, format, StaticStrings.SEARCH_STR));
2460 }
2461 // searchType in search
2462 if(search_type != null) {
2463 String searchtype_str = XMLTools.getNodeText(search_type);
2464
2465 Element search_type_element = to.createElement (StaticStrings.FORMAT_STR);
2466 search_type_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, StaticStrings.SEARCHTYPE_ELEMENT);
2467 XMLTools.setNodeText(search_type_element, searchtype_str);
2468
2469
2470 appendProperly (to.getDocumentElement (), search_type_element);
2471 }
2472 }
2473 // Handling defaultIndexLanguage and languageMetadata in collectionConfig.xml ('elementNameFrom'); in the internal structure, they are called 'DefaultLanguage' and 'LanguageMetadata' ('elementNameTo') respectively.
2474 // Converting from collectionConfig.xml to the internal xml structure.
2475 private void doLanguageMetadata (Document to, Node searchNode) {
2476 Element toElement = to.getDocumentElement ();
2477 String elementNameFrom = StaticStrings.LANGUAGE_METADATA_ELEMENT_STR;
2478 String elementNameTo = StaticStrings.LANGUAGE_METADATA_ELEMENT;
2479 Node from_element = XMLTools.getChildByTagName (searchNode, elementNameFrom);
2480 if (from_element == null) {
2481 return; // such an element not found
2482 }
2483
2484 Element to_element = to.createElement (elementNameTo);
2485
2486 String name_str = ((Element)from_element).getAttribute (StaticStrings.NAME_ATTRIBUTE);
2487 if (name_str.indexOf (StaticStrings.NS_SEP) == -1) {
2488 name_str = StaticStrings.EXTRACTED_NAMESPACE + name_str;
2489 }
2490 to_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
2491 to_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2492
2493 toElement.appendChild (to_element);
2494 }
2495 private void doReplaceListRef (Document to, Element from) {
2496 Element toElement = to.getDocumentElement ();
2497
2498 Node replace_element = XMLTools.getChildByTagName (from, StaticStrings.REPLACELISTREF_STR);
2499 if (replace_element == null) {
2500 return; // such an element not found
2501 }
2502
2503 Element to_element = XMLTools.duplicateElement (to, (Element)replace_element, true);
2504 toElement.appendChild (to_element);
2505 }
2506 private void convertReplaceListRef (Document from, Document to) {
2507 Element toElement = to.getDocumentElement ();
2508
2509 Node replace_element = XMLTools.getChildByTagName (from.getDocumentElement (), StaticStrings.REPLACELISTREF_STR);
2510 if (replace_element == null) {
2511 return; // such an element not found
2512 }
2513
2514 Element to_element = XMLTools.duplicateElement (to, (Element)replace_element, true);
2515 toElement.appendChild (to_element);
2516 }
2517 private void doOAIElement (Document to, Element from) {
2518 Element toElement = to.getDocumentElement ();
2519
2520 Node oai_element = XMLTools.getChildByTagName (from, StaticStrings.OAI_ELEMENT);
2521 if (oai_element == null) {
2522 return; // such an element not found
2523 }
2524
2525 Element to_element = XMLTools.duplicateElement (to, (Element)oai_element, true);
2526 toElement.appendChild (to_element);
2527 }
2528 private void convertOAIElement (Document from, Document to) {
2529 Element toElement = to.getDocumentElement ();
2530
2531 Node oai_element = XMLTools.getChildByTagName (from.getDocumentElement (), StaticStrings.OAI_ELEMENT);
2532 if (oai_element == null) {
2533 return; // such an element not found
2534 }
2535
2536 Element to_element = XMLTools.duplicateElement (to, (Element)oai_element, true);
2537 toElement.appendChild (to_element);
2538 }
2539 private void doDefaultIndexLanguage (Document to, Node searchNode) {
2540 Element toElement = to.getDocumentElement ();
2541 String elementNameFrom = StaticStrings.LANGUAGE_DEFAULT_INDEX_ELEMENT;
2542 String elementNameTo = StaticStrings.LANGUAGE_DEFAULT_ELEMENT;
2543 Node from_element = XMLTools.getChildByTagName (searchNode, elementNameFrom);
2544 if (from_element == null) {
2545 return; // such an element not found
2546 }
2547
2548 Element to_element = to.createElement (elementNameTo);
2549
2550 String name_str = ((Element)from_element).getAttribute (StaticStrings.NAME_ATTRIBUTE);
2551 to_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
2552 to_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2553
2554 toElement.appendChild (to_element);
2555 }
2556
2557 //Handle 'indexOption' (i.e. casefold, stem etc). In the internal structure, the element is called 'IndexOption'
2558 private void doIndexOption (Document to, Node searchNode) {
2559 Element toElement = to.getDocumentElement ();
2560 Node index_option_node = XMLTools.getChildByTagName (searchNode, StaticStrings.INDEXOPTION_STR);
2561 if (index_option_node == null) {
2562 return;
2563 }
2564 NodeList option_children = ((Element)index_option_node).getElementsByTagName (StaticStrings.OPTION_STR);
2565 int option_nodes = option_children.getLength ();
2566
2567 // for lucene, there is no 'indexOption'. We build a default 'indexOption' and 'assigned=false' in case the user switches to mg or mgpp
2568 if (option_nodes < 1) {
2569 Element index_option = to.createElement (StaticStrings.INDEXOPTIONS_ELEMENT);
2570 index_option.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR);
2571 index_option.setAttribute (StaticStrings.NAME_STR, StaticStrings.INDEXOPTIONS_STR);
2572 String[] option_str =
2573 { StaticStrings.CASEFOLD_OPTION_STR, StaticStrings.STEM_OPTION_STR };
2574 for (int i=0; i<option_str.length; i++) {
2575 Element option_element = to.createElement (StaticStrings.OPTION_ELEMENT);
2576 option_element.setAttribute (StaticStrings.NAME_STR, option_str[i]);
2577 index_option.appendChild (option_element);
2578 }
2579 appendProperly (toElement, index_option);
2580 return;
2581 }
2582
2583 Element index_option = to.createElement (StaticStrings.INDEXOPTIONS_ELEMENT);
2584 index_option.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2585 index_option.setAttribute (StaticStrings.NAME_STR, StaticStrings.INDEXOPTIONS_STR);
2586
2587 for (int i=0; i<option_nodes; i++) {
2588 String option_str = ((Element)option_children.item (i)).getAttribute (StaticStrings.NAME_ATTRIBUTE);
2589 Element option_element = to.createElement (StaticStrings.OPTION_ELEMENT);
2590 option_element.setAttribute (StaticStrings.NAME_STR, option_str);
2591 index_option.appendChild (option_element);
2592 }
2593 appendProperly (toElement, index_option);
2594 }
2595
2596 private Element doBuildType (Document to, String att_value) {
2597
2598 //construct 'BuildType' element
2599 Element element = to.createElement (StaticStrings.BUILDTYPE_ELEMENT);
2600 element.setAttribute (StaticStrings.NAME_ATTRIBUTE, StaticStrings.BUILDTYPE_STR);
2601 element.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, StaticStrings.ENGLISH_LANGUAGE_STR);
2602 element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2603 element.setAttribute (StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR);
2604
2605 XMLTools.setNodeText (element, att_value);
2606
2607 return element;
2608 }
2609
2610 // Convert 'description', 'smallicon' etc.
2611 private void convertDisplayItemList (Document from, Document to) {
2612 Element displayItemList = to.createElement (StaticStrings.DISPLAYITEMLIST_STR);
2613 Element destination = to.getDocumentElement ();
2614
2615 String []att_values =
2616 {StaticStrings.COLLECTIONMETADATA_COLLECTIONEXTRA_STR,
2617 StaticStrings.COLLECTIONMETADATA_ICONCOLLECTIONSMALL_STR,
2618 StaticStrings.COLLECTIONMETADATA_ICONCOLLECTION_STR,
2619 StaticStrings.COLLECTIONMETADATA_COLLECTIONNAME_STR};
2620
2621 String []map_attrs =
2622 {StaticStrings.DESCRIPTION_STR,
2623 StaticStrings.SMALLICON_STR,
2624 StaticStrings.ICON_STR,
2625 StaticStrings.NAME_STR};
2626
2627 for (int i=0; i<att_values.length; i++) {
2628
2629 //dOc
2630 ArrayList e_list = XMLTools.getNamedElementList (from.getDocumentElement (),
2631 StaticStrings.COLLECTIONMETADATA_ELEMENT,
2632 StaticStrings.NAME_ATTRIBUTE, att_values[i]);
2633 // if such elements don't exist, don't bother
2634 if (e_list == null) {
2635 continue;
2636 }
2637 for (int j=0; j<e_list.size (); j++) {
2638 Element e = (Element)e_list.get (j);
2639 if (e.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
2640 continue;
2641 }
2642 String text = XMLTools.getNodeText (e);
2643 String lang = e.getAttribute (StaticStrings.LANGUAGE_ATTRIBUTE);
2644
2645 Element displayItem = constructElement (StaticStrings.DISPLAYITEM_STR, map_attrs[i],
2646 StaticStrings.LANG_STR, lang, text, to);
2647 displayItemList.appendChild (displayItem);
2648 }
2649
2650 }
2651 destination.appendChild (displayItemList);
2652 }
2653 // This method creates a DisplayItem element of the type of 'to' by using the ingredients from the element 'e'
2654 private Element constructDisplayItem (Element e, Document to) {
2655 String lang_string = e.getAttribute (StaticStrings.LANGUAGE_ATTRIBUTE);
2656 String text = XMLTools.getNodeText (e);
2657 Element displayItem = to.createElement (StaticStrings.DISPLAYITEM_STR);
2658 displayItem.setAttribute (StaticStrings.NAME_ATTRIBUTE, StaticStrings.NAME_ATTRIBUTE);
2659 displayItem.setAttribute (StaticStrings.LANG_STR, lang_string);
2660 XMLTools.setNodeText (displayItem, text);
2661 return displayItem;
2662 }
2663 private void convertMetadataList (Document from, Document to) {
2664 Element metadataList = to.createElement (StaticStrings.METADATALIST_STR);
2665 Element destination = to.getDocumentElement ();
2666
2667 String []ele_names =
2668 {StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT,
2669 StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT,
2670 StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT};
2671 String []att_names =
2672 {StaticStrings.COLLECTIONMETADATA_CREATOR_STR,
2673 StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR,
2674 StaticStrings.COLLECTIONMETADATA_PUBLIC_STR};
2675 for (int i=0; i<ele_names.length; i++) {
2676 Element e = XMLTools.getNamedElement (from.getDocumentElement (),
2677 ele_names[i], StaticStrings.NAME_ATTRIBUTE, att_names[i]);
2678 if (e == null) {
2679 continue;
2680 }
2681 String text = XMLTools.getNodeText (e);
2682 Element metadata = to.createElement (StaticStrings.METADATA_STR);
2683 metadata.setAttribute (StaticStrings.NAME_ATTRIBUTE, att_names[i]);
2684 metadata.setAttribute (StaticStrings.LANG_STR, StaticStrings.ENGLISH_LANGUAGE_STR);
2685 XMLTools.setNodeText (metadata, text);
2686 metadataList.appendChild (metadata);
2687 }
2688
2689 destination.appendChild (metadataList);
2690 }
2691 // This method creates an element with the name 'element_name' of the type of 'to' by using the other three strings
2692 private Element constructElement (String element_name, String name_value, String lang_att, String lang_value, String text, Document to) {
2693 Element e = to.createElement (element_name);
2694 e.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2695 e.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_value);
2696 e.setAttribute (lang_att, lang_value);
2697 XMLTools.setNodeText (e, text);
2698
2699 return e;
2700 }
2701 // Convert classify in the internal(i.e. Document from) to collectionconfig.xml (i.e. Document to)
2702 private void convertClassifier (Document from, Document to) {
2703 Element browse_element = to.createElement (StaticStrings.BROWSE_STR);
2704 NodeList children = from.getDocumentElement ().getElementsByTagName (StaticStrings.CLASSIFY_ELEMENT);
2705
2706 int num_children = (children == null)? 0 : children.getLength ();
2707
2708 if (num_children == 0) {
2709 return ;
2710 }
2711
2712 for (int i=0; i<num_children; i++) {
2713
2714 Element child = (Element)children.item (i);
2715 if (child.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
2716 continue;
2717 }
2718 String str = child.getAttribute (StaticStrings.TYPE_ATTRIBUTE);
2719 Element classifier_element = to.createElement (StaticStrings.CLASSIFIER_STR);
2720 classifier_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, str);
2721
2722 NodeList option_children = child.getElementsByTagName (StaticStrings.OPTION_ELEMENT);
2723 for (int j=0; j<option_children.getLength (); j++) {
2724 Element el = (Element)option_children.item (j);
2725 if (el.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
2726 continue;
2727 }
2728 String name_str = el.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2729 String value_str = XMLTools.getNodeText (el);
2730
2731
2732 if (name_str == null && value_str == null) {
2733 continue;
2734 }
2735 Element option_element = to.createElement (StaticStrings.OPTION_STR);
2736 if (name_str != null && name_str.equals (StaticStrings.METADATA_STR)) {
2737
2738 // 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.
2739 String[] values = value_str.split (StaticStrings.COMMA_CHARACTER);
2740 value_str = "";
2741 for (int k=0; k<=values.length-1; k++) {
2742 if(values[k].startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
2743 values[k] = values[k].substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
2744 }
2745 else {
2746 MetadataElement metadata_element = MetadataTools.getMetadataElementWithDisplayName (values[k]);
2747 if (metadata_element != null) {
2748 values[k] = metadata_element.getFullName ();
2749 }
2750 }
2751 if (k < values.length-1) {
2752 value_str = value_str + values[k] + StaticStrings.COMMA_CHARACTER;
2753 } else {
2754 value_str = value_str + values[k];
2755 }
2756 }
2757 }
2758
2759 if (!name_str.equals ("")) {
2760 if (!name_str.startsWith (StaticStrings.MINUS_CHARACTER)) {
2761 name_str = StaticStrings.MINUS_CHARACTER + name_str;
2762 }
2763 option_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
2764 }
2765
2766 if (!value_str.equals ("")) {
2767 option_element.setAttribute (StaticStrings.VALUE_ATTRIBUTE, value_str);
2768 }
2769
2770 classifier_element.appendChild (option_element);
2771 }
2772
2773 //format element for this classifier
2774 Element e = (Element)XMLTools.getChildByTagName (child, StaticStrings.FORMAT_STR);
2775
2776 if (e != null) {
2777 classifier_element.appendChild (convertFormat(to, e));
2778 }
2779 browse_element.appendChild (classifier_element);
2780 }
2781
2782 //convert default classifier format
2783 Element e = XMLTools.getNamedElement (from.getDocumentElement (), StaticStrings.FORMAT_STR,
2784 StaticStrings.NAME_ATTRIBUTE, StaticStrings.BROWSE_STR);
2785 browse_element.appendChild (convertFormat(to, e));
2786
2787 to.getDocumentElement ().appendChild (browse_element);
2788 }
2789 private Element convertFormat(Document to, Element e) {
2790 String format_str = XMLTools.getNodeText(e);
2791 Element format = to.createElement (StaticStrings.FORMAT_STR);
2792 //XMLTools.copyAllChildren (format, e);
2793 XMLTools.setNodeText(format, format_str);
2794 return format;
2795 }
2796 //convert format statement for search
2797 private void convertSearchFormat (Document from, Document to) {
2798 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR);
2799 Element e = XMLTools.getNamedElement (from.getDocumentElement (), StaticStrings.FORMAT_STR,
2800 StaticStrings.NAME_ATTRIBUTE, StaticStrings.SEARCH_STR);
2801
2802 search.appendChild (convertFormat(to, e));
2803
2804 }
2805 //convert format statement for display of the documents
2806 private void convertDisplayFormat (Document from, Document to) {
2807 Element e = XMLTools.getNamedElement (from.getDocumentElement (), StaticStrings.FORMAT_STR,
2808 StaticStrings.NAME_ATTRIBUTE, StaticStrings.DISPLAY_STR);
2809 if (e == null) {
2810 return;
2811 }
2812 Element display = to.createElement (StaticStrings.DISPLAY_STR);
2813 display.appendChild (convertFormat(to, e));
2814 to.getDocumentElement ().appendChild (display);
2815 }
2816 // Convert plugins in the internal(i.e. Document from) to collectionconfig.xml (i.e. Document to)
2817 private void convertPlugin (Document from, Document to) {
2818 Element import_element = to.createElement (StaticStrings.IMPORT_STR);
2819 Element plugin_list_element = to.createElement (StaticStrings.PLUGINLIST_STR);
2820
2821 NodeList children = from.getDocumentElement ().getElementsByTagName (StaticStrings.PLUGIN_ELEMENT);
2822 int num_children = (children == null)? 0 : children.getLength ();
2823 if (num_children == 0) {
2824 return ;
2825 }
2826
2827 for (int i=0; i<num_children; i++) {
2828
2829 Element child = (Element)children.item (i);
2830 if (child.getAttribute (StaticStrings.SEPARATOR_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
2831 continue;
2832 }
2833 if (child.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
2834 continue;
2835 }
2836
2837 String str = child.getAttribute (StaticStrings.TYPE_ATTRIBUTE);
2838 Element plugin_element = to.createElement (StaticStrings.PLUGIN_STR);
2839 plugin_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, str);
2840
2841 NodeList option_children = child.getElementsByTagName (StaticStrings.OPTION_ELEMENT);
2842 for (int j=0; j<option_children.getLength (); j++) {
2843 Element el = (Element)option_children.item (j);
2844 if(!el.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
2845 continue;
2846 }
2847 String name_str = el.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2848 String value_str = XMLTools.getNodeText (el);
2849
2850
2851 if (name_str == null && value_str == null) {
2852 continue;
2853 }
2854 Element option_element = to.createElement (StaticStrings.OPTION_STR);
2855 if (name_str != null && name_str.equals (StaticStrings.METADATA_STR)) {
2856
2857 // 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.
2858 String[] values = value_str.split (StaticStrings.COMMA_CHARACTER);
2859 value_str = "";
2860 for (int k=0; k<=values.length-1; k++) {
2861 if(values[k].startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
2862 values[k] = values[k].substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
2863 }
2864
2865 if (k < values.length-1) {
2866 value_str = value_str + values[k] + StaticStrings.COMMA_CHARACTER;
2867 } else {
2868 value_str = value_str + values[k];
2869 }
2870 }
2871 }
2872
2873 if (!name_str.equals ("")) {
2874 if (!name_str.startsWith (StaticStrings.MINUS_CHARACTER)) {
2875 name_str = StaticStrings.MINUS_CHARACTER + name_str;
2876 }
2877 option_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
2878 }
2879
2880 if (!value_str.equals ("")) {
2881 option_element.setAttribute (StaticStrings.VALUE_ATTRIBUTE, value_str);
2882 }
2883
2884 plugin_element.appendChild (option_element);
2885 }//for loop ends
2886
2887 plugin_list_element.appendChild (plugin_element);
2888 }//for loop ends
2889
2890 import_element.appendChild (plugin_list_element);
2891
2892 //do the plugout element (used by building flax collections)
2893 Node plugout = XMLTools.getChildByTagNameIndexed (from.getDocumentElement (), PLUGOUT_ELEMENT, 0);
2894 if (plugout != null) {
2895 Element to_element = XMLTools.duplicateElement (to, (Element)plugout, true);
2896 import_element.appendChild (to_element);
2897 }
2898
2899 to.getDocumentElement ().appendChild (import_element);
2900 }
2901
2902 //Handle 'searchType' of collectionConfig.xml. In the internal structure, its also called 'searchType', eg. plain, form
2903 private void convertSearchType (Document from, Document to) {
2904 Element e = XMLTools.getNamedElement (from.getDocumentElement (), StaticStrings.FORMAT_STR,
2905 StaticStrings.NAME_ATTRIBUTE, StaticStrings.SEARCHTYPE_ELEMENT);//searchType
2906
2907 if (e == null) {
2908 return;
2909 }
2910 Element search_type_element = to.createElement (StaticStrings.FORMAT_STR);
2911
2912// String searchtype_str = e.getAttribute (StaticStrings.VALUE_ATTRIBUTE);
2913// search_type_element.setAttribute (StaticStrings.VALUE_ATTRIBUTE, searchtype_str);
2914 String searchtype_str = XMLTools.getNodeText(e);
2915 XMLTools.setNodeText(search_type_element, searchtype_str);
2916
2917 search_type_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, StaticStrings.SEARCHTYPE_ELEMENT);
2918 //Get the 'search' element from 'to'
2919 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR);
2920 search.appendChild (search_type_element);
2921 }
2922
2923 private void convertBuildType (Document from, Document to) {
2924 Element e = XMLTools.getNamedElement (from.getDocumentElement (),
2925 StaticStrings.BUILDTYPE_ELEMENT,
2926 StaticStrings.NAME_ATTRIBUTE, StaticStrings.BUILDTYPE_STR);
2927 if (e == null) {
2928 return;
2929 }
2930 String indexer = XMLTools.getNodeText (e);
2931 Element search = to.createElement (StaticStrings.SEARCH_STR);
2932 search.setAttribute (StaticStrings.TYPE_ATTRIBUTE, indexer);
2933 to.getDocumentElement ().appendChild (search);
2934 }
2935 private void convertDefaultIndex (Document from, Document to, Element search) {
2936 Element source = from.getDocumentElement ();
2937
2938 Element default_index_element = (Element)XMLTools.getChildByTagName (source, StaticStrings.INDEX_DEFAULT_ELEMENT);
2939 if (default_index_element == null) {
2940 return;
2941 }
2942
2943 String indexer = search.getAttribute (StaticStrings.TYPE_ATTRIBUTE);
2944 String level_str = default_index_element.getAttribute (StaticStrings.LEVEL_ATTRIBUTE);
2945 // Debugging purposes
2946 if (level_str.equals ("") && indexer.equals (StaticStrings.MG_STR) ) {
2947 System.out.println ("Bug: DefaultIndex should have its level attribute not empty.");
2948 }
2949
2950 NodeList content_elements = default_index_element.getElementsByTagName (StaticStrings.CONTENT_ELEMENT);
2951 int content_elements_length = content_elements.getLength ();
2952
2953 // Don't output anything if no indexes are set
2954 if(content_elements_length == 0) {
2955 return ;//
2956 }
2957
2958 String index_str = "";
2959
2960 if (indexer.equals (StaticStrings.MG_STR)) {
2961 //combine level with indexes
2962 index_str = level_str + StaticStrings.COLON_CHARACTER;
2963 }
2964 else { //for mgpp/lucene, just take index
2965 //do nothing
2966 }
2967
2968 for(int k = 0; k < content_elements_length; k++) {
2969 Element content_element = (Element) content_elements.item (k);
2970 if (content_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
2971 continue;
2972 }
2973 String name_str = content_element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2974
2975 if(name_str.startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
2976 name_str = name_str.substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
2977 }
2978
2979 index_str = index_str + name_str;
2980
2981 // Make it comma separated string
2982 if(k < content_elements_length - 1) {
2983 index_str = index_str + StaticStrings.COMMA_CHARACTER;
2984 }
2985 content_element = null;
2986 }//for loop ends
2987
2988
2989 Element default_index = to.createElement (StaticStrings.INDEX_DEFAULT_ELEMENT_LOWERCASE);
2990 default_index.setAttribute (StaticStrings.NAME_ATTRIBUTE, index_str);
2991 search.appendChild (default_index);
2992
2993 }
2994 private void convertSubcollection (Document from, Document to) {
2995 Element source = from.getDocumentElement ();
2996 //Get the 'search' element from 'to' which has already been created in 'convertBuildType'
2997 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR);
2998
2999 // Get the Subcollection element from the internal structure
3000 NodeList subcollection_elements = source.getElementsByTagName (StaticStrings.SUBCOLLECTION_ELEMENT);
3001 if (subcollection_elements == null) {
3002 return;
3003 }
3004 int subcollection_elements_length = subcollection_elements.getLength ();
3005
3006 if (subcollection_elements_length == 0) { // no
3007 return ;
3008 }
3009
3010 for(int j = 0; j < subcollection_elements_length; j++) {
3011
3012 Element e = (Element) subcollection_elements.item (j);
3013 if (e.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3014 continue;
3015 }
3016 String content = e.getAttribute (StaticStrings.CONTENT_ATTRIBUTE);
3017 String name = e.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3018 String options = e.getAttribute (StaticStrings.OPTIONS_ATTRIBUTE);
3019 String type = e.getAttribute (StaticStrings.TYPE_ATTRIBUTE);
3020 String text = XMLTools.getNodeText (e);
3021
3022 String filter = "";
3023 if (type.equals (StaticStrings.EXCLUDE_STR)) {
3024 filter = StaticStrings.EXCLAMATION_CHARACTER;
3025 }
3026
3027 if(content.startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
3028 content = content.substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
3029 }
3030 filter = filter + content + StaticStrings.SEPARATOR_CHARACTER + text;
3031 if (options != null && options != "") {
3032 filter = filter + StaticStrings.SEPARATOR_CHARACTER + options;
3033 }
3034 Element subcollection = to.createElement (StaticStrings.SUBCOLLECTION_STR);
3035 subcollection.setAttribute (StaticStrings.FILTER_ATTRIBUTE, filter);
3036 subcollection.setAttribute (StaticStrings.NAME_ATTRIBUTE, name);
3037
3038 search.appendChild (subcollection);
3039 }
3040 }
3041 private void convertSubcollectionIndexes (Document from, Document to) {
3042 Element source = from.getDocumentElement ();
3043 //Get the 'search' element from 'to' which has already been created in 'convertBuildType'
3044 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR);
3045
3046 // Get the SubcollectionIndexes element from the internal structure
3047 Element subcollection_indexes = (Element)XMLTools.getChildByTagName (source, StaticStrings.SUBCOLLECTION_INDEXES_ELEMENT);
3048 if (subcollection_indexes == null) {
3049 return;
3050 }
3051 NodeList index_elements = subcollection_indexes.getElementsByTagName (StaticStrings.INDEX_ELEMENT);
3052 int index_elements_length = index_elements.getLength ();
3053
3054 if (index_elements_length == 0) { // no indexes
3055 return ;
3056 }
3057
3058 for(int j = 0; j < index_elements_length; j++) {
3059 Element index_element = (Element) index_elements.item (j);
3060 if (index_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3061 continue;
3062 }
3063
3064 Element index = to.createElement (StaticStrings.SUBCOLLECTION_INDEX_ELEMENT);
3065
3066 String index_value = "";
3067
3068 NodeList content_elements = index_element.getElementsByTagName (StaticStrings.CONTENT_ELEMENT);
3069 int content_elements_length = content_elements.getLength ();
3070
3071 for(int k = 0; k < content_elements_length; k++) {
3072 Element content_element = (Element) content_elements.item (k);
3073 if (content_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3074 continue;
3075 }
3076 String name_str = content_element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3077 index_value += name_str;
3078 // Make it comma separated string
3079 if(k < content_elements_length - 1) {
3080 index_value += StaticStrings.COMMA_CHARACTER;
3081 }
3082 content_element = null;
3083 }//for loop ends
3084
3085 index.setAttribute (StaticStrings.NAME_ATTRIBUTE, index_value);
3086
3087 // Now constructing 'displayItem' element for this 'indexSubcollection' element
3088 // from the collectionmetadata element
3089 ArrayList collectionmetadata_list = XMLTools.getNamedElementList (source,
3090 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3091 StaticStrings.NAME_ATTRIBUTE, index_value);
3092
3093 if (collectionmetadata_list == null) {
3094 //try adding the "." prefix
3095 index_value = StaticStrings.DOT_CHARACTER + index_value;
3096 collectionmetadata_list = XMLTools.getNamedElementList (source,
3097 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3098 StaticStrings.NAME_ATTRIBUTE, index_value);
3099 }
3100 if (collectionmetadata_list != null) {
3101
3102 for(int k = 0; k < collectionmetadata_list.size (); k++) {
3103 Element collectionmetadata = (Element)collectionmetadata_list.get (k);
3104 if (collectionmetadata.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3105 continue;
3106 }
3107 Element displayItem = constructDisplayItem (collectionmetadata, to);
3108 index.appendChild (displayItem);
3109 }
3110 }
3111
3112 search.appendChild (index);
3113
3114 } //for loop ends
3115 }
3116
3117 private void convertLanguages (Document from, Document to) {
3118 Element source = from.getDocumentElement ();
3119 //Get the 'search' element from 'to' which has already been created in 'convertBuildType'
3120 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR);
3121
3122 // Get the Languages element from the internal structure
3123 Element languages = (Element)XMLTools.getChildByTagName (source, StaticStrings.LANGUAGES_ELEMENT);
3124 if (languages == null) {
3125 return;
3126 }
3127 NodeList language_elements = languages.getElementsByTagName (StaticStrings.LANGUAGE_ELEMENT);
3128 int language_elements_length = language_elements.getLength ();
3129
3130 if (language_elements_length == 0) {
3131 return ;
3132 }
3133
3134 for(int j = 0; j < language_elements_length; j++) {
3135 Element element = (Element) language_elements.item (j);
3136 if (element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3137 continue;
3138 }
3139
3140 // Create indexLanguage element
3141 Element index_language = to.createElement (StaticStrings.LANGUAGE_INDEX_ELEMENT);
3142
3143 String name_str = element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3144 index_language.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
3145
3146 // Now constructing 'displayItem' element for this 'indexLanguage' element
3147 // from the collectionmetadata element
3148 ArrayList collectionmetadata_list = XMLTools.getNamedElementList (source,
3149 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3150 StaticStrings.NAME_ATTRIBUTE, name_str);
3151
3152 if (collectionmetadata_list == null) {
3153 //try adding the "." prefix
3154 name_str = StaticStrings.DOT_CHARACTER + name_str;
3155 collectionmetadata_list = XMLTools.getNamedElementList (source,
3156 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3157 StaticStrings.NAME_ATTRIBUTE, name_str);
3158 }
3159 if (collectionmetadata_list != null) {
3160
3161 for(int k = 0; k < collectionmetadata_list.size (); k++) {
3162 Element collectionmetadata = (Element)collectionmetadata_list.get (k);
3163 if (collectionmetadata.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3164 continue;
3165 }
3166 Element displayItem = constructDisplayItem (collectionmetadata, to);
3167 index_language.appendChild (displayItem);
3168 }
3169 }
3170
3171 search.appendChild (index_language);
3172
3173 } //for loop ends
3174
3175 // Convert DefaultLanguage
3176 // Get the DefaultLanguage element from the internal structure
3177 Element default_language = (Element)XMLTools.getChildByTagName (source, StaticStrings.LANGUAGE_DEFAULT_ELEMENT);
3178 if(default_language != null) {
3179 String lang_name = default_language.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3180 Element default_index_language = to.createElement (StaticStrings.LANGUAGE_DEFAULT_INDEX_ELEMENT);
3181 default_index_language.setAttribute (StaticStrings.NAME_ATTRIBUTE, lang_name);
3182 search.appendChild (default_index_language);
3183 }
3184 // Convert LanguageMetadata
3185 // Get the LanguageMetadata element from the internal structure
3186 Element language_metadata = (Element)XMLTools.getChildByTagName (source, StaticStrings.LANGUAGE_METADATA_ELEMENT);
3187 if(language_metadata != null) {
3188 String meta_name = language_metadata.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3189 Element language_meta = to.createElement (StaticStrings.LANGUAGE_METADATA_ELEMENT_STR);
3190 if(meta_name.startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
3191 meta_name = meta_name.substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
3192 }
3193 language_meta.setAttribute (StaticStrings.NAME_ATTRIBUTE, meta_name);
3194 search.appendChild (language_meta);
3195 }
3196 }
3197
3198 //convert indexes and their displayItems, which go in 'search' element in collectionConfig.xml
3199 //parameter 'to' is the document to be saved as collectionConfig.xml
3200 //parameter 'from' is the internal xml structure
3201 private void convertIndex (Document from, Document to) {
3202 Element source = from.getDocumentElement ();
3203 //Get the 'search' element from 'to' which has already been created in 'convertBuildType'
3204 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR);
3205
3206 //THere are two sets of indexes elements, find the one which is assigned 'true'
3207 Element indexes = XMLTools.getNamedElement (source,
3208 StaticStrings.INDEXES_ELEMENT,
3209 StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
3210 if (indexes == null) {
3211 return;
3212 }
3213 NodeList index_elements = indexes.getElementsByTagName (StaticStrings.INDEX_ELEMENT);
3214 int index_elements_length = index_elements.getLength ();
3215
3216 if (index_elements_length == 0) { // no indexes
3217 return ;
3218 }
3219
3220 //find out it's mg or mgpp/lucene
3221 String mg = search.getAttribute (StaticStrings.TYPE_ATTRIBUTE);
3222 boolean mg_indexer = false;
3223 if (mg.equals (StaticStrings.MG_STR)) {
3224 mg_indexer = true;//it's mg, then the level is set as attribute of
3225 }
3226 if (mg_indexer == false) {
3227 // It's mgpp. Construct 'level' and 'defaultLevel' elements separately.
3228 convertLevels (from, to, search);
3229 }
3230
3231 for(int j = 0; j < index_elements_length; j++) {
3232 Element index_element = (Element) index_elements.item (j);
3233 if (index_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3234 continue;
3235 }
3236
3237 Element index_ele = to.createElement (StaticStrings.INDEX_LOW_STR);//index
3238
3239 // Used for creating displayItem for this element 'index_ele' further below
3240 // full_index_names contain 'ex.'
3241 String full_index_name = "";
3242 String level_str = "";
3243
3244 StringBuffer index_value = new StringBuffer ();
3245 if (mg_indexer == true) {
3246 // For mg indexer, there is a 'level' attribute in the index element of the internal structure
3247 // But mgpp/lucene don't
3248 level_str = index_element.getAttribute (StaticStrings.LEVEL_ATTRIBUTE);
3249 if(level_str.length () > 0) {
3250 index_value.append (level_str).append (StaticStrings.COLON_CHARACTER);
3251 //index_value = index_value.StaticStrings.COLON_CHARACTER;
3252 }
3253 }
3254
3255 NodeList content_elements = index_element.getElementsByTagName (StaticStrings.CONTENT_ELEMENT);
3256 int content_elements_length = content_elements.getLength ();
3257
3258 for(int k = 0; k < content_elements_length; k++) {
3259 Element content_element = (Element) content_elements.item (k);
3260 if (content_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3261 continue;
3262 }
3263 String name_str = content_element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3264
3265 full_index_name = full_index_name + name_str;
3266 if (k < content_elements_length - 1) {
3267 full_index_name = full_index_name + StaticStrings.COMMA_CHARACTER;
3268 }
3269
3270 if(name_str.startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
3271 name_str = name_str.substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
3272 }
3273
3274 index_value.append (name_str);
3275 name_str = null;
3276 // Make it comma separated string
3277 if(k < content_elements_length - 1) {
3278 index_value.append (StaticStrings.COMMA_CHARACTER);
3279 }
3280 content_element = null;
3281 }//for loop ends
3282
3283 String temp_str = index_value.toString ();
3284 index_ele.setAttribute (StaticStrings.NAME_ATTRIBUTE, temp_str);
3285
3286 // Now constructing 'displayItem' element for this 'index_ele' element
3287 // The index names in the collectionmetadata elements in the internal structure are not the names that
3288 // are used in the content elements (i.e. ex.Source or dc.Subject and keywords), but the names that are
3289 // in the configuration files (i.e. Source or dc.Subject)
3290 ArrayList collectionmetadata_list = XMLTools.getNamedElementList (source,
3291 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3292 StaticStrings.NAME_ATTRIBUTE, temp_str);
3293
3294 if (collectionmetadata_list == null) {
3295 //try adding the "." prefix
3296 String with_dot_str = StaticStrings.DOT_CHARACTER + temp_str;
3297 collectionmetadata_list = XMLTools.getNamedElementList (source,
3298 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3299 StaticStrings.NAME_ATTRIBUTE, with_dot_str);
3300
3301 if (collectionmetadata_list == null) {
3302 //try the full name, i.e. with 'ex.'
3303 if (mg_indexer == true) {
3304 full_index_name = level_str+StaticStrings.COLON_CHARACTER+full_index_name;
3305 }
3306 collectionmetadata_list = XMLTools.getNamedElementList (source,
3307 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3308 StaticStrings.NAME_ATTRIBUTE, full_index_name);
3309 }
3310 if (collectionmetadata_list == null) {
3311 with_dot_str = StaticStrings.DOT_CHARACTER + full_index_name;
3312 collectionmetadata_list = XMLTools.getNamedElementList (source,
3313 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3314 StaticStrings.NAME_ATTRIBUTE, with_dot_str);
3315 }
3316 }
3317 if (collectionmetadata_list != null) {
3318
3319 for(int k = 0; k < collectionmetadata_list.size (); k++) {
3320 Element collectionmetadata = (Element)collectionmetadata_list.get (k);
3321 if (collectionmetadata.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3322 continue;
3323 }
3324 Element displayItem = constructDisplayItem (collectionmetadata, to);
3325
3326 index_ele.appendChild (displayItem);
3327 }
3328 }
3329
3330 search.appendChild (index_ele);
3331
3332 } //for loop ends
3333
3334 //Convert default index
3335 convertDefaultIndex (from, to, search);
3336 convertIndexOptions(from, to, search);
3337 }
3338 // Convert levels for mgpp/lucene. This method is called by converIndex() when mgpp indexer is detected.
3339 private void convertLevels (Document from, Document to, Element search) {
3340 Element source = from.getDocumentElement ();
3341 Element index_option = XMLTools.getNamedElement (source,
3342 StaticStrings.INDEXOPTIONS_ELEMENT,
3343 StaticStrings.NAME_ATTRIBUTE, StaticStrings.LEVELS_STR);
3344 if (index_option == null) {
3345 return;
3346 }
3347 //Debugging purposes
3348 if (index_option.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3349 DebugStream.println ("For mgpp, there should be an IndexOption element for levels which is assigned 'true': possible bug.");
3350 }
3351
3352 NodeList option_elements = index_option.getElementsByTagName (StaticStrings.OPTION_ELEMENT);
3353 int num_elements = option_elements.getLength ();
3354
3355 // Don't output anything if no indexes are set
3356 if(num_elements == 0) {
3357 return ;//
3358 }
3359
3360 for(int k = 0; k < num_elements; k++) {
3361 Element e = (Element) option_elements.item (k);
3362 String name_str = e.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3363 Element level_element = to.createElement (StaticStrings.LEVEL_ELEMENT);
3364 level_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
3365
3366 //Now construct displayItem for this level element from collectionmetadata
3367 ArrayList collectionmetadata_list = XMLTools.getNamedElementList (source,
3368 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3369 StaticStrings.NAME_ATTRIBUTE, name_str);
3370
3371 if (collectionmetadata_list == null) {
3372 //try adding the "." prefix
3373 name_str = StaticStrings.DOT_CHARACTER + name_str;
3374 collectionmetadata_list = XMLTools.getNamedElementList (source,
3375 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3376 StaticStrings.NAME_ATTRIBUTE, name_str);
3377 }
3378 if (collectionmetadata_list != null) {
3379
3380 for(int j = 0; j < collectionmetadata_list.size (); j++) {
3381 Element collectionmetadata = (Element)collectionmetadata_list.get (j);
3382
3383 Element displayItem = constructDisplayItem (collectionmetadata, to);
3384 level_element.appendChild (displayItem);
3385 }
3386 }
3387 search.appendChild (level_element);
3388 }
3389
3390 //Convert default level
3391 Element default_index_option = XMLTools.getNamedElement (source,
3392 StaticStrings.INDEXOPTION_DEFAULT_ELEMENT,
3393 StaticStrings.NAME_ATTRIBUTE, StaticStrings.LEVEL_DEFAULT_STR);
3394 if (default_index_option == null) {
3395 return;
3396 }
3397 Element default_level = to.createElement (StaticStrings.LEVEL_DEFAULT_ELEMENT);
3398 String default_level_str = default_index_option.getAttribute (StaticStrings.VALUE_ATTRIBUTE);
3399 default_level.setAttribute (StaticStrings.NAME_ATTRIBUTE, default_level_str);
3400 search.appendChild (default_level);
3401
3402 }
3403 // Convert indexoptions for mg/mgpp/lucene. This method is called by convertIndex().
3404 private void convertIndexOptions (Document from, Document to, Element search) {
3405 Element source = from.getDocumentElement ();
3406 Element index_option = XMLTools.getNamedElement (source,
3407 StaticStrings.INDEXOPTIONS_ELEMENT,
3408 StaticStrings.NAME_ATTRIBUTE, StaticStrings.INDEXOPTIONS_STR);
3409 if (index_option == null) {
3410 return;
3411 }
3412 //Debugging purposes
3413 if (index_option.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3414 DebugStream.println ("There should be an IndexOption element which is assigned 'true': possible bug.");
3415 }
3416 Element indexOptionEl = to.createElement(StaticStrings.INDEXOPTION_STR);
3417 NodeList option_elements = index_option.getElementsByTagName (StaticStrings.OPTION_ELEMENT);
3418 int num_elements = option_elements.getLength ();
3419 // Don't output anything if no index
3420 if(num_elements == 0) {
3421 return ;//
3422 }
3423 search.appendChild (indexOptionEl);
3424
3425 for(int k = 0; k < num_elements; k++) {
3426 Element e = (Element) option_elements.item (k);
3427 String name_att = e.getAttribute(StaticStrings.NAME_ATTRIBUTE);
3428 Element optionEl = to.createElement(StaticStrings.OPTION_STR);
3429 optionEl.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_att);
3430 indexOptionEl.appendChild(optionEl);
3431 }
3432
3433 }
3434 // Append the element son to the element mother in the appropriate position.
3435 static public void appendProperly (Element mother, Element son) {
3436 if (son == null)
3437 return;
3438
3439 Node reference_node = findInsertionPoint (mother, son);
3440 if(reference_node != null) {
3441 mother.insertBefore (son, reference_node);
3442 }
3443 else {
3444 mother.appendChild (son);
3445 }
3446 }
3447 /** 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.
3448 * @param target_element the command Element to be inserted
3449 * @return the Element which the given command should be inserted before, or null to append to end of list
3450 */
3451 static public Node findInsertionPoint (Element document_element, Element target_element) {
3452 ///ystem.err.println("Find insertion point: " + target_element.getNodeName());
3453 String target_element_name = target_element.getNodeName ();
3454
3455 // Try to find commands with the same tag.
3456 NodeList matching_elements = document_element.getElementsByTagName (target_element_name);
3457 // If we found matching elements, then we have our most likely insertion location, so check within for groupings
3458 if(matching_elements.getLength () != 0) {
3459 ///ystem.err.println("Found matching elements.");
3460 // Only CollectionMeta are grouped.
3461 if(target_element_name.equals (StaticStrings.COLLECTIONMETADATA_ELEMENT)) {
3462 ///ystem.err.println("Dealing with collection metadata");
3463 // 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.
3464 // So if the command to be added is special add it immediately after any other special command
3465 if(target_element.getAttribute (StaticStrings.SPECIAL_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
3466 int index = 0;
3467 Element matched_element = (Element) matching_elements.item (index);
3468 Element sibling_element = (Element) matched_element.getNextSibling ();
3469 while(sibling_element.getAttribute (StaticStrings.SPECIAL_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
3470 index++;
3471 matched_element = (Element) matching_elements.item (index);
3472 sibling_element = (Element) matched_element.getNextSibling ();
3473 }
3474 if(sibling_element.getNodeName ().equals (NEWLINE_ELEMENT)) {
3475 Element newline_element = document.createElement (NEWLINE_ELEMENT);
3476 document_element.insertBefore (newline_element, sibling_element);
3477 }
3478 return sibling_element;
3479 }
3480 // Otherwise try to find a matching 'name' and add after the last one in that group.
3481 else {
3482 int index = 0;
3483 target_element_name = target_element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3484 boolean found = false;
3485 // Skip all of the special metadata
3486 Element matched_element = (Element) matching_elements.item (index);
3487 while(matched_element.getAttribute (StaticStrings.SPECIAL_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
3488 index++;
3489 matched_element = (Element) matching_elements.item (index);
3490 }
3491 // Begin search
3492 while(!found && matched_element != null) {
3493 if(matched_element.getAttribute (StaticStrings.NAME_ATTRIBUTE).equals (target_element_name)) {
3494 found = true;
3495 }
3496 else {
3497 index++;
3498 matched_element = (Element) matching_elements.item (index);
3499 }
3500 }
3501 // If we found a match, we need to continue checking until we find the last name match.
3502 if(found) {
3503 index++;
3504 Element previous_sibling = matched_element;
3505 Element sibling_element = (Element) matching_elements.item (index);
3506 while(sibling_element != null && sibling_element.getAttribute (StaticStrings.NAME_ATTRIBUTE).equals (target_element_name)) {
3507 previous_sibling = sibling_element;
3508 index++;
3509 sibling_element = (Element) matching_elements.item (index);
3510 }
3511 // 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!
3512 return previous_sibling.getNextSibling ();
3513 }
3514 // If not found we just add after last metadata element
3515 else {
3516 Element last_element = (Element) matching_elements.item (matching_elements.getLength () - 1);
3517 return last_element.getNextSibling ();
3518 }
3519 }
3520
3521 }
3522 else {
3523 ///ystem.err.println("Not dealing with collection meta.");
3524 Element matched_element = (Element) matching_elements.item (matching_elements.getLength () - 1);
3525 // 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)
3526 Node sibling_element = matched_element.getNextSibling ();
3527 if(sibling_element != null && sibling_element.getNodeName ().equals (NEWLINE_ELEMENT)) {
3528 Element newline_element = document.createElement (NEWLINE_ELEMENT);
3529 document_element.insertBefore (newline_element, sibling_element);
3530 }
3531 return sibling_element; // Note that this may be null
3532 }
3533 }
3534 ///ystem.err.println("No matching elements found.");
3535 // Locate where this command is in the ordering
3536 int command_index = -1;
3537 for(int i = 0; command_index == -1 && i < COMMAND_ORDER.length; i++) {
3538 if(COMMAND_ORDER[i].equals (target_element_name)) {
3539 command_index = i;
3540 }
3541 }
3542 ///ystem.err.println("Command index is: " + command_index);
3543 // Now move forward, checking for existing elements in each of the preceeding command orders.
3544 int preceeding_index = command_index - 1;
3545 ///ystem.err.println("Searching before the target command.");
3546 while(preceeding_index >= 0) {
3547 matching_elements = document_element.getElementsByTagName (COMMAND_ORDER[preceeding_index]);
3548 // If we've found a match
3549 if(matching_elements.getLength () > 0) {
3550 // We add after the last element
3551 Element matched_element = (Element) matching_elements.item (matching_elements.getLength () - 1);
3552 // 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)
3553 Node sibling_element = matched_element.getNextSibling ();
3554 if(sibling_element != null && sibling_element.getNodeName ().equals (NEWLINE_ELEMENT)) {
3555 Element newline_element = document.createElement (NEWLINE_ELEMENT);
3556 document_element.insertBefore (newline_element, sibling_element);
3557 }
3558 return sibling_element; // Note that this may be null
3559 }
3560 preceeding_index--;
3561 }
3562 // If all that fails, we now move backwards through the commands
3563 int susceeding_index = command_index + 1;
3564 ///ystem.err.println("Searching after the target command.");
3565 while(susceeding_index < COMMAND_ORDER.length) {
3566 matching_elements = document_element.getElementsByTagName (COMMAND_ORDER[susceeding_index]);
3567 // If we've found a match
3568 if(matching_elements.getLength () > 0) {
3569 // We add before the first element
3570 Element matched_element = (Element) matching_elements.item (0);
3571 // 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)
3572 Node sibling_element = matched_element.getPreviousSibling ();
3573 if(sibling_element != null && sibling_element.getNodeName ().equals (NEWLINE_ELEMENT)) {
3574 Element newline_element = document.createElement (NEWLINE_ELEMENT);
3575 document_element.insertBefore (newline_element, sibling_element);
3576 }
3577 return sibling_element; // Note that this may be null
3578 }
3579 susceeding_index++;
3580 }
3581 // Well. Apparently there are no other commands in this collection configuration. So append away...
3582 return null;
3583 }
3584 // From collectionConfig.xml to internal structure:add 'ex.' namespace (if none).
3585 // From internal structure to collectionConfig.xml:always peel off 'ex.' namespace (if any), except for format statement
3586 //This method parses 'xml_file_doc' into 'dOc'
3587 public void parseCollectionConfigXML (File xml_file, Document dOc) {
3588
3589 Document xml_file_doc = XMLTools.parseXMLFile (xml_file);
3590 Element fromElement = xml_file_doc.getDocumentElement ();
3591 Element toElement = dOc.getDocumentElement ();
3592
3593 // It's deliberately set that 'creator', 'maintainer', and 'public' are only in English (as they are just names).
3594 // So the following ArrayList have only one element.
3595 Node metadataListNode = XMLTools.getChildByTagNameIndexed (fromElement, StaticStrings.METADATALIST_STR, 0);
3596 if (metadataListNode != null) {
3597 ArrayList creator = doMetadataList (dOc, metadataListNode, StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT,
3598 StaticStrings.COLLECTIONMETADATA_CREATOR_STR);
3599 ArrayList maintainer = doMetadataList (dOc, metadataListNode,
3600 StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT,
3601 StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR);
3602 ArrayList is_public = doMetadataList (dOc, metadataListNode, StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT,
3603 StaticStrings.COLLECTIONMETADATA_PUBLIC_STR);
3604
3605 appendArrayList (toElement, creator);
3606 appendArrayList (toElement, maintainer);
3607 appendArrayList (toElement, is_public);
3608 }
3609
3610 Node searchNode = XMLTools.getChildByTagNameIndexed (fromElement, StaticStrings.SEARCH_STR, 0);
3611 String buildtype_value = ((Element)searchNode).getAttribute (StaticStrings.TYPE_ATTRIBUTE);//might be mg|mgpp|lucene
3612 Element buildtype = doBuildType (dOc, buildtype_value);
3613 appendProperly (toElement, buildtype);
3614
3615
3616 Node importNode = XMLTools.getChildByTagNameIndexed (fromElement, StaticStrings.IMPORT_STR, 0);
3617 if (importNode == null) {
3618 System.out.println ("There is no content in the 'import' block.");
3619 }
3620 if (importNode != null) {
3621 //do plugin list nodes
3622 Node pluginListNode = XMLTools.getChildByTagNameIndexed ((Element)importNode, StaticStrings.PLUGINLIST_STR, 0);
3623 if (pluginListNode == null) {
3624 System.out.println ("There is no pluginlist set.");
3625 }
3626 if (pluginListNode != null) {
3627
3628 doPlugin (dOc, pluginListNode);
3629 }
3630
3631 //do the plugout element (used by building flax collections)
3632 Node plugout = XMLTools.getChildByTagNameIndexed ((Element)importNode, PLUGOUT_ELEMENT, 0);
3633 if (plugout != null) {
3634 Element to_element = XMLTools.duplicateElement (dOc, (Element)plugout, true);
3635 toElement.appendChild (to_element);
3636 }
3637 }
3638
3639 Node browseNode = XMLTools.getChildByTagNameIndexed (fromElement, StaticStrings.BROWSE_STR, 0);
3640 if (browseNode != null) {
3641 if (browseNode == null) {
3642 System.out.println ("There is no classifier.");
3643 }
3644 doClassifier (dOc, browseNode);
3645 }
3646
3647 Node displayItemListNode = XMLTools.getChildByTagNameIndexed (fromElement, StaticStrings.DISPLAYITEMLIST_STR, 0);
3648 if (displayItemListNode != null) {
3649 ArrayList description = doDisplayItemList (dOc, displayItemListNode, StaticStrings.DESCRIPTION_STR,
3650 StaticStrings.COLLECTIONMETADATA_COLLECTIONEXTRA_STR);
3651 ArrayList smallicon = doDisplayItemList (dOc, displayItemListNode, StaticStrings.SMALLICON_STR,
3652 StaticStrings.COLLECTIONMETADATA_ICONCOLLECTIONSMALL_STR);
3653 ArrayList icon = doDisplayItemList (dOc, displayItemListNode, StaticStrings.ICON_STR,
3654 StaticStrings.COLLECTIONMETADATA_ICONCOLLECTION_STR);
3655 ArrayList name = doDisplayItemList (dOc, displayItemListNode, StaticStrings.NAME_STR,
3656 StaticStrings.COLLECTIONMETADATA_COLLECTIONNAME_STR);
3657
3658 appendArrayList (toElement, description);
3659 appendArrayList (toElement, smallicon);
3660 appendArrayList (toElement, icon);
3661 appendArrayList (toElement, name);
3662 }
3663
3664 if (buildtype_value.equalsIgnoreCase ("mg")) {
3665 doMGIndexes (dOc, searchNode);
3666 }
3667 else {
3668 doMGPPIndexes (dOc, searchNode);
3669 }
3670
3671 doDefaultIndex (dOc, searchNode);
3672 //doSearchType (dOc, searchNode);
3673 doDefaultLevel (dOc, searchNode);
3674 doLevel (dOc, searchNode);
3675 doIndexOption (dOc, searchNode);
3676 doSubcollection (dOc, searchNode);
3677 doIndexSubcollection (dOc, searchNode);
3678 doIndexLanguage (dOc, searchNode);
3679 doDefaultIndexLanguage (dOc, searchNode);
3680 doLanguageMetadata (dOc, searchNode);
3681 doSearchFormat (dOc, searchNode);
3682 doDisplayFormat (dOc, fromElement);
3683 doReplaceListRef (dOc, fromElement);
3684 doOAIElement (dOc, fromElement);
3685
3686 }
3687
3688
3689 public void saveCollectionConfigXML (File collect_cfg_file, Document doc) {
3690 //In this method, the file collect_cfg_file must be 'collectionConfig.xml'
3691
3692
3693 //Compare the internal structure (doc) with the saved structure from collectionConfig.xml and see if it has changed
3694 StringBuffer collect_cfg_string_buffer = new StringBuffer (XMLTools.xmlNodeToString (doc));
3695 String collect_cfg_string = collect_cfg_string_buffer.toString ();
3696 if (saved_collect_cfg_string_buffer != null) {
3697 String saved_collect_cfg_string = saved_collect_cfg_string_buffer.toString ();
3698 if (collect_cfg_string.equals (saved_collect_cfg_string)) {
3699 DebugStream.println ("'collectionConfig.xml' file hasn't changed so no save necessary...");
3700 return;
3701 }
3702 }
3703
3704 DebugStream.println ("'collectionConfig.xml' file has changed, saving now...");
3705
3706 // If we're using the Local Library we must release the collection before writing to the collect.cfg file
3707 String collection_name = Gatherer.c_man.getCollection ().getName ();
3708 boolean collection_released = false;
3709 if (Gatherer.c_man.built () && LocalLibraryServer.isRunning () == true) {
3710 // Release the collection
3711 LocalLibraryServer.releaseCollection (collection_name);
3712 collection_released = true;
3713 }
3714
3715 // Make a backup of the collectionConfig.xml file so that the user can manully change back
3716 if (collect_cfg_file.exists ()) {
3717
3718 File original_file = new File (collect_cfg_file.getParentFile (), Utility.COLLECTION_CONFIG_XML);
3719 File backup_file = new File (collect_cfg_file.getParentFile (), Utility.COLLECTION_CONFIG_BAK);
3720 if (backup_file.exists ()) {
3721 backup_file.delete ();
3722 }
3723 if (!original_file.renameTo (backup_file)) {
3724 System.err.println ("Warning: can't rename collectionConfig.xml to collectionConfig.bak.");
3725 }
3726 }
3727
3728 Document collection_config_xml_document = convertInternalToCollectionConfig (doc);
3729 String[] nonEscapingTagNames = {StaticStrings.FORMAT_STR};
3730 XMLTools.writeXMLFile (collect_cfg_file, collection_config_xml_document, nonEscapingTagNames);
3731 saved_collect_cfg_string_buffer = collect_cfg_string_buffer;
3732
3733 // If we're using a remote Greenstone server, upload the new 'collectionConfig.xml' file
3734 if (Gatherer.isGsdlRemote) {
3735 RemoteGreenstoneServer.uploadCollectionFile (collection_name, collect_cfg_file);
3736 }
3737
3738 // Now re-add the collection to the Local Library server
3739 if (collection_released) {
3740 LocalLibraryServer.addCollection (collection_name);
3741 }
3742
3743 }
3744 public void saveIfNecessary () {
3745 if (Gatherer.GS3 == true) {
3746 saveCollectionConfigXML (collect_cfg_file, document);
3747 return;
3748 }
3749 // Convert the collection configuration XML tree to the collect.cfg version
3750 StringBuffer collect_cfg_string_buffer = new StringBuffer ();
3751 NodeList command_elements = document.getDocumentElement ().getChildNodes ();
3752 boolean just_wrote_blank_line = false; // Prevent two or more blank lines in a row
3753 for (int i = 0; i < command_elements.getLength (); i++) {
3754 Node command_node = command_elements.item (i);
3755 if (!(command_node instanceof Element)) {
3756 // We're only interested in Elements
3757 continue;
3758 }
3759 Element command_element = (Element) command_node;
3760
3761 // Handle NewLine elements (blank lines)
3762 if (command_element.getNodeName ().equals (NEWLINE_ELEMENT) && !just_wrote_blank_line) {
3763 collect_cfg_string_buffer.append ("\n");
3764 just_wrote_blank_line = true;
3765 }
3766
3767 // Anything else we write to file, but only if it has been assigned, except for index and level commands
3768 // (which just get commented out if unassigned -- a side effect of MG & MGPP compatibility)
3769 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)) {
3770 String command;
3771 if (command_element.getNodeName ().equals (StaticStrings.FORMAT_ELEMENT)) {
3772 // Format statements we write out with ex. still present
3773 command = toString (command_element, true);
3774 }
3775 else {
3776 command = toString (command_element, false);
3777 }
3778
3779 if (command != null && command.length ()> 0 ) {
3780 collect_cfg_string_buffer.append (command + "\n");
3781 just_wrote_blank_line = false;
3782 }
3783 }
3784 }
3785
3786 String collect_cfg_string = collect_cfg_string_buffer.toString ();
3787 String saved_collect_cfg_string = saved_collect_cfg_string_buffer.toString ();
3788 if (collect_cfg_string.equals (saved_collect_cfg_string)) {
3789 DebugStream.println ("Collect.cfg file hasn't changed so no save necessary...");
3790 return;
3791 }
3792
3793 DebugStream.println ("Collect.cfg file has changed, saving now...");
3794
3795 // If we're using the Local Library we must release the collection before writing to the collect.cfg file
3796 String collection_name = CollectionManager.getLoadedCollectionName ();
3797 boolean collection_released = false;
3798 if (Gatherer.c_man.built () && LocalLibraryServer.isRunning () == true) {
3799 // Release the collection
3800 LocalLibraryServer.releaseCollection (collection_name);
3801 collection_released = true;
3802 }
3803
3804 // Make a backup of the collect.cfg file
3805 if (collect_cfg_file.exists ()) {
3806 File original_file = new File (collect_cfg_file.getParentFile (), StaticStrings.COLLECT_CFG);
3807 File backup_file = new File (collect_cfg_file.getParentFile (), Utility.COLLECT_BAK);
3808 if (backup_file.exists ()) {
3809 backup_file.delete ();
3810 }
3811 if (!original_file.renameTo (backup_file)) {
3812 System.err.println ("Warning: can't rename collect.cfg to collect.bak.");
3813 }
3814 }
3815
3816 try {
3817 OutputStream ostream = new FileOutputStream (collect_cfg_file);
3818 Writer file_writer = new OutputStreamWriter (ostream, ENCODING);
3819 BufferedWriter buffered_writer = new BufferedWriter (file_writer);
3820 buffered_writer.write (collect_cfg_string);
3821 buffered_writer.close ();
3822
3823 saved_collect_cfg_string_buffer = collect_cfg_string_buffer;
3824
3825 // If we're using a remote Greenstone server, upload the new collect.cfg file
3826 if (Gatherer.isGsdlRemote) {
3827 RemoteGreenstoneServer.uploadCollectionFile (collection_name, collect_cfg_file);
3828 }
3829 }
3830 catch (Exception exception) {
3831 DebugStream.println ("Error in CollectionConfiguration.save(): " + exception);
3832 DebugStream.printStackTrace (exception);
3833 }
3834
3835 // Now re-add the collection to the Local Library server
3836 if (collection_released) {
3837 LocalLibraryServer.addCollection (collection_name);
3838 }
3839 }
3840 // This method is initilised in CollectionDesignManager.java constructor
3841 public CollectionConfiguration (File collect_cfg_file) {
3842 this.collect_cfg_file = collect_cfg_file;
3843
3844 // parse the XML template
3845 document = XMLTools.parseXMLFile ("xml/CollectionConfig.xml", true);
3846 String filename = collect_cfg_file.getName ().toLowerCase ();
3847
3848 if (filename.endsWith (".cfg")) {
3849 parse (collect_cfg_file);
3850 }
3851 if (filename.endsWith (".xml")) {
3852 parseCollectionConfigXML (collect_cfg_file, document);
3853 }
3854
3855 //XMLTools.printXMLNode(document.getDocumentElement());
3856 }
3857
3858 // Append the elements, which are of Element type, in 'list' to Element 'to'
3859 private void appendArrayList (Element to, ArrayList list) {
3860 if (list == null) return;
3861
3862 for (int i=0; i<list.size (); i++) {
3863 appendProperly (to, (Element)list.get (i));
3864 }
3865 }
3866 //Convert the internal XML DOM tree (dOc) into that of collectionConfig.xml (skeleton)
3867 public Document convertInternalToCollectionConfig (Document dOc) {
3868 //first parse an empty skeleton of xml config file
3869 //The aim is to convert the internal structure into this skeleton
3870 Document skeleton = XMLTools.parseXMLFile ("xml/CollectionConfig.xml", true);
3871 //Element internal = dOc.getDocumentElement();
3872 convertMetadataList (dOc, skeleton);
3873 convertDisplayItemList (dOc, skeleton);
3874 convertBuildType (dOc, skeleton);
3875 convertIndex (dOc, skeleton);
3876 convertPlugin (dOc, skeleton);//also do the plugout element
3877 convertClassifier (dOc, skeleton);
3878 convertSubcollectionIndexes (dOc, skeleton);
3879 convertLanguages (dOc, skeleton);
3880 convertSubcollection (dOc, skeleton);
3881 convertSearchType (dOc, skeleton);
3882 convertSearchFormat (dOc, skeleton);
3883 convertDisplayFormat (dOc, skeleton);
3884 convertReplaceListRef (dOc, skeleton);
3885 convertOAIElement(dOc, skeleton);
3886
3887 return skeleton;
3888 }
3889 ///*********************************************************************************************************///
3890}
Note: See TracBrowser for help on using the repository browser.