source: gli/branches/glicolgroup/src/org/greenstone/gatherer/cdm/CollectionConfiguration.java@ 19668

Last change on this file since 19668 was 19668, checked in by ak19, 15 years ago

Not working. Changes made for collectiongroup.

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