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

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

a couple more additions to the plugin name map

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