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

Last change on this file since 13421 was 13421, checked in by kjdon, 17 years ago

only one tab for index options to string

  • 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.w3c.dom.*;
48
49/** 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).
50 * @author John Thompson, Greenstone Digital Library, University of Waikato
51 * @version 2.3d
52 */
53public class CollectionConfiguration
54{
55 static final private String ENCODING = "UTF-8";
56 static final private String NEWLINE_ELEMENT = "NewLine";
57
58 static private Document document;
59 static private StringBuffer saved_collect_cfg_string_buffer = null;
60
61
62 static public Element createElement(String element_name)
63 {
64 return document.createElement(element_name);
65 }
66
67
68 /** 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.
69 * @param target_element the command Element to be inserted
70 * @return the Element which the given command should be inserted before, or null to append to end of list
71 */
72 static public Node findInsertionPoint(Element target_element) {
73 ///ystem.err.println("Find insertion point: " + target_element.getNodeName());
74 String target_element_name = target_element.getNodeName();
75 Element document_element = document.getDocumentElement();
76 // Try to find commands with the same tag.
77 NodeList matching_elements = document_element.getElementsByTagName(target_element_name);
78 // If we found matching elements, then we have our most likely insertion location, so check within for groupings
79 if(matching_elements.getLength() != 0) {
80 ///ystem.err.println("Found matching elements.");
81 // Only CollectionMeta are grouped.
82 if(target_element_name.equals(StaticStrings.COLLECTIONMETADATA_ELEMENT)) {
83 ///ystem.err.println("Dealing with collection metadata");
84 // 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.
85 // So if the command to be added is special add it immediately after any other special command
86 if(target_element.getAttribute(StaticStrings.SPECIAL_ATTRIBUTE).equals(StaticStrings.TRUE_STR)) {
87 int index = 0;
88 Element matched_element = (Element) matching_elements.item(index);
89 Element sibling_element = (Element) matched_element.getNextSibling();
90 while(sibling_element.getAttribute(StaticStrings.SPECIAL_ATTRIBUTE).equals(StaticStrings.TRUE_STR)) {
91 index++;
92 matched_element = (Element) matching_elements.item(index);
93 sibling_element = (Element) matched_element.getNextSibling();
94 }
95 if(sibling_element.getNodeName().equals(NEWLINE_ELEMENT)) {
96 Element newline_element = document.createElement(NEWLINE_ELEMENT);
97 document_element.insertBefore(newline_element, sibling_element);
98 }
99 return sibling_element;
100 }
101 // Otherwise try to find a matching 'name' and add after the last one in that group.
102 else {
103 int index = 0;
104 target_element_name = target_element.getAttribute(StaticStrings.NAME_ATTRIBUTE);
105 boolean found = false;
106 // Skip all of the special metadata
107 Element matched_element = (Element) matching_elements.item(index);
108 while(matched_element.getAttribute(StaticStrings.SPECIAL_ATTRIBUTE).equals(StaticStrings.TRUE_STR)) {
109 index++;
110 matched_element = (Element) matching_elements.item(index);
111 }
112 // Begin search
113 while(!found && matched_element != null) {
114 if(matched_element.getAttribute(StaticStrings.NAME_ATTRIBUTE).equals(target_element_name)) {
115 found = true;
116 }
117 else {
118 index++;
119 matched_element = (Element) matching_elements.item(index);
120 }
121 }
122 // If we found a match, we need to continue checking until we find the last name match.
123 if(found) {
124 index++;
125 Element previous_sibling = matched_element;
126 Element sibling_element = (Element) matching_elements.item(index);
127 while(sibling_element != null && sibling_element.getAttribute(StaticStrings.NAME_ATTRIBUTE).equals(target_element_name)) {
128 previous_sibling = sibling_element;
129 index++;
130 sibling_element = (Element) matching_elements.item(index);
131 }
132 // 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!
133 return previous_sibling.getNextSibling();
134 }
135 // If not found we just add after last metadata element
136 else {
137 Element last_element = (Element) matching_elements.item(matching_elements.getLength() - 1);
138 return last_element.getNextSibling();
139 }
140 }
141
142 }
143 else {
144 ///ystem.err.println("Not dealing with collection meta.");
145 Element matched_element = (Element) matching_elements.item(matching_elements.getLength() - 1);
146 // 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)
147 Node sibling_element = matched_element.getNextSibling();
148 if(sibling_element != null && sibling_element.getNodeName().equals(NEWLINE_ELEMENT)) {
149 Element newline_element = document.createElement(NEWLINE_ELEMENT);
150 document_element.insertBefore(newline_element, sibling_element);
151 }
152 return sibling_element; // Note that this may be null
153 }
154 }
155 ///ystem.err.println("No matching elements found.");
156 // Locate where this command is in the ordering
157 int command_index = -1;
158 for(int i = 0; command_index == -1 && i < COMMAND_ORDER.length; i++) {
159 if(COMMAND_ORDER[i].equals(target_element_name)) {
160 command_index = i;
161 }
162 }
163 ///ystem.err.println("Command index is: " + command_index);
164 // Now move forward, checking for existing elements in each of the preceeding command orders.
165 int preceeding_index = command_index - 1;
166 ///ystem.err.println("Searching before the target command.");
167 while(preceeding_index >= 0) {
168 matching_elements = document_element.getElementsByTagName(COMMAND_ORDER[preceeding_index]);
169 // If we've found a match
170 if(matching_elements.getLength() > 0) {
171 // We add after the last element
172 Element matched_element = (Element) matching_elements.item(matching_elements.getLength() - 1);
173 // 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)
174 Node sibling_element = matched_element.getNextSibling();
175 if(sibling_element != null && sibling_element.getNodeName().equals(NEWLINE_ELEMENT)) {
176 Element newline_element = document.createElement(NEWLINE_ELEMENT);
177 document_element.insertBefore(newline_element, sibling_element);
178 }
179 return sibling_element; // Note that this may be null
180 }
181 preceeding_index--;
182 }
183 // If all that fails, we now move backwards through the commands
184 int susceeding_index = command_index + 1;
185 ///ystem.err.println("Searching after the target command.");
186 while(susceeding_index < COMMAND_ORDER.length) {
187 matching_elements = document_element.getElementsByTagName(COMMAND_ORDER[susceeding_index]);
188 // If we've found a match
189 if(matching_elements.getLength() > 0) {
190 // We add before the first element
191 Element matched_element = (Element) matching_elements.item(0);
192 // 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)
193 Node sibling_element = matched_element.getPreviousSibling();
194 if(sibling_element != null && sibling_element.getNodeName().equals(NEWLINE_ELEMENT)) {
195 Element newline_element = document.createElement(NEWLINE_ELEMENT);
196 document_element.insertBefore(newline_element, sibling_element);
197 }
198 return sibling_element; // Note that this may be null
199 }
200 susceeding_index++;
201 }
202 // Well. Apparently there are no other commands in this collection configuration. So append away...
203 return null;
204 }
205
206
207 static public NodeList getElementsByTagName(String element_name)
208 {
209 return document.getDocumentElement().getElementsByTagName(element_name);
210 }
211
212
213 static public String toString(Element command_element, boolean show_extracted_namespace) {
214 String command_element_name = command_element.getNodeName();
215 if(command_element_name.equals(StaticStrings.CLASSIFY_ELEMENT)) {
216 return classifyToString(command_element, show_extracted_namespace);
217 }
218 else if(command_element_name.equals(StaticStrings.FORMAT_ELEMENT)) {
219 return formatToString(command_element, show_extracted_namespace);
220 }
221 else if(command_element_name.equals(StaticStrings.INDEXES_ELEMENT)) {
222 return indexesToString(command_element, show_extracted_namespace);
223 }
224 else if(command_element_name.equals(StaticStrings.INDEX_DEFAULT_ELEMENT)) {
225 return indexDefaultToString(command_element, show_extracted_namespace);
226 }
227 else if(command_element_name.equals(StaticStrings.LANGUAGES_ELEMENT)) {
228 return languagesToString(command_element);
229 }
230 else if(command_element_name.equals(StaticStrings.LANGUAGE_DEFAULT_ELEMENT)) {
231 return languageDefaultToString(command_element);
232 }
233 else if (command_element_name.equals(StaticStrings.LANGUAGE_METADATA_ELEMENT)) {
234 return languageMetadataToString(command_element, show_extracted_namespace);
235 }
236 else if(command_element_name.equals(StaticStrings.INDEXOPTIONS_ELEMENT)) {
237 return indexOptionsToString(command_element);
238 }
239 else if(command_element_name.equals(StaticStrings.INDEXOPTION_DEFAULT_ELEMENT)) {
240 return indexOptionDefaultToString(command_element);
241 }
242 else if(command_element_name.equals(StaticStrings.COLLECTIONMETADATA_ELEMENT)) {
243 return metadataToString(command_element, show_extracted_namespace);
244 }
245 else if(command_element_name.equals(StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT)) {
246 return metadataToString(command_element, show_extracted_namespace);
247 }
248 else if(command_element_name.equals(StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT)) {
249 return metadataToString(command_element, show_extracted_namespace);
250 }
251 else if(command_element_name.equals(StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT)) {
252 return metadataToString(command_element, show_extracted_namespace);
253 }
254 else if (command_element_name.equals(StaticStrings.BUILDTYPE_ELEMENT)) {
255 return metadataToString(command_element, show_extracted_namespace);
256 }
257 else if(command_element_name.equals(StaticStrings.PLUGIN_ELEMENT)) {
258 return pluginToString(command_element, show_extracted_namespace);
259 }
260 else if(command_element_name.equals(StaticStrings.SUBCOLLECTION_ELEMENT)) {
261 return subcollectionToString(command_element, show_extracted_namespace);
262 }
263 else if(command_element_name.equals(StaticStrings.SUBCOLLECTION_DEFAULT_INDEX_ELEMENT)) {
264 return subcollectionDefaultIndexToString(command_element);
265 }
266 else if(command_element_name.equals(StaticStrings.SUBCOLLECTION_INDEXES_ELEMENT)) {
267 return subcollectionIndexesToString(command_element);
268 }
269 else if(command_element_name.equals(StaticStrings.SUPERCOLLECTION_ELEMENT)) {
270 return supercollectionToString(command_element);
271 }
272 else if(command_element_name.equals(StaticStrings.UNKNOWN_ELEMENT)) {
273 return unknownToString(command_element);
274 }
275 return "";
276 }
277
278 /** Parses arguments from a tokenizer and returns a HashMap of mappings. The tricky bit here is that not all entries in the HashMap are name->value pairs, as some arguments are boolean and are turned on by their presence. Arguments are denoted by a '-' prefix.
279 * @param tokenizer a CommandTokenizer based on the unconsumed portion of a command string
280 * @return a HashMap containing the arguments parsed
281 */
282 static public HashMap parseArguments(CommandTokenizer tokenizer) {
283 HashMap arguments = new HashMap();
284 String name = null;
285 String value = null;
286 while(tokenizer.hasMoreTokens() || name != null) {
287 // First we retrieve a name if we need one.
288 if(name == null) {
289 name = tokenizer.nextToken();
290 }
291 // Now we attempt to retrieve a value
292 if(tokenizer.hasMoreTokens()) {
293 value = tokenizer.nextToken();
294 // Test if the value is actually a name, and if so add the name by itself, then put value into name so that it is parsed correctly during the next loop.
295 if(value.startsWith(StaticStrings.MINUS_CHARACTER)) {
296 arguments.put(name, null);
297 name = value;
298 }
299 // Otherwise we have a typical name->value pair ready to go
300 else {
301 arguments.put(name, value);
302 name = null;
303 }
304 }
305 // Otherwise its a binary flag
306 else {
307 arguments.put(name, null);
308 name = null;
309 }
310 }
311 return arguments;
312 }
313
314 /** Gives the preferred ordering of commands */
315 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};
316
317 /** ************************** Public Data Members ***************************/
318
319 /** ************************** Private Data Members ***************************/
320
321 private File collect_cfg_file;
322
323 /** ************************** Public Methods ***************************/
324
325 public CollectionConfiguration(File collect_cfg_file)
326 {
327 this.collect_cfg_file = collect_cfg_file;
328 // parse the XML template
329 document = XMLTools.parseXMLFile("xml/CollectionConfig.xml", true);
330 parse(collect_cfg_file);
331
332 }
333
334 /** This debug facility shows the currently loaded collect.cfg or CollectConfig.xml file as a DOM tree. */
335 public void display() {
336 JDialog dialog = new JDialog(Gatherer.g_man, "Collection Configuration", false);
337 dialog.setSize(400,400);
338 JPanel content_pane = (JPanel) dialog.getContentPane();
339 final DOMTree tree = new DOMTree(document);
340 JButton refresh_button = new GLIButton("Refresh Tree");
341 refresh_button.addActionListener(new ActionListener() {
342 public void actionPerformed(ActionEvent event) {
343 tree.setDocument(document);
344 }
345 });
346 content_pane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
347 content_pane.setLayout(new BorderLayout());
348 content_pane.add(new JScrollPane(tree), BorderLayout.CENTER);
349 content_pane.add(refresh_button, BorderLayout.SOUTH);
350 dialog.setVisible(true);
351 }
352
353
354 public Element getCreator() {
355 Element element = getOrCreateElementByTagName(StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT, null, null);
356 element.setAttribute(StaticStrings.NAME_ATTRIBUTE, StaticStrings.COLLECTIONMETADATA_CREATOR_STR);
357 element.setAttribute(StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR);
358 return element;
359 }
360
361 public Element getDocumentElement() {
362 return document.getDocumentElement();
363 }
364
365 public File getFile() {
366 return collect_cfg_file;
367 }
368
369 /** Retrieve or create the languages Element. */
370 public Element getLanguages() {
371 return getOrCreateElementByTagName(StaticStrings.LANGUAGES_ELEMENT, null, null);
372 }
373
374 public Element getLanguageMetadata() {
375 return getOrCreateElementByTagName(StaticStrings.LANGUAGE_METADATA_ELEMENT, null, null);
376 }
377
378 public Element getLevels() {
379 return getOrCreateElementByTagName(StaticStrings.INDEXOPTIONS_ELEMENT, StaticStrings.NAME_ATTRIBUTE, StaticStrings.LEVELS_STR);
380 }
381
382 public Element getLevelDefault() {
383 return getOrCreateElementByTagName(StaticStrings.INDEXOPTION_DEFAULT_ELEMENT, StaticStrings.NAME_ATTRIBUTE, StaticStrings.LEVEL_DEFAULT_STR);
384 }
385
386 public Element getStemOptions() {
387 return getOrCreateElementByTagName(StaticStrings.INDEXOPTIONS_ELEMENT, StaticStrings.NAME_ATTRIBUTE, StaticStrings.STEMOPTIONS_STR);
388 }
389
390
391 public Element getMaintainer() {
392 Element element = getOrCreateElementByTagName(StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT, null, null);
393 element.setAttribute(StaticStrings.NAME_ATTRIBUTE, StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR);
394 element.setAttribute(StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR);
395 return element;
396 }
397
398 /** 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. */
399 public Element getMGIndexes() {
400 return getOrCreateElementByTagName(StaticStrings.INDEXES_ELEMENT, StaticStrings.MGPP_ATTRIBUTE, StaticStrings.FALSE_STR);
401 }
402
403 public Element getMGPPIndexes() {
404 return getOrCreateElementByTagName(StaticStrings.INDEXES_ELEMENT, StaticStrings.MGPP_ATTRIBUTE, StaticStrings.TRUE_STR);
405 }
406
407 public Element getPublic() {
408 Element element = getOrCreateElementByTagName(StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT, null, null);
409 element.setAttribute(StaticStrings.NAME_ATTRIBUTE, StaticStrings.COLLECTIONMETADATA_PUBLIC_STR);
410 element.setAttribute(StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR);
411 return element;
412 }
413
414 public Element getBuildType() {
415 Element element = getOrCreateElementByTagName(StaticStrings.BUILDTYPE_ELEMENT, null, null);
416 element.setAttribute(StaticStrings.NAME_ATTRIBUTE, StaticStrings.BUILDTYPE_STR);
417 element.setAttribute(StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR);
418 return element;
419
420 }
421
422 /** Retrieve or create the subindexes Element. */
423 public Element getSubIndexes() {
424 return getOrCreateElementByTagName(StaticStrings.SUBCOLLECTION_INDEXES_ELEMENT, null, null);
425 }
426
427 /** Retrieve or create the supercollections Element. */
428 public Element getSuperCollection() {
429 return getOrCreateElementByTagName(StaticStrings.SUPERCOLLECTION_ELEMENT, null, null);
430 }
431
432 public boolean ready() {
433 return document != null;
434 }
435
436
437 public void saveIfNecessary()
438 {
439 // Convert the collection configuration XML tree to the collect.cfg version
440 StringBuffer collect_cfg_string_buffer = new StringBuffer();
441 NodeList command_elements = document.getDocumentElement().getChildNodes();
442 boolean just_wrote_blank_line = false; // Prevent two or more blank lines in a row
443 for (int i = 0; i < command_elements.getLength(); i++) {
444 Node command_node = command_elements.item(i);
445 if (!(command_node instanceof Element)) {
446 // We're only interested in Elements
447 continue;
448 }
449 Element command_element = (Element) command_node;
450
451 // Handle NewLine elements (blank lines)
452 if (command_element.getNodeName().equals(NEWLINE_ELEMENT) && !just_wrote_blank_line) {
453 collect_cfg_string_buffer.append("\n");
454 just_wrote_blank_line = true;
455 }
456
457 // Anything else we write to file, but only if it has been assigned, except for index and level commands
458 // (which just get commented out if unassigned -- a side effect of MG & MGPP compatibility)
459 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)) {
460 String command;
461 if (command_element.getNodeName().equals(StaticStrings.FORMAT_ELEMENT)) {
462 // Format statements we write out with ex. still present
463 command = toString(command_element, true);
464 }
465 else {
466 command = toString(command_element, false);
467 }
468
469 if (command != null && command.length()> 0 ) {
470 collect_cfg_string_buffer.append(command + "\n");
471 just_wrote_blank_line = false;
472 }
473 }
474 }
475
476 String collect_cfg_string = collect_cfg_string_buffer.toString();
477 String saved_collect_cfg_string = saved_collect_cfg_string_buffer.toString();
478 if (collect_cfg_string.equals(saved_collect_cfg_string)) {
479 DebugStream.println("Collect.cfg file hasn't changed so no save necessary...");
480 return;
481 }
482
483 DebugStream.println("Collect.cfg file has changed, saving now...");
484
485 // If we're using the Local Library we must release the collection before writing to the collect.cfg file
486 String collection_name = Gatherer.c_man.getCollection().getName();
487 boolean collection_released = false;
488 if (Gatherer.c_man.built() && LocalLibraryServer.isRunning() == true) {
489 // Release the collection
490 LocalLibraryServer.releaseCollection(collection_name);
491 collection_released = true;
492 }
493
494 // Make a backup of the collect.cfg file
495 if (collect_cfg_file.exists()) {
496 File original_file = new File(collect_cfg_file.getParentFile(), StaticStrings.COLLECT_CFG);
497 File backup_file = new File(collect_cfg_file.getParentFile(), "collect.bak");
498 if (backup_file.exists()) {
499 backup_file.delete();
500 }
501 if (!original_file.renameTo(backup_file)) {
502 System.err.println("Warning: can't rename collect.cfg to collect.bak.");
503 }
504 }
505
506 try {
507 OutputStream ostream = new FileOutputStream(collect_cfg_file);
508 Writer file_writer = new OutputStreamWriter(ostream, ENCODING);
509 BufferedWriter buffered_writer = new BufferedWriter(file_writer);
510 buffered_writer.write(collect_cfg_string);
511 buffered_writer.close();
512
513 saved_collect_cfg_string_buffer = collect_cfg_string_buffer;
514
515 // If we're using a remote Greenstone server, upload the new collect.cfg file
516 if (Gatherer.isGsdlRemote) {
517 RemoteGreenstoneServer.uploadCollectionFile(collection_name, collect_cfg_file);
518 }
519 }
520 catch (Exception exception) {
521 DebugStream.println("Error in CollectionConfiguration.save(): " + exception);
522 DebugStream.printStackTrace(exception);
523 }
524
525 // Now re-add the collection to the Local Library server
526 if (collection_released) {
527 LocalLibraryServer.addCollection(collection_name);
528 }
529 }
530
531
532 /** ************************** Private Methods ***************************/
533
534 static private String classifyToString(Element command_element, boolean show_extracted_namespace)
535 {
536 StringBuffer text = new StringBuffer(StaticStrings.CLASSIFY_STR);
537 text.append(StaticStrings.TAB_CHARACTER);
538 text.append(command_element.getAttribute(StaticStrings.TYPE_ATTRIBUTE));
539 NodeList option_elements = command_element.getElementsByTagName(StaticStrings.OPTION_ELEMENT);
540 int option_elements_length = option_elements.getLength();
541 for(int j = 0; j < option_elements_length; j++) {
542 Element option_element = (Element) option_elements.item(j);
543 if(option_element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.TRUE_STR)) {
544 text.append(StaticStrings.SPACE_CHARACTER);
545 text.append(StaticStrings.MINUS_CHARACTER);
546 text.append(option_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
547 String value_str = XMLTools.getValue(option_element);
548
549 // Convert metadata element names to internal names, and remove extracted metadata namespaces
550 if (value_str.length() > 0) {
551 StringTokenizer string_tokenizer = new StringTokenizer(value_str, ",");
552 StringBuffer value_buffer = new StringBuffer();
553 while (string_tokenizer.hasMoreElements()) {
554 String raw_token = (String) string_tokenizer.nextElement();
555 String token = raw_token.trim();
556 MetadataElement metadata_element = MetadataTools.getMetadataElementWithDisplayName(token);
557 if (metadata_element != null) {
558 token = metadata_element.getFullName();
559 }
560
561 if (token.startsWith(StaticStrings.EXTRACTED_NAMESPACE)) {
562 token = token.substring(StaticStrings.EXTRACTED_NAMESPACE.length());
563 }
564 value_buffer.append(token);
565 if (string_tokenizer.hasMoreElements()) {
566 value_buffer.append(",");
567 }
568 }
569 value_str = value_buffer.toString();
570 }
571
572 text.append(StaticStrings.SPACE_CHARACTER);
573 if (value_str.indexOf(StaticStrings.SPACE_CHARACTER) == -1) {
574 text.append(value_str);
575 }
576 else {
577 text.append(StaticStrings.SPEECH_CHARACTER);
578 text.append(value_str);
579 text.append(StaticStrings.SPEECH_CHARACTER);
580 }
581 value_str = null;
582 }
583 option_element = null;
584 }
585 option_elements = null;
586 return text.toString();
587 }
588
589 static private String formatToString(Element command_element, boolean show_extracted_namespace) {
590 StringBuffer text = new StringBuffer(StaticStrings.FORMAT_STR);
591 text.append(StaticStrings.SPACE_CHARACTER);
592 text.append(command_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
593 text.append(StaticStrings.SPACE_CHARACTER);
594 String value_str = command_element.getAttribute(StaticStrings.VALUE_ATTRIBUTE);
595 if(value_str.length() != 0) {
596 text.append(value_str);
597 }
598 else {
599 // Remember to encode format string to Greenstone specification
600 value_str = Codec.transform(XMLTools.getValue(command_element), Codec.DOM_TO_GREENSTONE);
601 // Remove any references to a namespace for extracted metadata
602 if (!show_extracted_namespace) {
603 String match_string = "\\[" + MetadataSetManager.EXTRACTED_METADATA_NAMESPACE + "\\.";
604 value_str = value_str.replaceAll(match_string, "[");
605 }
606
607 text.append(StaticStrings.SPEECH_CHARACTER);
608 text.append(value_str);
609 text.append(StaticStrings.SPEECH_CHARACTER);
610 }
611 value_str = null;
612 return text.toString();
613 }
614
615 /** Retrieve or create the indexes Element. */
616 static private Element getOrCreateElementByTagName(String name, String conditional_attribute, String required_value) {
617 Element document_element = document.getDocumentElement();
618 NodeList elements = document_element.getElementsByTagName(name);
619 int elements_length = elements.getLength();
620 if(elements_length > 0) {
621 if(conditional_attribute == null) {
622 document_element = null;
623 return (Element) elements.item(0);
624 }
625 else {
626 for(int i = 0; i < elements_length; i++) {
627 Element element = (Element) elements.item(i);
628 if(element.getAttribute(conditional_attribute).equals(required_value)) {
629 document_element = null;
630 return element;
631 }
632 element = null;
633 }
634 }
635 }
636 // Create the element
637 Element element = document.createElement(name);
638 // If there was a property set it
639 if(conditional_attribute != null) {
640 element.setAttribute(conditional_attribute, required_value);
641 }
642 Node target_node = findInsertionPoint(element);
643 if(target_node != null) {
644 document_element.insertBefore(element, target_node);
645 }
646 else {
647 document_element.appendChild(element);
648 }
649 document_element = null;
650 return element;
651 }
652
653 static private String indexesToString(Element command_element, boolean show_extracted_namespace) {
654 boolean comment_only = false;
655 StringBuffer text = new StringBuffer("");
656 if(command_element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) {
657 text.append("#");
658 comment_only = true;
659 }
660 text.append(StaticStrings.INDEX_STR);
661 text.append(StaticStrings.TAB_CHARACTER);
662 if(!comment_only) {
663 text.append(StaticStrings.TAB_CHARACTER);
664 }
665 NodeList index_elements = command_element.getElementsByTagName(StaticStrings.INDEX_ELEMENT);
666 if (index_elements.getLength() == 0) { // no indexes
667 return "";
668 }
669 // For each index, write its level, a colon, then concatenate its child content elements into a single comma separated list
670 int index_elements_length = index_elements.getLength();
671 for(int j = 0; j < index_elements_length; j++) {
672 Element index_element = (Element) index_elements.item(j);
673 String level_str = index_element.getAttribute(StaticStrings.LEVEL_ATTRIBUTE);
674 if(level_str.length() > 0) {
675 text.append(level_str);
676 text.append(StaticStrings.COLON_CHARACTER);
677 }
678 NodeList content_elements = index_element.getElementsByTagName(StaticStrings.CONTENT_ELEMENT);
679 int content_elements_length = content_elements.getLength();
680 // Don't output anything if no indexes are set
681 if(content_elements_length == 0) {
682 return null;
683 }
684 for(int k = 0; k < content_elements_length; k++) {
685 Element content_element = (Element) content_elements.item(k);
686 String name_str = content_element.getAttribute(StaticStrings.NAME_ATTRIBUTE);
687 if(!show_extracted_namespace && name_str.startsWith(StaticStrings.EXTRACTED_NAMESPACE)) {
688 name_str = name_str.substring(StaticStrings.EXTRACTED_NAMESPACE.length());
689 }
690 text.append(name_str);
691 name_str = null;
692 if(k < content_elements_length - 1) {
693 text.append(StaticStrings.COMMA_CHARACTER);
694 }
695 content_element = null;
696 }
697 if(j < index_elements_length - 1) {
698 text.append(StaticStrings.SPACE_CHARACTER);
699 }
700 content_elements = null;
701 index_element = null;
702 }
703 index_elements = null;
704 return text.toString();
705 }
706
707 static private String indexDefaultToString(Element command_element, boolean show_extracted_namespace) {
708 StringBuffer text = new StringBuffer("");
709 if(command_element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) {
710 text.append("#");
711 }
712 text.append(StaticStrings.INDEX_DEFAULT_STR);
713 text.append(StaticStrings.TAB_CHARACTER);
714 if (!command_element.getAttribute(StaticStrings.LEVEL_ATTRIBUTE).equals("")) {
715 text.append(command_element.getAttribute(StaticStrings.LEVEL_ATTRIBUTE));
716 text.append(StaticStrings.COLON_CHARACTER);
717 }
718 NodeList content_elements = command_element.getElementsByTagName(StaticStrings.CONTENT_ELEMENT);
719 int content_elements_length = content_elements.getLength();
720 for(int j = 0; j < content_elements_length; j++) {
721 Element content_element = (Element) content_elements.item(j);
722 String name_str = content_element.getAttribute(StaticStrings.NAME_ATTRIBUTE);
723 if(!show_extracted_namespace && name_str.startsWith(StaticStrings.EXTRACTED_NAMESPACE)) {
724 name_str = name_str.substring(StaticStrings.EXTRACTED_NAMESPACE.length());
725 }
726 text.append(name_str);
727 name_str = null;
728 if(j < content_elements_length - 1) {
729 text.append(StaticStrings.COMMA_CHARACTER);
730 }
731 content_element = null;
732 }
733 content_elements = null;
734 return text.toString();
735 }
736
737 static private String languagesToString(Element command_element) {
738 StringBuffer text = new StringBuffer(StaticStrings.LANGUAGES_STR);
739 text.append(StaticStrings.TAB_CHARACTER);
740 // Retrieve all the languages and write them out in a space separated list
741 NodeList language_elements = command_element.getElementsByTagName(StaticStrings.LANGUAGE_ELEMENT);
742 int language_elements_length = language_elements.getLength();
743 if(language_elements_length == 0) {
744 return null;
745 }
746 for(int j = 0; j < language_elements_length; j++) {
747 Element language_element = (Element) language_elements.item(j);
748 text.append(language_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
749 if(j < language_elements_length - 1) {
750 text.append(StaticStrings.SPACE_CHARACTER);
751 }
752 }
753 return text.toString();
754 }
755
756 static private String languageDefaultToString(Element command_element) {
757 StringBuffer text = new StringBuffer(StaticStrings.LANGUAGE_DEFAULT_STR);
758 text.append(StaticStrings.TAB_CHARACTER);
759 text.append(command_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
760 return text.toString();
761 }
762
763 static private String languageMetadataToString(Element command_element, boolean show_extracted_namespace) {
764 if (!command_element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.TRUE_STR)) {
765 return "";
766 }
767 StringBuffer text = new StringBuffer(StaticStrings.LANGUAGE_METADATA_STR);
768 text.append(StaticStrings.TAB_CHARACTER);
769 String name_str = command_element.getAttribute(StaticStrings.NAME_ATTRIBUTE);
770 if(!show_extracted_namespace && name_str.startsWith(StaticStrings.EXTRACTED_NAMESPACE)) {
771 name_str = name_str.substring(StaticStrings.EXTRACTED_NAMESPACE.length());
772 }
773 text.append(name_str);
774 return text.toString();
775 }
776
777 static private String indexOptionsToString(Element command_element) {
778 StringBuffer text = new StringBuffer("");
779 if(command_element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) {
780 text.append("#");
781 }
782 text.append(command_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
783 text.append(StaticStrings.TAB_CHARACTER);
784 NodeList content_elements = command_element.getElementsByTagName(StaticStrings.INDEXOPTION_ELEMENT);
785 int content_elements_length = content_elements.getLength();
786 // Don't output anything if no options are set.
787 if(content_elements_length == 0) {
788 return null;
789 }
790 for(int i = 0; i < content_elements_length; i++) {
791 Element content_element = (Element) content_elements.item(i);
792 text.append(content_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
793 text.append(StaticStrings.SPACE_CHARACTER);
794 }
795 return text.substring(0, text.length() - 1);
796 }
797
798 static private String indexOptionDefaultToString(Element command_element) {
799 // Don't bother if there is no value
800 if (command_element.getAttribute(StaticStrings.VALUE_ATTRIBUTE).equals("")) {
801 return "";
802 }
803 StringBuffer text = new StringBuffer("");
804 if(command_element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) {
805 text.append("#");
806 }
807 text.append(command_element.getAttribute(StaticStrings.NAME_ATTRIBUTE));
808 text.append(StaticStrings.TAB_CHARACTER);
809 text.append(command_element.getAttribute(StaticStrings.VALUE_ATTRIBUTE));
810 return text.toString();
811 }
812
813 static private String metadataToString(Element command_element, boolean text_value) {
814 // lets first check the value - if its empty, don't bother sticking it in the config file
815 String value_str = XMLTools.getValue(command_element);
816 if (value_str.equals("")) {
817 return "";
818 }
819 boolean special = false;
820
821 StringBuffer text = new StringBuffer("");
822 String name_str = command_element.getAttribute(StaticStrings.NAME_ATTRIBUTE);
823 // 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.
824 if(name_str.equals(StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR)|| name_str.equals(StaticStrings.BUILDTYPE_STR) ) {
825 text.append(name_str);
826 text.append(StaticStrings.TAB_CHARACTER);
827 special = true;
828 }
829 else if (name_str.equals(StaticStrings.COLLECTIONMETADATA_CREATOR_STR) || name_str.equals(StaticStrings.COLLECTIONMETADATA_PUBLIC_STR) ) {
830 text.append(name_str);
831 text.append(StaticStrings.TAB_CHARACTER);
832 text.append(StaticStrings.TAB_CHARACTER);
833 special = true;
834 }
835 else {
836 text.append(StaticStrings.COLLECTIONMETADATA_STR);
837 text.append(StaticStrings.TAB_CHARACTER);
838 text.append(name_str);
839 text.append(StaticStrings.SPACE_CHARACTER);
840 String language_str = command_element.getAttribute(StaticStrings.LANGUAGE_ATTRIBUTE);
841 text.append(StaticStrings.LBRACKET_CHARACTER);
842 text.append(StaticStrings.LANGUAGE_ARGUMENT);
843 text.append(language_str);
844 text.append(StaticStrings.RBRACKET_CHARACTER);
845 text.append(StaticStrings.SPACE_CHARACTER);
846 }
847 name_str = null;
848
849 // 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
850 if(text_value == CollectionMeta.TEXT) {
851 value_str = Codec.transform(value_str, Codec.DOM_TO_TEXT);
852 }
853 else {
854 value_str = Codec.transform(value_str, Codec.DOM_TO_GREENSTONE);
855 }
856
857 // We don't wrap the email addresses in quotes, nor the other special metadata
858 if(special) {
859 text.append(value_str);
860 }
861 else {
862 text.append(StaticStrings.SPEECH_CHARACTER);
863 text.append(value_str);
864 text.append(StaticStrings.SPEECH_CHARACTER);
865 }
866 value_str = null;
867 return text.toString();
868 }
869
870 /** Parse a collect.cfg into a DOM model representation.
871 * note we are ignoring 2.39 compatibility now. */
872 private void parse(File collect_cfg_file) {
873 // hack for pre 2.71 compatibility - we need to add in a
874 // build type if there is not one there
875 boolean search_types_parsed = false;
876 boolean build_types_parsed = false;
877 try {
878 saved_collect_cfg_string_buffer = new StringBuffer();
879
880 Element collect_cfg_element = document.getDocumentElement();
881 // Read in the file one command at a time.
882 InputStream istream = new FileInputStream(collect_cfg_file);
883 Reader in_reader = new InputStreamReader(istream, ENCODING);
884 BufferedReader in = new BufferedReader(in_reader);
885 String command_str = null;
886 while((command_str = in.readLine()) != null) {
887 saved_collect_cfg_string_buffer.append(command_str + "\n");
888
889 boolean append_element = true;
890 Element command_element = null;
891 // A command may be broken over several lines.
892 command_str = command_str.trim();
893 boolean eof = false;
894 while(!eof && command_str.endsWith(StaticStrings.NEWLINE_CHARACTER)) {
895 String next_line = in.readLine();
896 if(next_line != null) {
897 next_line = next_line.trim();
898 if(next_line.length() > 0) {
899 // Remove the new line character
900 command_str = command_str.substring(0, command_str.lastIndexOf(StaticStrings.NEWLINE_CHARACTER));
901 // And append the next line, which due to the test above must be non-zero length
902 command_str = command_str + next_line;
903 }
904 next_line = null;
905 }
906 // If we've reached the end of the file theres nothing more we can do
907 else {
908 eof = true;
909 }
910 }
911 // If there is still a new line character, then we remove it and hope for the best
912 if(command_str.endsWith(StaticStrings.NEWLINE_CHARACTER)) {
913 command_str = command_str.substring(0, command_str.lastIndexOf(StaticStrings.NEWLINE_CHARACTER));
914 }
915 // Now we've either got a command to parse...
916 if(command_str.length() != 0) {
917 // Start trying to figure out what it is
918 //StringTokenizer tokenizer = new StringTokenizer(command_str);
919 // 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.
920 CommandTokenizer tokenizer = new CommandTokenizer(command_str, in);
921 String command_type = tokenizer.nextToken().toLowerCase();
922 // 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
923 if(command_element == null && command_type.equals(StaticStrings.CLASSIFY_STR)) {
924 command_element = parseClassify(command_str);
925 }
926 if(command_element == null && command_type.equals(StaticStrings.FORMAT_STR)) {
927 command_element = parseFormat(tokenizer); // Revised to handle multiple lines
928 }
929 if(command_element == null && (command_type.equals(StaticStrings.INDEX_STR) || command_type.equals(StaticStrings.COMMENTED_INDEXES_STR))) {
930 command_element = parseIndex(command_str);
931 }
932 if(command_element == null && (command_type.equals(StaticStrings.INDEX_DEFAULT_STR) || command_type.equals(StaticStrings.COMMENTED_INDEX_DEFAULT_STR))) {
933
934 command_element = parseIndexDefault(command_str);
935 }
936 if(command_element == null && command_type.equals(StaticStrings.LANGUAGES_STR)) {
937 command_element = parseLanguage(command_str);
938 }
939 if(command_element == null && command_type.equals(StaticStrings.LANGUAGE_DEFAULT_STR)) {
940 command_element = parseLanguageDefault(command_str);
941 }
942 if (command_element == null && command_type.equals(StaticStrings.LANGUAGE_METADATA_STR)) {
943 command_element = parseLanguageMetadata(command_str);
944 }
945 if(command_element == null && command_type.equals(StaticStrings.LEVELS_STR)) {
946 command_element = parseIndexOptions(command_str, StaticStrings.LEVELS_STR, true);
947 }
948 if (command_element == null && command_type.equals(StaticStrings.COMMENTED_LEVELS_STR)) {
949 command_element = parseIndexOptions(command_str, StaticStrings.LEVELS_STR, false);
950 }
951 if(command_element == null && command_type.equals(StaticStrings.LEVEL_DEFAULT_STR)) {
952 command_element = parseIndexOptionDefault(command_str, StaticStrings.LEVEL_DEFAULT_STR, true);
953 }
954 if(command_element == null && command_type.equals(StaticStrings.COMMENTED_LEVEL_DEFAULT_STR)) {
955 command_element = parseIndexOptionDefault(command_str, StaticStrings.LEVEL_DEFAULT_STR, false);
956 }
957 if (command_element == null && command_type.equals(StaticStrings.STEMOPTIONS_STR)) {
958 command_element = parseIndexOptions(command_str, StaticStrings.STEMOPTIONS_STR, true);
959 }
960 if (command_element == null && command_type.equals(StaticStrings.COMMENTED_STEMOPTIONS_STR)) {
961 command_element = parseIndexOptions(command_str, StaticStrings.STEMOPTIONS_STR, false);
962 }
963 if(command_element == null && command_type.equals(StaticStrings.COLLECTIONMETADATA_STR)) {
964 command_element = parseMetadata(tokenizer); // Revised to handle multiple lines
965 }
966 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))) {
967 command_element = parseMetadataSpecial(command_str);
968 // pre 2.71 hack
969 if (command_type.equals(StaticStrings.BUILDTYPE_STR)) {
970 build_types_parsed = true;
971 }
972 }
973 if(command_element == null && command_type.equals(StaticStrings.PLUGIN_STR)) {
974 command_element = parsePlugin(command_str);
975 }
976 // leave here for backwards compatibility
977 if(command_element == null && command_type.equals(StaticStrings.SEARCHTYPE_STR)) {
978 command_element = parseSearchType(command_str);
979 // pre 2.71 hack
980 search_types_parsed = true;
981
982 }
983 if(command_element == null && command_type.equals(StaticStrings.SUBCOLLECTION_STR)) {
984 command_element = parseSubCollection(command_str);
985 }
986 if(command_element == null && command_type.equals(StaticStrings.SUBCOLLECTION_DEFAULT_INDEX_STR)) {
987 command_element = parseSubCollectionDefaultIndex(command_str);
988 }
989 if(command_element == null && command_type.equals(StaticStrings.SUBCOLLECTION_INDEX_STR)) {
990 command_element = parseSubCollectionIndex(command_str);
991 }
992 if(command_element == null && (command_type.equals(StaticStrings.SUPERCOLLECTION_STR) || command_type.equals(StaticStrings.CCS_STR))) {
993 command_element = parseSuperCollection(command_str);
994 }
995 // Doesn't match any known type
996 command_type = null;
997 if(command_element == null) {
998 // No-one knows what to do with this command, so we create an Unknown command element
999 command_element = document.createElement(StaticStrings.UNKNOWN_ELEMENT);
1000 XMLTools.setValue(command_element, command_str);
1001 }
1002 }
1003 // Or an empty line to remember for later
1004 else {
1005 command_element = document.createElement(NEWLINE_ELEMENT);
1006 }
1007 // 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
1008 //if(append_element) {
1009 collect_cfg_element.appendChild(command_element);
1010 //}
1011 }
1012 if (!build_types_parsed) {
1013 String buildtype_type = BuildTypeManager.BUILD_TYPE_MG;
1014 if (search_types_parsed) {
1015 buildtype_type = BuildTypeManager.BUILD_TYPE_MGPP;
1016 }
1017 Element command_element = parseMetadataSpecial(StaticStrings.BUILDTYPE_STR+" "+buildtype_type);
1018 Node target_node = findInsertionPoint(command_element);
1019 if(target_node != null) {
1020 collect_cfg_element.insertBefore(command_element, target_node);
1021 }
1022 else {
1023 collect_cfg_element.appendChild(command_element);
1024 }
1025
1026 }
1027 }
1028 catch(Exception exception) {
1029 DebugStream.println("Error in CollectionConfiguration.parse(java.io.File): " + exception);
1030 DebugStream.printStackTrace(exception);
1031 }
1032 }
1033
1034
1035 private Element parseClassify(String command_str) {
1036 Element command_element = null;
1037 try {
1038 CommandTokenizer tokenizer = new CommandTokenizer(command_str);
1039 // 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).
1040 if(tokenizer.countTokens() >= 2) { // Must support "classify Phind" (no args)
1041 command_element = document.createElement(StaticStrings.CLASSIFY_ELEMENT);
1042 // First token is classify
1043 tokenizer.nextToken();
1044 // The next token is the classifier type
1045 command_element.setAttribute(StaticStrings.TYPE_ATTRIBUTE, tokenizer.nextToken());
1046 // Now we parse out the remaining arguments into a hashmapping from name to value
1047 HashMap arguments = parseArguments(tokenizer);
1048 // Assign the arguments as Option elements, but watch out for the metadata argument as we treat that differently
1049 Iterator names = arguments.keySet().iterator();
1050 while(names.hasNext()) {
1051 String name = (String) names.next();
1052 String value = (String) arguments.get(name); // Can be null
1053 // The metadata argument gets added as the content attribute
1054 if (name.equals(StaticStrings.METADATA_ARGUMENT) && value != null) {
1055 // Add the extracted namespace onto un-namespaced metadata names
1056 StringTokenizer string_tokenizer = new StringTokenizer(value, ",");
1057 value = "";
1058 while (string_tokenizer.hasMoreElements()) {
1059 String token = (String) string_tokenizer.nextElement();
1060
1061 if (token.indexOf(StaticStrings.NS_SEP) == -1) {
1062 token = StaticStrings.EXTRACTED_NAMESPACE + token;
1063 }
1064 else {
1065 MetadataElement metadata_element = MetadataTools.getMetadataElementWithName(token);
1066 if (metadata_element != null) {
1067 token = metadata_element.getDisplayName();
1068 }
1069 }
1070
1071 if (!value.equals("")) {
1072 value = value + ",";
1073 }
1074 value = value + token;
1075 }
1076 }
1077 // Everything else is an Option Element
1078 Element option_element = document.createElement(StaticStrings.OPTION_ELEMENT);
1079 option_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name.substring(1));
1080 if(value != null) {
1081 // Remove any speech marks appended in strings containing whitespace
1082 if(value.startsWith(StaticStrings.SPEECH_CHARACTER) && value.endsWith(StaticStrings.SPEECH_CHARACTER)) {
1083 value = value.substring(1, value.length() - 1);
1084 }
1085 XMLTools.setValue(option_element, value);
1086 }
1087 option_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1088 command_element.appendChild(option_element);
1089 option_element = null;
1090 name = null;
1091 value = null;
1092 }
1093 names = null;
1094 arguments = null;
1095 }
1096 tokenizer = null;
1097 }
1098 catch(Exception error) {
1099 }
1100 return command_element;
1101 }
1102
1103 private Element parseFormat(CommandTokenizer tokenizer) {
1104 Element command_element = null;
1105 try {
1106 command_element = document.createElement(StaticStrings.FORMAT_ELEMENT);
1107 String name_str = tokenizer.nextToken();
1108 String value_str = tokenizer.nextToken();
1109 if(name_str != null && value_str != null) {
1110 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_str);
1111 // If the value is true or false we add it as an attribute
1112 if(value_str.equalsIgnoreCase(StaticStrings.TRUE_STR) || value_str.equalsIgnoreCase(StaticStrings.FALSE_STR)) {
1113 command_element.setAttribute(StaticStrings.VALUE_ATTRIBUTE, value_str.toLowerCase());
1114 }
1115 // Otherwise it gets added as a text node
1116 else {
1117 // Ready the value str (which can contain all sorts of funky characters) for writing as a DOM value
1118 value_str = Codec.transform(value_str, Codec.GREENSTONE_TO_DOM);
1119 XMLTools.setValue(command_element, value_str);
1120 }
1121 }
1122 else {
1123 command_element = null;
1124 }
1125 name_str = null;
1126 value_str = null;
1127 }
1128 catch (Exception exception) {
1129 DebugStream.printStackTrace(exception);
1130 command_element = null;
1131 }
1132 return command_element;
1133 }
1134
1135 private Element parseIndex(String command_str) {
1136 Element command_element = null;
1137 try {
1138 StringTokenizer tokenizer = new StringTokenizer(command_str);
1139 String command = tokenizer.nextToken();
1140 command_element = document.createElement(StaticStrings.INDEXES_ELEMENT);
1141 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, (command.equals(StaticStrings.INDEX_STR) ? StaticStrings.TRUE_STR : StaticStrings.FALSE_STR));
1142 command = null;
1143 if(!tokenizer.hasMoreTokens()) {
1144
1145 // there are no indexes
1146 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR);
1147 command_element.setAttribute(StaticStrings.MGPP_ATTRIBUTE, StaticStrings.FALSE_STR); // for now
1148 tokenizer = null;
1149 return command_element;
1150 }
1151
1152 while(tokenizer.hasMoreTokens()) {
1153 Element index_element = document.createElement(StaticStrings.INDEX_ELEMENT);
1154 String index_str = tokenizer.nextToken();
1155 // 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.
1156 boolean old_index;
1157 if(index_str.indexOf(StaticStrings.COLON_CHARACTER) != -1) {
1158 old_index = true;
1159 index_element.setAttribute(StaticStrings.LEVEL_ATTRIBUTE, index_str.substring(0, index_str.indexOf(StaticStrings.COLON_CHARACTER)));
1160 index_str = index_str.substring(index_str.indexOf(StaticStrings.COLON_CHARACTER) + 1);
1161 command_element.setAttribute(StaticStrings.MGPP_ATTRIBUTE, StaticStrings.FALSE_STR);
1162 }
1163 else {
1164 command_element.setAttribute(StaticStrings.MGPP_ATTRIBUTE, StaticStrings.TRUE_STR);
1165 old_index = false;
1166 }
1167 StringTokenizer content_tokenizer = new StringTokenizer(index_str, StaticStrings.COMMA_CHARACTER);
1168 while(content_tokenizer.hasMoreTokens()) {
1169 Element content_element = document.createElement(StaticStrings.CONTENT_ELEMENT);
1170 String content_str = content_tokenizer.nextToken();
1171 // 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.
1172 if(content_str.indexOf(StaticStrings.NS_SEP) == -1) {
1173 if(content_str.equals(StaticStrings.TEXT_STR) || (!old_index && content_str.equals(StaticStrings.ALLFIELDS_STR))) {
1174 // Our special strings are OK.
1175 }
1176 else {
1177 content_str = StaticStrings.EXTRACTED_NAMESPACE + content_str;
1178 }
1179 }
1180 content_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, content_str);
1181 index_element.appendChild(content_element);
1182 content_element = null;
1183 }
1184 content_tokenizer = null;
1185 index_str = null;
1186 command_element.appendChild(index_element);
1187 index_element = null;
1188 }
1189 tokenizer = null;
1190 }
1191 catch (Exception exception) {
1192 exception.printStackTrace();
1193 }
1194 return command_element;
1195 }
1196
1197 private Element parseIndexDefault(String command_str) {
1198 Element command_element = null;
1199 try {
1200 StringTokenizer tokenizer = new StringTokenizer(command_str);
1201 if(tokenizer.countTokens() >= 2) {
1202 command_element = document.createElement(StaticStrings.INDEX_DEFAULT_ELEMENT);
1203 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, ((tokenizer.nextToken()).equals(StaticStrings.INDEX_DEFAULT_STR) ? StaticStrings.TRUE_STR : StaticStrings.FALSE_STR));
1204 String index_str = tokenizer.nextToken();
1205 String level="";
1206 if (index_str.indexOf(StaticStrings.COLON_CHARACTER) !=-1){
1207 level = index_str.substring(0, index_str.indexOf(StaticStrings.COLON_CHARACTER));
1208 }
1209
1210 command_element.setAttribute(StaticStrings.LEVEL_ATTRIBUTE,level);
1211
1212 String content_str = index_str;
1213
1214 if (index_str.indexOf(StaticStrings.COLON_CHARACTER) !=-1){
1215 content_str = index_str.substring(index_str.indexOf(StaticStrings.COLON_CHARACTER) + 1);
1216 }
1217
1218 StringTokenizer content_tokenizer = new StringTokenizer(content_str, StaticStrings.COMMA_CHARACTER);
1219 while(content_tokenizer.hasMoreTokens()) {
1220 Element content_element = document.createElement(StaticStrings.CONTENT_ELEMENT);
1221 content_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, content_tokenizer.nextToken());
1222 command_element.appendChild(content_element);
1223 content_element = null;
1224 }
1225 content_tokenizer = null;
1226 content_str = null;
1227 content_str = null;
1228 index_str = null;
1229 }
1230 tokenizer = null;
1231 }
1232 catch (Exception exception) {
1233 }
1234 return command_element;
1235 }
1236
1237 private Element parseLanguage(String command_str) {
1238 Element command_element = null;
1239 try {
1240 StringTokenizer tokenizer = new StringTokenizer(command_str);
1241 tokenizer.nextToken();
1242 if(tokenizer.hasMoreTokens()) {
1243 command_element = document.createElement(StaticStrings.LANGUAGES_ELEMENT);
1244 while(tokenizer.hasMoreTokens()) {
1245 Element language_element = document.createElement(StaticStrings.LANGUAGE_ELEMENT);
1246 language_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, tokenizer.nextToken());
1247 command_element.appendChild(language_element);
1248 language_element = null;
1249 }
1250 }
1251 tokenizer = null;
1252 }
1253 catch (Exception exception) {
1254 }
1255 return command_element;
1256 }
1257
1258 private Element parseLanguageDefault(String command_str) {
1259 Element command_element = null;
1260 try {
1261 StringTokenizer tokenizer = new StringTokenizer(command_str);
1262 if(tokenizer.countTokens() >= 2) {
1263 command_element = document.createElement(StaticStrings.LANGUAGE_DEFAULT_ELEMENT);
1264 tokenizer.nextToken();
1265 String default_language_str = tokenizer.nextToken();
1266 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, default_language_str);
1267 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1268 default_language_str = null;
1269 }
1270 tokenizer = null;
1271 }
1272 catch (Exception exception) {
1273 }
1274 return command_element;
1275 }
1276
1277 private Element parseLanguageMetadata(String command_str) {
1278 Element command_element = null;
1279 try {
1280 StringTokenizer tokenizer = new StringTokenizer(command_str);
1281 if(tokenizer.countTokens() >= 2) {
1282 command_element = document.createElement(StaticStrings.LANGUAGE_METADATA_ELEMENT);
1283 tokenizer.nextToken();
1284 String language_metadata_str = tokenizer.nextToken();
1285 if (language_metadata_str.indexOf(StaticStrings.NS_SEP) == -1) {
1286 language_metadata_str = StaticStrings.EXTRACTED_NAMESPACE + language_metadata_str;
1287 }
1288 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, language_metadata_str);
1289 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1290 language_metadata_str = null;
1291 }
1292 tokenizer = null;
1293
1294 }
1295 catch (Exception exception) {
1296 }
1297 return command_element;
1298 }
1299
1300 private Element parseIndexOptions(String command_str, String type, boolean assigned) {
1301 Element command_element = null;
1302 try {
1303 StringTokenizer tokenizer = new StringTokenizer(command_str);
1304 // First token is command type
1305 String command = tokenizer.nextToken();
1306 if(tokenizer.hasMoreTokens()) {
1307 command_element = document.createElement(StaticStrings.INDEXOPTIONS_ELEMENT);
1308 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE,type);
1309 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, (assigned ? StaticStrings.TRUE_STR : StaticStrings.FALSE_STR));
1310 while(tokenizer.hasMoreTokens()) {
1311 Element option_element = document.createElement(StaticStrings.INDEXOPTION_ELEMENT);
1312 option_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, tokenizer.nextToken());
1313 command_element.appendChild(option_element);
1314 option_element = null;
1315 }
1316 }
1317 command = null;
1318 }
1319 catch(Exception exception) {
1320 }
1321 return command_element;
1322 }
1323
1324 private Element parseIndexOptionDefault(String command_str, String type, boolean assigned) {
1325 Element command_element = null;
1326 try {
1327 StringTokenizer tokenizer = new StringTokenizer(command_str);
1328 // First token is command type
1329 String command = tokenizer.nextToken();
1330 if(tokenizer.hasMoreTokens()) {
1331 command_element = document.createElement(StaticStrings.INDEXOPTION_DEFAULT_ELEMENT);
1332 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, (assigned ? StaticStrings.TRUE_STR : StaticStrings.FALSE_STR)); // is it commented out or not?
1333 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, type);
1334 command_element.setAttribute(StaticStrings.VALUE_ATTRIBUTE, tokenizer.nextToken());
1335 }
1336
1337 tokenizer = null;
1338 }
1339 catch (Exception exception) {
1340 }
1341 return command_element;
1342 }
1343
1344 private Element parseMetadata(CommandTokenizer tokenizer) {
1345 Element command_element = null;
1346 try {
1347 command_element = document.createElement(StaticStrings.COLLECTIONMETADATA_ELEMENT);
1348 String name_str = tokenizer.nextToken();
1349 String value_str = tokenizer.nextToken();
1350 if(name_str != null && value_str != null) {
1351 String language_str = Configuration.getLanguage();
1352 // Check if the value string is actually a language string
1353 if(value_str.startsWith(StaticStrings.LBRACKET_CHARACTER) && value_str.endsWith(StaticStrings.RBRACKET_CHARACTER)) {
1354 language_str = value_str.substring(value_str.indexOf(StaticStrings.LANGUAGE_ARGUMENT) + 2, value_str.length() - 1);
1355 value_str = tokenizer.nextToken();
1356 }
1357 if(value_str != null) {
1358 // Ready the value str (which can contain all sorts of funky characters) for writing as a DOM value
1359 value_str = Codec.transform(value_str, Codec.GREENSTONE_TO_DOM);
1360 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_str);
1361 command_element.setAttribute(StaticStrings.LANGUAGE_ATTRIBUTE, language_str);
1362 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1363 XMLTools.setValue(command_element, value_str);
1364 }
1365 else {
1366 command_element = null;
1367 }
1368 language_str = null;
1369 }
1370 else {
1371 command_element = null;
1372 }
1373 name_str = null;
1374 value_str = null;
1375 }
1376 catch (Exception exception) {
1377 DebugStream.printStackTrace(exception);
1378 command_element = null;
1379 }
1380 return command_element;
1381 }
1382
1383 private Element parseMetadataSpecial(String command_str) {
1384 Element command_element = null;
1385 try {
1386 StringTokenizer tokenizer = new StringTokenizer(command_str);
1387 if(tokenizer.countTokens() >= 2) {
1388 String name_str = tokenizer.nextToken();
1389 String value_str = tokenizer.nextToken();
1390 if (name_str.equals(StaticStrings.COLLECTIONMETADATA_CREATOR_STR)) {
1391 command_element = document.createElement(StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT);
1392 }
1393 else if(name_str.equals(StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR)) {
1394 command_element = document.createElement(StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT);
1395 }
1396 else if(name_str.equals(StaticStrings.COLLECTIONMETADATA_PUBLIC_STR)) {
1397 command_element = document.createElement(StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT);
1398 }
1399 else if (name_str.equals(StaticStrings.BUILDTYPE_STR)) {
1400 command_element = document.createElement(StaticStrings.BUILDTYPE_ELEMENT);
1401 }
1402 if(command_element != null) {
1403 command_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_str);
1404 command_element.setAttribute(StaticStrings.LANGUAGE_ATTRIBUTE, StaticStrings.ENGLISH_LANGUAGE_STR);
1405 command_element.setAttribute(StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR);
1406 command_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
1407 if(value_str.startsWith(StaticStrings.SPEECH_CHARACTER) && value_str.endsWith(StaticStrings.SPEECH_CHARACTER)) {
1408 value_str = value_str.substring(1, value_str.length() - 1);
1409 }
1410 XMLTools.setValue(command_element, value_str);
1411 }
1412 value_str = null;
1413 name_str = null;
1414 }
1415 tokenizer = null;
1416 }
1417 catch (Exception exception) {
1418 }
1419 return command_element;
1420 }
1421
1422 private Element parsePlugin(String command_str) {
1423 Element command_element = null;
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.