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

Last change on this file since 14634 was 14634, checked in by xiao, 17 years ago

add two methods to write in and out the plugout element which is used by flax collection building

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