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

Last change on this file since 13586 was 13586, checked in by mdewsnip, 17 years ago

Added a static getLoadedCollectionName() function into CollectionManager, as part of making CollectionManager fully static.

  • Property svn:keywords set to Author Date Id Revision
File size: 77.3 KB
Line 
1/**
2 *#########################################################################
3 *
4 * A component of the Gatherer application, part of the Greenstone digital
5 * library suite from the New Zealand Digital Library Project at the
6 * University of Waikato, New Zealand.
7 *
8 * Author: John Thompson, Greenstone Digital Library, University of Waikato
9 *
10 * Copyright (C) 1999 New Zealand Digital Library Project
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 *########################################################################
26 */
27package org.greenstone.gatherer.cdm;
28
29import java.awt.*;
30import java.awt.event.*;
31import java.io.*;
32import java.util.*;
33import javax.swing.*;
34import org.greenstone.gatherer.Configuration;
35import org.greenstone.gatherer.DebugStream;
36import org.greenstone.gatherer.Gatherer;
37import org.greenstone.gatherer.LocalLibraryServer;
38import org.greenstone.gatherer.collection.CollectionManager;
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.w3c.dom.*;
49
50/** 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).
51 * @author John Thompson, Greenstone Digital Library, University of Waikato
52 * @version 2.3d
53 */
54public class CollectionConfiguration
55{
56 static final private String ENCODING = "UTF-8";
57 static final private String NEWLINE_ELEMENT = "NewLine";
58
59 static private Document document;
60 static private StringBuffer saved_collect_cfg_string_buffer = null;
61
62
63 static public Element createElement(String element_name)
64 {
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 {
210 return document.getDocumentElement().getElementsByTagName(element_name);
211 }
212
213
214 static public String toString(Element command_element, boolean show_extracted_namespace) {
215 String command_element_name = command_element.getNodeName();
216 if(command_element_name.equals(StaticStrings.CLASSIFY_ELEMENT)) {
217 return classifyToString(command_element, show_extracted_namespace);
218 }
219 else if(command_element_name.equals(StaticStrings.FORMAT_ELEMENT)) {
220 return formatToString(command_element, show_extracted_namespace);
221 }
222 else if(command_element_name.equals(StaticStrings.INDEXES_ELEMENT)) {
223 return indexesToString(command_element, show_extracted_namespace);
224 }
225 else if(command_element_name.equals(StaticStrings.INDEX_DEFAULT_ELEMENT)) {
226 return indexDefaultToString(command_element, show_extracted_namespace);
227 }
228 else if(command_element_name.equals(StaticStrings.LANGUAGES_ELEMENT)) {
229 return languagesToString(command_element);
230 }
231 else if(command_element_name.equals(StaticStrings.LANGUAGE_DEFAULT_ELEMENT)) {
232 return languageDefaultToString(command_element);
233 }
234 else if (command_element_name.equals(StaticStrings.LANGUAGE_METADATA_ELEMENT)) {
235 return languageMetadataToString(command_element, show_extracted_namespace);
236 }
237 else if(command_element_name.equals(StaticStrings.INDEXOPTIONS_ELEMENT)) {
238 return indexOptionsToString(command_element);
239 }
240 else if(command_element_name.equals(StaticStrings.INDEXOPTION_DEFAULT_ELEMENT)) {
241 return indexOptionDefaultToString(command_element);
242 }
243 else if(command_element_name.equals(StaticStrings.COLLECTIONMETADATA_ELEMENT)) {
244 return metadataToString(command_element, show_extracted_namespace);
245 }
246 else if(command_element_name.equals(StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT)) {
247 return metadataToString(command_element, show_extracted_namespace);
248 }
249 else if(command_element_name.equals(StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT)) {
250 return metadataToString(command_element, show_extracted_namespace);
251 }
252 else if(command_element_name.equals(StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT)) {
253 return metadataToString(command_element, show_extracted_namespace);
254 }
255 else if (command_element_name.equals(StaticStrings.BUILDTYPE_ELEMENT)) {
256 return metadataToString(command_element, show_extracted_namespace);
257 }
258 else if(command_element_name.equals(StaticStrings.PLUGIN_ELEMENT)) {
259 return pluginToString(command_element, show_extracted_namespace);
260 }
261 else if(command_element_name.equals(StaticStrings.SUBCOLLECTION_ELEMENT)) {
262 return subcollectionToString(command_element, show_extracted_namespace);
263 }
264 else if(command_element_name.equals(StaticStrings.SUBCOLLECTION_DEFAULT_INDEX_ELEMENT)) {
265 return subcollectionDefaultIndexToString(command_element);
266 }
267 else if(command_element_name.equals(StaticStrings.SUBCOLLECTION_INDEXES_ELEMENT)) {
268 return subcollectionIndexesToString(command_element);
269 }
270 else if(command_element_name.equals(StaticStrings.SUPERCOLLECTION_ELEMENT)) {
271 return supercollectionToString(command_element);
272 }
273 else if(command_element_name.equals(StaticStrings.UNKNOWN_ELEMENT)) {
274 return unknownToString(command_element);
275 }
276 return "";
277 }
278
279 /** 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.
280 * @param tokenizer a CommandTokenizer based on the unconsumed portion of a command string
281 * @return a HashMap containing the arguments parsed
282 */
283 static public HashMap parseArguments(CommandTokenizer tokenizer) {
284 HashMap arguments = new HashMap();
285 String name = null;
286 String value = null;
287 while(tokenizer.hasMoreTokens() || name != null) {
288 // First we retrieve a name if we need one.
289 if(name == null) {
290 name = tokenizer.nextToken();
291 }
292 // Now we attempt to retrieve a value
293 if(tokenizer.hasMoreTokens()) {
294 value = tokenizer.nextToken();
295 // 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.
296 if(value.startsWith(StaticStrings.MINUS_CHARACTER)) {
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 = {StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT, StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT, StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT, StaticStrings.BUILDTYPE_ELEMENT, StaticStrings.PLUGIN_ELEMENT, StaticStrings.INDEXES_ELEMENT, StaticStrings.INDEX_DEFAULT_ELEMENT, StaticStrings.INDEXOPTIONS_ELEMENT, StaticStrings.INDEXOPTION_DEFAULT_ELEMENT, StaticStrings.LANGUAGES_ELEMENT, StaticStrings.LANGUAGE_DEFAULT_ELEMENT, StaticStrings.LANGUAGE_METADATA_ELEMENT, StaticStrings.SUBCOLLECTION_ELEMENT, StaticStrings.SUBCOLLECTION_INDEXES_ELEMENT, StaticStrings.SUBCOLLECTION_DEFAULT_INDEX_ELEMENT, StaticStrings.SUPERCOLLECTION_ELEMENT, StaticStrings.CLASSIFY_ELEMENT, StaticStrings.FORMAT_ELEMENT, StaticStrings.COLLECTIONMETADATA_ELEMENT};
317
318 /** ************************** Public Data Members ***************************/
319
320 /** ************************** Private Data Members ***************************/
321
322 private File collect_cfg_file;
323
324 /** ************************** Public Methods ***************************/
325
326 public CollectionConfiguration(File collect_cfg_file)
327 {
328 this.collect_cfg_file = collect_cfg_file;
329 // parse the XML template
330 document = XMLTools.parseXMLFile("xml/CollectionConfig.xml", true);
331 parse(collect_cfg_file);
332
333 }
334
335 /** This debug facility shows the currently loaded collect.cfg or CollectConfig.xml file as a DOM tree. */
336 public void display() {
337 JDialog dialog = new JDialog(Gatherer.g_man, "Collection Configuration", false);
338 dialog.setSize(400,400);
339 JPanel content_pane = (JPanel) dialog.getContentPane();
340 final DOMTree tree = new DOMTree(document);
341 JButton refresh_button = new GLIButton("Refresh Tree");
342 refresh_button.addActionListener(new ActionListener() {
343 public void actionPerformed(ActionEvent event) {
344 tree.setDocument(document);
345 }
346 });
347 content_pane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
348 content_pane.setLayout(new BorderLayout());
349 content_pane.add(new JScrollPane(tree), BorderLayout.CENTER);
350 content_pane.add(refresh_button, BorderLayout.SOUTH);
351 dialog.setVisible(true);
352 }
353
354
355 public Element getCreator() {
356 Element element = getOrCreateElementByTagName(StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT, null, null);
357 element.setAttribute(StaticStrings.NAME_ATTRIBUTE, StaticStrings.COLLECTIONMETADATA_CREATOR_STR);
358 element.setAttribute(StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR);
359 return element;
360 }
361
362 public Element getDocumentElement() {
363 return document.getDocumentElement();
364 }
365
366 public File getFile() {
367 return collect_cfg_file;
368 }
369
370 /** Retrieve or create the languages Element. */
371 public Element getLanguages() {
372 return getOrCreateElementByTagName(StaticStrings.LANGUAGES_ELEMENT, null, null);
373 }
374
375 public Element getLanguageMetadata() {
376 return getOrCreateElementByTagName(StaticStrings.LANGUAGE_METADATA_ELEMENT, null, null);
377 }
378
379 public Element getLevels() {
380 return getOrCreateElementByTagName(StaticStrings.INDEXOPTIONS_ELEMENT, StaticStrings.NAME_ATTRIBUTE, StaticStrings.LEVELS_STR);
381 }
382
383 public Element getLevelDefault() {
384 return getOrCreateElementByTagName(StaticStrings.INDEXOPTION_DEFAULT_ELEMENT, StaticStrings.NAME_ATTRIBUTE, StaticStrings.LEVEL_DEFAULT_STR);
385 }
386
387 public Element getStemOptions() {
388 return getOrCreateElementByTagName(StaticStrings.INDEXOPTIONS_ELEMENT, StaticStrings.NAME_ATTRIBUTE, StaticStrings.STEMOPTIONS_STR);
389 }
390
391
392 public Element getMaintainer() {
393 Element element = getOrCreateElementByTagName(StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT, null, null);
394 element.setAttribute(StaticStrings.NAME_ATTRIBUTE, StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR);
395 element.setAttribute(StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR);
396 return element;
397 }
398
399 /** 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. */
400 public Element getMGIndexes() {
401 return getOrCreateElementByTagName(StaticStrings.INDEXES_ELEMENT, StaticStrings.MGPP_ATTRIBUTE, StaticStrings.FALSE_STR);
402 }
403
404 public Element getMGPPIndexes() {
405 return getOrCreateElementByTagName(StaticStrings.INDEXES_ELEMENT, StaticStrings.MGPP_ATTRIBUTE, StaticStrings.TRUE_STR);
406 }
407
408 public Element getPublic() {
409 Element element = getOrCreateElementByTagName(StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT, null, null);
410 element.setAttribute(StaticStrings.NAME_ATTRIBUTE, StaticStrings.COLLECTIONMETADATA_PUBLIC_STR);
411 element.setAttribute(StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR);
412 return element;
413 }
414
415 public Element getBuildType() {
416 Element element = getOrCreateElementByTagName(StaticStrings.BUILDTYPE_ELEMENT, null, null);
417 element.setAttribute(StaticStrings.NAME_ATTRIBUTE, StaticStrings.BUILDTYPE_STR);
418 element.setAttribute(StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR);
419 return element;
420
421 }
422
423 /** Retrieve or create the subindexes Element. */
424 public Element getSubIndexes() {
425 return getOrCreateElementByTagName(StaticStrings.SUBCOLLECTION_INDEXES_ELEMENT, null, null);
426 }
427
428 /** Retrieve or create the supercollections Element. */
429 public Element getSuperCollection() {
430 return getOrCreateElementByTagName(StaticStrings.SUPERCOLLECTION_ELEMENT, null, null);
431 }
432
433 public boolean ready() {
434 return document != null;
435 }
436
437
438 public void saveIfNecessary()
439 {
440 // Convert the collection configuration XML tree to the collect.cfg version
441 StringBuffer collect_cfg_string_buffer = new StringBuffer();
442 NodeList command_elements = document.getDocumentElement().getChildNodes();
443 boolean just_wrote_blank_line = false; // Prevent two or more blank lines in a row
444 for (int i = 0; i < command_elements.getLength(); i++) {
445 Node command_node = command_elements.item(i);
446 if (!(command_node instanceof Element)) {
447 // We're only interested in Elements
448 continue;
449 }
450 Element command_element = (Element) command_node;
451
452 // Handle NewLine elements (blank lines)
453 if (command_element.getNodeName().equals(NEWLINE_ELEMENT) && !just_wrote_blank_line) {
454 collect_cfg_string_buffer.append("\n");
455 just_wrote_blank_line = true;
456 }
457
458 // Anything else we write to file, but only if it has been assigned, except for index and level commands
459 // (which just get commented out if unassigned -- a side effect of MG & MGPP compatibility)
460 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)) {
461 String command;
462 if (command_element.getNodeName().equals(StaticStrings.FORMAT_ELEMENT)) {
463 // Format statements we write out with ex. still present
464 command = toString(command_element, true);
465 }
466 else {
467 command = toString(command_element, false);
468 }
469
470 if (command != null && command.length()> 0 ) {
471 collect_cfg_string_buffer.append(command + "\n");
472 just_wrote_blank_line = false;
473 }
474 }
475 }
476
477 String collect_cfg_string = collect_cfg_string_buffer.toString();
478 String saved_collect_cfg_string = saved_collect_cfg_string_buffer.toString();
479 if (collect_cfg_string.equals(saved_collect_cfg_string)) {
480 DebugStream.println("Collect.cfg file hasn't changed so no save necessary...");
481 return;
482 }
483
484 DebugStream.println("Collect.cfg file has changed, saving now...");
485
486 // If we're using the Local Library we must release the collection before writing to the collect.cfg file
487 String collection_name = CollectionManager.getLoadedCollectionName();
488 boolean collection_released = false;
489 if (Gatherer.c_man.built() && LocalLibraryServer.isRunning() == true) {
490 // Release the collection
491 LocalLibraryServer.releaseCollection(collection_name);
492 collection_released = true;
493 }
494
495 // Make a backup of the collect.cfg file
496 if (collect_cfg_file.exists()) {
497 File original_file = new File(collect_cfg_file.getParentFile(), StaticStrings.COLLECT_CFG);
498 File backup_file = new File(collect_cfg_file.getParentFile(), "collect.bak");
499 if (backup_file.exists()) {
500 backup_file.delete();
501 }
502 if (!original_file.renameTo(backup_file)) {
503 System.err.println("Warning: can't rename collect.cfg to collect.bak.");
504 }
505 }
506
507 try {
508 OutputStream ostream = new FileOutputStream(collect_cfg_file);
509 Writer file_writer = new OutputStreamWriter(ostream, ENCODING);
510 BufferedWriter buffered_writer = new BufferedWriter(file_writer);
511 buffered_writer.write(collect_cfg_string);
512 buffered_writer.close();
513
514 saved_collect_cfg_string_buffer = collect_cfg_string_buffer;
515
516 // If we're using a remote Greenstone server, upload the new collect.cfg file
517 if (Gatherer.isGsdlRemote) {
518 RemoteGreenstoneServer.uploadCollectionFile(collection_name, collect_cfg_file);
519 }
520 }
521 catch (Exception exception) {
522 DebugStream.println("Error in CollectionConfiguration.save(): " + exception);
523 DebugStream.printStackTrace(exception);
524 }
525
526 // Now re-add the collection to the Local Library server
527 if (collection_released) {
528 LocalLibraryServer.addCollection(collection_name);
529 }
530 }
531
532
533 /** ************************** Private Methods ***************************/
534
535 static private String classifyToString(Element command_element, boolean show_extracted_namespace)
536 {
537 StringBuffer text = new StringBuffer(StaticStrings.CLASSIFY_STR);
538 text.append(StaticStrings.TAB_CHARACTER);
539 text.append(command_element.getAttribute(StaticStrings.TYPE_ATTRIBUTE));
540 NodeList option_elements = command_element.getElementsByTagName(StaticStrings.OPTION_ELEMENT);
541 int option_elements_length = option_elements.getLength();
542 for(int j = 0; j < option_elements_length; j++) {
543 Element option_element = (Element) option_elements.item(j);
544 if(option_element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.TRUE_STR)) {
545 text.append(StaticStrings.SPACE_CHARACTER);
546 text.append(StaticStrings.MINUS_CHARACTER);
547 text.append(option_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
548 String value_str = XMLTools.getValue(option_element);
549
550 // Convert metadata element names to internal names, and remove extracted metadata namespaces
551 if (value_str.length() > 0) {
552 StringTokenizer string_tokenizer = new StringTokenizer(value_str, ",");
553 StringBuffer value_buffer = new StringBuffer();
554 while (string_tokenizer.hasMoreElements()) {
555 String raw_token = (String) string_tokenizer.nextElement();
556 String token = raw_token.trim();
557 MetadataElement metadata_element = MetadataTools.getMetadataElementWithDisplayName(token);
558 if (metadata_element != null) {
559 token = metadata_element.getFullName();
560 }
561
562 if (token.startsWith(StaticStrings.EXTRACTED_NAMESPACE)) {
563 token = token.substring(StaticStrings.EXTRACTED_NAMESPACE.length());
564 }
565 value_buffer.append(token);
566 if (string_tokenizer.hasMoreElements()) {
567 value_buffer.append(",");
568 }
569 }
570 value_str = value_buffer.toString();
571 }
572
573 text.append(StaticStrings.SPACE_CHARACTER);
574 if (value_str.indexOf(StaticStrings.SPACE_CHARACTER) == -1) {
575 text.append(value_str);
576 }
577 else {
578 text.append(StaticStrings.SPEECH_CHARACTER);
579 text.append(value_str);
580 text.append(StaticStrings.SPEECH_CHARACTER);
581 }
582 value_str = null;
583 }
584 option_element = null;
585 }
586 option_elements = null;
587 return text.toString();
588 }
589
590 static private String formatToString(Element command_element, boolean show_extracted_namespace) {
591 StringBuffer text = new StringBuffer(StaticStrings.FORMAT_STR);
592 text.append(StaticStrings.SPACE_CHARACTER);
593 text.append(command_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
594 text.append(StaticStrings.SPACE_CHARACTER);
595 String value_str = command_element.getAttribute(StaticStrings.VALUE_ATTRIBUTE);
596 if(value_str.length() != 0) {
597 text.append(value_str);
598 }
599 else {
600 // Remember to encode format string to Greenstone specification
601 value_str = Codec.transform(XMLTools.getValue(command_element), Codec.DOM_TO_GREENSTONE);
602 // Remove any references to a namespace for extracted metadata
603 if (!show_extracted_namespace) {
604 String match_string = "\\[" + MetadataSetManager.EXTRACTED_METADATA_NAMESPACE + "\\.";
605 value_str = value_str.replaceAll(match_string, "[");
606 }
607
608 text.append(StaticStrings.SPEECH_CHARACTER);
609 text.append(value_str);
610 text.append(StaticStrings.SPEECH_CHARACTER);
611 }
612 value_str = null;
613 return text.toString();
614 }
615
616 /** Retrieve or create the indexes Element. */
617 static private Element getOrCreateElementByTagName(String name, String conditional_attribute, String required_value) {
618 Element document_element = document.getDocumentElement();
619 NodeList elements = document_element.getElementsByTagName(name);
620 int elements_length = elements.getLength();
621 if(elements_length > 0) {
622 if(conditional_attribute == null) {
623 document_element = null;
624 return (Element) elements.item(0);
625 }
626 else {
627 for(int i = 0; i < elements_length; i++) {
628 Element element = (Element) elements.item(i);
629 if(element.getAttribute(conditional_attribute).equals(required_value)) {
630 document_element = null;
631 return element;
632 }
633 element = null;
634 }
635 }
636 }
637 // Create the element
638 Element element = document.createElement(name);
639 // If there was a property set it
640 if(conditional_attribute != null) {
641 element.setAttribute(conditional_attribute, required_value);
642 }
643 Node target_node = findInsertionPoint(element);
644 if(target_node != null) {
645 document_element.insertBefore(element, target_node);
646 }
647 else {
648 document_element.appendChild(element);
649 }
650 document_element = null;
651 return element;
652 }
653
654 static private String indexesToString(Element command_element, boolean show_extracted_namespace) {
655 boolean comment_only = false;
656 StringBuffer text = new StringBuffer("");
657 if(command_element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) {
658 text.append("#");
659 comment_only = true;
660 }
661 text.append(StaticStrings.INDEX_STR);
662 text.append(StaticStrings.TAB_CHARACTER);
663 if(!comment_only) {
664 text.append(StaticStrings.TAB_CHARACTER);
665 }
666 NodeList index_elements = command_element.getElementsByTagName(StaticStrings.INDEX_ELEMENT);
667 if (index_elements.getLength() == 0) { // no indexes
668 return "";
669 }
670 // For each index, write its level, a colon, then concatenate its child content elements into a single comma separated list
671 int index_elements_length = index_elements.getLength();
672 for(int j = 0; j < index_elements_length; j++) {
673 Element index_element = (Element) index_elements.item(j);
674 String level_str = index_element.getAttribute(StaticStrings.LEVEL_ATTRIBUTE);
675 if(level_str.length() > 0) {
676 text.append(level_str);
677 text.append(StaticStrings.COLON_CHARACTER);
678 }
679 NodeList content_elements = index_element.getElementsByTagName(StaticStrings.CONTENT_ELEMENT);
680 int content_elements_length = content_elements.getLength();
681 // Don't output anything if no indexes are set
682 if(content_elements_length == 0) {
683 return null;
684 }
685 for(int k = 0; k < content_elements_length; k++) {
686 Element content_element = (Element) content_elements.item(k);
687 String name_str = content_element.getAttribute(StaticStrings.NAME_ATTRIBUTE);
688 if(!show_extracted_namespace && name_str.startsWith(StaticStrings.EXTRACTED_NAMESPACE)) {
689 name_str = name_str.substring(StaticStrings.EXTRACTED_NAMESPACE.length());
690 }
691 text.append(name_str);
692 name_str = null;
693 if(k < content_elements_length - 1) {
694 text.append(StaticStrings.COMMA_CHARACTER);
695 }
696 content_element = null;
697 }
698 if(j < index_elements_length - 1) {
699 text.append(StaticStrings.SPACE_CHARACTER);
700 }
701 content_elements = null;
702 index_element = null;
703 }
704 index_elements = null;
705 return text.toString();
706 }
707
708 static private String indexDefaultToString(Element command_element, boolean show_extracted_namespace) {
709 StringBuffer text = new StringBuffer("");
710 if(command_element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) {
711 text.append("#");
712 }
713 text.append(StaticStrings.INDEX_DEFAULT_STR);
714 text.append(StaticStrings.TAB_CHARACTER);
715 if (!command_element.getAttribute(StaticStrings.LEVEL_ATTRIBUTE).equals("")) {
716 text.append(command_element.getAttribute(StaticStrings.LEVEL_ATTRIBUTE));
717 text.append(StaticStrings.COLON_CHARACTER);
718 }
719 NodeList content_elements = command_element.getElementsByTagName(StaticStrings.CONTENT_ELEMENT);
720 int content_elements_length = content_elements.getLength();
721 for(int j = 0; j < content_elements_length; j++) {
722 Element content_element = (Element) content_elements.item(j);
723 String name_str = content_element.getAttribute(StaticStrings.NAME_ATTRIBUTE);
724 if(!show_extracted_namespace && name_str.startsWith(StaticStrings.EXTRACTED_NAMESPACE)) {
725 name_str = name_str.substring(StaticStrings.EXTRACTED_NAMESPACE.length());
726 }
727 text.append(name_str);
728 name_str = null;
729 if(j < content_elements_length - 1) {
730 text.append(StaticStrings.COMMA_CHARACTER);
731 }
732 content_element = null;
733 }
734 content_elements = null;
735 return text.toString();
736 }
737
738 static private String languagesToString(Element command_element) {
739 StringBuffer text = new StringBuffer(StaticStrings.LANGUAGES_STR);
740 text.append(StaticStrings.TAB_CHARACTER);
741 // Retrieve all the languages and write them out in a space separated list
742 NodeList language_elements = command_element.getElementsByTagName(StaticStrings.LANGUAGE_ELEMENT);
743 int language_elements_length = language_elements.getLength();
744 if(language_elements_length == 0) {
745 return null;
746 }
747 for(int j = 0; j < language_elements_length; j++) {
748 Element language_element = (Element) language_elements.item(j);
749 text.append(language_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
750 if(j < language_elements_length - 1) {
751 text.append(StaticStrings.SPACE_CHARACTER);
752 }
753 }
754 return text.toString();
755 }
756
757 static private String languageDefaultToString(Element command_element) {
758 StringBuffer text = new StringBuffer(StaticStrings.LANGUAGE_DEFAULT_STR);
759 text.append(StaticStrings.TAB_CHARACTER);
760 text.append(command_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
761 return text.toString();
762 }
763
764 static private String languageMetadataToString(Element command_element, boolean show_extracted_namespace) {
765 if (!command_element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.TRUE_STR)) {
766 return "";
767 }
768 StringBuffer text = new StringBuffer(StaticStrings.LANGUAGE_METADATA_STR);
769 text.append(StaticStrings.TAB_CHARACTER);
770 String name_str = command_element.getAttribute(StaticStrings.NAME_ATTRIBUTE);
771 if(!show_extracted_namespace && name_str.startsWith(StaticStrings.EXTRACTED_NAMESPACE)) {
772 name_str = name_str.substring(StaticStrings.EXTRACTED_NAMESPACE.length());
773 }
774 text.append(name_str);
775 return text.toString();
776 }
777
778 static private String indexOptionsToString(Element command_element) {
779 StringBuffer text = new StringBuffer("");
780 if(command_element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) {
781 text.append("#");
782 }
783 text.append(command_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
784 text.append(StaticStrings.TAB_CHARACTER);
785 NodeList content_elements = command_element.getElementsByTagName(StaticStrings.INDEXOPTION_ELEMENT);
786 int content_elements_length = content_elements.getLength();
787 // Don't output anything if no options are set.
788 if(content_elements_length == 0) {
789 return null;
790 }
791 for(int i = 0; i < content_elements_length; i++) {
792 Element content_element = (Element) content_elements.item(i);
793 text.append(content_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
794 text.append(StaticStrings.SPACE_CHARACTER);
795 }
796 return text.substring(0, text.length() - 1);
797 }
798
799 static private String indexOptionDefaultToString(Element command_element) {
800 // Don't bother if there is no value
801 if (command_element.getAttribute(StaticStrings.VALUE_ATTRIBUTE).equals("")) {
802 return "";
803 }
804 StringBuffer text = new StringBuffer("");
805 if(command_element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) {
806 text.append("#");
807 }
808 text.append(command_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
809 text.append(StaticStrings.TAB_CHARACTER);
810 text.append(command_element.getAttribute(StaticStrings.VALUE_ATTRIBUTE));
811 return text.toString();
812 }
813
814 static private String metadataToString(Element command_element, boolean text_value) {
815 // lets first check the value - if its empty, don't bother sticking it in the config file
816 String value_str = XMLTools.getValue(command_element);
817 if (value_str.equals("")) {
818 return "";
819 }
820 boolean special = false;
821
822 StringBuffer text = new StringBuffer("");
823 String name_str = command_element.getAttribute(StaticStrings.NAME_ATTRIBUTE);
824 // 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.
825 if(name_str.equals(StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR)|| name_str.equals(StaticStrings.BUILDTYPE_STR) ) {
826 text.append(name_str);
827 text.append(StaticStrings.TAB_CHARACTER);
828 special = true;
829 }
830 else if (name_str.equals(StaticStrings.COLLECTIONMETADATA_CREATOR_STR) || name_str.equals(StaticStrings.COLLECTIONMETADATA_PUBLIC_STR) ) {
831 text.append(name_str);
832 text.append(StaticStrings.TAB_CHARACTER);
833 text.append(StaticStrings.TAB_CHARACTER);
834 special = true;
835 }
836 else {
837 text.append(StaticStrings.COLLECTIONMETADATA_STR);
838 text.append(StaticStrings.TAB_CHARACTER);
839 text.append(name_str);
840 text.append(StaticStrings.SPACE_CHARACTER);
841 String language_str = command_element.getAttribute(StaticStrings.LANGUAGE_ATTRIBUTE);
842 text.append(StaticStrings.LBRACKET_CHARACTER);
843 text.append(StaticStrings.LANGUAGE_ARGUMENT);
844 text.append(language_str);
845 text.append(StaticStrings.RBRACKET_CHARACTER);
846 text.append(StaticStrings.SPACE_CHARACTER);
847 }
848 name_str = null;
849
850 // 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
851 if(text_value == CollectionMeta.TEXT) {
852 value_str = Codec.transform(value_str, Codec.DOM_TO_TEXT);
853 }
854 else {
855 value_str = Codec.transform(value_str, Codec.DOM_TO_GREENSTONE);
856 }
857
858 // We don't wrap the email addresses in quotes, nor the other special metadata
859 if(special) {
860 text.append(value_str);
861 }
862 else {
863 text.append(StaticStrings.SPEECH_CHARACTER);
864 text.append(value_str);
865 text.append(StaticStrings.SPEECH_CHARACTER);
866 }
867 value_str = null;
868 return text.toString();
869 }
870
871 /** Parse a collect.cfg into a DOM model representation.
872 * note we are ignoring 2.39 compatibility now. */
873 private void parse(File collect_cfg_file) {
874 // hack for pre 2.71 compatibility - we need to add in a
875 // build type if there is not one there
876 boolean search_types_parsed = false;
877 boolean build_types_parsed = false;
878 try {
879 saved_collect_cfg_string_buffer = new StringBuffer();
880
881 Element collect_cfg_element = document.getDocumentElement();
882 // Read in the file one command at a time.
883 InputStream istream = new FileInputStream(collect_cfg_file);
884 Reader in_reader = new InputStreamReader(istream, ENCODING);
885 BufferedReader in = new BufferedReader(in_reader);
886 String command_str = null;
887 while((command_str = in.readLine()) != null) {
888 saved_collect_cfg_string_buffer.append(command_str + "\n");
889
890 boolean append_element = true;
891 Element command_element = null;
892 // A command may be broken over several lines.
893 command_str = command_str.trim();
894 boolean eof = false;
895 while(!eof && command_str.endsWith(StaticStrings.NEWLINE_CHARACTER)) {
896 String next_line = in.readLine();
897 if(next_line != null) {
898 next_line = next_line.trim();
899 if(next_line.length() > 0) {
900 // Remove the new line character
901 command_str = command_str.substring(0, command_str.lastIndexOf(StaticStrings.NEWLINE_CHARACTER));
902 // And append the next line, which due to the test above must be non-zero length
903 command_str = command_str + next_line;
904 }
905 next_line = null;
906 }
907 // If we've reached the end of the file theres nothing more we can do
908 else {
909 eof = true;
910 }
911 }
912 // If there is still a new line character, then we remove it and hope for the best
913 if(command_str.endsWith(StaticStrings.NEWLINE_CHARACTER)) {
914 command_str = command_str.substring(0, command_str.lastIndexOf(StaticStrings.NEWLINE_CHARACTER));
915 }
916 // Now we've either got a command to parse...
917 if(command_str.length() != 0) {
918 // Start trying to figure out what it is
919 //StringTokenizer tokenizer = new StringTokenizer(command_str);
920 // 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.
921 CommandTokenizer tokenizer = new CommandTokenizer(command_str, in);
922 String command_type = tokenizer.nextToken().toLowerCase();
923 // 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
924 if(command_element == null && command_type.equals(StaticStrings.CLASSIFY_STR)) {
925 command_element = parseClassify(command_str);
926 }
927 if(command_element == null && command_type.equals(StaticStrings.FORMAT_STR)) {
928 command_element = parseFormat(tokenizer); // Revised to handle multiple lines
929 }
930 if(command_element == null && (command_type.equals(StaticStrings.INDEX_STR) || command_type.equals(StaticStrings.COMMENTED_INDEXES_STR))) {
931 command_element = parseIndex(command_str);
932 }
933 if(command_element == null && (command_type.equals(StaticStrings.INDEX_DEFAULT_STR) || command_type.equals(StaticStrings.COMMENTED_INDEX_DEFAULT_STR))) {
934
935 command_element = parseIndexDefault(command_str);
936 }
937 if(command_element == null && command_type.equals(StaticStrings.LANGUAGES_STR)) {
938 command_element = parseLanguage(command_str);
939 }
940 if(command_element == null && command_type.equals(StaticStrings.LANGUAGE_DEFAULT_STR)) {
941 command_element = parseLanguageDefault(command_str);
942 }
943 if (command_element == null && command_type.equals(StaticStrings.LANGUAGE_METADATA_STR)) {
944 command_element = parseLanguageMetadata(command_str);
945 }
946 if(command_element == null && command_type.equals(StaticStrings.LEVELS_STR)) {
947 command_element = parseIndexOptions(command_str, StaticStrings.LEVELS_STR, true);
948 }
949 if (command_element == null && command_type.equals(StaticStrings.COMMENTED_LEVELS_STR)) {
950 command_element = parseIndexOptions(command_str, StaticStrings.LEVELS_STR, false);
951 }
952 if(command_element == null && command_type.equals(StaticStrings.LEVEL_DEFAULT_STR)) {
953 command_element = parseIndexOptionDefault(command_str, StaticStrings.LEVEL_DEFAULT_STR, true);
954 }
955 if(command_element == null && command_type.equals(StaticStrings.COMMENTED_LEVEL_DEFAULT_STR)) {
956 command_element = parseIndexOptionDefault(command_str, StaticStrings.LEVEL_DEFAULT_STR, false);
957 }
958 if (command_element == null && command_type.equals(StaticStrings.STEMOPTIONS_STR)) {
959 command_element = parseIndexOptions(command_str, StaticStrings.STEMOPTIONS_STR, true);
960 }
961 if (command_element == null && command_type.equals(StaticStrings.COMMENTED_STEMOPTIONS_STR)) {
962 command_element = parseIndexOptions(command_str, StaticStrings.STEMOPTIONS_STR, false);
963 }
964 if(command_element == null && command_type.equals(StaticStrings.COLLECTIONMETADATA_STR)) {
965 command_element = parseMetadata(tokenizer); // Revised to handle multiple lines
966 }
967 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))) {
968 command_element = parseMetadataSpecial(command_str);
969 // pre 2.71 hack
970 if (command_type.equals(StaticStrings.BUILDTYPE_STR)) {
971 build_types_parsed = true;
972 }
973 }
974 if(command_element == null && command_type.equals(StaticStrings.PLUGIN_STR)) {
975 command_element = parsePlugin(command_str);
976 }
977 // leave here for backwards compatibility
978 if(command_element == null && command_type.equals(StaticStrings.SEARCHTYPE_STR)) {
979 command_element = parseSearchType(command_str);
980 // pre 2.71 hack
981 search_types_parsed = true;
982
983 }
984 if(command_element == null && command_type.equals(StaticStrings.SUBCOLLECTION_STR)) {
985 command_element = parseSubCollection(command_str);
986 }
987 if(command_element == null && command_type.equals(StaticStrings.SUBCOLLECTION_DEFAULT_INDEX_STR)) {
988 command_element = parseSubCollectionDefaultIndex(command_str);
989 }
990 if(command_element == null && command_type.equals(StaticStrings.SUBCOLLECTION_INDEX_STR)) {
991 command_element = parseSubCollectionIndex(command_str);
992 }
993 if(command_element == null && (command_type.equals(StaticStrings.SUPERCOLLECTION_STR) || command_type.equals(StaticStrings.CCS_STR))) {
994 command_element = parseSuperCollection(command_str);
995 }
996 // Doesn't match any known type
997 command_type = null;
998 if(command_element == null) {
999 // No-one knows what to do with this command, so we create an Unknown command element
1000 command_element = document.createElement(StaticStrings.UNKNOWN_ELEMENT);
1001 XMLTools.setValue(command_element, command_str);
1002 }
1003 }
1004 // Or an empty line to remember for later
1005 else {
1006 command_element = document.createElement(NEWLINE_ELEMENT);
1007 }
1008 // 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
1009 //if(append_element) {
1010 collect_cfg_element.appendChild(command_element);
1011 //}
1012 }
1013 if (!build_types_parsed) {
1014 String buildtype_type = BuildTypeManager.BUILD_TYPE_MG;
1015 if (search_types_parsed) {
1016 buildtype_type = BuildTypeManager.BUILD_TYPE_MGPP;
1017 }
1018 Element command_element = parseMetadataSpecial(StaticStrings.BUILDTYPE_STR+" "+buildtype_type);
1019 Node target_node = findInsertionPoint(command_element);
1020 if(target_node != null) {
1021 collect_cfg_element.insertBefore(command_element, target_node);
1022 }
1023 else {
1024 collect_cfg_element.appendChild(command_element);
1025 }
1026
1027 }
1028 }
1029 catch(Exception exception) {
1030 DebugStream.println("Error in CollectionConfiguration.parse(java.io.File): " + exception);
1031 DebugStream.printStackTrace(exception);
1032 }
1033 }
1034
1035
1036 private Element parseClassify(String command_str) {
1037 Element command_element = null;
1038 try {
1039 CommandTokenizer tokenizer = new CommandTokenizer(command_str);
1040 // 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).
1041 if(tokenizer.countTokens() >= 2) { // Must support "classify Phind" (no args)
1042 command_element = document.createElement(StaticStrings.CLASSIFY_ELEMENT);
1043 // First token is classify
1044 tokenizer.nextToken();
1045 // The next token is the classifier type
1046 command_element.setAttribute(StaticStrings.TYPE_ATTRIBUTE, tokenizer.nextToken());
1047 // Now we parse out the remaining arguments into a hashmapping from name to value
1048 HashMap arguments = parseArguments(tokenizer);
1049 // Assign the arguments as Option elements, but watch out for the metadata argument as we treat that differently
1050 Iterator names = arguments.keySet().iterator();
1051 while(names.hasNext()) {
1052 String name = (String) names.next();
1053 String value = (String) arguments.get(name); // Can be null
1054 // The metadata argument gets added as the content attribute
1055 if (name.equals(StaticStrings.METADATA_ARGUMENT) && value != null) {
1056 // Add the extracted namespace onto un-namespaced metadata names
1057 StringTokenizer string_tokenizer = new StringTokenizer(value, ",");
1058 value = "";
1059 while (string_tokenizer.hasMoreElements()) {
1060 String token = (String) string_tokenizer.nextElement();
1061
1062 if (token.indexOf(StaticStrings.NS_SEP) == -1) {
1063 token = StaticStrings.EXTRACTED_NAMESPACE + token;
1064 }
1065 else {
1066 MetadataElement metadata_element = MetadataTools.getMetadataElementWithName(token);
1067 if (metadata_element != null) {
1068 token = metadata_element.getDisplayName();
1069 }
1070 }
1071
1072 if (!value.equals("")) {
1073 value = value + ",";
1074 }
1075 value = value + token;
1076 }
1077 }
1078 // Everything else is an Option Element
1079 Element option_element = document.createElement(StaticStrings.OPTION_ELEMENT);
1080 option_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name.substring(1));
1081 if(value != null) {
1082 // Remove any speech marks appended in strings containing whitespace
1083 if(value.startsWith(StaticStrings.SPEECH_CHARACTER) && value.endsWith(StaticStrings.SPEECH_CHARACTER)) {
1084 value = value.substring(1, value.length() - 1);
1085 }
1086 XMLTools.setValue(option_element, value);
1087 }
1088 option_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1089 command_element.appendChild(option_element);
1090 option_element = null;
1091 name = null;
1092 value = null;
1093 }
1094 names = null;
1095 arguments = null;
1096 }
1097 tokenizer = null;
1098 }
1099 catch(Exception error) {
1100 }
1101 return command_element;
1102 }
1103
1104 private Element parseFormat(CommandTokenizer tokenizer) {
1105 Element command_element = null;
1106 try {
1107 command_element = document.createElement(StaticStrings.FORMAT_ELEMENT);
1108 String name_str = tokenizer.nextToken();
1109 String value_str = tokenizer.nextToken();
1110 if(name_str != null && value_str != null) {
1111 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_str);
1112 // If the value is true or false we add it as an attribute
1113 if(value_str.equalsIgnoreCase(StaticStrings.TRUE_STR) || value_str.equalsIgnoreCase(StaticStrings.FALSE_STR)) {
1114 command_element.setAttribute(StaticStrings.VALUE_ATTRIBUTE, value_str.toLowerCase());
1115 }
1116 // Otherwise it gets added as a text node
1117 else {
1118 // Ready the value str (which can contain all sorts of funky characters) for writing as a DOM value
1119 value_str = Codec.transform(value_str, Codec.GREENSTONE_TO_DOM);
1120 XMLTools.setValue(command_element, value_str);
1121 }
1122 }
1123 else {
1124 command_element = null;
1125 }
1126 name_str = null;
1127 value_str = null;
1128 }
1129 catch (Exception exception) {
1130 DebugStream.printStackTrace(exception);
1131 command_element = null;
1132 }
1133 return command_element;
1134 }
1135
1136 private Element parseIndex(String command_str) {
1137 Element command_element = null;
1138 try {
1139 StringTokenizer tokenizer = new StringTokenizer(command_str);
1140 String command = tokenizer.nextToken();
1141 command_element = document.createElement(StaticStrings.INDEXES_ELEMENT);
1142 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, (command.equals(StaticStrings.INDEX_STR) ? StaticStrings.TRUE_STR : StaticStrings.FALSE_STR));
1143 command = null;
1144 if(!tokenizer.hasMoreTokens()) {
1145
1146 // there are no indexes
1147 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR);
1148 command_element.setAttribute(StaticStrings.MGPP_ATTRIBUTE, StaticStrings.FALSE_STR); // for now
1149 tokenizer = null;
1150 return command_element;
1151 }
1152
1153 while(tokenizer.hasMoreTokens()) {
1154 Element index_element = document.createElement(StaticStrings.INDEX_ELEMENT);
1155 String index_str = tokenizer.nextToken();
1156 // 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.
1157 boolean old_index;
1158 if(index_str.indexOf(StaticStrings.COLON_CHARACTER) != -1) {
1159 old_index = true;
1160 index_element.setAttribute(StaticStrings.LEVEL_ATTRIBUTE, index_str.substring(0, index_str.indexOf(StaticStrings.COLON_CHARACTER)));
1161 index_str = index_str.substring(index_str.indexOf(StaticStrings.COLON_CHARACTER) + 1);
1162 command_element.setAttribute(StaticStrings.MGPP_ATTRIBUTE, StaticStrings.FALSE_STR);
1163 }
1164 else {
1165 command_element.setAttribute(StaticStrings.MGPP_ATTRIBUTE, StaticStrings.TRUE_STR);
1166 old_index = false;
1167 }
1168 StringTokenizer content_tokenizer = new StringTokenizer(index_str, StaticStrings.COMMA_CHARACTER);
1169 while(content_tokenizer.hasMoreTokens()) {
1170 Element content_element = document.createElement(StaticStrings.CONTENT_ELEMENT);
1171 String content_str = content_tokenizer.nextToken();
1172 // 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.
1173 if(content_str.indexOf(StaticStrings.NS_SEP) == -1) {
1174 if(content_str.equals(StaticStrings.TEXT_STR) || (!old_index && content_str.equals(StaticStrings.ALLFIELDS_STR))) {
1175 // Our special strings are OK.
1176 }
1177 else {
1178 content_str = StaticStrings.EXTRACTED_NAMESPACE + content_str;
1179 }
1180 }
1181 content_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, content_str);
1182 index_element.appendChild(content_element);
1183 content_element = null;
1184 }
1185 content_tokenizer = null;
1186 index_str = null;
1187 command_element.appendChild(index_element);
1188 index_element = null;
1189 }
1190 tokenizer = null;
1191 }
1192 catch (Exception exception) {
1193 exception.printStackTrace();
1194 }
1195 return command_element;
1196 }
1197
1198 private Element parseIndexDefault(String command_str) {
1199 Element command_element = null;
1200 try {
1201 StringTokenizer tokenizer = new StringTokenizer(command_str);
1202 if(tokenizer.countTokens() >= 2) {
1203 command_element = document.createElement(StaticStrings.INDEX_DEFAULT_ELEMENT);
1204 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, ((tokenizer.nextToken()).equals(StaticStrings.INDEX_DEFAULT_STR) ? StaticStrings.TRUE_STR : StaticStrings.FALSE_STR));
1205 String index_str = tokenizer.nextToken();
1206 String level="";
1207 if (index_str.indexOf(StaticStrings.COLON_CHARACTER) !=-1){
1208 level = index_str.substring(0, index_str.indexOf(StaticStrings.COLON_CHARACTER));
1209 }
1210
1211 command_element.setAttribute(StaticStrings.LEVEL_ATTRIBUTE,level);
1212
1213 String content_str = index_str;
1214
1215 if (index_str.indexOf(StaticStrings.COLON_CHARACTER) !=-1){
1216 content_str = index_str.substring(index_str.indexOf(StaticStrings.COLON_CHARACTER) + 1);
1217 }
1218
1219 StringTokenizer content_tokenizer = new StringTokenizer(content_str, StaticStrings.COMMA_CHARACTER);
1220 while(content_tokenizer.hasMoreTokens()) {
1221 Element content_element = document.createElement(StaticStrings.CONTENT_ELEMENT);
1222 content_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, content_tokenizer.nextToken());
1223 command_element.appendChild(content_element);
1224 content_element = null;
1225 }
1226 content_tokenizer = null;
1227 content_str = null;
1228 content_str = null;
1229 index_str = null;
1230 }
1231 tokenizer = null;
1232 }
1233 catch (Exception exception) {
1234 }
1235 return command_element;
1236 }
1237
1238 private Element parseLanguage(String command_str) {
1239 Element command_element = null;
1240 try {
1241 StringTokenizer tokenizer = new StringTokenizer(command_str);
1242 tokenizer.nextToken();
1243 if(tokenizer.hasMoreTokens()) {
1244 command_element = document.createElement(StaticStrings.LANGUAGES_ELEMENT);
1245 while(tokenizer.hasMoreTokens()) {
1246 Element language_element = document.createElement(StaticStrings.LANGUAGE_ELEMENT);
1247 language_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, tokenizer.nextToken());
1248 command_element.appendChild(language_element);
1249 language_element = null;
1250 }
1251 }
1252 tokenizer = null;
1253 }
1254 catch (Exception exception) {
1255 }
1256 return command_element;
1257 }
1258
1259 private Element parseLanguageDefault(String command_str) {
1260 Element command_element = null;
1261 try {
1262 StringTokenizer tokenizer = new StringTokenizer(command_str);
1263 if(tokenizer.countTokens() >= 2) {
1264 command_element = document.createElement(StaticStrings.LANGUAGE_DEFAULT_ELEMENT);
1265 tokenizer.nextToken();
1266 String default_language_str = tokenizer.nextToken();
1267 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, default_language_str);
1268 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1269 default_language_str = null;
1270 }
1271 tokenizer = null;
1272 }
1273 catch (Exception exception) {
1274 }
1275 return command_element;
1276 }
1277
1278 private Element parseLanguageMetadata(String command_str) {
1279 Element command_element = null;
1280 try {
1281 StringTokenizer tokenizer = new StringTokenizer(command_str);
1282 if(tokenizer.countTokens() >= 2) {
1283 command_element = document.createElement(StaticStrings.LANGUAGE_METADATA_ELEMENT);
1284 tokenizer.nextToken();
1285 String language_metadata_str = tokenizer.nextToken();
1286 if (language_metadata_str.indexOf(StaticStrings.NS_SEP) == -1) {
1287 language_metadata_str = StaticStrings.EXTRACTED_NAMESPACE + language_metadata_str;
1288 }
1289 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, language_metadata_str);
1290 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1291 language_metadata_str = null;
1292 }
1293 tokenizer = null;
1294
1295 }
1296 catch (Exception exception) {
1297 }
1298 return command_element;
1299 }
1300
1301 private Element parseIndexOptions(String command_str, String type, boolean assigned) {
1302 Element command_element = null;
1303 try {
1304 StringTokenizer tokenizer = new StringTokenizer(command_str);
1305 // First token is command type
1306 String command = tokenizer.nextToken();
1307 if(tokenizer.hasMoreTokens()) {
1308 command_element = document.createElement(StaticStrings.INDEXOPTIONS_ELEMENT);
1309 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE,type);
1310 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, (assigned ? StaticStrings.TRUE_STR : StaticStrings.FALSE_STR));
1311 while(tokenizer.hasMoreTokens()) {
1312 Element option_element = document.createElement(StaticStrings.INDEXOPTION_ELEMENT);
1313 option_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, tokenizer.nextToken());
1314 command_element.appendChild(option_element);
1315 option_element = null;
1316 }
1317 }
1318 command = null;
1319 }
1320 catch(Exception exception) {
1321 }
1322 return command_element;
1323 }
1324
1325 private Element parseIndexOptionDefault(String command_str, String type, boolean assigned) {
1326 Element command_element = null;
1327 try {
1328 StringTokenizer tokenizer = new StringTokenizer(command_str);
1329 // First token is command type
1330 String command = tokenizer.nextToken();
1331 if(tokenizer.hasMoreTokens()) {
1332 command_element = document.createElement(StaticStrings.INDEXOPTION_DEFAULT_ELEMENT);
1333 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, (assigned ? StaticStrings.TRUE_STR : StaticStrings.FALSE_STR)); // is it commented out or not?
1334 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, type);
1335 command_element.setAttribute(StaticStrings.VALUE_ATTRIBUTE, tokenizer.nextToken());
1336 }
1337
1338 tokenizer = null;
1339 }
1340 catch (Exception exception) {
1341 }
1342 return command_element;
1343 }
1344
1345 private Element parseMetadata(CommandTokenizer tokenizer) {
1346 Element command_element = null;
1347 try {
1348 command_element = document.createElement(StaticStrings.COLLECTIONMETADATA_ELEMENT);
1349 String name_str = tokenizer.nextToken();
1350 String value_str = tokenizer.nextToken();
1351 if(name_str != null && value_str != null) {
1352 String language_str = Configuration.getLanguage();
1353 // Check if the value string is actually a language string
1354 if(value_str.startsWith(StaticStrings.LBRACKET_CHARACTER) && value_str.endsWith(StaticStrings.RBRACKET_CHARACTER)) {
1355 language_str = value_str.substring(value_str.indexOf(StaticStrings.LANGUAGE_ARGUMENT) + 2, value_str.length() - 1);
1356 value_str = tokenizer.nextToken();
1357 }
1358 if(value_str != null) {
1359 // Ready the value str (which can contain all sorts of funky characters) for writing as a DOM value
1360 value_str = Codec.transform(value_str, Codec.GREENSTONE_TO_DOM);
1361 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_str);
1362 command_element.setAttribute(StaticStrings.LANGUAGE_ATTRIBUTE, language_str);
1363 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1364 XMLTools.setValue(command_element, value_str);
1365 }
1366 else {
1367 command_element = null;
1368 }
1369 language_str = null;
1370 }
1371 else {
1372 command_element = null;
1373 }
1374 name_str = null;
1375 value_str = null;
1376 }
1377 catch (Exception exception) {
1378 DebugStream.printStackTrace(exception);
1379 command_element = null;
1380 }
1381 return command_element;
1382 }
1383
1384 private Element parseMetadataSpecial(String command_str) {
1385 Element command_element = null;
1386 try {
1387 StringTokenizer tokenizer = new StringTokenizer(command_str);
1388 if(tokenizer.countTokens() >= 2) {
1389 String name_str = tokenizer.nextToken();
1390 String value_str = tokenizer.nextToken();
1391 if (name_str.equals(StaticStrings.COLLECTIONMETADATA_CREATOR_STR)) {
1392 command_element = document.createElement(StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT);
1393 }
1394 else if(name_str.equals(StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR)) {
1395 command_element = document.createElement(StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT);
1396 }
1397 else if(name_str.equals(StaticStrings.COLLECTIONMETADATA_PUBLIC_STR)) {
1398 command_element = document.createElement(StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT);
1399 }
1400 else if (name_str.equals(StaticStrings.BUILDTYPE_STR)) {
1401 command_element = document.createElement(StaticStrings.BUILDTYPE_ELEMENT);
1402 }
1403 if(command_element != null) {
1404 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_str);
1405 command_element.setAttribute(StaticStrings.LANGUAGE_ATTRIBUTE, StaticStrings.ENGLISH_LANGUAGE_STR);
1406 command_element.setAttribute(StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR);
1407 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1408 if(value_str.startsWith(StaticStrings.SPEECH_CHARACTER) && value_str.endsWith(StaticStrings.SPEECH_CHARACTER)) {
1409 value_str = value_str.substring(1, value_str.length() - 1);
1410 }
1411 XMLTools.setValue(command_element, value_str);
1412 }
1413 value_str = null;
1414 name_str = null;
1415 }
1416 tokenizer = null;
1417 }
1418 catch (Exception exception) {
1419 }
1420 return command_element;
1421 }
1422
1423 private Element parsePlugin(String command_str) {
1424 Element command_element = null;
1425 try {
1426 CommandTokenizer tokenizer = new CommandTokenizer(command_str);
1427 // 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).
1428 if(tokenizer.countTokens() >= 2) {
1429 command_element = document.createElement(StaticStrings.PLUGIN_ELEMENT);
1430 // First token is plugin
1431 tokenizer.nextToken();
1432 // The next token is the type
1433 String type = tokenizer.nextToken();
1434 command_element.setAttribute(StaticStrings.TYPE_ATTRIBUTE, type);
1435 // Now we parse out the remaining arguments into a hashmapping from name to value
1436 HashMap arguments = parseArguments(tokenizer);
1437 // Assign the arguments as Option elements, but watch out for the metadata argument as we treat that differently
1438 // also watch out for the deprecated -use_metadata_files option to RecPlug and remove it
1439 Iterator names = arguments.keySet().iterator();
1440 while(names.hasNext()) {
1441 String name = (String) names.next();
1442 String value = (String) arguments.get(name); // Can be null
1443
1444 if(type.equals(StaticStrings.RECPLUG_STR) && name.substring(1).equals(StaticStrings.USE_METADATA_FILES_ARGUMENT)) {
1445 continue; // ignore this option
1446 }
1447 Element option_element = document.createElement(StaticStrings.OPTION_ELEMENT);
1448 option_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name.substring(1));
1449 option_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1450 if(value != null) {
1451 // Remove any speech marks appended in strings containing whitespace
1452 if(value.startsWith(StaticStrings.SPEECH_CHARACTER) && value.endsWith(StaticStrings.SPEECH_CHARACTER)) {
1453 value = value.substring(1, value.length() - 1);
1454 }
1455 if(name.equals(StaticStrings.METADATA_ARGUMENT)) {
1456 // 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.
1457 if(value.indexOf(StaticStrings.NS_SEP) == -1) {
1458 value = StaticStrings.EXTRACTED_NAMESPACE + value;
1459 }
1460 }
1461 XMLTools.setValue(option_element, value);
1462 }
1463 command_element.appendChild(option_element);
1464 option_element = null;
1465 name = null;
1466 value = null;
1467 }
1468
1469 type = null;
1470 names = null;
1471 arguments = null;
1472 }
1473 tokenizer = null;
1474 }
1475 catch(Exception exception) {
1476 }
1477 return command_element;
1478 }
1479
1480 /* search types are now handled as formats - leave this here to convert in case we have an old config file */
1481 private Element parseSearchType(String command_str) {
1482 Element command_element = null;
1483 try {
1484 StringTokenizer tokenizer = new StringTokenizer(command_str);
1485 // First token is command type (searchtype)
1486 tokenizer.nextToken();
1487 if(tokenizer.hasMoreTokens()) {
1488 command_element = document.createElement(StaticStrings.FORMAT_ELEMENT);
1489 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, "SearchTypes");
1490 String value = tokenizer.nextToken();
1491 while(tokenizer.hasMoreTokens()) {
1492 value += ","+tokenizer.nextToken();
1493 }
1494 value = Codec.transform(value, Codec.GREENSTONE_TO_DOM);
1495 XMLTools.setValue(command_element, value);
1496 }
1497 }
1498 catch(Exception exception) {
1499 }
1500 return command_element;
1501 }
1502
1503 private Element parseSubCollection(String command_str) {
1504 Element command_element = null;
1505 try {
1506 CommandTokenizer tokenizer = new CommandTokenizer(command_str);
1507 if(tokenizer.countTokens() >= 3) {
1508 command_element = document.createElement(StaticStrings.SUBCOLLECTION_ELEMENT);
1509 // First token is command type
1510 tokenizer.nextToken();
1511 // Then subcollection identifier
1512 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, tokenizer.nextToken());
1513 // Then finally the pattern used to build the subcollection partition
1514 String full_pattern_str = tokenizer.nextToken();
1515 // Set inclusion/exclusion flag and remove any exclamation mark
1516 boolean exclusion = full_pattern_str.startsWith(StaticStrings.EXCLAMATION_CHARACTER);
1517 if (exclusion) {
1518 full_pattern_str = full_pattern_str.substring(1, full_pattern_str.length());
1519 command_element.setAttribute(StaticStrings.TYPE_ATTRIBUTE, StaticStrings.EXCLUDE_STR);
1520 }
1521 else {
1522 command_element.setAttribute(StaticStrings.TYPE_ATTRIBUTE, StaticStrings.INCLUDE_STR);
1523 }
1524 StringTokenizer pattern_tokenizer = new StringTokenizer(full_pattern_str, StaticStrings.SEPARATOR_CHARACTER);
1525 if(pattern_tokenizer.countTokens() >= 2) {
1526 String content_str = pattern_tokenizer.nextToken();
1527 // 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.
1528 if(!content_str.equals(StaticStrings.FILENAME_STR) && content_str.indexOf(StaticStrings.NS_SEP) == -1) {
1529 content_str = StaticStrings.EXTRACTED_NAMESPACE + content_str;
1530 }
1531 command_element.setAttribute(StaticStrings.CONTENT_ATTRIBUTE, content_str);
1532 XMLTools.setValue(command_element, pattern_tokenizer.nextToken());
1533 if(pattern_tokenizer.hasMoreTokens()) {
1534 command_element.setAttribute(StaticStrings.OPTIONS_ATTRIBUTE, pattern_tokenizer.nextToken());
1535 }
1536 }
1537 pattern_tokenizer = null;
1538 }
1539 }
1540 catch(Exception exception) {
1541 exception.printStackTrace();
1542 }
1543 return command_element;
1544 }
1545
1546 private Element parseSubCollectionDefaultIndex(String command_str) {
1547 Element command_element = null;
1548 try {
1549 StringTokenizer tokenizer = new StringTokenizer(command_str);
1550 if(tokenizer.countTokens() == 2) {
1551 command_element = document.createElement(StaticStrings.SUBCOLLECTION_DEFAULT_INDEX_ELEMENT);
1552 tokenizer.nextToken();
1553 //command_element.setAttribute(CONTENT_ATTRIBUTE, tokenizer.nextToken());
1554 String content_str = tokenizer.nextToken();
1555 StringTokenizer content_tokenizer = new StringTokenizer(content_str, StaticStrings.COMMA_CHARACTER);
1556 while(content_tokenizer.hasMoreTokens()) {
1557 Element content_element = document.createElement(StaticStrings.CONTENT_ELEMENT);
1558 content_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, content_tokenizer.nextToken());
1559 command_element.appendChild(content_element);
1560 content_element = null;
1561 }
1562 content_tokenizer = null;
1563 content_str = null;
1564 }
1565 tokenizer = null;
1566 }
1567 catch(Exception exception) {
1568 }
1569 return command_element;
1570 }
1571
1572 private Element parseSubCollectionIndex(String command_str) {
1573 Element command_element = null;
1574 try {
1575 StringTokenizer tokenizer = new StringTokenizer(command_str);
1576 tokenizer.nextToken();
1577 if(tokenizer.hasMoreTokens()) {
1578 command_element = document.createElement(StaticStrings.SUBCOLLECTION_INDEXES_ELEMENT);
1579 }
1580 while(tokenizer.hasMoreTokens()) {
1581 Element subcollectionindex_element = document.createElement(StaticStrings.INDEX_ELEMENT);
1582 //command_element.setAttribute(CONTENT_ATTRIBUTE, tokenizer.nextToken());
1583 String content_str = tokenizer.nextToken();
1584 StringTokenizer content_tokenizer = new StringTokenizer(content_str, StaticStrings.COMMA_CHARACTER);
1585 while(content_tokenizer.hasMoreTokens()) {
1586 Element content_element = document.createElement(StaticStrings.CONTENT_ELEMENT);
1587 content_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, content_tokenizer.nextToken());
1588 subcollectionindex_element.appendChild(content_element);
1589 content_element = null;
1590 }
1591 content_tokenizer = null;
1592 content_str = null;
1593 command_element.appendChild(subcollectionindex_element);
1594 subcollectionindex_element = null;
1595 }
1596 tokenizer = null;
1597 }
1598 catch (Exception exception) {
1599 }
1600 return command_element;
1601 }
1602
1603 private Element parseSuperCollection(String command_str) {
1604 Element command_element = null;
1605 try {
1606 StringTokenizer tokenizer = new StringTokenizer(command_str);
1607 if(tokenizer.countTokens() >= 3) {
1608 command_element = document.createElement(StaticStrings.SUPERCOLLECTION_ELEMENT);
1609 tokenizer.nextToken();
1610 while(tokenizer.hasMoreTokens()) {
1611 Element collection_element = document.createElement(StaticStrings.COLLECTION_ELEMENT);
1612 collection_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, tokenizer.nextToken());
1613 command_element.appendChild(collection_element);
1614 collection_element = null;
1615 }
1616 }
1617 tokenizer = null;
1618 }
1619 catch(Exception exception) {
1620 }
1621 return command_element;
1622 }
1623
1624 static private String pluginToString(Element command_element, boolean show_extracted_namespace) {
1625 StringBuffer text = new StringBuffer();
1626 if(!command_element.getAttribute(StaticStrings.SEPARATOR_ATTRIBUTE).equals(StaticStrings.TRUE_STR)) {
1627 text.append(StaticStrings.PLUGIN_STR);
1628 text.append(StaticStrings.TAB_CHARACTER);
1629 text.append(StaticStrings.TAB_CHARACTER);
1630 text.append(command_element.getAttribute(StaticStrings.TYPE_ATTRIBUTE));
1631 // Retrieve, and output, the arguments
1632 NodeList option_elements = command_element.getElementsByTagName(StaticStrings.OPTION_ELEMENT);
1633 int option_elements_length = option_elements.getLength();
1634 if(option_elements_length > 0) {
1635 for(int j = 0; j < option_elements_length; j++) {
1636 Element option_element = (Element) option_elements.item(j);
1637 if(option_element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.TRUE_STR)) {
1638 text.append(StaticStrings.SPACE_CHARACTER);
1639 text.append(StaticStrings.MINUS_CHARACTER);
1640 text.append(option_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
1641 String value_str = XMLTools.getValue(option_element);
1642 if(!show_extracted_namespace && value_str.startsWith(StaticStrings.EXTRACTED_NAMESPACE)) {
1643 value_str = value_str.substring(StaticStrings.EXTRACTED_NAMESPACE.length());
1644 }
1645 if(value_str.length() > 0) {
1646 text.append(StaticStrings.SPACE_CHARACTER);
1647 if(value_str.indexOf(StaticStrings.SPACE_CHARACTER) == -1) {
1648 text.append(value_str);
1649 }
1650 else {
1651 text.append(StaticStrings.SPEECH_CHARACTER);
1652 text.append(value_str);
1653 text.append(StaticStrings.SPEECH_CHARACTER);
1654 }
1655 }
1656 value_str = null;
1657 }
1658 option_element = null;
1659 }
1660 }
1661 option_elements = null;
1662 }
1663 return text.toString();
1664 }
1665
1666 static private String searchtypeToString(Element command_element) {
1667 if(command_element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.TRUE_STR)) {
1668 StringBuffer text = new StringBuffer(StaticStrings.SEARCHTYPE_STR);
1669 text.append(StaticStrings.TAB_CHARACTER);
1670 NodeList search_elements = command_element.getElementsByTagName(StaticStrings.CONTENT_ELEMENT);
1671 int search_elements_length = search_elements.getLength();
1672 for(int i = 0; i < search_elements_length; i++) {
1673 Element search_element = (Element) search_elements.item(i);
1674 text.append(search_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
1675 text.append(StaticStrings.SPACE_CHARACTER);
1676 }
1677 return text.substring(0, text.length() - 1);
1678 }
1679 else {
1680 return null;
1681 }
1682 }
1683
1684 static private String subcollectionToString(Element command_element, boolean show_extracted_namespace) {
1685 StringBuffer text = new StringBuffer(StaticStrings.SUBCOLLECTION_STR);
1686 text.append(StaticStrings.SPACE_CHARACTER);
1687 text.append(command_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
1688 text.append(StaticStrings.SPACE_CHARACTER);
1689 text.append(StaticStrings.TAB_CHARACTER);
1690 text.append(StaticStrings.SPEECH_CHARACTER);
1691 if(command_element.getAttribute(StaticStrings.TYPE_ATTRIBUTE).equals(StaticStrings.EXCLUDE_STR)) {
1692 text.append(StaticStrings.EXCLAMATION_CHARACTER);
1693 }
1694 String content_str = command_element.getAttribute(StaticStrings.CONTENT_ATTRIBUTE);
1695 if(!show_extracted_namespace && content_str.startsWith(StaticStrings.EXTRACTED_NAMESPACE)) {
1696 content_str = content_str.substring(StaticStrings.EXTRACTED_NAMESPACE.length());
1697 }
1698 text.append(content_str);
1699 content_str = null;
1700 text.append(StaticStrings.SEPARATOR_CHARACTER);
1701 text.append(XMLTools.getValue(command_element));
1702 text.append(StaticStrings.SEPARATOR_CHARACTER);
1703 String options_str = command_element.getAttribute(StaticStrings.OPTIONS_ATTRIBUTE);
1704 if(options_str.length() > 0) {
1705 text.append(options_str);
1706 }
1707 options_str = null;
1708 text.append(StaticStrings.SPEECH_CHARACTER);
1709 return text.toString();
1710 }
1711
1712 static private String subcollectionDefaultIndexToString(Element command_element) {
1713 StringBuffer text = new StringBuffer(StaticStrings.SUBCOLLECTION_DEFAULT_INDEX_STR);
1714 text.append(StaticStrings.TAB_CHARACTER);
1715 NodeList content_elements = command_element.getElementsByTagName(StaticStrings.CONTENT_ELEMENT);
1716 int content_elements_length = content_elements.getLength();
1717 for(int j = 0; j < content_elements_length; j++) {
1718 Element content_element = (Element) content_elements.item(j);
1719 text.append(content_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
1720 if(j < content_elements_length - 1) {
1721 text.append(StaticStrings.COMMA_CHARACTER);
1722 }
1723 }
1724 return text.toString();
1725 }
1726
1727 static private String subcollectionIndexesToString(Element command_element) {
1728 StringBuffer text = new StringBuffer(StaticStrings.SUBCOLLECTION_INDEX_STR);
1729 text.append(StaticStrings.TAB_CHARACTER);
1730 // Retrieve all of the subcollection index partitions
1731 NodeList subcollectionindex_elements = command_element.getElementsByTagName(StaticStrings.INDEX_ELEMENT);
1732 int subcollectionindex_elements_length = subcollectionindex_elements.getLength();
1733 if(subcollectionindex_elements_length == 0) {
1734 return null;
1735 }
1736 for(int j = 0; j < subcollectionindex_elements_length; j++) {
1737 Element subcollectionindex_element = (Element) subcollectionindex_elements.item(j);
1738 NodeList content_elements = subcollectionindex_element.getElementsByTagName(StaticStrings.CONTENT_ELEMENT);
1739 int content_elements_length = content_elements.getLength();
1740 for(int k = 0; k < content_elements_length; k++) {
1741 Element content_element = (Element) content_elements.item(k);
1742 text.append(content_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
1743 if(k < content_elements_length - 1) {
1744 text.append(StaticStrings.COMMA_CHARACTER);
1745 }
1746 }
1747 if(j < subcollectionindex_elements_length - 1) {
1748 text.append(StaticStrings.SPACE_CHARACTER);
1749 }
1750 }
1751 return text.toString();
1752 }
1753
1754 static private String supercollectionToString(Element command_element) {
1755 NodeList content_elements = command_element.getElementsByTagName(StaticStrings.COLLECTION_ELEMENT);
1756 int content_elements_length = content_elements.getLength();
1757 if(content_elements_length > 1) {
1758 StringBuffer text = new StringBuffer(StaticStrings.SUPERCOLLECTION_STR);
1759 text.append(StaticStrings.TAB_CHARACTER);
1760 for(int j = 0; j < content_elements_length; j++) {
1761 Element content_element = (Element) content_elements.item(j);
1762 text.append(content_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
1763 if(j < content_elements_length - 1) {
1764 text.append(StaticStrings.SPACE_CHARACTER);
1765 }
1766 }
1767 return text.toString();
1768 }
1769 return null;
1770 }
1771
1772 static private String unknownToString(Element command_element) {
1773 return XMLTools.getValue(command_element);
1774 }
1775
1776 /** 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.
1777 * @param writer the BufferedWriter to which the str will be written
1778 * @param str the String to be written
1779 */
1780 private void write(BufferedWriter writer, String str)
1781 throws IOException {
1782 writer.write(str, 0, str.length());
1783 }
1784}
Note: See TracBrowser for help on using the repository browser.