source: gli/branches/3.03/src/org/greenstone/gatherer/cdm/CollectionConfiguration.java@ 14636

Last change on this file since 14636 was 14636, checked in by qq6, 17 years ago

updated by Xiao

  • Property svn:keywords set to Author Date Id Revision
File size: 207.7 KB
Line 
1/**
2 *#########################################################################
3 *
4 * A component of the Gatherer application, part of the Greenstone digital
5 * library suite from the New Zealand Digital Library Project at the
6 * University of Waikato, New Zealand.
7 *
8 * Author: John Thompson, Greenstone Digital Library, University of Waikato
9 *
10 * Copyright (C) 1999 New Zealand Digital Library Project
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 *########################################################################
26 */
27package org.greenstone.gatherer.cdm;
28
29import java.awt.*;
30import java.awt.event.*;
31import java.io.*;
32import java.util.*;
33import javax.swing.*;
34import org.greenstone.gatherer.Configuration;
35import org.greenstone.gatherer.DebugStream;
36import org.greenstone.gatherer.Gatherer;
37import org.greenstone.gatherer.collection.CollectionManager;
38import org.greenstone.gatherer.greenstone.LocalLibraryServer;
39import org.greenstone.gatherer.gui.GLIButton;
40import org.greenstone.gatherer.metadata.MetadataElement;
41import org.greenstone.gatherer.metadata.MetadataSetManager;
42import org.greenstone.gatherer.metadata.MetadataTools;
43import org.greenstone.gatherer.remote.RemoteGreenstoneServer;
44import org.greenstone.gatherer.util.DOMTree;
45import org.greenstone.gatherer.util.Codec;
46import org.greenstone.gatherer.util.StaticStrings;
47import org.greenstone.gatherer.util.XMLTools;
48import org.greenstone.gatherer.util.Utility;
49import org.w3c.dom.*;
50
51/** This class provides access to an xml-type view of the collect.cfg file. This is useful as it allows the manipulation and free form editing of a collect.cfg file while still allowing the various CDM data managers to base themselves directly on this model (whereas they used to be independant ListModels which clobbered the ordering of unparsed commands).
52 * @author John Thompson, Greenstone Digital Library, University of Waikato
53 * @version 2.3d
54 */
55public class CollectionConfiguration {
56 static final private String ENCODING = "UTF-8";
57 static final private String NEWLINE_ELEMENT = "NewLine";
58 static final private String PLUGOUT_ELEMENT = "plugout";//used by building flax collections
59
60 static private Document document;
61 static private StringBuffer saved_collect_cfg_string_buffer = null;
62
63
64 static public Element createElement (String element_name) {
65 return document.createElement (element_name);
66 }
67
68
69 /** Find the best insertion position for the given DOM Element. This should try to match command tag, and if found should then try to group by name or type (eg CollectionMeta), or append to end is no such grouping exists (eg Plugins). Failing a command match it will check against the command order for the best insertion location.
70 * @param target_element the command Element to be inserted
71 * @return the Element which the given command should be inserted before, or null to append to end of list
72 */
73 static public Node findInsertionPoint (Element target_element) {
74 ///ystem.err.println("Find insertion point: " + target_element.getNodeName());
75 String target_element_name = target_element.getNodeName ();
76 Element document_element = document.getDocumentElement ();
77 // Try to find commands with the same tag.
78 NodeList matching_elements = document_element.getElementsByTagName (target_element_name);
79 // If we found matching elements, then we have our most likely insertion location, so check within for groupings
80 if(matching_elements.getLength () != 0) {
81 ///ystem.err.println("Found matching elements.");
82 // Only CollectionMeta are grouped.
83 if(target_element_name.equals (StaticStrings.COLLECTIONMETADATA_ELEMENT)) {
84 ///ystem.err.println("Dealing with collection metadata");
85 // Special case: CollectionMeta can be added at either the start or end of a collection configuration file. However the start position is reserved for special metadata, so if no non-special metadata can be found we must append to the end.
86 // So if the command to be added is special add it immediately after any other special command
87 if(target_element.getAttribute (StaticStrings.SPECIAL_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
88 int index = 0;
89 Element matched_element = (Element) matching_elements.item (index);
90 Element sibling_element = (Element) matched_element.getNextSibling ();
91 while(sibling_element.getAttribute (StaticStrings.SPECIAL_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
92 index++;
93 matched_element = (Element) matching_elements.item (index);
94 sibling_element = (Element) matched_element.getNextSibling ();
95 }
96 if(sibling_element.getNodeName ().equals (NEWLINE_ELEMENT)) {
97 Element newline_element = document.createElement (NEWLINE_ELEMENT);
98 document_element.insertBefore (newline_element, sibling_element);
99 }
100 return sibling_element;
101 }
102 // Otherwise try to find a matching 'name' and add after the last one in that group.
103 else {
104 int index = 0;
105 target_element_name = target_element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
106 boolean found = false;
107 // Skip all of the special metadata
108 Element matched_element = (Element) matching_elements.item (index);
109 while(matched_element.getAttribute (StaticStrings.SPECIAL_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
110 index++;
111 matched_element = (Element) matching_elements.item (index);
112 }
113 // Begin search
114 while(!found && matched_element != null) {
115 if(matched_element.getAttribute (StaticStrings.NAME_ATTRIBUTE).equals (target_element_name)) {
116 found = true;
117 }
118 else {
119 index++;
120 matched_element = (Element) matching_elements.item (index);
121 }
122 }
123 // If we found a match, we need to continue checking until we find the last name match.
124 if(found) {
125 index++;
126 Element previous_sibling = matched_element;
127 Element sibling_element = (Element) matching_elements.item (index);
128 while(sibling_element != null && sibling_element.getAttribute (StaticStrings.NAME_ATTRIBUTE).equals (target_element_name)) {
129 previous_sibling = sibling_element;
130 index++;
131 sibling_element = (Element) matching_elements.item (index);
132 }
133 // Previous sibling now holds the command immediately before where we want to add, so find its next sibling and add to that. In this one case we can ignore new lines!
134 return previous_sibling.getNextSibling ();
135 }
136 // If not found we just add after last metadata element
137 else {
138 Element last_element = (Element) matching_elements.item (matching_elements.getLength () - 1);
139 return last_element.getNextSibling ();
140 }
141 }
142
143 }
144 else {
145 ///ystem.err.println("Not dealing with collection meta.");
146 Element matched_element = (Element) matching_elements.item (matching_elements.getLength () - 1);
147 // One final quick test. If the matched element is immediately followed by a NewLine command, then we insert another NewLine after the matched command, then return the NewLine instead (thus the about to be inserted command will be placed between the two NewLines)
148 Node sibling_element = matched_element.getNextSibling ();
149 if(sibling_element != null && sibling_element.getNodeName ().equals (NEWLINE_ELEMENT)) {
150 Element newline_element = document.createElement (NEWLINE_ELEMENT);
151 document_element.insertBefore (newline_element, sibling_element);
152 }
153 return sibling_element; // Note that this may be null
154 }
155 }
156 ///ystem.err.println("No matching elements found.");
157 // Locate where this command is in the ordering
158 int command_index = -1;
159 for(int i = 0; command_index == -1 && i < COMMAND_ORDER.length; i++) {
160 if(COMMAND_ORDER[i].equals (target_element_name)) {
161 command_index = i;
162 }
163 }
164 ///ystem.err.println("Command index is: " + command_index);
165 // Now move forward, checking for existing elements in each of the preceeding command orders.
166 int preceeding_index = command_index - 1;
167 ///ystem.err.println("Searching before the target command.");
168 while(preceeding_index >= 0) {
169 matching_elements = document_element.getElementsByTagName (COMMAND_ORDER[preceeding_index]);
170 // If we've found a match
171 if(matching_elements.getLength () > 0) {
172 // We add after the last element
173 Element matched_element = (Element) matching_elements.item (matching_elements.getLength () - 1);
174 // One final quick test. If the matched element is immediately followed by a NewLine command, then we insert another NewLine after the matched command, then return the NewLine instead (thus the about to be inserted command will be placed between the two NewLines)
175 Node sibling_element = matched_element.getNextSibling ();
176 if(sibling_element != null && sibling_element.getNodeName ().equals (NEWLINE_ELEMENT)) {
177 Element newline_element = document.createElement (NEWLINE_ELEMENT);
178 document_element.insertBefore (newline_element, sibling_element);
179 }
180 return sibling_element; // Note that this may be null
181 }
182 preceeding_index--;
183 }
184 // If all that fails, we now move backwards through the commands
185 int susceeding_index = command_index + 1;
186 ///ystem.err.println("Searching after the target command.");
187 while(susceeding_index < COMMAND_ORDER.length) {
188 matching_elements = document_element.getElementsByTagName (COMMAND_ORDER[susceeding_index]);
189 // If we've found a match
190 if(matching_elements.getLength () > 0) {
191 // We add before the first element
192 Element matched_element = (Element) matching_elements.item (0);
193 // One final quick test. If the matched element is immediately preceeded by a NewLine command, then we insert another NewLine before the matched command, then return this new NewLine instead (thus the about to be inserted command will be placed between the two NewLines)
194 Node sibling_element = matched_element.getPreviousSibling ();
195 if(sibling_element != null && sibling_element.getNodeName ().equals (NEWLINE_ELEMENT)) {
196 Element newline_element = document.createElement (NEWLINE_ELEMENT);
197 document_element.insertBefore (newline_element, sibling_element);
198 }
199 return sibling_element; // Note that this may be null
200 }
201 susceeding_index++;
202 }
203 // Well. Apparently there are no other commands in this collection configuration. So append away...
204 return null;
205 }
206
207
208 static public NodeList getElementsByTagName (String element_name) {
209 return document.getDocumentElement ().getElementsByTagName (element_name);
210 }
211
212
213 static public String toString (Element command_element, boolean show_extracted_namespace) {
214 String command_element_name = command_element.getNodeName ();
215 if(command_element_name.equals (StaticStrings.CLASSIFY_ELEMENT)) {
216 return classifyToString (command_element, show_extracted_namespace);
217 }
218 else if(command_element_name.equals (StaticStrings.FORMAT_ELEMENT)) {
219 return formatToString (command_element, show_extracted_namespace);
220 }
221 else if(command_element_name.equals (StaticStrings.INDEXES_ELEMENT)) {
222 return indexesToString (command_element, show_extracted_namespace);
223 }
224 else if(command_element_name.equals (StaticStrings.INDEX_DEFAULT_ELEMENT)) {
225 return indexDefaultToString (command_element, show_extracted_namespace);
226 }
227 else if(command_element_name.equals (StaticStrings.LANGUAGES_ELEMENT)) {
228 return languagesToString (command_element);
229 }
230 else if(command_element_name.equals (StaticStrings.LANGUAGE_DEFAULT_ELEMENT)) {
231 return languageDefaultToString (command_element);
232 }
233 else if (command_element_name.equals (StaticStrings.LANGUAGE_METADATA_ELEMENT)) {
234 return languageMetadataToString (command_element, show_extracted_namespace);
235 }
236 else if(command_element_name.equals (StaticStrings.INDEXOPTIONS_ELEMENT)) {
237 return indexOptionsToString (command_element);
238 }
239 else if(command_element_name.equals (StaticStrings.INDEXOPTION_DEFAULT_ELEMENT)) {
240 return indexOptionDefaultToString (command_element);
241 }
242 else if(command_element_name.equals (StaticStrings.COLLECTIONMETADATA_ELEMENT)) {
243 return metadataToString (command_element, show_extracted_namespace);
244 }
245 else if(command_element_name.equals (StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT)) {
246 return metadataToString (command_element, show_extracted_namespace);
247 }
248 else if(command_element_name.equals (StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT)) {
249 return metadataToString (command_element, show_extracted_namespace);
250 }
251 else if(command_element_name.equals (StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT)) {
252 return metadataToString (command_element, show_extracted_namespace);
253 }
254 else if (command_element_name.equals (StaticStrings.BUILDTYPE_ELEMENT)) {
255 return metadataToString (command_element, show_extracted_namespace);
256 }
257 else if(command_element_name.equals (StaticStrings.PLUGIN_ELEMENT)) {
258 return pluginToString (command_element, show_extracted_namespace);
259 }
260 else if(command_element_name.equals (StaticStrings.SUBCOLLECTION_ELEMENT)) {
261 return subcollectionToString (command_element, show_extracted_namespace);
262 }
263 else if(command_element_name.equals (StaticStrings.SUBCOLLECTION_DEFAULT_INDEX_ELEMENT)) {
264 return subcollectionDefaultIndexToString (command_element);
265 }
266 else if(command_element_name.equals (StaticStrings.SUBCOLLECTION_INDEXES_ELEMENT)) {
267 return subcollectionIndexesToString (command_element);
268 }
269 else if(command_element_name.equals (StaticStrings.SUPERCOLLECTION_ELEMENT)) {
270 return supercollectionToString (command_element);
271 }
272 else if(command_element_name.equals (StaticStrings.UNKNOWN_ELEMENT)) {
273 return unknownToString (command_element);
274 }
275 return "";
276 }
277
278 /** Parses arguments from a tokenizer and returns a HashMap of mappings. The tricky bit here is that not all entries in the HashMap are name->value pairs, as some arguments are boolean and are turned on by their presence. Arguments are denoted by a '-' prefix.
279 * @param tokenizer a CommandTokenizer based on the unconsumed portion of a command string
280 * @return a HashMap containing the arguments parsed
281 */
282 static public HashMap parseArguments (CommandTokenizer tokenizer) {
283 HashMap arguments = new HashMap ();
284 String name = null;
285 String value = null;
286 while(tokenizer.hasMoreTokens () || name != null) {
287 // First we retrieve a name if we need one.
288 if(name == null) {
289 name = tokenizer.nextToken ();
290 }
291 // Now we attempt to retrieve a value
292 if(tokenizer.hasMoreTokens ()) {
293 value = tokenizer.nextToken ();
294 // Test if the value is actually a name, and if so add the name by itself, then put value into name so that it is parsed correctly during the next loop.
295 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 doDefaultIndexLanguage (Document to, Node searchNode) {
2539 Element toElement = to.getDocumentElement ();
2540 String elementNameFrom = StaticStrings.LANGUAGE_DEFAULT_INDEX_ELEMENT;
2541 String elementNameTo = StaticStrings.LANGUAGE_DEFAULT_ELEMENT;
2542 Node from_element = XMLTools.getChildByTagName (searchNode, elementNameFrom);
2543 if (from_element == null) {
2544 return; // such an element not found
2545 }
2546
2547 Element to_element = to.createElement (elementNameTo);
2548
2549 String name_str = ((Element)from_element).getAttribute (StaticStrings.NAME_ATTRIBUTE);
2550 to_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
2551 to_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2552
2553 toElement.appendChild (to_element);
2554 }
2555
2556 //Handle 'indexOption' (i.e. casefold, stem etc). In the internal structure, the element is called 'IndexOption'
2557 private void doIndexOption (Document to, Node searchNode) {
2558 Element toElement = to.getDocumentElement ();
2559 Node index_option_node = XMLTools.getChildByTagName (searchNode, StaticStrings.INDEXOPTION_STR);
2560 if (index_option_node == null) {
2561 return;
2562 }
2563 NodeList option_children = ((Element)index_option_node).getElementsByTagName (StaticStrings.OPTION_STR);
2564 int option_nodes = option_children.getLength ();
2565
2566 // for lucene, there is no 'indexOption'. We build a default 'indexOption' and 'assigned=false' in case the user switches to mg or mgpp
2567 if (option_nodes < 1) {
2568 Element index_option = to.createElement (StaticStrings.INDEXOPTIONS_ELEMENT);
2569 index_option.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR);
2570 index_option.setAttribute (StaticStrings.NAME_STR, StaticStrings.INDEXOPTIONS_STR);
2571 String[] option_str =
2572 { StaticStrings.CASEFOLD_OPTION_STR, StaticStrings.STEM_OPTION_STR };
2573 for (int i=0; i<option_str.length; i++) {
2574 Element option_element = to.createElement (StaticStrings.OPTION_ELEMENT);
2575 option_element.setAttribute (StaticStrings.NAME_STR, option_str[i]);
2576 index_option.appendChild (option_element);
2577 }
2578 appendProperly (toElement, index_option);
2579 return;
2580 }
2581
2582 Element index_option = to.createElement (StaticStrings.INDEXOPTIONS_ELEMENT);
2583 index_option.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2584 index_option.setAttribute (StaticStrings.NAME_STR, StaticStrings.INDEXOPTIONS_STR);
2585
2586 for (int i=0; i<option_nodes; i++) {
2587 String option_str = ((Element)option_children.item (i)).getAttribute (StaticStrings.NAME_ATTRIBUTE);
2588 Element option_element = to.createElement (StaticStrings.OPTION_ELEMENT);
2589 option_element.setAttribute (StaticStrings.NAME_STR, option_str);
2590 index_option.appendChild (option_element);
2591 }
2592 appendProperly (toElement, index_option);
2593 }
2594
2595 private Element doBuildType (Document to, String att_value) {
2596
2597 //construct 'BuildType' element
2598 Element element = to.createElement (StaticStrings.BUILDTYPE_ELEMENT);
2599 element.setAttribute (StaticStrings.NAME_ATTRIBUTE, StaticStrings.BUILDTYPE_STR);
2600 element.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, StaticStrings.ENGLISH_LANGUAGE_STR);
2601 element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2602 element.setAttribute (StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR);
2603
2604 XMLTools.setNodeText (element, att_value);
2605
2606 return element;
2607 }
2608
2609 // Convert 'description', 'smallicon' etc.
2610 private void convertDisplayItemList (Document from, Document to) {
2611 Element displayItemList = to.createElement (StaticStrings.DISPLAYITEMLIST_STR);
2612 Element destination = to.getDocumentElement ();
2613
2614 String []att_values =
2615 {StaticStrings.COLLECTIONMETADATA_COLLECTIONEXTRA_STR,
2616 StaticStrings.COLLECTIONMETADATA_ICONCOLLECTIONSMALL_STR,
2617 StaticStrings.COLLECTIONMETADATA_ICONCOLLECTION_STR,
2618 StaticStrings.COLLECTIONMETADATA_COLLECTIONNAME_STR};
2619
2620 String []map_attrs =
2621 {StaticStrings.DESCRIPTION_STR,
2622 StaticStrings.SMALLICON_STR,
2623 StaticStrings.ICON_STR,
2624 StaticStrings.NAME_STR};
2625
2626 for (int i=0; i<att_values.length; i++) {
2627
2628 //dOc
2629 ArrayList e_list = XMLTools.getNamedElementList (from.getDocumentElement (),
2630 StaticStrings.COLLECTIONMETADATA_ELEMENT,
2631 StaticStrings.NAME_ATTRIBUTE, att_values[i]);
2632 // if such elements don't exist, don't bother
2633 if (e_list == null) {
2634 continue;
2635 }
2636 for (int j=0; j<e_list.size (); j++) {
2637 Element e = (Element)e_list.get (j);
2638 if (e.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
2639 continue;
2640 }
2641 String text = XMLTools.getNodeText (e);
2642 String lang = e.getAttribute (StaticStrings.LANGUAGE_ATTRIBUTE);
2643
2644 Element displayItem = constructElement (StaticStrings.DISPLAYITEM_STR, map_attrs[i],
2645 StaticStrings.LANG_STR, lang, text, to);
2646 displayItemList.appendChild (displayItem);
2647 }
2648
2649 }
2650 destination.appendChild (displayItemList);
2651 }
2652 // This method creates a DisplayItem element of the type of 'to' by using the ingredients from the element 'e'
2653 private Element constructDisplayItem (Element e, Document to) {
2654 String lang_string = e.getAttribute (StaticStrings.LANGUAGE_ATTRIBUTE);
2655 String text = XMLTools.getNodeText (e);
2656 Element displayItem = to.createElement (StaticStrings.DISPLAYITEM_STR);
2657 displayItem.setAttribute (StaticStrings.NAME_ATTRIBUTE, StaticStrings.NAME_ATTRIBUTE);
2658 displayItem.setAttribute (StaticStrings.LANG_STR, lang_string);
2659 XMLTools.setNodeText (displayItem, text);
2660 return displayItem;
2661 }
2662 private void convertMetadataList (Document from, Document to) {
2663 Element metadataList = to.createElement (StaticStrings.METADATALIST_STR);
2664 Element destination = to.getDocumentElement ();
2665
2666 String []ele_names =
2667 {StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT,
2668 StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT,
2669 StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT};
2670 String []att_names =
2671 {StaticStrings.COLLECTIONMETADATA_CREATOR_STR,
2672 StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR,
2673 StaticStrings.COLLECTIONMETADATA_PUBLIC_STR};
2674 for (int i=0; i<ele_names.length; i++) {
2675 Element e = XMLTools.getNamedElement (from.getDocumentElement (),
2676 ele_names[i], StaticStrings.NAME_ATTRIBUTE, att_names[i]);
2677 if (e == null) {
2678 continue;
2679 }
2680 String text = XMLTools.getNodeText (e);
2681 Element metadata = to.createElement (StaticStrings.METADATA_STR);
2682 metadata.setAttribute (StaticStrings.NAME_ATTRIBUTE, att_names[i]);
2683 metadata.setAttribute (StaticStrings.LANG_STR, StaticStrings.ENGLISH_LANGUAGE_STR);
2684 XMLTools.setNodeText (metadata, text);
2685 metadataList.appendChild (metadata);
2686 }
2687
2688 destination.appendChild (metadataList);
2689 }
2690 // This method creates an element with the name 'element_name' of the type of 'to' by using the other three strings
2691 private Element constructElement (String element_name, String name_value, String lang_att, String lang_value, String text, Document to) {
2692 Element e = to.createElement (element_name);
2693 e.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
2694 e.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_value);
2695 e.setAttribute (lang_att, lang_value);
2696 XMLTools.setNodeText (e, text);
2697
2698 return e;
2699 }
2700 // Convert classify in the internal(i.e. Document from) to collectionconfig.xml (i.e. Document to)
2701 private void convertClassifier (Document from, Document to) {
2702 Element browse_element = to.createElement (StaticStrings.BROWSE_STR);
2703 NodeList children = from.getDocumentElement ().getElementsByTagName (StaticStrings.CLASSIFY_ELEMENT);
2704
2705 int num_children = (children == null)? 0 : children.getLength ();
2706
2707 if (num_children == 0) {
2708 return ;
2709 }
2710
2711 for (int i=0; i<num_children; i++) {
2712
2713 Element child = (Element)children.item (i);
2714 if (child.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
2715 continue;
2716 }
2717 String str = child.getAttribute (StaticStrings.TYPE_ATTRIBUTE);
2718 Element classifier_element = to.createElement (StaticStrings.CLASSIFIER_STR);
2719 classifier_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, str);
2720
2721 NodeList option_children = child.getElementsByTagName (StaticStrings.OPTION_ELEMENT);
2722 for (int j=0; j<option_children.getLength (); j++) {
2723 Element el = (Element)option_children.item (j);
2724 if (el.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
2725 continue;
2726 }
2727 String name_str = el.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2728 String value_str = XMLTools.getNodeText (el);
2729
2730
2731 if (name_str == null && value_str == null) {
2732 continue;
2733 }
2734 Element option_element = to.createElement (StaticStrings.OPTION_STR);
2735 if (name_str != null && name_str.equals (StaticStrings.METADATA_STR)) {
2736
2737 // 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.
2738 String[] values = value_str.split (StaticStrings.COMMA_CHARACTER);
2739 value_str = "";
2740 for (int k=0; k<=values.length-1; k++) {
2741 if(values[k].startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
2742 values[k] = values[k].substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
2743 }
2744 else {
2745 MetadataElement metadata_element = MetadataTools.getMetadataElementWithDisplayName (values[k]);
2746 if (metadata_element != null) {
2747 values[k] = metadata_element.getFullName ();
2748 }
2749 }
2750 if (k < values.length-1) {
2751 value_str = value_str + values[k] + StaticStrings.COMMA_CHARACTER;
2752 } else {
2753 value_str = value_str + values[k];
2754 }
2755 }
2756 }
2757
2758 if (!name_str.equals ("")) {
2759 if (!name_str.startsWith (StaticStrings.MINUS_CHARACTER)) {
2760 name_str = StaticStrings.MINUS_CHARACTER + name_str;
2761 }
2762 option_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
2763 }
2764
2765 if (!value_str.equals ("")) {
2766 option_element.setAttribute (StaticStrings.VALUE_ATTRIBUTE, value_str);
2767 }
2768
2769 classifier_element.appendChild (option_element);
2770 }
2771
2772 //format element for this classifier
2773 Element e = (Element)XMLTools.getChildByTagName (child, StaticStrings.FORMAT_STR);
2774
2775 if (e != null) {
2776 classifier_element.appendChild (convertFormat(to, e));
2777 }
2778 browse_element.appendChild (classifier_element);
2779 }
2780
2781 //convert default classifier format
2782 Element e = XMLTools.getNamedElement (from.getDocumentElement (), StaticStrings.FORMAT_STR,
2783 StaticStrings.NAME_ATTRIBUTE, StaticStrings.BROWSE_STR);
2784 browse_element.appendChild (convertFormat(to, e));
2785
2786 to.getDocumentElement ().appendChild (browse_element);
2787 }
2788 private Element convertFormat(Document to, Element e) {
2789 String format_str = XMLTools.getNodeText(e);
2790 Element format = to.createElement (StaticStrings.FORMAT_STR);
2791 //XMLTools.copyAllChildren (format, e);
2792 XMLTools.setNodeText(format, format_str);
2793 return format;
2794 }
2795 //convert format statement for search
2796 private void convertSearchFormat (Document from, Document to) {
2797 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR);
2798 Element e = XMLTools.getNamedElement (from.getDocumentElement (), StaticStrings.FORMAT_STR,
2799 StaticStrings.NAME_ATTRIBUTE, StaticStrings.SEARCH_STR);
2800
2801 search.appendChild (convertFormat(to, e));
2802
2803 }
2804 //convert format statement for display of the documents
2805 private void convertDisplayFormat (Document from, Document to) {
2806 Element e = XMLTools.getNamedElement (from.getDocumentElement (), StaticStrings.FORMAT_STR,
2807 StaticStrings.NAME_ATTRIBUTE, StaticStrings.DISPLAY_STR);
2808 if (e == null) {
2809 return;
2810 }
2811 Element display = to.createElement (StaticStrings.DISPLAY_STR);
2812 display.appendChild (convertFormat(to, e));
2813 to.getDocumentElement ().appendChild (display);
2814 }
2815 // Convert plugins in the internal(i.e. Document from) to collectionconfig.xml (i.e. Document to)
2816 private void convertPlugin (Document from, Document to) {
2817 Element import_element = to.createElement (StaticStrings.IMPORT_STR);
2818 Element plugin_list_element = to.createElement (StaticStrings.PLUGINLIST_STR);
2819
2820 NodeList children = from.getDocumentElement ().getElementsByTagName (StaticStrings.PLUGIN_ELEMENT);
2821 int num_children = (children == null)? 0 : children.getLength ();
2822 if (num_children == 0) {
2823 return ;
2824 }
2825
2826 for (int i=0; i<num_children; i++) {
2827
2828 Element child = (Element)children.item (i);
2829 if (child.getAttribute (StaticStrings.SEPARATOR_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
2830 continue;
2831 }
2832 if (child.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
2833 continue;
2834 }
2835
2836 String str = child.getAttribute (StaticStrings.TYPE_ATTRIBUTE);
2837 Element plugin_element = to.createElement (StaticStrings.PLUGIN_STR);
2838 plugin_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, str);
2839
2840 NodeList option_children = child.getElementsByTagName (StaticStrings.OPTION_ELEMENT);
2841 for (int j=0; j<option_children.getLength (); j++) {
2842 Element el = (Element)option_children.item (j);
2843 if(!el.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
2844 continue;
2845 }
2846 String name_str = el.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2847 String value_str = XMLTools.getNodeText (el);
2848
2849
2850 if (name_str == null && value_str == null) {
2851 continue;
2852 }
2853 Element option_element = to.createElement (StaticStrings.OPTION_STR);
2854 if (name_str != null && name_str.equals (StaticStrings.METADATA_STR)) {
2855
2856 // 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.
2857 String[] values = value_str.split (StaticStrings.COMMA_CHARACTER);
2858 value_str = "";
2859 for (int k=0; k<=values.length-1; k++) {
2860 if(values[k].startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
2861 values[k] = values[k].substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
2862 }
2863
2864 if (k < values.length-1) {
2865 value_str = value_str + values[k] + StaticStrings.COMMA_CHARACTER;
2866 } else {
2867 value_str = value_str + values[k];
2868 }
2869 }
2870 }
2871
2872 if (!name_str.equals ("")) {
2873 if (!name_str.startsWith (StaticStrings.MINUS_CHARACTER)) {
2874 name_str = StaticStrings.MINUS_CHARACTER + name_str;
2875 }
2876 option_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
2877 }
2878
2879 if (!value_str.equals ("")) {
2880 option_element.setAttribute (StaticStrings.VALUE_ATTRIBUTE, value_str);
2881 }
2882
2883 plugin_element.appendChild (option_element);
2884 }//for loop ends
2885
2886 plugin_list_element.appendChild (plugin_element);
2887 }//for loop ends
2888
2889 import_element.appendChild (plugin_list_element);
2890
2891 //do the plugout element (used by building flax collections)
2892 Node plugout = XMLTools.getChildByTagNameIndexed (from.getDocumentElement (), PLUGOUT_ELEMENT, 0);
2893 if (plugout != null) {
2894 Element to_element = XMLTools.duplicateElement (to, (Element)plugout, true);
2895 import_element.appendChild (to_element);
2896 }
2897
2898 to.getDocumentElement ().appendChild (import_element);
2899 }
2900
2901 //Handle 'searchType' of collectionConfig.xml. In the internal structure, its also called 'searchType', eg. plain, form
2902 private void convertSearchType (Document from, Document to) {
2903 Element e = XMLTools.getNamedElement (from.getDocumentElement (), StaticStrings.FORMAT_STR,
2904 StaticStrings.NAME_ATTRIBUTE, StaticStrings.SEARCHTYPE_ELEMENT);//searchType
2905
2906 if (e == null) {
2907 return;
2908 }
2909 Element search_type_element = to.createElement (StaticStrings.FORMAT_STR);
2910
2911// String searchtype_str = e.getAttribute (StaticStrings.VALUE_ATTRIBUTE);
2912// search_type_element.setAttribute (StaticStrings.VALUE_ATTRIBUTE, searchtype_str);
2913 String searchtype_str = XMLTools.getNodeText(e);
2914 XMLTools.setNodeText(search_type_element, searchtype_str);
2915
2916 search_type_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, StaticStrings.SEARCHTYPE_ELEMENT);
2917 //Get the 'search' element from 'to'
2918 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR);
2919 search.appendChild (search_type_element);
2920 }
2921
2922 private void convertBuildType (Document from, Document to) {
2923 Element e = XMLTools.getNamedElement (from.getDocumentElement (),
2924 StaticStrings.BUILDTYPE_ELEMENT,
2925 StaticStrings.NAME_ATTRIBUTE, StaticStrings.BUILDTYPE_STR);
2926 if (e == null) {
2927 return;
2928 }
2929 String indexer = XMLTools.getNodeText (e);
2930 Element search = to.createElement (StaticStrings.SEARCH_STR);
2931 search.setAttribute (StaticStrings.TYPE_ATTRIBUTE, indexer);
2932 to.getDocumentElement ().appendChild (search);
2933 }
2934 private void convertDefaultIndex (Document from, Document to, Element search) {
2935 Element source = from.getDocumentElement ();
2936
2937 Element default_index_element = (Element)XMLTools.getChildByTagName (source, StaticStrings.INDEX_DEFAULT_ELEMENT);
2938 if (default_index_element == null) {
2939 return;
2940 }
2941
2942 String indexer = search.getAttribute (StaticStrings.TYPE_ATTRIBUTE);
2943 String level_str = default_index_element.getAttribute (StaticStrings.LEVEL_ATTRIBUTE);
2944 // Debugging purposes
2945 if (level_str.equals ("") && indexer.equals (StaticStrings.MG_STR) ) {
2946 System.out.println ("Bug: DefaultIndex should have its level attribute not empty.");
2947 }
2948
2949 NodeList content_elements = default_index_element.getElementsByTagName (StaticStrings.CONTENT_ELEMENT);
2950 int content_elements_length = content_elements.getLength ();
2951
2952 // Don't output anything if no indexes are set
2953 if(content_elements_length == 0) {
2954 return ;//
2955 }
2956
2957 String index_str = "";
2958
2959 if (indexer.equals (StaticStrings.MG_STR)) {
2960 //combine level with indexes
2961 index_str = level_str + StaticStrings.COLON_CHARACTER;
2962 }
2963 else { //for mgpp/lucene, just take index
2964 //do nothing
2965 }
2966
2967 for(int k = 0; k < content_elements_length; k++) {
2968 Element content_element = (Element) content_elements.item (k);
2969 if (content_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
2970 continue;
2971 }
2972 String name_str = content_element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
2973
2974 if(name_str.startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
2975 name_str = name_str.substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
2976 }
2977
2978 index_str = index_str + name_str;
2979
2980 // Make it comma separated string
2981 if(k < content_elements_length - 1) {
2982 index_str = index_str + StaticStrings.COMMA_CHARACTER;
2983 }
2984 content_element = null;
2985 }//for loop ends
2986
2987
2988 Element default_index = to.createElement (StaticStrings.INDEX_DEFAULT_ELEMENT_LOWERCASE);
2989 default_index.setAttribute (StaticStrings.NAME_ATTRIBUTE, index_str);
2990 search.appendChild (default_index);
2991
2992 }
2993 private void convertSubcollection (Document from, Document to) {
2994 Element source = from.getDocumentElement ();
2995 //Get the 'search' element from 'to' which has already been created in 'convertBuildType'
2996 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR);
2997
2998 // Get the Subcollection element from the internal structure
2999 NodeList subcollection_elements = source.getElementsByTagName (StaticStrings.SUBCOLLECTION_ELEMENT);
3000 if (subcollection_elements == null) {
3001 return;
3002 }
3003 int subcollection_elements_length = subcollection_elements.getLength ();
3004
3005 if (subcollection_elements_length == 0) { // no
3006 return ;
3007 }
3008
3009 for(int j = 0; j < subcollection_elements_length; j++) {
3010
3011 Element e = (Element) subcollection_elements.item (j);
3012 if (e.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3013 continue;
3014 }
3015 String content = e.getAttribute (StaticStrings.CONTENT_ATTRIBUTE);
3016 String name = e.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3017 String options = e.getAttribute (StaticStrings.OPTIONS_ATTRIBUTE);
3018 String type = e.getAttribute (StaticStrings.TYPE_ATTRIBUTE);
3019 String text = XMLTools.getNodeText (e);
3020
3021 String filter = "";
3022 if (type.equals (StaticStrings.EXCLUDE_STR)) {
3023 filter = StaticStrings.EXCLAMATION_CHARACTER;
3024 }
3025
3026 if(content.startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
3027 content = content.substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
3028 }
3029 filter = filter + content + StaticStrings.SEPARATOR_CHARACTER + text;
3030 if (options != null && options != "") {
3031 filter = filter + StaticStrings.SEPARATOR_CHARACTER + options;
3032 }
3033 Element subcollection = to.createElement (StaticStrings.SUBCOLLECTION_STR);
3034 subcollection.setAttribute (StaticStrings.FILTER_ATTRIBUTE, filter);
3035 subcollection.setAttribute (StaticStrings.NAME_ATTRIBUTE, name);
3036
3037 search.appendChild (subcollection);
3038 }
3039 }
3040 private void convertSubcollectionIndexes (Document from, Document to) {
3041 Element source = from.getDocumentElement ();
3042 //Get the 'search' element from 'to' which has already been created in 'convertBuildType'
3043 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR);
3044
3045 // Get the SubcollectionIndexes element from the internal structure
3046 Element subcollection_indexes = (Element)XMLTools.getChildByTagName (source, StaticStrings.SUBCOLLECTION_INDEXES_ELEMENT);
3047 if (subcollection_indexes == null) {
3048 return;
3049 }
3050 NodeList index_elements = subcollection_indexes.getElementsByTagName (StaticStrings.INDEX_ELEMENT);
3051 int index_elements_length = index_elements.getLength ();
3052
3053 if (index_elements_length == 0) { // no indexes
3054 return ;
3055 }
3056
3057 for(int j = 0; j < index_elements_length; j++) {
3058 Element index_element = (Element) index_elements.item (j);
3059 if (index_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3060 continue;
3061 }
3062
3063 Element index = to.createElement (StaticStrings.SUBCOLLECTION_INDEX_ELEMENT);
3064
3065 String index_value = "";
3066
3067 NodeList content_elements = index_element.getElementsByTagName (StaticStrings.CONTENT_ELEMENT);
3068 int content_elements_length = content_elements.getLength ();
3069
3070 for(int k = 0; k < content_elements_length; k++) {
3071 Element content_element = (Element) content_elements.item (k);
3072 if (content_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3073 continue;
3074 }
3075 String name_str = content_element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3076 index_value += name_str;
3077 // Make it comma separated string
3078 if(k < content_elements_length - 1) {
3079 index_value += StaticStrings.COMMA_CHARACTER;
3080 }
3081 content_element = null;
3082 }//for loop ends
3083
3084 index.setAttribute (StaticStrings.NAME_ATTRIBUTE, index_value);
3085
3086 // Now constructing 'displayItem' element for this 'indexSubcollection' element
3087 // from the collectionmetadata element
3088 ArrayList collectionmetadata_list = XMLTools.getNamedElementList (source,
3089 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3090 StaticStrings.NAME_ATTRIBUTE, index_value);
3091
3092 if (collectionmetadata_list == null) {
3093 //try adding the "." prefix
3094 index_value = StaticStrings.DOT_CHARACTER + index_value;
3095 collectionmetadata_list = XMLTools.getNamedElementList (source,
3096 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3097 StaticStrings.NAME_ATTRIBUTE, index_value);
3098 }
3099 if (collectionmetadata_list != null) {
3100
3101 for(int k = 0; k < collectionmetadata_list.size (); k++) {
3102 Element collectionmetadata = (Element)collectionmetadata_list.get (k);
3103 if (collectionmetadata.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3104 continue;
3105 }
3106 Element displayItem = constructDisplayItem (collectionmetadata, to);
3107 index.appendChild (displayItem);
3108 }
3109 }
3110
3111 search.appendChild (index);
3112
3113 } //for loop ends
3114 }
3115
3116 private void convertLanguages (Document from, Document to) {
3117 Element source = from.getDocumentElement ();
3118 //Get the 'search' element from 'to' which has already been created in 'convertBuildType'
3119 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR);
3120
3121 // Get the Languages element from the internal structure
3122 Element languages = (Element)XMLTools.getChildByTagName (source, StaticStrings.LANGUAGES_ELEMENT);
3123 if (languages == null) {
3124 return;
3125 }
3126 NodeList language_elements = languages.getElementsByTagName (StaticStrings.LANGUAGE_ELEMENT);
3127 int language_elements_length = language_elements.getLength ();
3128
3129 if (language_elements_length == 0) {
3130 return ;
3131 }
3132
3133 for(int j = 0; j < language_elements_length; j++) {
3134 Element element = (Element) language_elements.item (j);
3135 if (element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3136 continue;
3137 }
3138
3139 // Create indexLanguage element
3140 Element index_language = to.createElement (StaticStrings.LANGUAGE_INDEX_ELEMENT);
3141
3142 String name_str = element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3143 index_language.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
3144
3145 // Now constructing 'displayItem' element for this 'indexLanguage' element
3146 // from the collectionmetadata element
3147 ArrayList collectionmetadata_list = XMLTools.getNamedElementList (source,
3148 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3149 StaticStrings.NAME_ATTRIBUTE, name_str);
3150
3151 if (collectionmetadata_list == null) {
3152 //try adding the "." prefix
3153 name_str = StaticStrings.DOT_CHARACTER + name_str;
3154 collectionmetadata_list = XMLTools.getNamedElementList (source,
3155 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3156 StaticStrings.NAME_ATTRIBUTE, name_str);
3157 }
3158 if (collectionmetadata_list != null) {
3159
3160 for(int k = 0; k < collectionmetadata_list.size (); k++) {
3161 Element collectionmetadata = (Element)collectionmetadata_list.get (k);
3162 if (collectionmetadata.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3163 continue;
3164 }
3165 Element displayItem = constructDisplayItem (collectionmetadata, to);
3166 index_language.appendChild (displayItem);
3167 }
3168 }
3169
3170 search.appendChild (index_language);
3171
3172 } //for loop ends
3173
3174 // Convert DefaultLanguage
3175 // Get the DefaultLanguage element from the internal structure
3176 Element default_language = (Element)XMLTools.getChildByTagName (source, StaticStrings.LANGUAGE_DEFAULT_ELEMENT);
3177 if(default_language != null) {
3178 String lang_name = default_language.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3179 Element default_index_language = to.createElement (StaticStrings.LANGUAGE_DEFAULT_INDEX_ELEMENT);
3180 default_index_language.setAttribute (StaticStrings.NAME_ATTRIBUTE, lang_name);
3181 search.appendChild (default_index_language);
3182 }
3183 // Convert LanguageMetadata
3184 // Get the LanguageMetadata element from the internal structure
3185 Element language_metadata = (Element)XMLTools.getChildByTagName (source, StaticStrings.LANGUAGE_METADATA_ELEMENT);
3186 if(language_metadata != null) {
3187 String meta_name = language_metadata.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3188 Element language_meta = to.createElement (StaticStrings.LANGUAGE_METADATA_ELEMENT_STR);
3189 if(meta_name.startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
3190 meta_name = meta_name.substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
3191 }
3192 language_meta.setAttribute (StaticStrings.NAME_ATTRIBUTE, meta_name);
3193 search.appendChild (language_meta);
3194 }
3195 }
3196
3197 //convert indexes and their displayItems, which go in 'search' element in collectionConfig.xml
3198 //parameter 'to' is the document to be saved as collectionConfig.xml
3199 //parameter 'from' is the internal xml structure
3200 private void convertIndex (Document from, Document to) {
3201 Element source = from.getDocumentElement ();
3202 //Get the 'search' element from 'to' which has already been created in 'convertBuildType'
3203 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR);
3204
3205 //THere are two sets of indexes elements, find the one which is assigned 'true'
3206 Element indexes = XMLTools.getNamedElement (source,
3207 StaticStrings.INDEXES_ELEMENT,
3208 StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
3209 if (indexes == null) {
3210 return;
3211 }
3212 NodeList index_elements = indexes.getElementsByTagName (StaticStrings.INDEX_ELEMENT);
3213 int index_elements_length = index_elements.getLength ();
3214
3215 if (index_elements_length == 0) { // no indexes
3216 return ;
3217 }
3218
3219 //find out it's mg or mgpp/lucene
3220 String mg = search.getAttribute (StaticStrings.TYPE_ATTRIBUTE);
3221 boolean mg_indexer = false;
3222 if (mg.equals (StaticStrings.MG_STR)) {
3223 mg_indexer = true;//it's mg, then the level is set as attribute of
3224 }
3225 if (mg_indexer == false) {
3226 // It's mgpp. Construct 'level' and 'defaultLevel' elements separately.
3227 convertLevels (from, to, search);
3228 }
3229
3230 for(int j = 0; j < index_elements_length; j++) {
3231 Element index_element = (Element) index_elements.item (j);
3232 if (index_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3233 continue;
3234 }
3235
3236 Element index_ele = to.createElement (StaticStrings.INDEX_LOW_STR);//index
3237
3238 // Used for creating displayItem for this element 'index_ele' further below
3239 // full_index_names contain 'ex.'
3240 String full_index_name = "";
3241 String level_str = "";
3242
3243 StringBuffer index_value = new StringBuffer ();
3244 if (mg_indexer == true) {
3245 // For mg indexer, there is a 'level' attribute in the index element of the internal structure
3246 // But mgpp/lucene don't
3247 level_str = index_element.getAttribute (StaticStrings.LEVEL_ATTRIBUTE);
3248 if(level_str.length () > 0) {
3249 index_value.append (level_str).append (StaticStrings.COLON_CHARACTER);
3250 //index_value = index_value.StaticStrings.COLON_CHARACTER;
3251 }
3252 }
3253
3254 NodeList content_elements = index_element.getElementsByTagName (StaticStrings.CONTENT_ELEMENT);
3255 int content_elements_length = content_elements.getLength ();
3256
3257 for(int k = 0; k < content_elements_length; k++) {
3258 Element content_element = (Element) content_elements.item (k);
3259 if (content_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3260 continue;
3261 }
3262 String name_str = content_element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3263
3264 full_index_name = full_index_name + name_str;
3265 if (k < content_elements_length - 1) {
3266 full_index_name = full_index_name + StaticStrings.COMMA_CHARACTER;
3267 }
3268
3269 if(name_str.startsWith (StaticStrings.EXTRACTED_NAMESPACE)) {
3270 name_str = name_str.substring (StaticStrings.EXTRACTED_NAMESPACE.length ());
3271 }
3272
3273 index_value.append (name_str);
3274 name_str = null;
3275 // Make it comma separated string
3276 if(k < content_elements_length - 1) {
3277 index_value.append (StaticStrings.COMMA_CHARACTER);
3278 }
3279 content_element = null;
3280 }//for loop ends
3281
3282 String temp_str = index_value.toString ();
3283 index_ele.setAttribute (StaticStrings.NAME_ATTRIBUTE, temp_str);
3284
3285 // Now constructing 'displayItem' element for this 'index_ele' element
3286 // The index names in the collectionmetadata elements in the internal structure are not the names that
3287 // are used in the content elements (i.e. ex.Source or dc.Subject and keywords), but the names that are
3288 // in the configuration files (i.e. Source or dc.Subject)
3289 ArrayList collectionmetadata_list = XMLTools.getNamedElementList (source,
3290 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3291 StaticStrings.NAME_ATTRIBUTE, temp_str);
3292
3293 if (collectionmetadata_list == null) {
3294 //try adding the "." prefix
3295 String with_dot_str = StaticStrings.DOT_CHARACTER + temp_str;
3296 collectionmetadata_list = XMLTools.getNamedElementList (source,
3297 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3298 StaticStrings.NAME_ATTRIBUTE, with_dot_str);
3299
3300 if (collectionmetadata_list == null) {
3301 //try the full name, i.e. with 'ex.'
3302 if (mg_indexer == true) {
3303 full_index_name = level_str+StaticStrings.COLON_CHARACTER+full_index_name;
3304 }
3305 collectionmetadata_list = XMLTools.getNamedElementList (source,
3306 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3307 StaticStrings.NAME_ATTRIBUTE, full_index_name);
3308 }
3309 if (collectionmetadata_list == null) {
3310 with_dot_str = StaticStrings.DOT_CHARACTER + full_index_name;
3311 collectionmetadata_list = XMLTools.getNamedElementList (source,
3312 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3313 StaticStrings.NAME_ATTRIBUTE, with_dot_str);
3314 }
3315 }
3316 if (collectionmetadata_list != null) {
3317
3318 for(int k = 0; k < collectionmetadata_list.size (); k++) {
3319 Element collectionmetadata = (Element)collectionmetadata_list.get (k);
3320 if (collectionmetadata.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3321 continue;
3322 }
3323 Element displayItem = constructDisplayItem (collectionmetadata, to);
3324
3325 index_ele.appendChild (displayItem);
3326 }
3327 }
3328
3329 search.appendChild (index_ele);
3330
3331 } //for loop ends
3332
3333 //Convert default index
3334 convertDefaultIndex (from, to, search);
3335 convertIndexOptions(from, to, search);
3336 }
3337 // Convert levels for mgpp/lucene. This method is called by converIndex() when mgpp indexer is detected.
3338 private void convertLevels (Document from, Document to, Element search) {
3339 Element source = from.getDocumentElement ();
3340 Element index_option = XMLTools.getNamedElement (source,
3341 StaticStrings.INDEXOPTIONS_ELEMENT,
3342 StaticStrings.NAME_ATTRIBUTE, StaticStrings.LEVELS_STR);
3343 if (index_option == null) {
3344 return;
3345 }
3346 //Debugging purposes
3347 if (index_option.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3348 DebugStream.println ("For mgpp, there should be an IndexOption element for levels which is assigned 'true': possible bug.");
3349 }
3350
3351 NodeList option_elements = index_option.getElementsByTagName (StaticStrings.OPTION_ELEMENT);
3352 int num_elements = option_elements.getLength ();
3353
3354 // Don't output anything if no indexes are set
3355 if(num_elements == 0) {
3356 return ;//
3357 }
3358
3359 for(int k = 0; k < num_elements; k++) {
3360 Element e = (Element) option_elements.item (k);
3361 String name_str = e.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3362 Element level_element = to.createElement (StaticStrings.LEVEL_ELEMENT);
3363 level_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str);
3364
3365 //Now construct displayItem for this level element from collectionmetadata
3366 ArrayList collectionmetadata_list = XMLTools.getNamedElementList (source,
3367 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3368 StaticStrings.NAME_ATTRIBUTE, name_str);
3369
3370 if (collectionmetadata_list == null) {
3371 //try adding the "." prefix
3372 name_str = StaticStrings.DOT_CHARACTER + name_str;
3373 collectionmetadata_list = XMLTools.getNamedElementList (source,
3374 StaticStrings.COLLECTIONMETADATA_ELEMENT,
3375 StaticStrings.NAME_ATTRIBUTE, name_str);
3376 }
3377 if (collectionmetadata_list != null) {
3378
3379 for(int j = 0; j < collectionmetadata_list.size (); j++) {
3380 Element collectionmetadata = (Element)collectionmetadata_list.get (j);
3381
3382 Element displayItem = constructDisplayItem (collectionmetadata, to);
3383 level_element.appendChild (displayItem);
3384 }
3385 }
3386 search.appendChild (level_element);
3387 }
3388
3389 //Convert default level
3390 Element default_index_option = XMLTools.getNamedElement (source,
3391 StaticStrings.INDEXOPTION_DEFAULT_ELEMENT,
3392 StaticStrings.NAME_ATTRIBUTE, StaticStrings.LEVEL_DEFAULT_STR);
3393 if (default_index_option == null) {
3394 return;
3395 }
3396 Element default_level = to.createElement (StaticStrings.LEVEL_DEFAULT_ELEMENT);
3397 String default_level_str = default_index_option.getAttribute (StaticStrings.VALUE_ATTRIBUTE);
3398 default_level.setAttribute (StaticStrings.NAME_ATTRIBUTE, default_level_str);
3399 search.appendChild (default_level);
3400
3401 }
3402 // Convert indexoptions for mg/mgpp/lucene. This method is called by convertIndex().
3403 private void convertIndexOptions (Document from, Document to, Element search) {
3404 Element source = from.getDocumentElement ();
3405 Element index_option = XMLTools.getNamedElement (source,
3406 StaticStrings.INDEXOPTIONS_ELEMENT,
3407 StaticStrings.NAME_ATTRIBUTE, StaticStrings.INDEXOPTIONS_STR);
3408 if (index_option == null) {
3409 return;
3410 }
3411 //Debugging purposes
3412 if (index_option.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) {
3413 DebugStream.println ("There should be an IndexOption element which is assigned 'true': possible bug.");
3414 }
3415 Element indexOptionEl = to.createElement(StaticStrings.INDEXOPTION_STR);
3416 NodeList option_elements = index_option.getElementsByTagName (StaticStrings.OPTION_ELEMENT);
3417 int num_elements = option_elements.getLength ();
3418 // Don't output anything if no index
3419 if(num_elements == 0) {
3420 return ;//
3421 }
3422 search.appendChild (indexOptionEl);
3423
3424 for(int k = 0; k < num_elements; k++) {
3425 Element e = (Element) option_elements.item (k);
3426 String name_att = e.getAttribute(StaticStrings.NAME_ATTRIBUTE);
3427 Element optionEl = to.createElement(StaticStrings.OPTION_STR);
3428 optionEl.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_att);
3429 indexOptionEl.appendChild(optionEl);
3430 }
3431
3432 }
3433 // Append the element son to the element mother in the appropriate position.
3434 static public void appendProperly (Element mother, Element son) {
3435 if (son == null)
3436 return;
3437
3438 Node reference_node = findInsertionPoint (mother, son);
3439 if(reference_node != null) {
3440 mother.insertBefore (son, reference_node);
3441 }
3442 else {
3443 mother.appendChild (son);
3444 }
3445 }
3446 /** 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.
3447 * @param target_element the command Element to be inserted
3448 * @return the Element which the given command should be inserted before, or null to append to end of list
3449 */
3450 static public Node findInsertionPoint (Element document_element, Element target_element) {
3451 ///ystem.err.println("Find insertion point: " + target_element.getNodeName());
3452 String target_element_name = target_element.getNodeName ();
3453
3454 // Try to find commands with the same tag.
3455 NodeList matching_elements = document_element.getElementsByTagName (target_element_name);
3456 // If we found matching elements, then we have our most likely insertion location, so check within for groupings
3457 if(matching_elements.getLength () != 0) {
3458 ///ystem.err.println("Found matching elements.");
3459 // Only CollectionMeta are grouped.
3460 if(target_element_name.equals (StaticStrings.COLLECTIONMETADATA_ELEMENT)) {
3461 ///ystem.err.println("Dealing with collection metadata");
3462 // 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.
3463 // So if the command to be added is special add it immediately after any other special command
3464 if(target_element.getAttribute (StaticStrings.SPECIAL_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
3465 int index = 0;
3466 Element matched_element = (Element) matching_elements.item (index);
3467 Element sibling_element = (Element) matched_element.getNextSibling ();
3468 while(sibling_element.getAttribute (StaticStrings.SPECIAL_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
3469 index++;
3470 matched_element = (Element) matching_elements.item (index);
3471 sibling_element = (Element) matched_element.getNextSibling ();
3472 }
3473 if(sibling_element.getNodeName ().equals (NEWLINE_ELEMENT)) {
3474 Element newline_element = document.createElement (NEWLINE_ELEMENT);
3475 document_element.insertBefore (newline_element, sibling_element);
3476 }
3477 return sibling_element;
3478 }
3479 // Otherwise try to find a matching 'name' and add after the last one in that group.
3480 else {
3481 int index = 0;
3482 target_element_name = target_element.getAttribute (StaticStrings.NAME_ATTRIBUTE);
3483 boolean found = false;
3484 // Skip all of the special metadata
3485 Element matched_element = (Element) matching_elements.item (index);
3486 while(matched_element.getAttribute (StaticStrings.SPECIAL_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) {
3487 index++;
3488 matched_element = (Element) matching_elements.item (index);
3489 }
3490 // Begin search
3491 while(!found && matched_element != null) {
3492 if(matched_element.getAttribute (StaticStrings.NAME_ATTRIBUTE).equals (target_element_name)) {
3493 found = true;
3494 }
3495 else {
3496 index++;
3497 matched_element = (Element) matching_elements.item (index);
3498 }
3499 }
3500 // If we found a match, we need to continue checking until we find the last name match.
3501 if(found) {
3502 index++;
3503 Element previous_sibling = matched_element;
3504 Element sibling_element = (Element) matching_elements.item (index);
3505 while(sibling_element != null && sibling_element.getAttribute (StaticStrings.NAME_ATTRIBUTE).equals (target_element_name)) {
3506 previous_sibling = sibling_element;
3507 index++;
3508 sibling_element = (Element) matching_elements.item (index);
3509 }
3510 // 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!
3511 return previous_sibling.getNextSibling ();
3512 }
3513 // If not found we just add after last metadata element
3514 else {
3515 Element last_element = (Element) matching_elements.item (matching_elements.getLength () - 1);
3516 return last_element.getNextSibling ();
3517 }
3518 }
3519
3520 }
3521 else {
3522 ///ystem.err.println("Not dealing with collection meta.");
3523 Element matched_element = (Element) matching_elements.item (matching_elements.getLength () - 1);
3524 // 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)
3525 Node sibling_element = matched_element.getNextSibling ();
3526 if(sibling_element != null && sibling_element.getNodeName ().equals (NEWLINE_ELEMENT)) {
3527 Element newline_element = document.createElement (NEWLINE_ELEMENT);
3528 document_element.insertBefore (newline_element, sibling_element);
3529 }
3530 return sibling_element; // Note that this may be null
3531 }
3532 }
3533 ///ystem.err.println("No matching elements found.");
3534 // Locate where this command is in the ordering
3535 int command_index = -1;
3536 for(int i = 0; command_index == -1 && i < COMMAND_ORDER.length; i++) {
3537 if(COMMAND_ORDER[i].equals (target_element_name)) {
3538 command_index = i;
3539 }
3540 }
3541 ///ystem.err.println("Command index is: " + command_index);
3542 // Now move forward, checking for existing elements in each of the preceeding command orders.
3543 int preceeding_index = command_index - 1;
3544 ///ystem.err.println("Searching before the target command.");
3545 while(preceeding_index >= 0) {
3546 matching_elements = document_element.getElementsByTagName (COMMAND_ORDER[preceeding_index]);
3547 // If we've found a match
3548 if(matching_elements.getLength () > 0) {
3549 // We add after the last element
3550 Element matched_element = (Element) matching_elements.item (matching_elements.getLength () - 1);
3551 // 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)
3552 Node sibling_element = matched_element.getNextSibling ();
3553 if(sibling_element != null && sibling_element.getNodeName ().equals (NEWLINE_ELEMENT)) {
3554 Element newline_element = document.createElement (NEWLINE_ELEMENT);
3555 document_element.insertBefore (newline_element, sibling_element);
3556 }
3557 return sibling_element; // Note that this may be null
3558 }
3559 preceeding_index--;
3560 }
3561 // If all that fails, we now move backwards through the commands
3562 int susceeding_index = command_index + 1;
3563 ///ystem.err.println("Searching after the target command.");
3564 while(susceeding_index < COMMAND_ORDER.length) {
3565 matching_elements = document_element.getElementsByTagName (COMMAND_ORDER[susceeding_index]);
3566 // If we've found a match
3567 if(matching_elements.getLength () > 0) {
3568 // We add before the first element
3569 Element matched_element = (Element) matching_elements.item (0);
3570 // 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)
3571 Node sibling_element = matched_element.getPreviousSibling ();
3572 if(sibling_element != null && sibling_element.getNodeName ().equals (NEWLINE_ELEMENT)) {
3573 Element newline_element = document.createElement (NEWLINE_ELEMENT);
3574 document_element.insertBefore (newline_element, sibling_element);
3575 }
3576 return sibling_element; // Note that this may be null
3577 }
3578 susceeding_index++;
3579 }
3580 // Well. Apparently there are no other commands in this collection configuration. So append away...
3581 return null;
3582 }
3583 // From collectionConfig.xml to internal structure:add 'ex.' namespace (if none).
3584 // From internal structure to collectionConfig.xml:always peel off 'ex.' namespace (if any), except for format statement
3585 //This method parses 'xml_file_doc' into 'dOc'
3586 public void parseCollectionConfigXML (File xml_file, Document dOc) {
3587
3588 Document xml_file_doc = XMLTools.parseXMLFile (xml_file);
3589 Element fromElement = xml_file_doc.getDocumentElement ();
3590 Element toElement = dOc.getDocumentElement ();
3591
3592 // It's deliberately set that 'creator', 'maintainer', and 'public' are only in English (as they are just names).
3593 // So the following ArrayList have only one element.
3594 Node metadataListNode = XMLTools.getChildByTagNameIndexed (fromElement, StaticStrings.METADATALIST_STR, 0);
3595 if (metadataListNode != null) {
3596 ArrayList creator = doMetadataList (dOc, metadataListNode, StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT,
3597 StaticStrings.COLLECTIONMETADATA_CREATOR_STR);
3598 ArrayList maintainer = doMetadataList (dOc, metadataListNode,
3599 StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT,
3600 StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR);
3601 ArrayList is_public = doMetadataList (dOc, metadataListNode, StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT,
3602 StaticStrings.COLLECTIONMETADATA_PUBLIC_STR);
3603
3604 appendArrayList (toElement, creator);
3605 appendArrayList (toElement, maintainer);
3606 appendArrayList (toElement, is_public);
3607 }
3608
3609 Node searchNode = XMLTools.getChildByTagNameIndexed (fromElement, StaticStrings.SEARCH_STR, 0);
3610 String buildtype_value = ((Element)searchNode).getAttribute (StaticStrings.TYPE_ATTRIBUTE);//might be mg|mgpp|lucene
3611 Element buildtype = doBuildType (dOc, buildtype_value);
3612 appendProperly (toElement, buildtype);
3613
3614
3615 Node importNode = XMLTools.getChildByTagNameIndexed (fromElement, StaticStrings.IMPORT_STR, 0);
3616 if (importNode == null) {
3617 System.out.println ("There is no content in the 'import' block.");
3618 }
3619 if (importNode != null) {
3620 //do plugin list nodes
3621 Node pluginListNode = XMLTools.getChildByTagNameIndexed ((Element)importNode, StaticStrings.PLUGINLIST_STR, 0);
3622 if (pluginListNode == null) {
3623 System.out.println ("There is no pluginlist set.");
3624 }
3625 if (pluginListNode != null) {
3626
3627 doPlugin (dOc, pluginListNode);
3628 }
3629
3630 //do the plugout element (used by building flax collections)
3631 Node plugout = XMLTools.getChildByTagNameIndexed ((Element)importNode, PLUGOUT_ELEMENT, 0);
3632 if (plugout != null) {
3633 Element to_element = XMLTools.duplicateElement (dOc, (Element)plugout, true);
3634 toElement.appendChild (to_element);
3635 }
3636 }
3637
3638 Node browseNode = XMLTools.getChildByTagNameIndexed (fromElement, StaticStrings.BROWSE_STR, 0);
3639 if (browseNode != null) {
3640 if (browseNode == null) {
3641 System.out.println ("There is no classifier.");
3642 }
3643 doClassifier (dOc, browseNode);
3644 }
3645
3646 Node displayItemListNode = XMLTools.getChildByTagNameIndexed (fromElement, StaticStrings.DISPLAYITEMLIST_STR, 0);
3647 if (displayItemListNode != null) {
3648 ArrayList description = doDisplayItemList (dOc, displayItemListNode, StaticStrings.DESCRIPTION_STR,
3649 StaticStrings.COLLECTIONMETADATA_COLLECTIONEXTRA_STR);
3650 ArrayList smallicon = doDisplayItemList (dOc, displayItemListNode, StaticStrings.SMALLICON_STR,
3651 StaticStrings.COLLECTIONMETADATA_ICONCOLLECTIONSMALL_STR);
3652 ArrayList icon = doDisplayItemList (dOc, displayItemListNode, StaticStrings.ICON_STR,
3653 StaticStrings.COLLECTIONMETADATA_ICONCOLLECTION_STR);
3654 ArrayList name = doDisplayItemList (dOc, displayItemListNode, StaticStrings.NAME_STR,
3655 StaticStrings.COLLECTIONMETADATA_COLLECTIONNAME_STR);
3656
3657 appendArrayList (toElement, description);
3658 appendArrayList (toElement, smallicon);
3659 appendArrayList (toElement, icon);
3660 appendArrayList (toElement, name);
3661 }
3662
3663 if (buildtype_value.equalsIgnoreCase ("mg")) {
3664 doMGIndexes (dOc, searchNode);
3665 }
3666 else {
3667 doMGPPIndexes (dOc, searchNode);
3668 }
3669
3670 doDefaultIndex (dOc, searchNode);
3671 //doSearchType (dOc, searchNode);
3672 doDefaultLevel (dOc, searchNode);
3673 doLevel (dOc, searchNode);
3674 doIndexOption (dOc, searchNode);
3675 doSubcollection (dOc, searchNode);
3676 doIndexSubcollection (dOc, searchNode);
3677 doIndexLanguage (dOc, searchNode);
3678 doDefaultIndexLanguage (dOc, searchNode);
3679 doLanguageMetadata (dOc, searchNode);
3680 doSearchFormat (dOc, searchNode);
3681 doDisplayFormat (dOc, fromElement);
3682 doReplaceListRef (dOc, fromElement);
3683 doOAIElement (dOc, fromElement);
3684
3685 }
3686
3687
3688 public void saveCollectionConfigXML (File collect_cfg_file, Document doc) {
3689 //In this method, the file collect_cfg_file must be 'collectionConfig.xml'
3690
3691
3692 //Compare the internal structure (doc) with the saved structure from collectionConfig.xml and see if it has changed
3693 StringBuffer collect_cfg_string_buffer = new StringBuffer (XMLTools.xmlNodeToString (doc));
3694 String collect_cfg_string = collect_cfg_string_buffer.toString ();
3695 if (saved_collect_cfg_string_buffer != null) {
3696 String saved_collect_cfg_string = saved_collect_cfg_string_buffer.toString ();
3697 if (collect_cfg_string.equals (saved_collect_cfg_string)) {
3698 DebugStream.println ("'collectionConfig.xml' file hasn't changed so no save necessary...");
3699 return;
3700 }
3701 }
3702
3703 DebugStream.println ("'collectionConfig.xml' file has changed, saving now...");
3704
3705 // If we're using the Local Library we must release the collection before writing to the collect.cfg file
3706 String collection_name = Gatherer.c_man.getCollection ().getName ();
3707 boolean collection_released = false;
3708 if (Gatherer.c_man.built () && LocalLibraryServer.isRunning () == true) {
3709 // Release the collection
3710 LocalLibraryServer.releaseCollection (collection_name);
3711 collection_released = true;
3712 }
3713
3714 // Make a backup of the collectionConfig.xml file so that the user can manully change back
3715 if (collect_cfg_file.exists ()) {
3716
3717 File original_file = new File (collect_cfg_file.getParentFile (), Utility.COLLECTION_CONFIG_XML);
3718 File backup_file = new File (collect_cfg_file.getParentFile (), Utility.COLLECTION_CONFIG_BAK);
3719 if (backup_file.exists ()) {
3720 backup_file.delete ();
3721 }
3722 if (!original_file.renameTo (backup_file)) {
3723 System.err.println ("Warning: can't rename collectionConfig.xml to collectionConfig.bak.");
3724 }
3725 }
3726
3727 Document collection_config_xml_document = convertInternalToCollectionConfig (doc);
3728 String[] nonEscapingTagNames = {StaticStrings.FORMAT_STR};
3729 XMLTools.writeXMLFile (collect_cfg_file, collection_config_xml_document, nonEscapingTagNames);
3730 saved_collect_cfg_string_buffer = collect_cfg_string_buffer;
3731
3732 // If we're using a remote Greenstone server, upload the new 'collectionConfig.xml' file
3733 if (Gatherer.isGsdlRemote) {
3734 RemoteGreenstoneServer.uploadCollectionFile (collection_name, collect_cfg_file);
3735 }
3736
3737 // Now re-add the collection to the Local Library server
3738 if (collection_released) {
3739 LocalLibraryServer.addCollection (collection_name);
3740 }
3741
3742 }
3743 public void saveIfNecessary () {
3744 if (Gatherer.GS3 == true) {
3745 saveCollectionConfigXML (collect_cfg_file, document);
3746 return;
3747 }
3748 // Convert the collection configuration XML tree to the collect.cfg version
3749 StringBuffer collect_cfg_string_buffer = new StringBuffer ();
3750 NodeList command_elements = document.getDocumentElement ().getChildNodes ();
3751 boolean just_wrote_blank_line = false; // Prevent two or more blank lines in a row
3752 for (int i = 0; i < command_elements.getLength (); i++) {
3753 Node command_node = command_elements.item (i);
3754 if (!(command_node instanceof Element)) {
3755 // We're only interested in Elements
3756 continue;
3757 }
3758 Element command_element = (Element) command_node;
3759
3760 // Handle NewLine elements (blank lines)
3761 if (command_element.getNodeName ().equals (NEWLINE_ELEMENT) && !just_wrote_blank_line) {
3762 collect_cfg_string_buffer.append ("\n");
3763 just_wrote_blank_line = true;
3764 }
3765
3766 // Anything else we write to file, but only if it has been assigned, except for index and level commands
3767 // (which just get commented out if unassigned -- a side effect of MG & MGPP compatibility)
3768 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)) {
3769 String command;
3770 if (command_element.getNodeName ().equals (StaticStrings.FORMAT_ELEMENT)) {
3771 // Format statements we write out with ex. still present
3772 command = toString (command_element, true);
3773 }
3774 else {
3775 command = toString (command_element, false);
3776 }
3777
3778 if (command != null && command.length ()> 0 ) {
3779 collect_cfg_string_buffer.append (command + "\n");
3780 just_wrote_blank_line = false;
3781 }
3782 }
3783 }
3784
3785 String collect_cfg_string = collect_cfg_string_buffer.toString ();
3786 String saved_collect_cfg_string = saved_collect_cfg_string_buffer.toString ();
3787 if (collect_cfg_string.equals (saved_collect_cfg_string)) {
3788 DebugStream.println ("Collect.cfg file hasn't changed so no save necessary...");
3789 return;
3790 }
3791
3792 DebugStream.println ("Collect.cfg file has changed, saving now...");
3793
3794 // If we're using the Local Library we must release the collection before writing to the collect.cfg file
3795 String collection_name = CollectionManager.getLoadedCollectionName ();
3796 boolean collection_released = false;
3797 if (Gatherer.c_man.built () && LocalLibraryServer.isRunning () == true) {
3798 // Release the collection
3799 LocalLibraryServer.releaseCollection (collection_name);
3800 collection_released = true;
3801 }
3802
3803 // Make a backup of the collect.cfg file
3804 if (collect_cfg_file.exists ()) {
3805 File original_file = new File (collect_cfg_file.getParentFile (), StaticStrings.COLLECT_CFG);
3806 File backup_file = new File (collect_cfg_file.getParentFile (), Utility.COLLECT_BAK);
3807 if (backup_file.exists ()) {
3808 backup_file.delete ();
3809 }
3810 if (!original_file.renameTo (backup_file)) {
3811 System.err.println ("Warning: can't rename collect.cfg to collect.bak.");
3812 }
3813 }
3814
3815 try {
3816 OutputStream ostream = new FileOutputStream (collect_cfg_file);
3817 Writer file_writer = new OutputStreamWriter (ostream, ENCODING);
3818 BufferedWriter buffered_writer = new BufferedWriter (file_writer);
3819 buffered_writer.write (collect_cfg_string);
3820 buffered_writer.close ();
3821
3822 saved_collect_cfg_string_buffer = collect_cfg_string_buffer;
3823
3824 // If we're using a remote Greenstone server, upload the new collect.cfg file
3825 if (Gatherer.isGsdlRemote) {
3826 RemoteGreenstoneServer.uploadCollectionFile (collection_name, collect_cfg_file);
3827 }
3828 }
3829 catch (Exception exception) {
3830 DebugStream.println ("Error in CollectionConfiguration.save(): " + exception);
3831 DebugStream.printStackTrace (exception);
3832 }
3833
3834 // Now re-add the collection to the Local Library server
3835 if (collection_released) {
3836 LocalLibraryServer.addCollection (collection_name);
3837 }
3838 }
3839 // This method is initilised in CollectionDesignManager.java constructor
3840 public CollectionConfiguration (File collect_cfg_file) {
3841 this.collect_cfg_file = collect_cfg_file;
3842
3843 // parse the XML template
3844 document = XMLTools.parseXMLFile ("xml/CollectionConfig.xml", true);
3845 String filename = collect_cfg_file.getName ().toLowerCase ();
3846
3847 if (filename.endsWith (".cfg")) {
3848 parse (collect_cfg_file);
3849 }
3850 if (filename.endsWith (".xml")) {
3851 parseCollectionConfigXML (collect_cfg_file, document);
3852 }
3853
3854 //XMLTools.printXMLNode(document.getDocumentElement());
3855 }
3856
3857 // Append the elements, which are of Element type, in 'list' to Element 'to'
3858 private void appendArrayList (Element to, ArrayList list) {
3859 if (list == null) return;
3860
3861 for (int i=0; i<list.size (); i++) {
3862 appendProperly (to, (Element)list.get (i));
3863 }
3864 }
3865 //Convert the internal XML DOM tree (dOc) into that of collectionConfig.xml (skeleton)
3866 public Document convertInternalToCollectionConfig (Document dOc) {
3867 //first parse an empty skeleton of xml config file
3868 //The aim is to convert the internal structure into this skeleton
3869 Document skeleton = XMLTools.parseXMLFile ("xml/CollectionConfig.xml", true);
3870 //Element internal = dOc.getDocumentElement();
3871 convertMetadataList (dOc, skeleton);
3872 convertDisplayItemList (dOc, skeleton);
3873 convertBuildType (dOc, skeleton);
3874 convertIndex (dOc, skeleton);
3875 convertPlugin (dOc, skeleton);//also do the plugout element
3876 convertClassifier (dOc, skeleton);
3877 convertSubcollectionIndexes (dOc, skeleton);
3878 convertLanguages (dOc, skeleton);
3879 convertSubcollection (dOc, skeleton);
3880 convertSearchType (dOc, skeleton);
3881 convertSearchFormat (dOc, skeleton);
3882 convertDisplayFormat (dOc, skeleton);
3883 convertReplaceListRef (dOc, skeleton);
3884 convertOAIElement(dOc, skeleton);
3885
3886 return skeleton;
3887 }
3888 ///*********************************************************************************************************///
3889}
Note: See TracBrowser for help on using the repository browser.