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

Last change on this file since 16678 was 16678, checked in by davidb, 16 years ago

Fixed oversight in GLI reading GS3 collectionConfig.xml where it didn't use the backwards-compatible mapping to rename old Plug->Plugins

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