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

Last change on this file since 13182 was 13181, checked in by kjdon, 18 years ago

RecPlug option -use_metadata_files has been deprecated. When parsing plugins, instead of ensuring that this option is present, we remove it if it is.

  • Property svn:keywords set to Author Date Id Revision
File size: 77.2 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.gui.GLIButton;
39import org.greenstone.gatherer.metadata.MetadataElement;
40import org.greenstone.gatherer.metadata.MetadataSetManager;
41import org.greenstone.gatherer.metadata.MetadataTools;
42import org.greenstone.gatherer.remote.RemoteGreenstoneServer;
43import org.greenstone.gatherer.util.DOMTree;
44import org.greenstone.gatherer.util.Codec;
45import org.greenstone.gatherer.util.StaticStrings;
46import org.greenstone.gatherer.util.XMLTools;
47import org.greenstone.gatherer.util.ZipTools;
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 = Gatherer.c_man.getCollection().getName();
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 text.append(StaticStrings.TAB_CHARACTER);
786 NodeList content_elements = command_element.getElementsByTagName(StaticStrings.INDEXOPTION_ELEMENT);
787 int content_elements_length = content_elements.getLength();
788 // Don't output anything if no options are set.
789 if(content_elements_length == 0) {
790 return null;
791 }
792 for(int i = 0; i < content_elements_length; i++) {
793 Element content_element = (Element) content_elements.item(i);
794 text.append(content_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
795 text.append(StaticStrings.SPACE_CHARACTER);
796 }
797 return text.substring(0, text.length() - 1);
798 }
799
800 static private String indexOptionDefaultToString(Element command_element) {
801 StringBuffer text = new StringBuffer("");
802 if(command_element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) {
803 text.append("#");
804 }
805 text.append(command_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
806 text.append(StaticStrings.TAB_CHARACTER);
807 text.append(command_element.getAttribute(StaticStrings.VALUE_ATTRIBUTE));
808 return text.toString();
809 }
810
811 static private String metadataToString(Element command_element, boolean text_value) {
812 // lets first check the value - if its empty, don't bother sticking it in the config file
813 String value_str = XMLTools.getValue(command_element);
814 if (value_str.equals("")) {
815 return "";
816 }
817 boolean special = false;
818
819 StringBuffer text = new StringBuffer("");
820 String name_str = command_element.getAttribute(StaticStrings.NAME_ATTRIBUTE);
821 // 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.
822 if(name_str.equals(StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR)|| name_str.equals(StaticStrings.BUILDTYPE_STR) ) {
823 text.append(name_str);
824 text.append(StaticStrings.TAB_CHARACTER);
825 special = true;
826 }
827 else if (name_str.equals(StaticStrings.COLLECTIONMETADATA_CREATOR_STR) || name_str.equals(StaticStrings.COLLECTIONMETADATA_PUBLIC_STR) ) {
828 text.append(name_str);
829 text.append(StaticStrings.TAB_CHARACTER);
830 text.append(StaticStrings.TAB_CHARACTER);
831 special = true;
832 }
833 else {
834 text.append(StaticStrings.COLLECTIONMETADATA_STR);
835 text.append(StaticStrings.TAB_CHARACTER);
836 text.append(name_str);
837 text.append(StaticStrings.SPACE_CHARACTER);
838 String language_str = command_element.getAttribute(StaticStrings.LANGUAGE_ATTRIBUTE);
839 text.append(StaticStrings.LBRACKET_CHARACTER);
840 text.append(StaticStrings.LANGUAGE_ARGUMENT);
841 text.append(language_str);
842 text.append(StaticStrings.RBRACKET_CHARACTER);
843 text.append(StaticStrings.SPACE_CHARACTER);
844 }
845 name_str = null;
846
847 // 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
848 if(text_value == CollectionMeta.TEXT) {
849 value_str = Codec.transform(value_str, Codec.DOM_TO_TEXT);
850 }
851 else {
852 value_str = Codec.transform(value_str, Codec.DOM_TO_GREENSTONE);
853 }
854
855 // We don't wrap the email addresses in quotes, nor the other special metadata
856 if(special) {
857 text.append(value_str);
858 }
859 else {
860 text.append(StaticStrings.SPEECH_CHARACTER);
861 text.append(value_str);
862 text.append(StaticStrings.SPEECH_CHARACTER);
863 }
864 value_str = null;
865 return text.toString();
866 }
867
868 /** Parse a collect.cfg into a DOM model representation.
869 * note we are ignoring 2.39 compatibility now. */
870 private void parse(File collect_cfg_file) {
871 // hack for pre 2.71 compatibility - we need to add in a
872 // build type if there is not one there
873 boolean search_types_parsed = false;
874 boolean build_types_parsed = false;
875 try {
876 saved_collect_cfg_string_buffer = new StringBuffer();
877
878 Element collect_cfg_element = document.getDocumentElement();
879 // Read in the file one command at a time.
880 InputStream istream = new FileInputStream(collect_cfg_file);
881 Reader in_reader = new InputStreamReader(istream, ENCODING);
882 BufferedReader in = new BufferedReader(in_reader);
883 String command_str = null;
884 while((command_str = in.readLine()) != null) {
885 saved_collect_cfg_string_buffer.append(command_str + "\n");
886
887 boolean append_element = true;
888 Element command_element = null;
889 // A command may be broken over several lines.
890 command_str = command_str.trim();
891 boolean eof = false;
892 while(!eof && command_str.endsWith(StaticStrings.NEWLINE_CHARACTER)) {
893 String next_line = in.readLine();
894 if(next_line != null) {
895 next_line = next_line.trim();
896 if(next_line.length() > 0) {
897 // Remove the new line character
898 command_str = command_str.substring(0, command_str.lastIndexOf(StaticStrings.NEWLINE_CHARACTER));
899 // And append the next line, which due to the test above must be non-zero length
900 command_str = command_str + next_line;
901 }
902 next_line = null;
903 }
904 // If we've reached the end of the file theres nothing more we can do
905 else {
906 eof = true;
907 }
908 }
909 // If there is still a new line character, then we remove it and hope for the best
910 if(command_str.endsWith(StaticStrings.NEWLINE_CHARACTER)) {
911 command_str = command_str.substring(0, command_str.lastIndexOf(StaticStrings.NEWLINE_CHARACTER));
912 }
913 // Now we've either got a command to parse...
914 if(command_str.length() != 0) {
915 // Start trying to figure out what it is
916 //StringTokenizer tokenizer = new StringTokenizer(command_str);
917 // 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.
918 CommandTokenizer tokenizer = new CommandTokenizer(command_str, in);
919 String command_type = tokenizer.nextToken().toLowerCase();
920 // 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
921 if(command_element == null && command_type.equals(StaticStrings.CLASSIFY_STR)) {
922 command_element = parseClassify(command_str);
923 }
924 if(command_element == null && command_type.equals(StaticStrings.FORMAT_STR)) {
925 command_element = parseFormat(tokenizer); // Revised to handle multiple lines
926 }
927 if(command_element == null && (command_type.equals(StaticStrings.INDEX_STR) || command_type.equals(StaticStrings.COMMENTED_INDEXES_STR))) {
928 command_element = parseIndex(command_str);
929 }
930 if(command_element == null && (command_type.equals(StaticStrings.INDEX_DEFAULT_STR) || command_type.equals(StaticStrings.COMMENTED_INDEX_DEFAULT_STR))) {
931
932 command_element = parseIndexDefault(command_str);
933 }
934 if(command_element == null && command_type.equals(StaticStrings.LANGUAGES_STR)) {
935 command_element = parseLanguage(command_str);
936 }
937 if(command_element == null && command_type.equals(StaticStrings.LANGUAGE_DEFAULT_STR)) {
938 command_element = parseLanguageDefault(command_str);
939 }
940 if (command_element == null && command_type.equals(StaticStrings.LANGUAGE_METADATA_STR)) {
941 command_element = parseLanguageMetadata(command_str);
942 }
943 if(command_element == null && command_type.equals(StaticStrings.LEVELS_STR)) {
944 command_element = parseIndexOptions(command_str, StaticStrings.LEVELS_STR, true);
945 }
946 if (command_element == null && command_type.equals(StaticStrings.COMMENTED_LEVELS_STR)) {
947 command_element = parseIndexOptions(command_str, StaticStrings.LEVELS_STR, false);
948 }
949 if(command_element == null && command_type.equals(StaticStrings.LEVEL_DEFAULT_STR)) {
950 command_element = parseIndexOptionDefault(command_str, StaticStrings.LEVEL_DEFAULT_STR, true);
951 }
952 if(command_element == null && command_type.equals(StaticStrings.COMMENTED_LEVEL_DEFAULT_STR)) {
953
954 command_element = parseIndexOptionDefault(command_str, StaticStrings.LEVEL_DEFAULT_STR, false);
955 }
956 if (command_element == null && command_type.equals(StaticStrings.STEMOPTIONS_STR)) {
957 command_element = parseIndexOptions(command_str, StaticStrings.STEMOPTIONS_STR, true);
958 }
959 if (command_element == null && command_type.equals(StaticStrings.COMMENTED_STEMOPTIONS_STR)) {
960 command_element = parseIndexOptions(command_str, StaticStrings.STEMOPTIONS_STR, false);
961 }
962 if(command_element == null && command_type.equals(StaticStrings.COLLECTIONMETADATA_STR)) {
963 command_element = parseMetadata(tokenizer); // Revised to handle multiple lines
964 }
965 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))) {
966 command_element = parseMetadataSpecial(command_str);
967 // pre 2.71 hack
968 if (command_type.equals(StaticStrings.BUILDTYPE_STR)) {
969 build_types_parsed = true;
970 }
971 }
972 if(command_element == null && command_type.equals(StaticStrings.PLUGIN_STR)) {
973 command_element = parsePlugin(command_str);
974 }
975 // leave here for backwards compatibility
976 if(command_element == null && command_type.equals(StaticStrings.SEARCHTYPE_STR)) {
977 command_element = parseSearchType(command_str);
978 // pre 2.71 hack
979 search_types_parsed = true;
980
981 }
982 if(command_element == null && command_type.equals(StaticStrings.SUBCOLLECTION_STR)) {
983 command_element = parseSubCollection(command_str);
984 }
985 if(command_element == null && command_type.equals(StaticStrings.SUBCOLLECTION_DEFAULT_INDEX_STR)) {
986 command_element = parseSubCollectionDefaultIndex(command_str);
987 }
988 if(command_element == null && command_type.equals(StaticStrings.SUBCOLLECTION_INDEX_STR)) {
989 command_element = parseSubCollectionIndex(command_str);
990 }
991 if(command_element == null && (command_type.equals(StaticStrings.SUPERCOLLECTION_STR) || command_type.equals(StaticStrings.CCS_STR))) {
992 command_element = parseSuperCollection(command_str);
993 }
994 // Doesn't match any known type
995 command_type = null;
996 if(command_element == null) {
997 // No-one knows what to do with this command, so we create an Unknown command element
998 command_element = document.createElement(StaticStrings.UNKNOWN_ELEMENT);
999 XMLTools.setValue(command_element, command_str);
1000 }
1001 }
1002 // Or an empty line to remember for later
1003 else {
1004 command_element = document.createElement(NEWLINE_ELEMENT);
1005 }
1006 // 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
1007 //if(append_element) {
1008 collect_cfg_element.appendChild(command_element);
1009 //}
1010 }
1011 if (!build_types_parsed) {
1012 String buildtype_type = BuildTypeManager.BUILD_TYPE_MG;
1013 if (search_types_parsed) {
1014 buildtype_type = BuildTypeManager.BUILD_TYPE_MGPP;
1015 }
1016 Element command_element = parseMetadataSpecial(StaticStrings.BUILDTYPE_STR+" "+buildtype_type);
1017 Node target_node = findInsertionPoint(command_element);
1018 if(target_node != null) {
1019 collect_cfg_element.insertBefore(command_element, target_node);
1020 }
1021 else {
1022 collect_cfg_element.appendChild(command_element);
1023 }
1024
1025 }
1026 }
1027 catch(Exception exception) {
1028 DebugStream.println("Error in CollectionConfiguration.parse(java.io.File): " + exception);
1029 DebugStream.printStackTrace(exception);
1030 }
1031 }
1032
1033
1034 private Element parseClassify(String command_str) {
1035 Element command_element = null;
1036 try {
1037 CommandTokenizer tokenizer = new CommandTokenizer(command_str);
1038 // 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).
1039 if(tokenizer.countTokens() >= 2) { // Must support "classify Phind" (no args)
1040 command_element = document.createElement(StaticStrings.CLASSIFY_ELEMENT);
1041 // First token is classify
1042 tokenizer.nextToken();
1043 // The next token is the classifier type
1044 command_element.setAttribute(StaticStrings.TYPE_ATTRIBUTE, tokenizer.nextToken());
1045 // Now we parse out the remaining arguments into a hashmapping from name to value
1046 HashMap arguments = parseArguments(tokenizer);
1047 // Assign the arguments as Option elements, but watch out for the metadata argument as we treat that differently
1048 Iterator names = arguments.keySet().iterator();
1049 while(names.hasNext()) {
1050 String name = (String) names.next();
1051 String value = (String) arguments.get(name); // Can be null
1052 // The metadata argument gets added as the content attribute
1053 if (name.equals(StaticStrings.METADATA_ARGUMENT) && value != null) {
1054 // Add the extracted namespace onto un-namespaced metadata names
1055 StringTokenizer string_tokenizer = new StringTokenizer(value, ",");
1056 value = "";
1057 while (string_tokenizer.hasMoreElements()) {
1058 String token = (String) string_tokenizer.nextElement();
1059
1060 if (token.indexOf(StaticStrings.NS_SEP) == -1) {
1061 token = StaticStrings.EXTRACTED_NAMESPACE + token;
1062 }
1063 else {
1064 MetadataElement metadata_element = MetadataTools.getMetadataElementWithName(token);
1065 if (metadata_element != null) {
1066 token = metadata_element.getDisplayName();
1067 }
1068 }
1069
1070 if (!value.equals("")) {
1071 value = value + ",";
1072 }
1073 value = value + token;
1074 }
1075 }
1076 // Everything else is an Option Element
1077 Element option_element = document.createElement(StaticStrings.OPTION_ELEMENT);
1078 option_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name.substring(1));
1079 if(value != null) {
1080 // Remove any speech marks appended in strings containing whitespace
1081 if(value.startsWith(StaticStrings.SPEECH_CHARACTER) && value.endsWith(StaticStrings.SPEECH_CHARACTER)) {
1082 value = value.substring(1, value.length() - 1);
1083 }
1084 XMLTools.setValue(option_element, value);
1085 }
1086 option_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1087 command_element.appendChild(option_element);
1088 option_element = null;
1089 name = null;
1090 value = null;
1091 }
1092 names = null;
1093 arguments = null;
1094 }
1095 tokenizer = null;
1096 }
1097 catch(Exception error) {
1098 }
1099 return command_element;
1100 }
1101
1102 private Element parseFormat(CommandTokenizer tokenizer) {
1103 Element command_element = null;
1104 try {
1105 command_element = document.createElement(StaticStrings.FORMAT_ELEMENT);
1106 String name_str = tokenizer.nextToken();
1107 String value_str = tokenizer.nextToken();
1108 if(name_str != null && value_str != null) {
1109 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_str);
1110 // If the value is true or false we add it as an attribute
1111 if(value_str.equalsIgnoreCase(StaticStrings.TRUE_STR) || value_str.equalsIgnoreCase(StaticStrings.FALSE_STR)) {
1112 command_element.setAttribute(StaticStrings.VALUE_ATTRIBUTE, value_str.toLowerCase());
1113 }
1114 // Otherwise it gets added as a text node
1115 else {
1116 // Ready the value str (which can contain all sorts of funky characters) for writing as a DOM value
1117 value_str = Codec.transform(value_str, Codec.GREENSTONE_TO_DOM);
1118 XMLTools.setValue(command_element, value_str);
1119 }
1120 }
1121 else {
1122 command_element = null;
1123 }
1124 name_str = null;
1125 value_str = null;
1126 }
1127 catch (Exception exception) {
1128 DebugStream.printStackTrace(exception);
1129 command_element = null;
1130 }
1131 return command_element;
1132 }
1133
1134 private Element parseIndex(String command_str) {
1135 Element command_element = null;
1136 try {
1137 StringTokenizer tokenizer = new StringTokenizer(command_str);
1138 String command = tokenizer.nextToken();
1139 command_element = document.createElement(StaticStrings.INDEXES_ELEMENT);
1140 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, (command.equals(StaticStrings.INDEX_STR) ? StaticStrings.TRUE_STR : StaticStrings.FALSE_STR));
1141 command = null;
1142 if(!tokenizer.hasMoreTokens()) {
1143
1144 // there are no indexes
1145 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR);
1146 command_element.setAttribute(StaticStrings.MGPP_ATTRIBUTE, StaticStrings.FALSE_STR); // for now
1147 tokenizer = null;
1148 return command_element;
1149 }
1150
1151 while(tokenizer.hasMoreTokens()) {
1152 Element index_element = document.createElement(StaticStrings.INDEX_ELEMENT);
1153 String index_str = tokenizer.nextToken();
1154 // 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.
1155 boolean old_index;
1156 if(index_str.indexOf(StaticStrings.COLON_CHARACTER) != -1) {
1157 old_index = true;
1158 index_element.setAttribute(StaticStrings.LEVEL_ATTRIBUTE, index_str.substring(0, index_str.indexOf(StaticStrings.COLON_CHARACTER)));
1159 index_str = index_str.substring(index_str.indexOf(StaticStrings.COLON_CHARACTER) + 1);
1160 command_element.setAttribute(StaticStrings.MGPP_ATTRIBUTE, StaticStrings.FALSE_STR);
1161 }
1162 else {
1163 command_element.setAttribute(StaticStrings.MGPP_ATTRIBUTE, StaticStrings.TRUE_STR);
1164 old_index = false;
1165 }
1166 StringTokenizer content_tokenizer = new StringTokenizer(index_str, StaticStrings.COMMA_CHARACTER);
1167 while(content_tokenizer.hasMoreTokens()) {
1168 Element content_element = document.createElement(StaticStrings.CONTENT_ELEMENT);
1169 String content_str = content_tokenizer.nextToken();
1170 // 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.
1171 if(content_str.indexOf(StaticStrings.NS_SEP) == -1) {
1172 if(content_str.equals(StaticStrings.TEXT_STR) || (!old_index && content_str.equals(StaticStrings.ALLFIELDS_STR))) {
1173 // Our special strings are OK.
1174 }
1175 else {
1176 content_str = StaticStrings.EXTRACTED_NAMESPACE + content_str;
1177 }
1178 }
1179 content_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, content_str);
1180 index_element.appendChild(content_element);
1181 content_element = null;
1182 }
1183 content_tokenizer = null;
1184 index_str = null;
1185 command_element.appendChild(index_element);
1186 index_element = null;
1187 }
1188 tokenizer = null;
1189 }
1190 catch (Exception exception) {
1191 exception.printStackTrace();
1192 }
1193 return command_element;
1194 }
1195
1196 private Element parseIndexDefault(String command_str) {
1197 Element command_element = null;
1198 try {
1199 StringTokenizer tokenizer = new StringTokenizer(command_str);
1200 if(tokenizer.countTokens() >= 2) {
1201 command_element = document.createElement(StaticStrings.INDEX_DEFAULT_ELEMENT);
1202 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, ((tokenizer.nextToken()).equals(StaticStrings.INDEX_DEFAULT_STR) ? StaticStrings.TRUE_STR : StaticStrings.FALSE_STR));
1203 String index_str = tokenizer.nextToken();
1204 String level="";
1205 if (index_str.indexOf(StaticStrings.COLON_CHARACTER) !=-1){
1206 level = index_str.substring(0, index_str.indexOf(StaticStrings.COLON_CHARACTER));
1207 }
1208
1209 command_element.setAttribute(StaticStrings.LEVEL_ATTRIBUTE,level);
1210
1211 String content_str = index_str;
1212
1213 if (index_str.indexOf(StaticStrings.COLON_CHARACTER) !=-1){
1214 content_str = index_str.substring(index_str.indexOf(StaticStrings.COLON_CHARACTER) + 1);
1215 }
1216
1217 StringTokenizer content_tokenizer = new StringTokenizer(content_str, StaticStrings.COMMA_CHARACTER);
1218 while(content_tokenizer.hasMoreTokens()) {
1219 Element content_element = document.createElement(StaticStrings.CONTENT_ELEMENT);
1220 content_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, content_tokenizer.nextToken());
1221 command_element.appendChild(content_element);
1222 content_element = null;
1223 }
1224 content_tokenizer = null;
1225 content_str = null;
1226 content_str = null;
1227 index_str = null;
1228 }
1229 tokenizer = null;
1230 }
1231 catch (Exception exception) {
1232 }
1233 return command_element;
1234 }
1235
1236 private Element parseLanguage(String command_str) {
1237 Element command_element = null;
1238 try {
1239 StringTokenizer tokenizer = new StringTokenizer(command_str);
1240 tokenizer.nextToken();
1241 if(tokenizer.hasMoreTokens()) {
1242 command_element = document.createElement(StaticStrings.LANGUAGES_ELEMENT);
1243 while(tokenizer.hasMoreTokens()) {
1244 Element language_element = document.createElement(StaticStrings.LANGUAGE_ELEMENT);
1245 language_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, tokenizer.nextToken());
1246 command_element.appendChild(language_element);
1247 language_element = null;
1248 }
1249 }
1250 tokenizer = null;
1251 }
1252 catch (Exception exception) {
1253 }
1254 return command_element;
1255 }
1256
1257 private Element parseLanguageDefault(String command_str) {
1258 Element command_element = null;
1259 try {
1260 StringTokenizer tokenizer = new StringTokenizer(command_str);
1261 if(tokenizer.countTokens() >= 2) {
1262 command_element = document.createElement(StaticStrings.LANGUAGE_DEFAULT_ELEMENT);
1263 tokenizer.nextToken();
1264 String default_language_str = tokenizer.nextToken();
1265 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, default_language_str);
1266 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1267 default_language_str = null;
1268 }
1269 tokenizer = null;
1270 }
1271 catch (Exception exception) {
1272 }
1273 return command_element;
1274 }
1275
1276 private Element parseLanguageMetadata(String command_str) {
1277 Element command_element = null;
1278 try {
1279 StringTokenizer tokenizer = new StringTokenizer(command_str);
1280 if(tokenizer.countTokens() >= 2) {
1281 command_element = document.createElement(StaticStrings.LANGUAGE_METADATA_ELEMENT);
1282 tokenizer.nextToken();
1283 String language_metadata_str = tokenizer.nextToken();
1284 if (language_metadata_str.indexOf(StaticStrings.NS_SEP) == -1) {
1285 language_metadata_str = StaticStrings.EXTRACTED_NAMESPACE + language_metadata_str;
1286 }
1287 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, language_metadata_str);
1288 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1289 language_metadata_str = null;
1290 }
1291 tokenizer = null;
1292
1293 }
1294 catch (Exception exception) {
1295 }
1296 return command_element;
1297 }
1298
1299 private Element parseIndexOptions(String command_str, String type, boolean assigned) {
1300 Element command_element = null;
1301 try {
1302 StringTokenizer tokenizer = new StringTokenizer(command_str);
1303 // First token is command type
1304 String command = tokenizer.nextToken();
1305 if(tokenizer.hasMoreTokens()) {
1306 command_element = document.createElement(StaticStrings.INDEXOPTIONS_ELEMENT);
1307 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE,type);
1308 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, (assigned ? StaticStrings.TRUE_STR : StaticStrings.FALSE_STR));
1309 while(tokenizer.hasMoreTokens()) {
1310 Element option_element = document.createElement(StaticStrings.INDEXOPTION_ELEMENT);
1311 option_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, tokenizer.nextToken());
1312 command_element.appendChild(option_element);
1313 option_element = null;
1314 }
1315 }
1316 command = null;
1317 }
1318 catch(Exception exception) {
1319 }
1320 return command_element;
1321 }
1322
1323 private Element parseIndexOptionDefault(String command_str, String type, boolean assigned) {
1324 Element command_element = null;
1325 try {
1326 StringTokenizer tokenizer = new StringTokenizer(command_str);
1327 // First token is command type
1328 String command = tokenizer.nextToken();
1329 if(tokenizer.hasMoreTokens()) {
1330 command_element = document.createElement(StaticStrings.INDEXOPTION_DEFAULT_ELEMENT);
1331 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, (assigned ? StaticStrings.TRUE_STR : StaticStrings.FALSE_STR)); // is it commented out or not?
1332 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, type);
1333 command_element.setAttribute(StaticStrings.VALUE_ATTRIBUTE, tokenizer.nextToken());
1334 }
1335
1336 tokenizer = null;
1337 }
1338 catch (Exception exception) {
1339 }
1340 return command_element;
1341 }
1342
1343 private Element parseMetadata(CommandTokenizer tokenizer) {
1344 Element command_element = null;
1345 try {
1346 command_element = document.createElement(StaticStrings.COLLECTIONMETADATA_ELEMENT);
1347 String name_str = tokenizer.nextToken();
1348 String value_str = tokenizer.nextToken();
1349 if(name_str != null && value_str != null) {
1350 String language_str = Configuration.getLanguage();
1351 // Check if the value string is actually a language string
1352 if(value_str.startsWith(StaticStrings.LBRACKET_CHARACTER) && value_str.endsWith(StaticStrings.RBRACKET_CHARACTER)) {
1353 language_str = value_str.substring(value_str.indexOf(StaticStrings.LANGUAGE_ARGUMENT) + 2, value_str.length() - 1);
1354 value_str = tokenizer.nextToken();
1355 }
1356 if(value_str != null) {
1357 // Ready the value str (which can contain all sorts of funky characters) for writing as a DOM value
1358 value_str = Codec.transform(value_str, Codec.GREENSTONE_TO_DOM);
1359 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_str);
1360 command_element.setAttribute(StaticStrings.LANGUAGE_ATTRIBUTE, language_str);
1361 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1362 XMLTools.setValue(command_element, value_str);
1363 }
1364 else {
1365 command_element = null;
1366 }
1367 language_str = null;
1368 }
1369 else {
1370 command_element = null;
1371 }
1372 name_str = null;
1373 value_str = null;
1374 }
1375 catch (Exception exception) {
1376 DebugStream.printStackTrace(exception);
1377 command_element = null;
1378 }
1379 return command_element;
1380 }
1381
1382 private Element parseMetadataSpecial(String command_str) {
1383 Element command_element = null;
1384 try {
1385 StringTokenizer tokenizer = new StringTokenizer(command_str);
1386 if(tokenizer.countTokens() >= 2) {
1387 String name_str = tokenizer.nextToken();
1388 String value_str = tokenizer.nextToken();
1389 if (name_str.equals(StaticStrings.COLLECTIONMETADATA_CREATOR_STR)) {
1390 command_element = document.createElement(StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT);
1391 }
1392 else if(name_str.equals(StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR)) {
1393 command_element = document.createElement(StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT);
1394 }
1395 else if(name_str.equals(StaticStrings.COLLECTIONMETADATA_PUBLIC_STR)) {
1396 command_element = document.createElement(StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT);
1397 }
1398 else if (name_str.equals(StaticStrings.BUILDTYPE_STR)) {
1399 command_element = document.createElement(StaticStrings.BUILDTYPE_ELEMENT);
1400 }
1401 if(command_element != null) {
1402 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_str);
1403 command_element.setAttribute(StaticStrings.LANGUAGE_ATTRIBUTE, StaticStrings.ENGLISH_LANGUAGE_STR);
1404 command_element.setAttribute(StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR);
1405 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1406 if(value_str.startsWith(StaticStrings.SPEECH_CHARACTER) && value_str.endsWith(StaticStrings.SPEECH_CHARACTER)) {
1407 value_str = value_str.substring(1, value_str.length() - 1);
1408 }
1409 XMLTools.setValue(command_element, value_str);
1410 }
1411 value_str = null;
1412 name_str = null;
1413 }
1414 tokenizer = null;
1415 }
1416 catch (Exception exception) {
1417 }
1418 return command_element;
1419 }
1420
1421 private Element parsePlugin(String command_str) {
1422 Element command_element = null;
1423 //boolean use_metadata_files = false;
1424 try {
1425 CommandTokenizer tokenizer = new CommandTokenizer(command_str);
1426 // 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).
1427 if(tokenizer.countTokens() >= 2) {
1428 command_element = document.createElement(StaticStrings.PLUGIN_ELEMENT);
1429 // First token is plugin
1430 tokenizer.nextToken();
1431 // The next token is the type
1432 String type = tokenizer.nextToken();
1433 command_element.setAttribute(StaticStrings.TYPE_ATTRIBUTE, type);
1434 // Now we parse out the remaining arguments into a hashmapping from name to value
1435 HashMap arguments = parseArguments(tokenizer);
1436 // Assign the arguments as Option elements, but watch out for the metadata argument as we treat that differently
1437 // also watch out for the deprecated -use_metadata_files option to RecPlug and remove it
1438 Iterator names = arguments.keySet().iterator();
1439 while(names.hasNext()) {
1440 String name = (String) names.next();
1441 String value = (String) arguments.get(name); // Can be null
1442
1443 if(type.equals(StaticStrings.RECPLUG_STR) && name.substring(1).equals(StaticStrings.USE_METADATA_FILES_ARGUMENT)) {
1444 continue; // ignore this option
1445 }
1446 Element option_element = document.createElement(StaticStrings.OPTION_ELEMENT);
1447 option_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name.substring(1));
1448 option_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1449 if(value != null) {
1450 // Remove any speech marks appended in strings containing whitespace
1451 if(value.startsWith(StaticStrings.SPEECH_CHARACTER) && value.endsWith(StaticStrings.SPEECH_CHARACTER)) {
1452 value = value.substring(1, value.length() - 1);
1453 }
1454 if(name.equals(StaticStrings.METADATA_ARGUMENT)) {
1455 // 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.
1456 if(value.indexOf(StaticStrings.NS_SEP) == -1) {
1457 value = StaticStrings.EXTRACTED_NAMESPACE + value;
1458 }
1459 }
1460 XMLTools.setValue(option_element, value);
1461 }
1462 command_element.appendChild(option_element);
1463 option_element = null;
1464 name = null;
1465 value = null;
1466 }
1467
1468 type = null;
1469 names = null;
1470 arguments = null;
1471 }
1472 tokenizer = null;
1473 }
1474 catch(Exception exception) {
1475 }
1476 return command_element;
1477 }
1478
1479 /* search types are now handled as formats - leave this here to convert in case we have an old config file */
1480 private Element parseSearchType(String command_str) {
1481 Element command_element = null;
1482 try {
1483 StringTokenizer tokenizer = new StringTokenizer(command_str);
1484 // First token is command type (searchtype)
1485 tokenizer.nextToken();
1486 if(tokenizer.hasMoreTokens()) {
1487 command_element = document.createElement(StaticStrings.FORMAT_ELEMENT);
1488 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, "SearchTypes");
1489 String value = tokenizer.nextToken();
1490 while(tokenizer.hasMoreTokens()) {
1491 value += ","+tokenizer.nextToken();
1492 }
1493 value = Codec.transform(value, Codec.GREENSTONE_TO_DOM);
1494 XMLTools.setValue(command_element, value);
1495 }
1496 }
1497 catch(Exception exception) {
1498 }
1499 return command_element;
1500 }
1501
1502 private Element parseSubCollection(String command_str) {
1503 Element command_element = null;
1504 try {
1505 CommandTokenizer tokenizer = new CommandTokenizer(command_str);
1506 if(tokenizer.countTokens() >= 3) {
1507 command_element = document.createElement(StaticStrings.SUBCOLLECTION_ELEMENT);
1508 // First token is command type
1509 tokenizer.nextToken();
1510 // Then subcollection identifier
1511 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, tokenizer.nextToken());
1512 // Then finally the pattern used to build the subcollection partition
1513 String full_pattern_str = tokenizer.nextToken();
1514 // Set inclusion/exclusion flag and remove any exclamation mark
1515 boolean exclusion = full_pattern_str.startsWith(StaticStrings.EXCLAMATION_CHARACTER);
1516 if (exclusion) {
1517 full_pattern_str = full_pattern_str.substring(1, full_pattern_str.length());
1518 command_element.setAttribute(StaticStrings.TYPE_ATTRIBUTE, StaticStrings.EXCLUDE_STR);
1519 }
1520 else {
1521 command_element.setAttribute(StaticStrings.TYPE_ATTRIBUTE, StaticStrings.INCLUDE_STR);
1522 }
1523 StringTokenizer pattern_tokenizer = new StringTokenizer(full_pattern_str, StaticStrings.SEPARATOR_CHARACTER);
1524 if(pattern_tokenizer.countTokens() >= 2) {
1525 String content_str = pattern_tokenizer.nextToken();
1526 // 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.
1527 if(!content_str.equals(StaticStrings.FILENAME_STR) && content_str.indexOf(StaticStrings.NS_SEP) == -1) {
1528 content_str = StaticStrings.EXTRACTED_NAMESPACE + content_str;
1529 }
1530 command_element.setAttribute(StaticStrings.CONTENT_ATTRIBUTE, content_str);
1531 XMLTools.setValue(command_element, pattern_tokenizer.nextToken());
1532 if(pattern_tokenizer.hasMoreTokens()) {
1533 command_element.setAttribute(StaticStrings.OPTIONS_ATTRIBUTE, pattern_tokenizer.nextToken());
1534 }
1535 }
1536 pattern_tokenizer = null;
1537 }
1538 }
1539 catch(Exception exception) {
1540 exception.printStackTrace();
1541 }
1542 return command_element;
1543 }
1544
1545 private Element parseSubCollectionDefaultIndex(String command_str) {
1546 Element command_element = null;
1547 try {
1548 StringTokenizer tokenizer = new StringTokenizer(command_str);
1549 if(tokenizer.countTokens() == 2) {
1550 command_element = document.createElement(StaticStrings.SUBCOLLECTION_DEFAULT_INDEX_ELEMENT);
1551 tokenizer.nextToken();
1552 //command_element.setAttribute(CONTENT_ATTRIBUTE, tokenizer.nextToken());
1553 String content_str = tokenizer.nextToken();
1554 StringTokenizer content_tokenizer = new StringTokenizer(content_str, StaticStrings.COMMA_CHARACTER);
1555 while(content_tokenizer.hasMoreTokens()) {
1556 Element content_element = document.createElement(StaticStrings.CONTENT_ELEMENT);
1557 content_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, content_tokenizer.nextToken());
1558 command_element.appendChild(content_element);
1559 content_element = null;
1560 }
1561 content_tokenizer = null;
1562 content_str = null;
1563 }
1564 tokenizer = null;
1565 }
1566 catch(Exception exception) {
1567 }
1568 return command_element;
1569 }
1570
1571 private Element parseSubCollectionIndex(String command_str) {
1572 Element command_element = null;
1573 try {
1574 StringTokenizer tokenizer = new StringTokenizer(command_str);
1575 tokenizer.nextToken();
1576 if(tokenizer.hasMoreTokens()) {
1577 command_element = document.createElement(StaticStrings.SUBCOLLECTION_INDEXES_ELEMENT);
1578 }
1579 while(tokenizer.hasMoreTokens()) {
1580 Element subcollectionindex_element = document.createElement(StaticStrings.INDEX_ELEMENT);
1581 //command_element.setAttribute(CONTENT_ATTRIBUTE, tokenizer.nextToken());
1582 String content_str = tokenizer.nextToken();
1583 StringTokenizer content_tokenizer = new StringTokenizer(content_str, StaticStrings.COMMA_CHARACTER);
1584 while(content_tokenizer.hasMoreTokens()) {
1585 Element content_element = document.createElement(StaticStrings.CONTENT_ELEMENT);
1586 content_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, content_tokenizer.nextToken());
1587 subcollectionindex_element.appendChild(content_element);
1588 content_element = null;
1589 }
1590 content_tokenizer = null;
1591 content_str = null;
1592 command_element.appendChild(subcollectionindex_element);
1593 subcollectionindex_element = null;
1594 }
1595 tokenizer = null;
1596 }
1597 catch (Exception exception) {
1598 }
1599 return command_element;
1600 }
1601
1602 private Element parseSuperCollection(String command_str) {
1603 Element command_element = null;
1604 try {
1605 StringTokenizer tokenizer = new StringTokenizer(command_str);
1606 if(tokenizer.countTokens() >= 3) {
1607 command_element = document.createElement(StaticStrings.SUPERCOLLECTION_ELEMENT);
1608 tokenizer.nextToken();
1609 while(tokenizer.hasMoreTokens()) {
1610 Element collection_element = document.createElement(StaticStrings.COLLECTION_ELEMENT);
1611 collection_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, tokenizer.nextToken());
1612 command_element.appendChild(collection_element);
1613 collection_element = null;
1614 }
1615 }
1616 tokenizer = null;
1617 }
1618 catch(Exception exception) {
1619 }
1620 return command_element;
1621 }
1622
1623 static private String pluginToString(Element command_element, boolean show_extracted_namespace) {
1624 StringBuffer text = new StringBuffer();
1625 if(!command_element.getAttribute(StaticStrings.SEPARATOR_ATTRIBUTE).equals(StaticStrings.TRUE_STR)) {
1626 text.append(StaticStrings.PLUGIN_STR);
1627 text.append(StaticStrings.TAB_CHARACTER);
1628 text.append(StaticStrings.TAB_CHARACTER);
1629 text.append(command_element.getAttribute(StaticStrings.TYPE_ATTRIBUTE));
1630 // Retrieve, and output, the arguments
1631 NodeList option_elements = command_element.getElementsByTagName(StaticStrings.OPTION_ELEMENT);
1632 int option_elements_length = option_elements.getLength();
1633 if(option_elements_length > 0) {
1634 for(int j = 0; j < option_elements_length; j++) {
1635 Element option_element = (Element) option_elements.item(j);
1636 if(option_element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.TRUE_STR)) {
1637 text.append(StaticStrings.SPACE_CHARACTER);
1638 text.append(StaticStrings.MINUS_CHARACTER);
1639 text.append(option_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
1640 String value_str = XMLTools.getValue(option_element);
1641 if(!show_extracted_namespace && value_str.startsWith(StaticStrings.EXTRACTED_NAMESPACE)) {
1642 value_str = value_str.substring(StaticStrings.EXTRACTED_NAMESPACE.length());
1643 }
1644 if(value_str.length() > 0) {
1645 text.append(StaticStrings.SPACE_CHARACTER);
1646 if(value_str.indexOf(StaticStrings.SPACE_CHARACTER) == -1) {
1647 text.append(value_str);
1648 }
1649 else {
1650 text.append(StaticStrings.SPEECH_CHARACTER);
1651 text.append(value_str);
1652 text.append(StaticStrings.SPEECH_CHARACTER);
1653 }
1654 }
1655 value_str = null;
1656 }
1657 option_element = null;
1658 }
1659 }
1660 option_elements = null;
1661 }
1662 return text.toString();
1663 }
1664
1665 static private String searchtypeToString(Element command_element) {
1666 if(command_element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.TRUE_STR)) {
1667 StringBuffer text = new StringBuffer(StaticStrings.SEARCHTYPE_STR);
1668 text.append(StaticStrings.TAB_CHARACTER);
1669 NodeList search_elements = command_element.getElementsByTagName(StaticStrings.CONTENT_ELEMENT);
1670 int search_elements_length = search_elements.getLength();
1671 for(int i = 0; i < search_elements_length; i++) {
1672 Element search_element = (Element) search_elements.item(i);
1673 text.append(search_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
1674 text.append(StaticStrings.SPACE_CHARACTER);
1675 }
1676 return text.substring(0, text.length() - 1);
1677 }
1678 else {
1679 return null;
1680 }
1681 }
1682
1683 static private String subcollectionToString(Element command_element, boolean show_extracted_namespace) {
1684 StringBuffer text = new StringBuffer(StaticStrings.SUBCOLLECTION_STR);
1685 text.append(StaticStrings.SPACE_CHARACTER);
1686 text.append(command_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
1687 text.append(StaticStrings.SPACE_CHARACTER);
1688 text.append(StaticStrings.TAB_CHARACTER);
1689 text.append(StaticStrings.SPEECH_CHARACTER);
1690 if(command_element.getAttribute(StaticStrings.TYPE_ATTRIBUTE).equals(StaticStrings.EXCLUDE_STR)) {
1691 text.append(StaticStrings.EXCLAMATION_CHARACTER);
1692 }
1693 String content_str = command_element.getAttribute(StaticStrings.CONTENT_ATTRIBUTE);
1694 if(!show_extracted_namespace && content_str.startsWith(StaticStrings.EXTRACTED_NAMESPACE)) {
1695 content_str = content_str.substring(StaticStrings.EXTRACTED_NAMESPACE.length());
1696 }
1697 text.append(content_str);
1698 content_str = null;
1699 text.append(StaticStrings.SEPARATOR_CHARACTER);
1700 text.append(XMLTools.getValue(command_element));
1701 text.append(StaticStrings.SEPARATOR_CHARACTER);
1702 String options_str = command_element.getAttribute(StaticStrings.OPTIONS_ATTRIBUTE);
1703 if(options_str.length() > 0) {
1704 text.append(options_str);
1705 }
1706 options_str = null;
1707 text.append(StaticStrings.SPEECH_CHARACTER);
1708 return text.toString();
1709 }
1710
1711 static private String subcollectionDefaultIndexToString(Element command_element) {
1712 StringBuffer text = new StringBuffer(StaticStrings.SUBCOLLECTION_DEFAULT_INDEX_STR);
1713 text.append(StaticStrings.TAB_CHARACTER);
1714 NodeList content_elements = command_element.getElementsByTagName(StaticStrings.CONTENT_ELEMENT);
1715 int content_elements_length = content_elements.getLength();
1716 for(int j = 0; j < content_elements_length; j++) {
1717 Element content_element = (Element) content_elements.item(j);
1718 text.append(content_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
1719 if(j < content_elements_length - 1) {
1720 text.append(StaticStrings.COMMA_CHARACTER);
1721 }
1722 }
1723 return text.toString();
1724 }
1725
1726 static private String subcollectionIndexesToString(Element command_element) {
1727 StringBuffer text = new StringBuffer(StaticStrings.SUBCOLLECTION_INDEX_STR);
1728 text.append(StaticStrings.TAB_CHARACTER);
1729 // Retrieve all of the subcollection index partitions
1730 NodeList subcollectionindex_elements = command_element.getElementsByTagName(StaticStrings.INDEX_ELEMENT);
1731 int subcollectionindex_elements_length = subcollectionindex_elements.getLength();
1732 if(subcollectionindex_elements_length == 0) {
1733 return null;
1734 }
1735 for(int j = 0; j < subcollectionindex_elements_length; j++) {
1736 Element subcollectionindex_element = (Element) subcollectionindex_elements.item(j);
1737 NodeList content_elements = subcollectionindex_element.getElementsByTagName(StaticStrings.CONTENT_ELEMENT);
1738 int content_elements_length = content_elements.getLength();
1739 for(int k = 0; k < content_elements_length; k++) {
1740 Element content_element = (Element) content_elements.item(k);
1741 text.append(content_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
1742 if(k < content_elements_length - 1) {
1743 text.append(StaticStrings.COMMA_CHARACTER);
1744 }
1745 }
1746 if(j < subcollectionindex_elements_length - 1) {
1747 text.append(StaticStrings.SPACE_CHARACTER);
1748 }
1749 }
1750 return text.toString();
1751 }
1752
1753 static private String supercollectionToString(Element command_element) {
1754 NodeList content_elements = command_element.getElementsByTagName(StaticStrings.COLLECTION_ELEMENT);
1755 int content_elements_length = content_elements.getLength();
1756 if(content_elements_length > 1) {
1757 StringBuffer text = new StringBuffer(StaticStrings.SUPERCOLLECTION_STR);
1758 text.append(StaticStrings.TAB_CHARACTER);
1759 for(int j = 0; j < content_elements_length; j++) {
1760 Element content_element = (Element) content_elements.item(j);
1761 text.append(content_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
1762 if(j < content_elements_length - 1) {
1763 text.append(StaticStrings.SPACE_CHARACTER);
1764 }
1765 }
1766 return text.toString();
1767 }
1768 return null;
1769 }
1770
1771 static private String unknownToString(Element command_element) {
1772 return XMLTools.getValue(command_element);
1773 }
1774
1775 /** 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.
1776 * @param writer the BufferedWriter to which the str will be written
1777 * @param str the String to be written
1778 */
1779 private void write(BufferedWriter writer, String str)
1780 throws IOException {
1781 writer.write(str, 0, str.length());
1782 }
1783}
Note: See TracBrowser for help on using the repository browser.