Changeset 24801 for main/trunk/gli/src/org/greenstone/gatherer/cdm/CollectionConfigXMLReadWrite.java
- Timestamp:
- 2011-11-08T13:45:45+13:00 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
main/trunk/gli/src/org/greenstone/gatherer/cdm/CollectionConfigXMLReadWrite.java
r24425 r24801 42 42 import org.w3c.dom.*; 43 43 44 public class CollectionConfigXMLReadWrite { 45 46 static final private String PLUGOUT_ELEMENT = "plugout";//used by building flax collections 47 48 /** ******************************************************************************************************** 49 The code from this point below are used for greenstone 3 collection configuration, i.e., read ColletionConfig.xml 50 * into the internal DOM tree, and convert the internal DOM tree back to CollectionConfig.xml. 51 * 52 Methods named 'doXXXX' are for convert collectionConfig.xml into the internal configuration xml structure; 53 Methods named 'convertXXXX' are for convert the internal configuration xml structure back to collectionConfig.xml. 54 ************************************************************************************************************ */ 55 56 /**Arguments: metadataListNode->the 'displayItemList' element in collectionConfig.xml 57 name_value->the value of the 'name' attribute of 'index' element; 58 att_value->the value of the 'name' attribute of 'displayItem' element 59 return: an ArrayList of the contructed 'CollectionMetadata' elements 60 */ 61 static private ArrayList doDisplayItemList (Document to, Node displayListNode, String att_value, String name_value) { 62 Element toElement = to.getDocumentElement (); 63 ArrayList display_item_list = new ArrayList (); 64 ArrayList item_list = XMLTools.getNamedElementList ((Element)displayListNode, 65 StaticStrings.DISPLAYITEM_STR, StaticStrings.NAME_ATTRIBUTE, att_value); 66 if (item_list == null) { 67 return null; 68 } 69 70 for (int i=0; i<item_list.size (); i++) { 71 Element item = (Element)item_list.get (i); 72 String text = XMLTools.getNodeText (item); 73 74 //If there is nothing to display, don't bother creating the element 75 if (text == "") { 76 continue; 77 } 78 //get the value in 'lang=value' 79 String lang = item.getAttribute (StaticStrings.LANG_STR); 80 81 Element e = to.createElement (StaticStrings.COLLECTIONMETADATA_ELEMENT); 82 e.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 83 e.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_value); 84 e.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, lang); 85 XMLTools.setNodeText (e, text); 86 display_item_list.add (e); 87 } 88 return display_item_list; 89 } 90 91 static private ArrayList doMetadataList (Document to, Node metadataListNode, String ele_name, String att_value) { 92 Element toElement = to.getDocumentElement (); 93 ArrayList metadata_list = new ArrayList (); 94 95 ArrayList item_list = XMLTools.getNamedElementList ((Element)metadataListNode, 96 StaticStrings.METADATA_STR, StaticStrings.NAME_ATTRIBUTE, att_value); 97 if (item_list == null) { 98 return null; 99 } 100 101 for (int i=0; i<item_list.size (); i++) { 102 Element item = (Element)item_list.get (i); 103 String text = XMLTools.getNodeText (item); 104 105 //If there is nothing to display, don't bother creating the element 106 if (text == "") { 107 continue; 108 } 109 //get the value in 'lang=value' 110 String lang = item.getAttribute (StaticStrings.LANG_STR); 111 112 Element element = to.createElement (ele_name); 113 element.setAttribute (StaticStrings.NAME_ATTRIBUTE, att_value); 114 element.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, lang); 115 element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 116 element.setAttribute (StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR); 117 XMLTools.setNodeText (element, text); 118 119 metadata_list.add (element); 120 } 121 return metadata_list; 122 } 123 // 'to' is the internal structure 124 static private void doMGIndexes (Document to, Node searchNode) { 125 Element toElement = to.getDocumentElement (); 126 Element indexes_element = to.createElement (StaticStrings.INDEXES_ELEMENT);//<Indexes> 127 indexes_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 128 indexes_element.setAttribute (StaticStrings.MGPP_ATTRIBUTE, StaticStrings.FALSE_STR); 129 130 NodeList index_children = ((Element)searchNode).getElementsByTagName (StaticStrings.INDEX_LOW_STR);//index 131 int num_nodes = index_children.getLength (); 132 133 for (int i=0; i<num_nodes; i++) { 134 Element e = (Element)index_children.item (i); 135 String index_str = e.getAttribute (StaticStrings.NAME_ATTRIBUTE); 136 String index_str_display = index_str;//used for creating collectionmetadata for this index 137 Element index_element = to.createElement (StaticStrings.INDEX_ELEMENT);//<Index> 138 139 // For mg, it's the 'Old G2.38 and earlier' that use level:source tuplets, but we double check it anyway 140 boolean old_index = true; 141 if(index_str.indexOf (StaticStrings.COLON_CHARACTER) == -1) { 142 // It doesn't contain ':' character 143 System.err.println ("Something is wrong! the index should be level:source tuplets."); 144 old_index = false; 145 } 146 else { 147 // Handling 'index' element 148 index_element.setAttribute (StaticStrings.LEVEL_ATTRIBUTE, 149 index_str.substring (0, index_str.indexOf (StaticStrings.COLON_CHARACTER))); 150 index_str = index_str.substring (index_str.indexOf (StaticStrings.COLON_CHARACTER) + 1); 151 152 //Each index may have a list of comma-separated strings. 153 //split them into 'content' elements in the internal structure 154 StringTokenizer content_tokenizer = new StringTokenizer (index_str, StaticStrings.COMMA_CHARACTER); 155 //index_str = ""; 156 while(content_tokenizer.hasMoreTokens ()) { 157 // Replace index_str to be qualified name, eg. dc.Subject and keywords insread of dc.Subject. 158 159 160 Element content_element = to.createElement (StaticStrings.CONTENT_ELEMENT); 161 String content_str = content_tokenizer.nextToken (); 162 // Since the contents of indexes have to be certain keywords, or metadata elements, 163 //if the content isn't a keyword and doesn't yet have a namespace, append the extracted metadata namespace. 164 if(content_str.indexOf (StaticStrings.NS_SEP) == -1) { 165 if(content_str.equals (StaticStrings.TEXT_STR) || 166 (!old_index && content_str.equals (StaticStrings.ALLFIELDS_STR))) { 167 // in this case, do nothing 168 } 169 else { 170 content_str = StaticStrings.EXTRACTED_NAMESPACE + content_str; 171 } 172 } 173 174 content_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, content_str); 175 index_element.appendChild (content_element); 176 content_element = null; 177 } // while ends 178 179 indexes_element.appendChild (index_element); 180 181 // Handling 'displayItem' elements and Constructing 'collectionmetadata' elements 182 // Use the fully qualified index names 183 ArrayList collectionmetadata_list = doDisplayItemList (to, e, StaticStrings.NAME_ATTRIBUTE, index_str_display); 184 appendArrayList (toElement, collectionmetadata_list); 185 } //else ends 186 } //for loop ends 187 appendProperly (toElement, indexes_element); 188 189 //***// 190 // create another set of <indexes> which will be used when user switches to MGPP/LUCENE 191 // i.e. we build a default index set for a start 192 193 String []index_strs = 194 {StaticStrings.TEXT_STR, 195 StaticStrings.EXTRACTED_NAMESPACE + StaticStrings.TITLE_ELEMENT, 196 StaticStrings.EXTRACTED_NAMESPACE + StaticStrings.SOURCE_ELEMENT}; 197 198 Element mgpp_indexes = to.createElement (StaticStrings.INDEXES_ELEMENT);//<Indexes> 199 mgpp_indexes.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR); 200 mgpp_indexes.setAttribute (StaticStrings.MGPP_ATTRIBUTE, StaticStrings.TRUE_STR); 201 for (int i=0; i<index_strs.length; i++) { 202 Element index_element = to.createElement (StaticStrings.INDEX_ELEMENT);//<Index> 203 Element content_element = to.createElement (StaticStrings.CONTENT_ELEMENT); 204 content_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, index_strs[i]); 205 index_element.appendChild (content_element); 206 mgpp_indexes.appendChild (index_element); 207 208 // Contructing 'collectionmetadata' elements for 'mgpp' indexes 209 Element collectionmetadata = to.createElement (StaticStrings.COLLECTIONMETADATA_ELEMENT); 210 collectionmetadata.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 211 collectionmetadata.setAttribute (StaticStrings.NAME_ATTRIBUTE, index_strs[i]); 212 collectionmetadata.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, StaticStrings.ENGLISH_LANGUAGE_STR); 213 if (index_strs[i].indexOf (StaticStrings.NS_SEP) != -1) { 214 index_strs[i] = index_strs[i].substring (index_strs[i].indexOf (StaticStrings.NS_SEP) + 1); 215 } 216 XMLTools.setNodeText (collectionmetadata, index_strs[i]); 217 218 appendProperly (toElement, collectionmetadata); 219 220 } 221 appendProperly (toElement, mgpp_indexes); 222 } 223 224 //This is actually doing indexes for both mgpp and lucene 225 static private void doMGPPIndexes (Document to, Node searchNode) { 226 Element toElement = to.getDocumentElement (); 227 Element indexes_element = to.createElement (StaticStrings.INDEXES_ELEMENT);//<Indexes> 228 indexes_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 229 indexes_element.setAttribute (StaticStrings.MGPP_ATTRIBUTE, StaticStrings.TRUE_STR); 230 231 NodeList index_children = ((Element)searchNode).getElementsByTagName (StaticStrings.INDEX_LOW_STR);//index 232 int num_nodes = index_children.getLength (); 233 234 for (int i=0; i<num_nodes; i++) { 235 236 Element index_element = to.createElement (StaticStrings.INDEX_ELEMENT);//<Index> 237 Element e = (Element)index_children.item (i); 238 String index_str = e.getAttribute (StaticStrings.NAME_ATTRIBUTE); 239 String index_str_display = index_str;//for creating collectionmetadata for this index 240 241 // Handling 'index' element 242 // Double check to make sure it's not colon separated style index. 243 boolean old_index = false; 244 if(index_str.indexOf (StaticStrings.COLON_CHARACTER) != -1) { 245 System.err.println ("Something is wrong! the index should NOT be level:source tuplets style."); 246 old_index = true; 247 } 248 //Each index may have a list of comma-separated strings. 249 //split them into 'content' elements in the internal structure 250 StringTokenizer content_tokenizer = new StringTokenizer (index_str, StaticStrings.COMMA_CHARACTER); 251 //index_str = ""; 252 while(content_tokenizer.hasMoreTokens ()) { 253 // Replace index_str to be qualified name, eg. dc.Subject and keywords insread of dc.Subject. 254 255 Element content_element = to.createElement (StaticStrings.CONTENT_ELEMENT); 256 String content_str = content_tokenizer.nextToken (); 257 // 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. 258 if(content_str.indexOf (StaticStrings.NS_SEP) == -1) { 259 if(content_str.equals (StaticStrings.TEXT_STR)) { 260 // in this case, do nothing 261 } 262 else { 263 content_str = StaticStrings.EXTRACTED_NAMESPACE + content_str; 264 } 265 } 266 content_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, content_str); 267 index_element.appendChild (content_element); 268 content_element = null; 269 } //while ends 270 271 indexes_element.appendChild (index_element); 272 273 274 index_element = null; 275 276 // Handling 'displayItem' element of this 'index' element 277 // 'e' is the parent element 'index' of 'displayItem' element 278 ArrayList collectionmetadata_list = doDisplayItemList (to, e, StaticStrings.NAME_ATTRIBUTE, index_str_display); 279 appendArrayList (toElement, collectionmetadata_list); 280 281 282 } // for loop ends 283 toElement.appendChild (indexes_element); 284 285 // create another set of <indexes> which will be used when user switches to MG 286 // i.e. we build a default index set for a start 287 Element mg_indexes = to.createElement (StaticStrings.INDEXES_ELEMENT);//<Indexes> 288 mg_indexes.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR); 289 mg_indexes.setAttribute (StaticStrings.MGPP_ATTRIBUTE, StaticStrings.FALSE_STR); 290 291 //put the namespace '.ex' as prefix to the indexes 292 String []index_strs = 293 {StaticStrings.TEXT_STR, 294 StaticStrings.EXTRACTED_NAMESPACE + StaticStrings.TITLE_ELEMENT, 295 StaticStrings.EXTRACTED_NAMESPACE + StaticStrings.SOURCE_ELEMENT}; 296 for (int i=0; i<index_strs.length; i++) { 297 Element index_element = to.createElement (StaticStrings.INDEX_ELEMENT);//<Index> 298 index_element.setAttribute (StaticStrings.LEVEL_ATTRIBUTE, StaticStrings.DOCUMENT_STR); 299 Element content_element = to.createElement (StaticStrings.CONTENT_ELEMENT); 300 content_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, index_strs[i]); 301 index_element.appendChild (content_element); 302 303 mg_indexes.appendChild (index_element); 304 305 // Contructing 'collectionmetadata' elements for 'mg' indexes 306 Element collectionmetadata = to.createElement (StaticStrings.COLLECTIONMETADATA_ELEMENT); 307 collectionmetadata.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 308 String temp = StaticStrings.DOCUMENT_STR.concat (StaticStrings.COLON_CHARACTER).concat (index_strs[i]); 309 collectionmetadata.setAttribute (StaticStrings.NAME_ATTRIBUTE, temp); 310 collectionmetadata.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, StaticStrings.ENGLISH_LANGUAGE_STR); 311 if (index_strs[i].indexOf (StaticStrings.NS_SEP) != -1) { 312 index_strs[i] = index_strs[i].substring (index_strs[i].indexOf (StaticStrings.NS_SEP) + 1); 313 } 314 XMLTools.setNodeText (collectionmetadata, index_strs[i]); 315 316 appendProperly (toElement, collectionmetadata); 317 318 } 319 toElement.appendChild (mg_indexes); 320 321 } 322 323 static private void doDisplayFormat (Document to, Element from) { 324 //display element in the xml file 325 Element de = (Element)XMLTools.getChildByTagName (from, StaticStrings.DISPLAY_STR); 326 if (de == null) { 327 return; 328 } 329 //format element in the display element 330 Element fe = (Element)XMLTools.getChildByTagName (de, StaticStrings.FORMAT_STR); 331 332 to.getDocumentElement ().appendChild (doFormat(to, fe, StaticStrings.DISPLAY_STR)); 333 } 334 335 //construct 'DefaultIndex' element in the internal structure from collectionConfig.xml 336 static private void doDefaultIndex (Document to, Node searchNode) { 337 Element toElement = to.getDocumentElement (); 338 Element default_index_element = to.createElement (StaticStrings.INDEX_DEFAULT_ELEMENT); 339 default_index_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 340 341 Element e = (Element)XMLTools.getChildByTagName (searchNode, StaticStrings.INDEX_DEFAULT_ELEMENT_LOWERCASE);//defaultIndex 342 if (e == null) { 343 return; 344 } 345 String index_str = e.getAttribute (StaticStrings.NAME_ATTRIBUTE); 346 347 boolean old_index = false; 348 if(index_str.indexOf (StaticStrings.COLON_CHARACTER) != -1) { 349 //The index is 'level:source tuplets' which is for mg. Take out 'level' 350 old_index = true; 351 default_index_element.setAttribute (StaticStrings.LEVEL_ATTRIBUTE, 352 index_str.substring (0, index_str.indexOf (StaticStrings.COLON_CHARACTER))); 353 index_str = index_str.substring (index_str.indexOf (StaticStrings.COLON_CHARACTER) + 1); 354 } else { 355 default_index_element.setAttribute (StaticStrings.LEVEL_ATTRIBUTE, ""); 356 } 357 358 //Each index may have a list of comma-separated strings. 359 //split them into 'content' elements in the internal structure 360 StringTokenizer content_tokenizer = new StringTokenizer (index_str, StaticStrings.COMMA_CHARACTER); 361 while(content_tokenizer.hasMoreTokens ()) { 362 Element content_element = to.createElement (StaticStrings.CONTENT_ELEMENT); 363 String content_str = content_tokenizer.nextToken (); 364 // 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. 365 if(content_str.indexOf (StaticStrings.NS_SEP) == -1) { 366 if(content_str.equals (StaticStrings.TEXT_STR) || 367 (!old_index && content_str.equals (StaticStrings.ALLFIELDS_STR))) { 368 // in this case, do nothing 369 } 370 else { 371 content_str = StaticStrings.EXTRACTED_NAMESPACE + content_str; 372 } 373 } 374 375 content_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, content_str); 376 default_index_element.appendChild (content_element); 377 content_element = null; 378 } 379 appendProperly (toElement, default_index_element); 380 } 381 // For mg, this method is still called, but make it 'assigned=false' 382 static private void doDefaultLevel (Document to, Node searchNode) { 383 Element toElement = to.getDocumentElement (); 384 Element default_index_option = to.createElement (StaticStrings.INDEXOPTION_DEFAULT_ELEMENT); 385 default_index_option.setAttribute (StaticStrings.NAME_STR, StaticStrings.LEVEL_DEFAULT_STR); 386 387 Element e = (Element)XMLTools.getChildByTagName (searchNode, StaticStrings.LEVEL_DEFAULT_ELEMENT); 388 if (e != null) { 389 default_index_option.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 390 String level = e.getAttribute (StaticStrings.NAME_ATTRIBUTE); 391 default_index_option.setAttribute (StaticStrings.VALUE_ATTRIBUTE, level); 392 } else { 393 //In the case of mg, there's no level! build a default one using 'assigned=false value=document' 394 default_index_option.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR); 395 default_index_option.setAttribute (StaticStrings.VALUE_ATTRIBUTE, StaticStrings.DOCUMENT_STR); 396 } 397 appendProperly (toElement, default_index_option); 398 } 399 400 // Transform plugins (pluginListNode) of collectionConfig.xml into the internal structure (i.e. Document to) 401 static private void doPlugin (Document to, Node pluginListNode) { 402 Element toElement = to.getDocumentElement (); 403 NodeList plugin_children = ((Element)pluginListNode).getElementsByTagName (StaticStrings.PLUGIN_STR); 404 int plugin_nodes = plugin_children.getLength (); 405 406 if (plugin_nodes < 1) { 407 return; 408 } 409 410 for (int i=0; i<plugin_nodes; i++) { 411 Element e = (Element)plugin_children.item (i); 412 String str = e.getAttribute (StaticStrings.NAME_ATTRIBUTE); 413 str = Utility.ensureNewPluginName(str); 414 Element plugin_element = to.createElement (StaticStrings.PLUGIN_ELEMENT); 415 plugin_element.setAttribute (StaticStrings.TYPE_ATTRIBUTE, str); 416 417 418 NodeList option_children = e.getElementsByTagName (StaticStrings.OPTION_STR); 419 420 for (int j=0; j<option_children.getLength (); j++) { 421 Element el = (Element)option_children.item (j); 422 String name_str = el.getAttribute (StaticStrings.NAME_ATTRIBUTE); 423 if (name_str.startsWith (StaticStrings.MINUS_CHARACTER)) { 424 name_str = name_str.substring (1); 425 } 426 String value_str = el.getAttribute (StaticStrings.VALUE_ATTRIBUTE); 427 Element option_element = null; 428 429 if (name_str.equals ("") && !value_str.equals ("")) { 430 continue; 431 } 432 433 434 option_element = to.createElement (StaticStrings.OPTION_ELEMENT); 435 option_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 436 if(name_str.equals (StaticStrings.RECPLUG_STR) && value_str.equals (StaticStrings.USE_METADATA_FILES_ARGUMENT)) { 437 continue; // ignore this option 438 } 439 440 if(value_str != null) { 441 // Remove any speech marks appended in strings containing whitespace 442 if(value_str.startsWith (StaticStrings.SPEECH_CHARACTER) && value_str.endsWith (StaticStrings.SPEECH_CHARACTER)) { 443 value_str = value_str.substring (1, value_str.length () - 1); 444 } 445 if(name_str.equals (StaticStrings.METADATA_STR)) { 446 // 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. 447 String[] values = value_str.split (StaticStrings.COMMA_CHARACTER); 448 value_str = ""; 449 for (int k=0; k<=values.length-1; k++) { 450 if (values[k].indexOf (StaticStrings.NS_SEP) == -1) { 451 values[k] = StaticStrings.EXTRACTED_NAMESPACE + values[k]; 452 } 453 454 if (k < values.length-1) { 455 value_str = value_str + values[k] + StaticStrings.COMMA_CHARACTER; 456 457 } else { 458 value_str = value_str + values[k]; 459 } 460 } 461 } 462 } 463 if (!name_str.equals ("")) { 464 option_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str); 465 } 466 if (!value_str.equals ("")) { 467 XMLTools.setNodeText (option_element, value_str); 468 } 469 plugin_element.appendChild (option_element); 470 471 } 472 473 appendProperly (toElement, plugin_element); 474 } 475 476 } 477 478 //Handle classifiers 479 static private void doClassifier (Document to, Node browseNode) { 480 Element toElement = to.getDocumentElement (); 481 NodeList classifier_children = ((Element)browseNode).getElementsByTagName (StaticStrings.CLASSIFIER_STR); 482 int num_nodes = classifier_children.getLength (); 483 484 if (num_nodes < 1) { 485 return; 486 } 487 488 for (int i=0; i<num_nodes; i++) { 489 Element e = (Element)classifier_children.item (i); 490 String str = e.getAttribute (StaticStrings.NAME_ATTRIBUTE); 491 Element classify_element = to.createElement (StaticStrings.CLASSIFY_ELEMENT); 492 classify_element.setAttribute (StaticStrings.TYPE_ATTRIBUTE, str); 493 494 String options_str = ""; 495 NodeList option_children = e.getElementsByTagName (StaticStrings.OPTION_STR); 496 for (int j=0; j<option_children.getLength (); j++) { 497 Element el = (Element)option_children.item (j); 498 String name_str = el.getAttribute (StaticStrings.NAME_ATTRIBUTE); 499 options_str = options_str + ((name_str.equals(""))? "" : (" " + name_str)); 500 if (name_str.startsWith (StaticStrings.MINUS_CHARACTER)) { 501 name_str = name_str.substring (1); 502 } 503 String value_str = el.getAttribute (StaticStrings.VALUE_ATTRIBUTE); 504 options_str = options_str + ((name_str.equals(""))? "" : (" " + value_str)); 505 Element option_element = null; 506 507 if (name_str.equals ("") && !value_str.equals ("")) { 508 continue; //invalid condition 509 } 510 511 option_element = to.createElement (StaticStrings.OPTION_ELEMENT); 512 option_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 513 514 if (!name_str.equals ("")) { 515 option_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str); 516 } 517 518 if (!value_str.equals ("") && name_str.equals (StaticStrings.METADATA_STR)) { 519 // 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. 520 String[] values = value_str.split (StaticStrings.COMMA_CHARACTER); 521 value_str = ""; 522 for (int k=0; k<=values.length-1; k++) { 523 if (values[k].indexOf (StaticStrings.NS_SEP) == -1) { 524 values[k] = StaticStrings.EXTRACTED_NAMESPACE + values[k]; 525 } 526 else { 527 MetadataElement metadata_element = MetadataTools.getMetadataElementWithName (values[k]); 528 if (metadata_element != null) { 529 values[k] = metadata_element.getDisplayName (); 530 } 531 } 532 if (k < values.length-1) { 533 value_str = value_str + values[k] + StaticStrings.COMMA_CHARACTER; 534 } else { 535 value_str = value_str + values[k]; 536 } 537 } 538 } 539 540 if (value_str != null && !value_str.equals ("")) { 541 XMLTools.setNodeText (option_element, value_str); 542 } 543 classify_element.appendChild (option_element); 544 } 545 //format element for this classifier 546 Element format = (Element)XMLTools.getChildByTagName (e, StaticStrings.FORMAT_STR); 547 if(format != null) { 548 classify_element.appendChild (doFormat(to, format, null)); 549 } 550 appendProperly (toElement, classify_element); 551 } 552 553 // default format statement for all classifiers 554 Element default_classifier_format = (Element)XMLTools.getChildByTagName (browseNode, StaticStrings.FORMAT_STR); 555 556 to.getDocumentElement ().appendChild (doFormat(to, default_classifier_format, StaticStrings.BROWSE_STR)); 557 } 558 static private Element doFormat(Document to, Element format, String name_str) { 559 Element format_element = to.createElement (StaticStrings.FORMAT_STR); 560 if (name_str != null) { 561 format_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str); 562 } 563 564 // Don't write out an empty format statement of <format/> (i.e. format has no child nodes) 565 // as this will end up embedded in another format statement as <format><format/><format /> 566 // This doubling up of format stmts will then prevent GLI from opening the collection again. 567 if (format != null && format.hasChildNodes()) { // not an empty format statement 568 String gsf_text = XMLTools.xmlNodeToStringWithoutIndenting(format); 569 570 if (gsf_text.startsWith("<") && (gsf_text.indexOf("<") != gsf_text.lastIndexOf("<"))) { 571 gsf_text = gsf_text.substring(gsf_text.indexOf("<gsf"), 572 gsf_text.indexOf(StaticStrings.FORMAT_END_TAG)); 573 } 574 575 XMLTools.setNodeText(format_element, gsf_text); 576 } 577 return format_element; 578 } 579 // Handling 'subcollection' elements in 'search' element of 'collectionConfig.xml' 580 static private void doSubcollection (Document to, Node searchNode) { 581 Element toElement = to.getDocumentElement (); 582 NodeList sub_children = ((Element)searchNode).getElementsByTagName (StaticStrings.SUBCOLLECTION_STR); 583 int sub_nodes = sub_children.getLength (); 584 585 // There is no subcollection 586 if (sub_nodes < 1) { 587 return; 588 } 589 590 for (int i=0; i<sub_nodes; i++) { 591 Element sub_child = (Element)sub_children.item (i); 592 String name_str = sub_child.getAttribute (StaticStrings.NAME_ATTRIBUTE); 593 String filter_str = sub_child.getAttribute (StaticStrings.FILTER_ATTRIBUTE); 594 595 // filter_str is in the form '<! (if set)><metadata>/<metadata value>/<flag (if any)>' 596 597 int pos = filter_str.indexOf (StaticStrings.SEPARATOR_CHARACTER); 598 String meta_str = ""; 599 String meta_value_str = ""; 600 String clude_str = ""; 601 String flag_str = ""; 602 if (pos == -1) { 603 604 meta_str = meta_value_str = filter_str; 605 clude_str = StaticStrings.INCLUDE_STR; 606 } else { 607 clude_str = StaticStrings.INCLUDE_STR; 608 if (filter_str.startsWith (StaticStrings.EXCLAMATION_CHARACTER)) { 609 clude_str = StaticStrings.EXCLUDE_STR; 610 // Peel off "!" 611 filter_str = filter_str.substring (StaticStrings.EXCLAMATION_CHARACTER.length ()); 612 } 613 614 String[] strs = filter_str.split (StaticStrings.SEPARATOR_CHARACTER); 615 if (strs[0] != null && strs[0] != "") { 616 meta_str = strs[0]; 617 } 618 if(!meta_str.equals (StaticStrings.FILENAME_STR) && meta_str.indexOf (StaticStrings.NS_SEP) == -1) { 619 meta_str = StaticStrings.EXTRACTED_NAMESPACE + meta_str; 620 } 621 622 if (strs[1] != null && strs[1] != "") { 623 meta_value_str = strs[1]; 624 } 625 if (strs.length > 2) { 626 //This means there has been set a flag 627 if (strs[2] != null && strs[2] != "") { 628 flag_str = strs[2]; 629 } 630 } 631 } 632 Element subcollection_element = to.createElement (StaticStrings.SUBCOLLECTION_ELEMENT); 633 subcollection_element.setAttribute (StaticStrings.NAME_STR, name_str); 634 subcollection_element.setAttribute (StaticStrings.CONTENT_ATTRIBUTE, meta_str); 635 subcollection_element.setAttribute (StaticStrings.TYPE_ATTRIBUTE, clude_str); 636 if (flag_str != "") { 637 subcollection_element.setAttribute (StaticStrings.OPTIONS_ATTRIBUTE, flag_str); 638 } 639 XMLTools.setNodeText (subcollection_element, meta_value_str); 640 641 toElement.appendChild (subcollection_element); 642 } 643 } 644 //Handle levels (document, section). In the internal structure, the element is called 'IndexOption' 645 static private void doLevel (Document to, Node searchNode) { 646 Element toElement = to.getDocumentElement (); 647 NodeList level_children = ((Element)searchNode).getElementsByTagName (StaticStrings.LEVEL_ATTRIBUTE); 648 int level_nodes = level_children.getLength (); 649 650 // it's mg, there's no level. So we construct a default 'indexOption' in the internal structure 651 if (level_nodes < 1) { 652 Element index_option = to.createElement (StaticStrings.INDEXOPTIONS_ELEMENT); 653 index_option.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR); 654 index_option.setAttribute (StaticStrings.NAME_STR, StaticStrings.LEVELS_STR); 655 656 Element option_element = to.createElement (StaticStrings.OPTION_ELEMENT); 657 option_element.setAttribute (StaticStrings.NAME_STR, StaticStrings.DOCUMENT_STR); 658 index_option.appendChild (option_element); 659 660 appendProperly (toElement, index_option); 661 662 return; 663 } 664 665 Element index_option = to.createElement (StaticStrings.INDEXOPTIONS_ELEMENT); 666 index_option.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 667 index_option.setAttribute (StaticStrings.NAME_STR, StaticStrings.LEVELS_STR); 668 669 for (int i=0; i<level_nodes; i++) { 670 Element level_element = (Element)level_children.item (i); 671 String level_str = level_element.getAttribute (StaticStrings.NAME_ATTRIBUTE); 672 Element option_element = to.createElement (StaticStrings.OPTION_ELEMENT); 673 option_element.setAttribute (StaticStrings.NAME_STR, level_str); 674 index_option.appendChild (option_element); 675 676 677 // Contructing 'collectionmetadata' elements from the 'displayItem' of this 'level' element 678 ArrayList displayItem_list = XMLTools.getNamedElementList (level_element, 679 StaticStrings.DISPLAYITEM_STR, StaticStrings.NAME_ATTRIBUTE, StaticStrings.NAME_STR); 680 if (displayItem_list == null) { 681 return ; 682 } 683 for (int j=0; j<displayItem_list.size (); j++) { 684 Element item = (Element)displayItem_list.get (j); 685 String text = XMLTools.getNodeText (item); 686 String lang = item.getAttribute (StaticStrings.LANG_ATTRIBUTE); 687 688 //If there is nothing to display, don't bother creating the element 689 if (text == "") { 690 continue; 691 } 692 Element collectionmetadata = to.createElement (StaticStrings.COLLECTIONMETADATA_ELEMENT); 693 collectionmetadata.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 694 collectionmetadata.setAttribute (StaticStrings.NAME_ATTRIBUTE, level_str); 695 collectionmetadata.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, lang); 696 XMLTools.setNodeText (collectionmetadata, text); 697 698 appendProperly (toElement, collectionmetadata); 699 } 700 } 701 appendProperly (toElement, index_option); 702 } 703 //Handle 'indexSubcollection' element of collectionConfig.xml, which is called 'SubcollectionIndexes' in the internal structure. These contain the subcollection indexes (i.e. the filter or filter combinations), and displayed words for the filter names. 704 static private void doIndexSubcollection (Document to, Node searchNode) { 705 Element toElement = to.getDocumentElement (); 706 NodeList index_sub_children = ((Element)searchNode).getElementsByTagName (StaticStrings.SUBCOLLECTION_INDEX_ELEMENT); 707 int num_nodes = index_sub_children.getLength (); 708 709 // there is no subcollection index 710 if (num_nodes < 1) { 711 return; 712 } 713 714 Element subcollection_indexes = to.createElement (StaticStrings.SUBCOLLECTION_INDEXES_ELEMENT); 715 716 for (int i=0; i<num_nodes; i++) { 717 Element index_element = to.createElement (StaticStrings.INDEX_ELEMENT); 718 Element index_sub_child = (Element)index_sub_children.item (i); 719 String name_str = index_sub_child.getAttribute (StaticStrings.NAME_ATTRIBUTE); 720 721 // name_str is in the form of comma separated strings, each of which is a subcollection filter name 722 String[] filters = name_str.split (StaticStrings.COMMA_CHARACTER); 723 for (int j=0; j<filters.length; j++) { 724 725 Element content_element = to.createElement (StaticStrings.CONTENT_ELEMENT); 726 content_element.setAttribute (StaticStrings.NAME_STR, filters[j]); 727 index_element.appendChild (content_element); 728 } 729 subcollection_indexes.appendChild (index_element); 730 731 // Contructing 'collectionmetadata' elements from the 'displayItem' of this 'indexSubcollection' element 732 ArrayList displayItem_list = XMLTools.getNamedElementList (index_sub_child, 733 StaticStrings.DISPLAYITEM_STR, StaticStrings.NAME_ATTRIBUTE, StaticStrings.NAME_STR); 734 if (displayItem_list == null) { 735 // there is no display item for this element 736 continue; 737 } 738 for (int j=0; j<displayItem_list.size (); j++) { 739 Element item = (Element)displayItem_list.get (j); 740 String text = XMLTools.getNodeText (item); 741 String lang = item.getAttribute (StaticStrings.LANG_ATTRIBUTE); 742 743 //If there is nothing to display, don't bother creating the element 744 if (text == "") { 745 continue; 746 } 747 Element collectionmetadata = to.createElement (StaticStrings.COLLECTIONMETADATA_ELEMENT); 748 collectionmetadata.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 749 collectionmetadata.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str); 750 collectionmetadata.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, lang); 751 XMLTools.setNodeText (collectionmetadata, text); 752 753 appendProperly (toElement, collectionmetadata); 754 } 755 } 756 appendProperly (toElement, subcollection_indexes); 757 } 758 //Handle 'indexLanguage' element of collectionConfig.xml, which is called 'Languages' in the internal structure. These contain the language indexes, and displayed words for those language index names. 759 static private void doIndexLanguage (Document to, Node searchNode) { 760 Element toElement = to.getDocumentElement (); 761 NodeList index_sub_children = ((Element)searchNode).getElementsByTagName (StaticStrings.LANGUAGE_INDEX_ELEMENT); 762 int num_nodes = index_sub_children.getLength (); 763 764 // there is no subcollection index 765 if (num_nodes < 1) { 766 return; 767 } 768 769 Element language_indexes = to.createElement (StaticStrings.LANGUAGES_ELEMENT); 770 771 for (int i=0; i<num_nodes; i++) { 772 Element language_element = to.createElement (StaticStrings.LANGUAGE_ELEMENT); 773 Element index_sub_child = (Element)index_sub_children.item (i); 774 String name_str = index_sub_child.getAttribute (StaticStrings.NAME_ATTRIBUTE); 775 language_element.setAttribute (StaticStrings.NAME_STR, name_str); 776 language_indexes.appendChild (language_element); 777 778 // Contructing 'collectionmetadata' elements from the 'displayItem' of this 'indexLanguage' element 779 ArrayList displayItem_list = XMLTools.getNamedElementList (index_sub_child, 780 StaticStrings.DISPLAYITEM_STR, StaticStrings.NAME_ATTRIBUTE, StaticStrings.NAME_STR); 781 if (displayItem_list == null) { 782 // there is no display item for this element 783 continue; 784 } 785 for (int j=0; j<displayItem_list.size (); j++) { 786 Element item = (Element)displayItem_list.get (j); 787 String text = XMLTools.getNodeText (item); 788 String lang = item.getAttribute (StaticStrings.LANG_ATTRIBUTE); 789 790 //If there is nothing to display, don't bother creating the element 791 if (text == "") { 792 continue; 793 } 794 Element collectionmetadata = to.createElement (StaticStrings.COLLECTIONMETADATA_ELEMENT); 795 collectionmetadata.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 796 collectionmetadata.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str); 797 collectionmetadata.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, lang); 798 XMLTools.setNodeText (collectionmetadata, text); 799 800 appendProperly (toElement, collectionmetadata); 801 } 802 } 803 toElement.appendChild (language_indexes); 804 } 805 806 // Handling search types 807 static private void doSearchType (Document to, Node searchNode) { 808 NodeList type_children = ((Element)searchNode).getElementsByTagName (StaticStrings.SEARCHTYPE_ELEMENT); 809 int num_types = type_children.getLength(); 810 String searchtype_str = ""; 811 if (num_types < 1) { 812 // not defined yet, add in default 813 searchtype_str = "plain,simpleform,advancedform"; 814 } 815 else { 816 for(int i=0; i<num_types; i++) { 817 Node e = type_children.item (i); 818 String t = ((Element)e).getAttribute (StaticStrings.NAME_ATTRIBUTE); 819 if (i>0) { 820 searchtype_str += ","; 821 } 822 searchtype_str += t; 823 } 824 } 825 826 // pretend its a format statement 827 Element search_type_element = to.createElement (StaticStrings.FORMAT_STR); 828 search_type_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, StaticStrings.SEARCHTYPE_ELEMENT); 829 XMLTools.setNodeText(search_type_element, searchtype_str); 830 appendProperly (to.getDocumentElement (), search_type_element); 831 832 } 833 834 // Handling search format statement 835 static private void doSearchFormat (Document to, Node searchNode) { 836 // THere is currently just one format element for search. HOwever, need to check for old config files which used to have <format name="searchTypes"> 837 NodeList format_children = ((Element)searchNode).getElementsByTagName (StaticStrings.FORMAT_STR); 838 int format_nodes = format_children.getLength (); 839 if (format_nodes < 1) { 840 return; 841 } 842 Element format = null; 843 for(int i=0; i<format_nodes; i++) { 844 Node e = format_children.item (i); 845 if (e.hasAttributes () == false) { 846 //The format element for format statement has no attribute 847 format = (Element)e; 848 } 849 } 850 //format statement for search 851 if (format != null) { 852 (to.getDocumentElement ()).appendChild (doFormat(to, format, StaticStrings.SEARCH_STR)); 853 } 854 } 855 // Handling defaultIndexLanguage and languageMetadata in collectionConfig.xml ('elementNameFrom'); in the internal structure, they are called 'DefaultLanguage' and 'LanguageMetadata' ('elementNameTo') respectively. 856 // Converting from collectionConfig.xml to the internal xml structure. 857 static private void doLanguageMetadata (Document to, Node searchNode) { 858 Element toElement = to.getDocumentElement (); 859 String elementNameFrom = StaticStrings.LANGUAGE_METADATA_ELEMENT_STR; 860 String elementNameTo = StaticStrings.LANGUAGE_METADATA_ELEMENT; 861 Node from_element = XMLTools.getChildByTagName (searchNode, elementNameFrom); 862 if (from_element == null) { 863 return; // such an element not found 864 } 865 866 Element to_element = to.createElement (elementNameTo); 867 868 String name_str = ((Element)from_element).getAttribute (StaticStrings.NAME_ATTRIBUTE); 869 if (name_str.indexOf (StaticStrings.NS_SEP) == -1) { 870 name_str = StaticStrings.EXTRACTED_NAMESPACE + name_str; 871 } 872 to_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str); 873 to_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 874 875 toElement.appendChild (to_element); 876 } 877 static private void doReplaceListRef (Document to, Element from) { 878 Element toElement = to.getDocumentElement (); 879 880 NodeList replace_elements = from.getElementsByTagName(StaticStrings.REPLACELISTREF_STR); 881 int num_elems = replace_elements.getLength(); 882 if (num_elems < 1) { 883 return; 884 } 885 for (int i=0; i<num_elems; i++) { 886 Element to_element = XMLTools.duplicateElement (to, (Element)replace_elements.item(i), true); 887 toElement.appendChild (to_element); 888 } 889 } 890 static private void convertReplaceListRef (Document from, Document to) { 891 Element toElement = to.getDocumentElement (); 892 893 NodeList replace_elements = from.getDocumentElement().getElementsByTagName(StaticStrings.REPLACELISTREF_STR); 894 int num_elems = replace_elements.getLength(); 895 if (num_elems < 1) { 896 return; 897 } 898 for (int i=0; i<num_elems; i++) { 899 Element to_element = XMLTools.duplicateElement (to, (Element)replace_elements.item(i), true); 900 toElement.appendChild (to_element); 901 } 902 } 903 904 /** serviceRackList is currently not editable in GLI - just copy it in from config file and write it out again. */ 905 static private void doServiceRackList (Document to, Element from) { 906 Element toElement = to.getDocumentElement (); 907 908 Node srl_element = XMLTools.getChildByTagName (from, StaticStrings.SERVICE_RACK_LIST_ELEMENT); 909 if (srl_element == null) { 910 return; // such an element not found 911 } 912 913 Element to_element = XMLTools.duplicateElement (to, (Element)srl_element, true); 914 toElement.appendChild (to_element); 915 } 916 static private void convertServiceRackList (Document from, Document to) { 917 Element toElement = to.getDocumentElement (); 918 919 Node srl_element = XMLTools.getChildByTagName (from.getDocumentElement (), StaticStrings.SERVICE_RACK_LIST_ELEMENT); 920 if (srl_element == null) { 921 return; // such an element not found 922 } 923 924 Element to_element = XMLTools.duplicateElement (to, (Element)srl_element, true); 925 toElement.appendChild (to_element); 926 } 927 static private void doDefaultIndexLanguage (Document to, Node searchNode) { 928 Element toElement = to.getDocumentElement (); 929 String elementNameFrom = StaticStrings.LANGUAGE_DEFAULT_INDEX_ELEMENT; 930 String elementNameTo = StaticStrings.LANGUAGE_DEFAULT_ELEMENT; 931 Node from_element = XMLTools.getChildByTagName (searchNode, elementNameFrom); 932 if (from_element == null) { 933 return; // such an element not found 934 } 935 936 Element to_element = to.createElement (elementNameTo); 937 938 String name_str = ((Element)from_element).getAttribute (StaticStrings.NAME_ATTRIBUTE); 939 to_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str); 940 to_element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 941 942 toElement.appendChild (to_element); 943 } 944 945 //Handle 'indexOption' (i.e. casefold, stem etc). In the internal structure, the element is called 'IndexOption' 946 static private void doIndexOption (Document to, Node searchNode) { 947 Element toElement = to.getDocumentElement (); 948 Node index_option_node = XMLTools.getChildByTagName (searchNode, StaticStrings.INDEXOPTION_STR); 949 if (index_option_node == null) { 950 return; 951 } 952 NodeList option_children = ((Element)index_option_node).getElementsByTagName (StaticStrings.OPTION_STR); 953 int option_nodes = option_children.getLength (); 954 955 // for lucene, there is no 'indexOption'. We build a default 'indexOption' and 'assigned=false' in case the user switches to mg or mgpp 956 if (option_nodes < 1) { 957 Element index_option = to.createElement (StaticStrings.INDEXOPTIONS_ELEMENT); 958 index_option.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR); 959 index_option.setAttribute (StaticStrings.NAME_STR, StaticStrings.INDEXOPTIONS_STR); 960 String[] option_str = 961 { StaticStrings.CASEFOLD_OPTION_STR, StaticStrings.STEM_OPTION_STR }; 962 for (int i=0; i<option_str.length; i++) { 963 Element option_element = to.createElement (StaticStrings.OPTION_ELEMENT); 964 option_element.setAttribute (StaticStrings.NAME_STR, option_str[i]); 965 index_option.appendChild (option_element); 966 } 967 appendProperly (toElement, index_option); 968 return; 969 } 970 971 Element index_option = to.createElement (StaticStrings.INDEXOPTIONS_ELEMENT); 972 index_option.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 973 index_option.setAttribute (StaticStrings.NAME_STR, StaticStrings.INDEXOPTIONS_STR); 974 975 for (int i=0; i<option_nodes; i++) { 976 String option_str = ((Element)option_children.item (i)).getAttribute (StaticStrings.NAME_ATTRIBUTE); 977 Element option_element = to.createElement (StaticStrings.OPTION_ELEMENT); 978 option_element.setAttribute (StaticStrings.NAME_STR, option_str); 979 index_option.appendChild (option_element); 980 } 981 appendProperly (toElement, index_option); 982 } 983 984 static private Element doBuildType (Document to, String att_value) { 985 986 //construct 'BuildType' element 987 Element element = to.createElement (StaticStrings.BUILDTYPE_ELEMENT); 988 element.setAttribute (StaticStrings.NAME_ATTRIBUTE, StaticStrings.BUILDTYPE_STR); 989 element.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, StaticStrings.ENGLISH_LANGUAGE_STR); 990 element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 991 element.setAttribute (StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR); 992 993 XMLTools.setNodeText (element, att_value); 994 995 return element; 996 } 997 998 static private Element doDatabaseType (Document to, String att_value) { 999 1000 //construct 'DatabaseType' element 1001 Element element = to.createElement (StaticStrings.DATABASETYPE_ELEMENT); 1002 element.setAttribute (StaticStrings.NAME_ATTRIBUTE, StaticStrings.DATABASETYPE_STR); 1003 element.setAttribute (StaticStrings.LANGUAGE_ATTRIBUTE, StaticStrings.ENGLISH_LANGUAGE_STR); 1004 element.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 1005 element.setAttribute (StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR); 1006 1007 XMLTools.setNodeText (element, att_value); 1008 1009 return element; 1010 } 1011 1012 // Convert 'description', 'smallicon' etc. 1013 static private void convertDisplayItemList (Document from, Document to) { 1014 Element displayItemList = to.createElement (StaticStrings.DISPLAYITEMLIST_STR); 1015 Element destination = to.getDocumentElement (); 1016 1017 String []att_values = 1018 {StaticStrings.COLLECTIONMETADATA_COLLECTIONEXTRA_STR, 1019 StaticStrings.COLLECTIONMETADATA_ICONCOLLECTIONSMALL_STR, 1020 StaticStrings.COLLECTIONMETADATA_ICONCOLLECTION_STR, 1021 StaticStrings.COLLECTIONMETADATA_COLLECTIONNAME_STR}; 1022 1023 String []map_attrs = 1024 {StaticStrings.DESCRIPTION_STR, 1025 StaticStrings.SMALLICON_STR, 1026 StaticStrings.ICON_STR, 1027 StaticStrings.NAME_STR}; 1028 1029 for (int i=0; i<att_values.length; i++) { 1030 1031 //dOc 1032 ArrayList e_list = XMLTools.getNamedElementList (from.getDocumentElement (), 1033 StaticStrings.COLLECTIONMETADATA_ELEMENT, 1034 StaticStrings.NAME_ATTRIBUTE, att_values[i]); 1035 // if such elements don't exist, don't bother 1036 if (e_list == null) { 1037 continue; 1038 } 1039 for (int j=0; j<e_list.size (); j++) { 1040 Element e = (Element)e_list.get (j); 1041 if (e.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) { 1042 continue; 1043 } 1044 String text = XMLTools.getNodeText (e); 1045 String lang = e.getAttribute (StaticStrings.LANGUAGE_ATTRIBUTE); 1046 1047 Element displayItem = constructElement (StaticStrings.DISPLAYITEM_STR, map_attrs[i], 1048 StaticStrings.LANG_STR, lang, text, to); 1049 displayItemList.appendChild (displayItem); 1050 } 1051 1052 } 1053 destination.appendChild (displayItemList); 1054 } 1055 // This method creates a DisplayItem element of the type of 'to' by using the ingredients from the element 'e' 1056 static private Element constructDisplayItem (Element e, Document to) { 1057 String lang_string = e.getAttribute (StaticStrings.LANGUAGE_ATTRIBUTE); 1058 String text = XMLTools.getNodeText (e); 1059 Element displayItem = to.createElement (StaticStrings.DISPLAYITEM_STR); 1060 displayItem.setAttribute (StaticStrings.NAME_ATTRIBUTE, StaticStrings.NAME_ATTRIBUTE); 1061 displayItem.setAttribute (StaticStrings.LANG_STR, lang_string); 1062 XMLTools.setNodeText (displayItem, text); 1063 return displayItem; 1064 } 1065 static private void convertMetadataList (Document from, Document to) { 1066 Element metadataList = to.createElement (StaticStrings.METADATALIST_STR); 1067 Element destination = to.getDocumentElement (); 1068 1069 String []ele_names = 1070 {StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT, 1071 StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT, 1072 StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT}; 1073 String []att_names = 1074 {StaticStrings.COLLECTIONMETADATA_CREATOR_STR, 1075 StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR, 1076 StaticStrings.COLLECTIONMETADATA_PUBLIC_STR}; 1077 for (int i=0; i<ele_names.length; i++) { 1078 Element e = XMLTools.getNamedElement (from.getDocumentElement (), 1079 ele_names[i], StaticStrings.NAME_ATTRIBUTE, att_names[i]); 1080 if (e == null) { 1081 continue; 1082 } 1083 String text = XMLTools.getNodeText (e); 1084 Element metadata = to.createElement (StaticStrings.METADATA_STR); 1085 metadata.setAttribute (StaticStrings.NAME_ATTRIBUTE, att_names[i]); 1086 metadata.setAttribute (StaticStrings.LANG_STR, StaticStrings.ENGLISH_LANGUAGE_STR); 1087 XMLTools.setNodeText (metadata, text); 1088 metadataList.appendChild (metadata); 1089 } 1090 1091 destination.appendChild (metadataList); 1092 } 1093 // This method creates an element with the name 'element_name' of the type of 'to' by using the other three strings 1094 static private Element constructElement (String element_name, String name_value, String lang_att, String lang_value, String text, Document to) { 1095 Element e = to.createElement (element_name); 1096 e.setAttribute (StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 1097 e.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_value); 1098 e.setAttribute (lang_att, lang_value); 1099 XMLTools.setNodeText (e, text); 1100 1101 return e; 1102 } 1103 // Convert classify in the internal(i.e. Document from) to collectionconfig.xml (i.e. Document to) 1104 static private void convertClassifier (Document from, Document to) { 1105 Element browse_element = to.createElement (StaticStrings.BROWSE_STR); 1106 NodeList children = from.getDocumentElement ().getElementsByTagName (StaticStrings.CLASSIFY_ELEMENT); 1107 1108 int num_children = (children == null)? 0 : children.getLength (); 1109 1110 if (num_children == 0) { 1111 return ; 1112 } 1113 1114 for (int i=0; i<num_children; i++) { 1115 1116 Element child = (Element)children.item (i); 1117 if (child.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) { 1118 continue; 1119 } 1120 String str = child.getAttribute (StaticStrings.TYPE_ATTRIBUTE); 1121 Element classifier_element = to.createElement (StaticStrings.CLASSIFIER_STR); 1122 classifier_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, str); 1123 1124 NodeList option_children = child.getElementsByTagName (StaticStrings.OPTION_ELEMENT); 1125 for (int j=0; j<option_children.getLength (); j++) { 1126 Element el = (Element)option_children.item (j); 1127 if (el.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) { 1128 continue; 1129 } 1130 String name_str = el.getAttribute (StaticStrings.NAME_ATTRIBUTE); 1131 String value_str = XMLTools.getNodeText (el); 1132 1133 1134 if (name_str == null && value_str == null) { 1135 continue; 1136 } 1137 Element option_element = to.createElement (StaticStrings.OPTION_STR); 1138 if (name_str != null && name_str.equals (StaticStrings.METADATA_STR)) { 1139 1140 // The metadata argument is the fully qualified name of a metadata element, so if it contains a namespace, remove the extracted metadata namespace as the build process doesn't know about it. 1141 String[] values = value_str.split (StaticStrings.COMMA_CHARACTER); 1142 value_str = ""; 1143 for (int k=0; k<=values.length-1; k++) { 1144 if(values[k].startsWith (StaticStrings.EXTRACTED_NAMESPACE) && values[k].indexOf(StaticStrings.NS_SEP, StaticStrings.EXTRACTED_NAMESPACE.length()) == -1) { 1145 values[k] = values[k].substring (StaticStrings.EXTRACTED_NAMESPACE.length ()); 1146 } 1147 else { 1148 MetadataElement metadata_element = MetadataTools.getMetadataElementWithDisplayName (values[k]); 1149 if (metadata_element != null) { 1150 values[k] = metadata_element.getFullName (); 1151 } 1152 } 1153 if (k < values.length-1) { 1154 value_str = value_str + values[k] + StaticStrings.COMMA_CHARACTER; 1155 } else { 1156 value_str = value_str + values[k]; 1157 } 1158 } 1159 } 1160 1161 if (!name_str.equals ("")) { 1162 if (!name_str.startsWith (StaticStrings.MINUS_CHARACTER)) { 1163 name_str = StaticStrings.MINUS_CHARACTER + name_str; 1164 } 1165 option_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str); 1166 } 1167 1168 if (!value_str.equals ("")) { 1169 option_element.setAttribute (StaticStrings.VALUE_ATTRIBUTE, value_str); 1170 } 1171 1172 classifier_element.appendChild (option_element); 1173 } 1174 1175 //format element for this classifier 1176 Element e = (Element)XMLTools.getChildByTagName (child, StaticStrings.FORMAT_STR); 1177 1178 if (e != null) { 1179 classifier_element.appendChild (convertFormat(to, e)); 1180 } 1181 browse_element.appendChild (classifier_element); 1182 } 1183 1184 //convert default classifier format 1185 Element e = XMLTools.getNamedElement (from.getDocumentElement (), StaticStrings.FORMAT_STR, 1186 StaticStrings.NAME_ATTRIBUTE, StaticStrings.BROWSE_STR); 1187 browse_element.appendChild (convertFormat(to, e)); 1188 1189 to.getDocumentElement ().appendChild (browse_element); 1190 } 1191 static private Element convertFormat(Document to, Element e) { 1192 String format_str = XMLTools.getNodeText(e); 1193 Element format = to.createElement (StaticStrings.FORMAT_STR); 1194 //XMLTools.copyAllChildren (format, e); 1195 XMLTools.setNodeText(format, format_str); 1196 return format; 1197 } 1198 //convert format statement for search 1199 static private void convertSearchFormat (Document from, Document to) { 1200 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR); 1201 Element e = XMLTools.getNamedElement (from.getDocumentElement (), StaticStrings.FORMAT_STR, 1202 StaticStrings.NAME_ATTRIBUTE, StaticStrings.SEARCH_STR); 1203 1204 search.appendChild (convertFormat(to, e)); 1205 1206 } 1207 //convert format statement for display of the documents 1208 static private void convertDisplayFormat (Document from, Document to) { 1209 Element e = XMLTools.getNamedElement (from.getDocumentElement (), StaticStrings.FORMAT_STR, 1210 StaticStrings.NAME_ATTRIBUTE, StaticStrings.DISPLAY_STR); 1211 if (e == null) { 1212 return; 1213 } 1214 Element display = to.createElement (StaticStrings.DISPLAY_STR); 1215 display.appendChild (convertFormat(to, e)); 1216 to.getDocumentElement ().appendChild (display); 1217 } 1218 // Convert plugins in the internal(i.e. Document from) to collectionconfig.xml (i.e. Document to) 1219 static private void convertPlugin (Document from, Document to) { 1220 Element import_element = to.createElement (StaticStrings.IMPORT_STR); 1221 Element plugin_list_element = to.createElement (StaticStrings.PLUGINLIST_STR); 1222 1223 NodeList children = from.getDocumentElement ().getElementsByTagName (StaticStrings.PLUGIN_ELEMENT); 1224 int num_children = (children == null)? 0 : children.getLength (); 1225 if (num_children == 0) { 1226 return ; 1227 } 1228 1229 for (int i=0; i<num_children; i++) { 1230 1231 Element child = (Element)children.item (i); 1232 if (child.getAttribute (StaticStrings.SEPARATOR_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) { 1233 continue; 1234 } 1235 if (child.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) { 1236 continue; 1237 } 1238 1239 String str = child.getAttribute (StaticStrings.TYPE_ATTRIBUTE); 1240 Element plugin_element = to.createElement (StaticStrings.PLUGIN_STR); 1241 plugin_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, str); 1242 1243 NodeList option_children = child.getElementsByTagName (StaticStrings.OPTION_ELEMENT); 1244 for (int j=0; j<option_children.getLength (); j++) { 1245 Element el = (Element)option_children.item (j); 1246 if(!el.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) { 1247 continue; 1248 } 1249 String name_str = el.getAttribute (StaticStrings.NAME_ATTRIBUTE); 1250 String value_str = XMLTools.getNodeText (el); 1251 1252 1253 if (name_str == null && value_str == null) { 1254 continue; 1255 } 1256 Element option_element = to.createElement (StaticStrings.OPTION_STR); 1257 if (name_str != null && name_str.equals (StaticStrings.METADATA_STR)) { 1258 1259 // The metadata argument is the fully qualified name of a metadata element, so if it contains a namespace, remove the extracted metadata namespace as the build process doesn't know about it, but ONLY if it is not embedded metadata (e.g. ex.dc.*) 1260 String[] values = value_str.split (StaticStrings.COMMA_CHARACTER); 1261 value_str = ""; 1262 for (int k=0; k<=values.length-1; k++) { 1263 if(values[k].startsWith (StaticStrings.EXTRACTED_NAMESPACE) && values[k].indexOf(StaticStrings.NS_SEP, StaticStrings.EXTRACTED_NAMESPACE.length()) == -1) { 1264 values[k] = values[k].substring (StaticStrings.EXTRACTED_NAMESPACE.length ()); 1265 } 1266 1267 if (k < values.length-1) { 1268 value_str = value_str + values[k] + StaticStrings.COMMA_CHARACTER; 1269 } else { 1270 value_str = value_str + values[k]; 1271 } 1272 } 1273 } 1274 1275 if (!name_str.equals ("")) { 1276 if (!name_str.startsWith (StaticStrings.MINUS_CHARACTER)) { 1277 name_str = StaticStrings.MINUS_CHARACTER + name_str; 1278 } 1279 option_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str); 1280 } 1281 1282 if (!value_str.equals ("")) { 1283 option_element.setAttribute (StaticStrings.VALUE_ATTRIBUTE, value_str); 1284 } 1285 1286 plugin_element.appendChild (option_element); 1287 }//for loop ends 1288 1289 plugin_list_element.appendChild (plugin_element); 1290 }//for loop ends 1291 1292 import_element.appendChild (plugin_list_element); 1293 1294 //do the plugout element (used by building flax collections) 1295 Node plugout = XMLTools.getChildByTagNameIndexed (from.getDocumentElement (), PLUGOUT_ELEMENT, 0); 1296 if (plugout != null) { 1297 Element to_element = XMLTools.duplicateElement (to, (Element)plugout, true); 1298 import_element.appendChild (to_element); 1299 } 1300 1301 to.getDocumentElement ().appendChild (import_element); 1302 } 1303 1304 //Handle 'searchType' of collectionConfig.xml. In the internal structure, its also called 'searchType', eg. plain, form 1305 static private void convertSearchType (Document from, Document to) { 1306 Element e = XMLTools.getNamedElement (from.getDocumentElement (), StaticStrings.FORMAT_STR, 1307 StaticStrings.NAME_ATTRIBUTE, StaticStrings.SEARCHTYPE_ELEMENT);//searchType 1308 1309 if (e == null) { 1310 return; 1311 } 1312 String searchtype_str = XMLTools.getNodeText(e); 1313 //Get the 'search' element from 'to' 1314 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR); 1315 1316 String[] types = searchtype_str.split(","); 1317 for (int i=0; i<types.length; i++) { 1318 Element search_type_element = to.createElement (StaticStrings.SEARCHTYPE_ELEMENT); 1319 search_type_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, types[i]); 1320 search.appendChild (search_type_element); 1321 } 1322 } 1323 1324 static private void convertBuildType (Document from, Document to) { 1325 Element e = XMLTools.getNamedElement (from.getDocumentElement (), 1326 StaticStrings.BUILDTYPE_ELEMENT, 1327 StaticStrings.NAME_ATTRIBUTE, StaticStrings.BUILDTYPE_STR); 1328 if (e == null) { 1329 return; 1330 } 1331 String indexer = XMLTools.getNodeText (e); 1332 Element search = to.createElement (StaticStrings.SEARCH_STR); 1333 search.setAttribute (StaticStrings.TYPE_ATTRIBUTE, indexer); 1334 to.getDocumentElement ().appendChild (search); 1335 } 1336 static private void convertDatabaseType (Document from, Document to) { 1337 Element e = XMLTools.getNamedElement (from.getDocumentElement (), 1338 StaticStrings.DATABASETYPE_ELEMENT, 1339 StaticStrings.NAME_ATTRIBUTE, 1340 StaticStrings.DATABASETYPE_STR); 1341 if (e == null) { 1342 return; 1343 } 1344 String db = XMLTools.getNodeText (e); 1345 Element dbtype = to.createElement (StaticStrings.INFODB_STR); 1346 dbtype.setAttribute (StaticStrings.TYPE_ATTRIBUTE, db); 1347 to.getDocumentElement ().appendChild (dbtype); 1348 } 1349 static private void convertDefaultIndex (Document from, Document to, Element search) { 1350 Element source = from.getDocumentElement (); 1351 1352 Element default_index_element = (Element)XMLTools.getChildByTagName (source, StaticStrings.INDEX_DEFAULT_ELEMENT); 1353 if (default_index_element == null) { 1354 return; 1355 } 1356 1357 String indexer = search.getAttribute (StaticStrings.TYPE_ATTRIBUTE); 1358 String level_str = default_index_element.getAttribute (StaticStrings.LEVEL_ATTRIBUTE); 1359 // Debugging purposes 1360 if (level_str.equals ("") && indexer.equals (StaticStrings.MG_STR) ) { 1361 System.out.println ("Bug: DefaultIndex should have its level attribute not empty."); 1362 } 1363 1364 NodeList content_elements = default_index_element.getElementsByTagName (StaticStrings.CONTENT_ELEMENT); 1365 int content_elements_length = content_elements.getLength (); 1366 1367 // Don't output anything if no indexes are set 1368 if(content_elements_length == 0) { 1369 return ;// 1370 } 1371 1372 String index_str = ""; 1373 1374 if (indexer.equals (StaticStrings.MG_STR)) { 1375 //combine level with indexes 1376 index_str = level_str + StaticStrings.COLON_CHARACTER; 1377 } 1378 else { //for mgpp/lucene, just take index 1379 //do nothing 1380 } 1381 1382 for(int k = 0; k < content_elements_length; k++) { 1383 Element content_element = (Element) content_elements.item (k); 1384 if (content_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) { 1385 continue; 1386 } 1387 String name_str = content_element.getAttribute (StaticStrings.NAME_ATTRIBUTE); 1388 1389 if(name_str.startsWith (StaticStrings.EXTRACTED_NAMESPACE) && name_str.indexOf(StaticStrings.NS_SEP, StaticStrings.EXTRACTED_NAMESPACE.length()) == -1) { 1390 name_str = name_str.substring (StaticStrings.EXTRACTED_NAMESPACE.length ()); 1391 } 1392 1393 index_str = index_str + name_str; 1394 1395 // Make it comma separated string 1396 if(k < content_elements_length - 1) { 1397 index_str = index_str + StaticStrings.COMMA_CHARACTER; 1398 } 1399 content_element = null; 1400 }//for loop ends 1401 1402 1403 Element default_index = to.createElement (StaticStrings.INDEX_DEFAULT_ELEMENT_LOWERCASE); 1404 default_index.setAttribute (StaticStrings.NAME_ATTRIBUTE, index_str); 1405 search.appendChild (default_index); 1406 1407 } 1408 static private void convertSubcollection (Document from, Document to) { 1409 Element source = from.getDocumentElement (); 1410 //Get the 'search' element from 'to' which has already been created in 'convertBuildType' 1411 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR); 1412 1413 // Get the Subcollection element from the internal structure 1414 NodeList subcollection_elements = source.getElementsByTagName (StaticStrings.SUBCOLLECTION_ELEMENT); 1415 if (subcollection_elements == null) { 1416 return; 1417 } 1418 int subcollection_elements_length = subcollection_elements.getLength (); 1419 1420 if (subcollection_elements_length == 0) { // no 1421 return ; 1422 } 1423 1424 for(int j = 0; j < subcollection_elements_length; j++) { 1425 1426 Element e = (Element) subcollection_elements.item (j); 1427 if (e.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) { 1428 continue; 1429 } 1430 String content = e.getAttribute (StaticStrings.CONTENT_ATTRIBUTE); 1431 String name = e.getAttribute (StaticStrings.NAME_ATTRIBUTE); 1432 String options = e.getAttribute (StaticStrings.OPTIONS_ATTRIBUTE); 1433 String type = e.getAttribute (StaticStrings.TYPE_ATTRIBUTE); 1434 String text = XMLTools.getNodeText (e); 1435 1436 String filter = ""; 1437 if (type.equals (StaticStrings.EXCLUDE_STR)) { 1438 filter = StaticStrings.EXCLAMATION_CHARACTER; 1439 } 1440 1441 if(content.startsWith (StaticStrings.EXTRACTED_NAMESPACE) && content.indexOf(StaticStrings.NS_SEP, StaticStrings.EXTRACTED_NAMESPACE.length()) == -1) { 1442 content = content.substring (StaticStrings.EXTRACTED_NAMESPACE.length ()); 1443 } 1444 filter = filter + content + StaticStrings.SEPARATOR_CHARACTER + text; 1445 if (options != null && options != "") { 1446 filter = filter + StaticStrings.SEPARATOR_CHARACTER + options; 1447 } 1448 Element subcollection = to.createElement (StaticStrings.SUBCOLLECTION_STR); 1449 subcollection.setAttribute (StaticStrings.FILTER_ATTRIBUTE, filter); 1450 subcollection.setAttribute (StaticStrings.NAME_ATTRIBUTE, name); 1451 1452 search.appendChild (subcollection); 1453 } 1454 } 1455 static private void convertSubcollectionIndexes (Document from, Document to) { 1456 Element source = from.getDocumentElement (); 1457 //Get the 'search' element from 'to' which has already been created in 'convertBuildType' 1458 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR); 1459 1460 // Get the SubcollectionIndexes element from the internal structure 1461 Element subcollection_indexes = (Element)XMLTools.getChildByTagName (source, StaticStrings.SUBCOLLECTION_INDEXES_ELEMENT); 1462 if (subcollection_indexes == null) { 1463 return; 1464 } 1465 NodeList index_elements = subcollection_indexes.getElementsByTagName (StaticStrings.INDEX_ELEMENT); 1466 int index_elements_length = index_elements.getLength (); 1467 1468 if (index_elements_length == 0) { // no indexes 1469 return ; 1470 } 1471 1472 for(int j = 0; j < index_elements_length; j++) { 1473 Element index_element = (Element) index_elements.item (j); 1474 if (index_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) { 1475 continue; 1476 } 1477 1478 Element index = to.createElement (StaticStrings.SUBCOLLECTION_INDEX_ELEMENT); 1479 1480 String index_value = ""; 1481 1482 NodeList content_elements = index_element.getElementsByTagName (StaticStrings.CONTENT_ELEMENT); 1483 int content_elements_length = content_elements.getLength (); 1484 1485 for(int k = 0; k < content_elements_length; k++) { 1486 Element content_element = (Element) content_elements.item (k); 1487 if (content_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) { 1488 continue; 1489 } 1490 String name_str = content_element.getAttribute (StaticStrings.NAME_ATTRIBUTE); 1491 index_value += name_str; 1492 // Make it comma separated string 1493 if(k < content_elements_length - 1) { 1494 index_value += StaticStrings.COMMA_CHARACTER; 1495 } 1496 content_element = null; 1497 }//for loop ends 1498 1499 index.setAttribute (StaticStrings.NAME_ATTRIBUTE, index_value); 1500 1501 // Now constructing 'displayItem' element for this 'indexSubcollection' element 1502 // from the collectionmetadata element 1503 ArrayList collectionmetadata_list = XMLTools.getNamedElementList (source, 1504 StaticStrings.COLLECTIONMETADATA_ELEMENT, 1505 StaticStrings.NAME_ATTRIBUTE, index_value); 1506 1507 if (collectionmetadata_list != null) { 1508 1509 for(int k = 0; k < collectionmetadata_list.size (); k++) { 1510 Element collectionmetadata = (Element)collectionmetadata_list.get (k); 1511 if (collectionmetadata.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) { 1512 continue; 1513 } 1514 Element displayItem = constructDisplayItem (collectionmetadata, to); 1515 index.appendChild (displayItem); 1516 } 1517 } 1518 1519 search.appendChild (index); 1520 1521 } //for loop ends 1522 } 1523 1524 static private void convertLanguages (Document from, Document to) { 1525 Element source = from.getDocumentElement (); 1526 //Get the 'search' element from 'to' which has already been created in 'convertBuildType' 1527 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR); 1528 1529 // Get the Languages element from the internal structure 1530 Element languages = (Element)XMLTools.getChildByTagName (source, StaticStrings.LANGUAGES_ELEMENT); 1531 if (languages == null) { 1532 return; 1533 } 1534 NodeList language_elements = languages.getElementsByTagName (StaticStrings.LANGUAGE_ELEMENT); 1535 int language_elements_length = language_elements.getLength (); 1536 1537 if (language_elements_length == 0) { 1538 return ; 1539 } 1540 1541 for(int j = 0; j < language_elements_length; j++) { 1542 Element element = (Element) language_elements.item (j); 1543 if (element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) { 1544 continue; 1545 } 1546 1547 // Create indexLanguage element 1548 Element index_language = to.createElement (StaticStrings.LANGUAGE_INDEX_ELEMENT); 1549 1550 String name_str = element.getAttribute (StaticStrings.NAME_ATTRIBUTE); 1551 index_language.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str); 1552 1553 // Now constructing 'displayItem' element for this 'indexLanguage' element 1554 // from the collectionmetadata element 1555 ArrayList collectionmetadata_list = XMLTools.getNamedElementList (source, 1556 StaticStrings.COLLECTIONMETADATA_ELEMENT, 1557 StaticStrings.NAME_ATTRIBUTE, name_str); 1558 1559 if (collectionmetadata_list != null) { 1560 1561 for(int k = 0; k < collectionmetadata_list.size (); k++) { 1562 Element collectionmetadata = (Element)collectionmetadata_list.get (k); 1563 if (collectionmetadata.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) { 1564 continue; 1565 } 1566 Element displayItem = constructDisplayItem (collectionmetadata, to); 1567 index_language.appendChild (displayItem); 1568 } 1569 } 1570 1571 search.appendChild (index_language); 1572 1573 } //for loop ends 1574 1575 // Convert DefaultLanguage 1576 // Get the DefaultLanguage element from the internal structure 1577 Element default_language = (Element)XMLTools.getChildByTagName (source, StaticStrings.LANGUAGE_DEFAULT_ELEMENT); 1578 if(default_language != null) { 1579 String lang_name = default_language.getAttribute (StaticStrings.NAME_ATTRIBUTE); 1580 Element default_index_language = to.createElement (StaticStrings.LANGUAGE_DEFAULT_INDEX_ELEMENT); 1581 default_index_language.setAttribute (StaticStrings.NAME_ATTRIBUTE, lang_name); 1582 search.appendChild (default_index_language); 1583 } 1584 // Convert LanguageMetadata 1585 // Get the LanguageMetadata element from the internal structure 1586 Element language_metadata = (Element)XMLTools.getChildByTagName (source, StaticStrings.LANGUAGE_METADATA_ELEMENT); 1587 if(language_metadata != null) { 1588 String meta_name = language_metadata.getAttribute (StaticStrings.NAME_ATTRIBUTE); 1589 Element language_meta = to.createElement (StaticStrings.LANGUAGE_METADATA_ELEMENT_STR); 1590 if(meta_name.startsWith (StaticStrings.EXTRACTED_NAMESPACE) && meta_name.indexOf(StaticStrings.NS_SEP, StaticStrings.EXTRACTED_NAMESPACE.length()) == -1) { 1591 meta_name = meta_name.substring (StaticStrings.EXTRACTED_NAMESPACE.length ()); 1592 } 1593 language_meta.setAttribute (StaticStrings.NAME_ATTRIBUTE, meta_name); 1594 search.appendChild (language_meta); 1595 } 1596 } 1597 1598 //convert indexes and their displayItems, which go in 'search' element in collectionConfig.xml 1599 //parameter 'to' is the document to be saved as collectionConfig.xml 1600 //parameter 'from' is the internal xml structure 1601 static private void convertIndex (Document from, Document to) { 1602 Element source = from.getDocumentElement (); 1603 //Get the 'search' element from 'to' which has already been created in 'convertBuildType' 1604 Element search = (Element)XMLTools.getChildByTagName (to.getDocumentElement (), StaticStrings.SEARCH_STR); 1605 1606 //THere are two sets of indexes elements, find the one which is assigned 'true' 1607 Element indexes = XMLTools.getNamedElement (source, 1608 StaticStrings.INDEXES_ELEMENT, 1609 StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 1610 if (indexes == null) { 1611 return; 1612 } 1613 NodeList index_elements = indexes.getElementsByTagName (StaticStrings.INDEX_ELEMENT); 1614 int index_elements_length = index_elements.getLength (); 1615 1616 if (index_elements_length == 0) { // no indexes 1617 return ; 1618 } 1619 1620 //find out it's mg or mgpp/lucene 1621 String mg = search.getAttribute (StaticStrings.TYPE_ATTRIBUTE); 1622 boolean mg_indexer = false; 1623 if (mg.equals (StaticStrings.MG_STR)) { 1624 mg_indexer = true;//it's mg, then the level is set as attribute of 1625 } 1626 if (mg_indexer == false) { 1627 // It's mgpp. Construct 'level' and 'defaultLevel' elements separately. 1628 convertLevels (from, to, search); 1629 } 1630 1631 for(int j = 0; j < index_elements_length; j++) { 1632 Element index_element = (Element) index_elements.item (j); 1633 if (index_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) { 1634 continue; 1635 } 1636 1637 Element index_ele = to.createElement (StaticStrings.INDEX_LOW_STR);//index 1638 1639 // Used for creating displayItem for this element 'index_ele' further below 1640 // full_index_names contain 'ex.' 1641 String full_index_name = ""; 1642 String level_str = ""; 1643 1644 StringBuffer index_value = new StringBuffer (); 1645 if (mg_indexer == true) { 1646 // For mg indexer, there is a 'level' attribute in the index element of the internal structure 1647 // But mgpp/lucene don't 1648 level_str = index_element.getAttribute (StaticStrings.LEVEL_ATTRIBUTE); 1649 if(level_str.length () > 0) { 1650 index_value.append (level_str).append (StaticStrings.COLON_CHARACTER); 1651 //index_value = index_value.StaticStrings.COLON_CHARACTER; 1652 } 1653 } 1654 1655 NodeList content_elements = index_element.getElementsByTagName (StaticStrings.CONTENT_ELEMENT); 1656 int content_elements_length = content_elements.getLength (); 1657 1658 for(int k = 0; k < content_elements_length; k++) { 1659 Element content_element = (Element) content_elements.item (k); 1660 if (content_element.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) { 1661 continue; 1662 } 1663 String name_str = content_element.getAttribute (StaticStrings.NAME_ATTRIBUTE); 1664 1665 full_index_name = full_index_name + name_str; 1666 if (k < content_elements_length - 1) { 1667 full_index_name = full_index_name + StaticStrings.COMMA_CHARACTER; 1668 } 1669 1670 if(name_str.startsWith (StaticStrings.EXTRACTED_NAMESPACE) && name_str.indexOf(StaticStrings.NS_SEP, StaticStrings.EXTRACTED_NAMESPACE.length()) == -1) { 1671 name_str = name_str.substring (StaticStrings.EXTRACTED_NAMESPACE.length ()); 1672 } 1673 1674 index_value.append (name_str); 1675 name_str = null; 1676 // Make it comma separated string 1677 if(k < content_elements_length - 1) { 1678 index_value.append (StaticStrings.COMMA_CHARACTER); 1679 } 1680 content_element = null; 1681 }//for loop ends 1682 1683 String temp_str = index_value.toString (); 1684 index_ele.setAttribute (StaticStrings.NAME_ATTRIBUTE, temp_str); 1685 1686 // Now constructing 'displayItem' element for this 'index_ele' element 1687 // The index names in the collectionmetadata elements in the internal structure are not the names that 1688 // are used in the content elements (i.e. ex.Source or dc.Subject and keywords), but the names that are 1689 // in the configuration files (i.e. Source or dc.Subject) 1690 ArrayList collectionmetadata_list = XMLTools.getNamedElementList (source, 1691 StaticStrings.COLLECTIONMETADATA_ELEMENT, 1692 StaticStrings.NAME_ATTRIBUTE, temp_str); 1693 1694 if (collectionmetadata_list == null) { 1695 //try the full name, i.e. with 'ex.' 1696 if (mg_indexer == true) { 1697 // but first append level info if we are mg 1698 full_index_name = level_str+StaticStrings.COLON_CHARACTER+full_index_name; 1699 } 1700 collectionmetadata_list = XMLTools.getNamedElementList (source, 1701 StaticStrings.COLLECTIONMETADATA_ELEMENT, 1702 StaticStrings.NAME_ATTRIBUTE, full_index_name); 1703 } 1704 1705 if (collectionmetadata_list != null) { 1706 1707 for(int k = 0; k < collectionmetadata_list.size (); k++) { 1708 Element collectionmetadata = (Element)collectionmetadata_list.get (k); 1709 if (collectionmetadata.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) { 1710 continue; 1711 } 1712 Element displayItem = constructDisplayItem (collectionmetadata, to); 1713 1714 index_ele.appendChild (displayItem); 1715 } 1716 } 1717 1718 search.appendChild (index_ele); 1719 1720 } //for loop ends 1721 1722 //Convert default index 1723 convertDefaultIndex (from, to, search); 1724 convertIndexOptions(from, to, search); 1725 } 1726 // Convert levels for mgpp/lucene. This method is called by converIndex() when mgpp indexer is detected. 1727 static private void convertLevels (Document from, Document to, Element search) { 1728 Element source = from.getDocumentElement (); 1729 Element index_option = XMLTools.getNamedElement (source, 1730 StaticStrings.INDEXOPTIONS_ELEMENT, 1731 StaticStrings.NAME_ATTRIBUTE, StaticStrings.LEVELS_STR); 1732 if (index_option == null) { 1733 return; 1734 } 1735 //Debugging purposes 1736 if (index_option.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) { 1737 DebugStream.println ("For mgpp, there should be an IndexOption element for levels which is assigned 'true': possible bug."); 1738 } 1739 1740 NodeList option_elements = index_option.getElementsByTagName (StaticStrings.OPTION_ELEMENT); 1741 int num_elements = option_elements.getLength (); 1742 1743 // Don't output anything if no indexes are set 1744 if(num_elements == 0) { 1745 return ;// 1746 } 1747 1748 for(int k = 0; k < num_elements; k++) { 1749 Element e = (Element) option_elements.item (k); 1750 String name_str = e.getAttribute (StaticStrings.NAME_ATTRIBUTE); 1751 Element level_element = to.createElement (StaticStrings.LEVEL_ELEMENT); 1752 level_element.setAttribute (StaticStrings.NAME_ATTRIBUTE, name_str); 1753 1754 //Now construct displayItem for this level element from collectionmetadata 1755 ArrayList collectionmetadata_list = XMLTools.getNamedElementList (source, 1756 StaticStrings.COLLECTIONMETADATA_ELEMENT, 1757 StaticStrings.NAME_ATTRIBUTE, name_str); 1758 1759 if (collectionmetadata_list != null) { 1760 1761 for(int j = 0; j < collectionmetadata_list.size (); j++) { 1762 Element collectionmetadata = (Element)collectionmetadata_list.get (j); 1763 1764 Element displayItem = constructDisplayItem (collectionmetadata, to); 1765 level_element.appendChild (displayItem); 1766 } 1767 } 1768 search.appendChild (level_element); 1769 } 1770 1771 //Convert default level 1772 Element default_index_option = XMLTools.getNamedElement (source, 1773 StaticStrings.INDEXOPTION_DEFAULT_ELEMENT, 1774 StaticStrings.NAME_ATTRIBUTE, StaticStrings.LEVEL_DEFAULT_STR); 1775 if (default_index_option == null) { 1776 return; 1777 } 1778 Element default_level = to.createElement (StaticStrings.LEVEL_DEFAULT_ELEMENT); 1779 String default_level_str = default_index_option.getAttribute (StaticStrings.VALUE_ATTRIBUTE); 1780 default_level.setAttribute (StaticStrings.NAME_ATTRIBUTE, default_level_str); 1781 search.appendChild (default_level); 1782 1783 } 1784 // Convert indexoptions for mg/mgpp/lucene. This method is called by convertIndex(). 1785 static private void convertIndexOptions (Document from, Document to, Element search) { 1786 Element source = from.getDocumentElement (); 1787 Element index_option = XMLTools.getNamedElement (source, 1788 StaticStrings.INDEXOPTIONS_ELEMENT, 1789 StaticStrings.NAME_ATTRIBUTE, StaticStrings.INDEXOPTIONS_STR); 1790 if (index_option == null) { 1791 return; 1792 } 1793 //Debugging purposes 1794 if (index_option.getAttribute (StaticStrings.ASSIGNED_ATTRIBUTE).equals (StaticStrings.FALSE_STR)) { 1795 DebugStream.println ("There should be an IndexOption element which is assigned 'true': possible bug."); 1796 } 1797 Element indexOptionEl = to.createElement(StaticStrings.INDEXOPTION_STR); 1798 NodeList option_elements = index_option.getElementsByTagName (StaticStrings.OPTION_ELEMENT); 1799 int num_elements = option_elements.getLength (); 1800 // Don't output anything if no index 1801 if(num_elements == 0) { 1802 return ;// 1803 } 1804 search.appendChild (indexOptionEl); 1805 1806 for(int k = 0; k < num_elements; k++) { 1807 Element e = (Element) option_elements.item (k); 1808 String name_att = e.getAttribute(StaticStrings.NAME_ATTRIBUTE); 1809 Element optionEl = to.createElement(StaticStrings.OPTION_STR); 1810 optionEl.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_att); 1811 indexOptionEl.appendChild(optionEl); 1812 } 1813 1814 } 1815 // Append the element son to the element mother in the appropriate position. 1816 static public void appendProperly (Element mother, Element son) { 1817 if (son == null) 1818 return; 1819 1820 Node reference_node = findInsertionPoint (mother, son); 1821 if(reference_node != null) { 1822 mother.insertBefore (son, reference_node); 1823 } 1824 else { 1825 mother.appendChild (son); 1826 } 1827 } 1828 /** Find the best insertion position for the given DOM Element 'target_element' in the DOM Element 'document_element'. This should try to match command tag, and if found should then try to group by name or type (eg CollectionMeta), or append to end is no such grouping exists (eg Plugins). Failing a command match it will check against the command order for the best insertion location. 1829 * @param target_element the command Element to be inserted 1830 * @return the Element which the given command should be inserted before, or null to append to end of list 1831 */ 1832 static public Node findInsertionPoint (Element document_element, Element target_element) { 1833 ///ystem.err.println("Find insertion point: " + target_element.getNodeName()); 1834 String target_element_name = target_element.getNodeName (); 1835 1836 // Try to find commands with the same tag. 1837 NodeList matching_elements = document_element.getElementsByTagName (target_element_name); 1838 // If we found matching elements, then we have our most likely insertion location, so check within for groupings 1839 if(matching_elements.getLength () != 0) { 1840 ///ystem.err.println("Found matching elements."); 1841 // Only CollectionMeta are grouped. 1842 if(target_element_name.equals (StaticStrings.COLLECTIONMETADATA_ELEMENT)) { 1843 ///ystem.err.println("Dealing with collection metadata"); 1844 // 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. 1845 // So if the command to be added is special add it immediately after any other special command 1846 if(target_element.getAttribute (StaticStrings.SPECIAL_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) { 1847 int index = 0; 1848 Element matched_element = (Element) matching_elements.item (index); 1849 Element sibling_element = (Element) matched_element.getNextSibling (); 1850 while(sibling_element.getAttribute (StaticStrings.SPECIAL_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) { 1851 index++; 1852 matched_element = (Element) matching_elements.item (index); 1853 sibling_element = (Element) matched_element.getNextSibling (); 1854 } 1855 if(sibling_element.getNodeName ().equals (CollectionConfiguration.NEWLINE_ELEMENT)) { 1856 Element newline_element = document_element.getOwnerDocument().createElement (CollectionConfiguration.NEWLINE_ELEMENT); 1857 document_element.insertBefore (newline_element, sibling_element); 1858 } 1859 return sibling_element; 1860 } 1861 // Otherwise try to find a matching 'name' and add after the last one in that group. 1862 else { 1863 int index = 0; 1864 target_element_name = target_element.getAttribute (StaticStrings.NAME_ATTRIBUTE); 1865 boolean found = false; 1866 // Skip all of the special metadata 1867 Element matched_element = (Element) matching_elements.item (index); 1868 while(matched_element.getAttribute (StaticStrings.SPECIAL_ATTRIBUTE).equals (StaticStrings.TRUE_STR)) { 1869 index++; 1870 matched_element = (Element) matching_elements.item (index); 1871 } 1872 // Begin search 1873 while(!found && matched_element != null) { 1874 if(matched_element.getAttribute (StaticStrings.NAME_ATTRIBUTE).equals (target_element_name)) { 1875 found = true; 1876 } 1877 else { 1878 index++; 1879 matched_element = (Element) matching_elements.item (index); 1880 } 1881 } 1882 // If we found a match, we need to continue checking until we find the last name match. 1883 if(found) { 1884 index++; 1885 Element previous_sibling = matched_element; 1886 Element sibling_element = (Element) matching_elements.item (index); 1887 while(sibling_element != null && sibling_element.getAttribute (StaticStrings.NAME_ATTRIBUTE).equals (target_element_name)) { 1888 previous_sibling = sibling_element; 1889 index++; 1890 sibling_element = (Element) matching_elements.item (index); 1891 } 1892 // 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! 1893 return previous_sibling.getNextSibling (); 1894 } 1895 // If not found we just add after last metadata element 1896 else { 1897 Element last_element = (Element) matching_elements.item (matching_elements.getLength () - 1); 1898 return last_element.getNextSibling (); 1899 } 1900 } 1901 1902 } 1903 else { 1904 ///ystem.err.println("Not dealing with collection meta."); 1905 Element matched_element = (Element) matching_elements.item (matching_elements.getLength () - 1); 1906 // 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) 1907 Node sibling_element = matched_element.getNextSibling (); 1908 if(sibling_element != null && sibling_element.getNodeName ().equals (CollectionConfiguration.NEWLINE_ELEMENT)) { 1909 Element newline_element = document_element.getOwnerDocument().createElement (CollectionConfiguration.NEWLINE_ELEMENT); 1910 document_element.insertBefore (newline_element, sibling_element); 1911 } 1912 return sibling_element; // Note that this may be null 1913 } 1914 } 1915 ///ystem.err.println("No matching elements found."); 1916 // Locate where this command is in the ordering 1917 int command_index = -1; 1918 for(int i = 0; command_index == -1 && i < CollectionConfiguration.COMMAND_ORDER.length; i++) { 1919 if(CollectionConfiguration.COMMAND_ORDER[i].equals (target_element_name)) { 1920 command_index = i; 1921 } 1922 } 1923 ///ystem.err.println("Command index is: " + command_index); 1924 // Now move forward, checking for existing elements in each of the preceeding command orders. 1925 int preceeding_index = command_index - 1; 1926 ///ystem.err.println("Searching before the target command."); 1927 while(preceeding_index >= 0) { 1928 matching_elements = document_element.getElementsByTagName (CollectionConfiguration.COMMAND_ORDER[preceeding_index]); 1929 // If we've found a match 1930 if(matching_elements.getLength () > 0) { 1931 // We add after the last element 1932 Element matched_element = (Element) matching_elements.item (matching_elements.getLength () - 1); 1933 // 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) 1934 Node sibling_element = matched_element.getNextSibling (); 1935 if(sibling_element != null && sibling_element.getNodeName ().equals (CollectionConfiguration.NEWLINE_ELEMENT)) { 1936 Element newline_element = document_element.getOwnerDocument().createElement (CollectionConfiguration.NEWLINE_ELEMENT); 1937 document_element.insertBefore (newline_element, sibling_element); 1938 } 1939 return sibling_element; // Note that this may be null 1940 } 1941 preceeding_index--; 1942 } 1943 // If all that fails, we now move backwards through the commands 1944 int susceeding_index = command_index + 1; 1945 ///ystem.err.println("Searching after the target command."); 1946 while(susceeding_index < CollectionConfiguration.COMMAND_ORDER.length) { 1947 matching_elements = document_element.getElementsByTagName (CollectionConfiguration.COMMAND_ORDER[susceeding_index]); 1948 // If we've found a match 1949 if(matching_elements.getLength () > 0) { 1950 // We add before the first element 1951 Element matched_element = (Element) matching_elements.item (0); 1952 // 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) 1953 Node sibling_element = matched_element.getPreviousSibling (); 1954 if(sibling_element != null && sibling_element.getNodeName ().equals (CollectionConfiguration.NEWLINE_ELEMENT)) { 1955 Element newline_element = document_element.getOwnerDocument().createElement (CollectionConfiguration.NEWLINE_ELEMENT); 1956 document_element.insertBefore (newline_element, sibling_element); 1957 } 1958 return sibling_element; // Note that this may be null 1959 } 1960 susceeding_index++; 1961 } 1962 // Well. Apparently there are no other commands in this collection configuration. So append away... 1963 return null; 1964 } 1965 // From collectionConfig.xml to internal structure:add 'ex.' namespace (if none). 1966 // From internal structure to collectionConfig.xml:always peel off 'ex.' namespace (if any), except for format statement 1967 //This method parses 'xml_file_doc' into 'dOc' 1968 static public void parse(File xml_file, Document dOc) { 1969 1970 Document xml_file_doc = XMLTools.parseXMLFile (xml_file); 1971 Element fromElement = xml_file_doc.getDocumentElement (); 1972 Element toElement = dOc.getDocumentElement (); 1973 1974 // It's deliberately set that 'creator', 'maintainer', and 'public' are only in English (as they are just names). 1975 // So the following ArrayList have only one element. 1976 Node metadataListNode = XMLTools.getChildByTagNameIndexed (fromElement, StaticStrings.METADATALIST_STR, 0); 1977 if (metadataListNode != null) { 1978 ArrayList creator = doMetadataList (dOc, metadataListNode, StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT, 1979 StaticStrings.COLLECTIONMETADATA_CREATOR_STR); 1980 ArrayList maintainer = doMetadataList (dOc, metadataListNode, 1981 StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT, 1982 StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR); 1983 ArrayList is_public = doMetadataList (dOc, metadataListNode, StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT, 1984 StaticStrings.COLLECTIONMETADATA_PUBLIC_STR); 1985 1986 appendArrayList (toElement, creator); 1987 appendArrayList (toElement, maintainer); 1988 appendArrayList (toElement, is_public); 1989 } 1990 1991 Node databaseNode = XMLTools.getChildByTagNameIndexed (fromElement, StaticStrings.INFODB_STR, 0); 1992 String databasetype_value = "gdbm"; 1993 if(databaseNode != null) { 1994 databasetype_value = ((Element)databaseNode).getAttribute (StaticStrings.TYPE_ATTRIBUTE);//might be gdbm|jdbm|sqlite OR not yet set (in which case it should default to gdbm) 1995 } 1996 1997 Element databasetype = doDatabaseType(dOc, databasetype_value); 1998 appendProperly (toElement, databasetype); 1999 2000 Node searchNode = XMLTools.getChildByTagNameIndexed (fromElement, StaticStrings.SEARCH_STR, 0); 2001 String buildtype_value = ((Element)searchNode).getAttribute (StaticStrings.TYPE_ATTRIBUTE);//might be mg|mgpp|lucene 2002 Element buildtype = doBuildType (dOc, buildtype_value); 2003 appendProperly (toElement, buildtype); 2004 2005 2006 Node importNode = XMLTools.getChildByTagNameIndexed (fromElement, StaticStrings.IMPORT_STR, 0); 2007 if (importNode == null) { 2008 System.out.println ("There is no content in the 'import' block."); 2009 } 2010 if (importNode != null) { 2011 //do plugin list nodes 2012 Node pluginListNode = XMLTools.getChildByTagNameIndexed ((Element)importNode, StaticStrings.PLUGINLIST_STR, 0); 2013 if (pluginListNode == null) { 2014 System.out.println ("There is no pluginlist set."); 2015 } 2016 if (pluginListNode != null) { 2017 2018 doPlugin (dOc, pluginListNode); 2019 } 2020 2021 //do the plugout element (used by building flax collections) 2022 Node plugout = XMLTools.getChildByTagNameIndexed ((Element)importNode, PLUGOUT_ELEMENT, 0); 2023 if (plugout != null) { 2024 Element to_element = XMLTools.duplicateElement (dOc, (Element)plugout, true); 2025 toElement.appendChild (to_element); 2026 } 2027 } 2028 2029 Node browseNode = XMLTools.getChildByTagNameIndexed (fromElement, StaticStrings.BROWSE_STR, 0); 2030 if (browseNode != null) { 2031 if (browseNode == null) { 2032 System.out.println ("There is no classifier."); 2033 } 2034 doClassifier (dOc, browseNode); 2035 } 2036 2037 Node displayItemListNode = XMLTools.getChildByTagNameIndexed (fromElement, StaticStrings.DISPLAYITEMLIST_STR, 0); 2038 if (displayItemListNode != null) { 2039 ArrayList description = doDisplayItemList (dOc, displayItemListNode, StaticStrings.DESCRIPTION_STR, 2040 StaticStrings.COLLECTIONMETADATA_COLLECTIONEXTRA_STR); 2041 ArrayList smallicon = doDisplayItemList (dOc, displayItemListNode, StaticStrings.SMALLICON_STR, 2042 StaticStrings.COLLECTIONMETADATA_ICONCOLLECTIONSMALL_STR); 2043 ArrayList icon = doDisplayItemList (dOc, displayItemListNode, StaticStrings.ICON_STR, 2044 StaticStrings.COLLECTIONMETADATA_ICONCOLLECTION_STR); 2045 ArrayList name = doDisplayItemList (dOc, displayItemListNode, StaticStrings.NAME_STR, 2046 StaticStrings.COLLECTIONMETADATA_COLLECTIONNAME_STR); 2047 2048 appendArrayList (toElement, description); 2049 appendArrayList (toElement, smallicon); 2050 appendArrayList (toElement, icon); 2051 appendArrayList (toElement, name); 2052 } 2053 2054 if (buildtype_value.equalsIgnoreCase ("mg")) { 2055 doMGIndexes (dOc, searchNode); 2056 } 2057 else { 2058 doMGPPIndexes (dOc, searchNode); 2059 } 2060 2061 doDefaultIndex (dOc, searchNode); 2062 doDefaultLevel (dOc, searchNode); 2063 doLevel (dOc, searchNode); 2064 doIndexOption (dOc, searchNode); 2065 doSubcollection (dOc, searchNode); 2066 doIndexSubcollection (dOc, searchNode); 2067 doIndexLanguage (dOc, searchNode); 2068 doDefaultIndexLanguage (dOc, searchNode); 2069 doLanguageMetadata (dOc, searchNode); 2070 doSearchType (dOc, searchNode); 2071 doSearchFormat (dOc, searchNode); 2072 doDisplayFormat (dOc, fromElement); 2073 doReplaceListRef (dOc, fromElement); 2074 doServiceRackList (dOc, fromElement); 2075 2076 } 2077 2078 2079 static public String generateStringVersion(Document doc) { 2080 return XMLTools.xmlNodeToString(doc); 2081 } 2082 2083 static public void save (File collect_config_xml_file, Document doc) { 2084 2085 Document collection_config_xml_document = convertInternalToCollectionConfig (doc); 2086 String[] nonEscapingTagNames = {StaticStrings.FORMAT_STR}; 2087 XMLTools.writeXMLFile (collect_config_xml_file, collection_config_xml_document, nonEscapingTagNames); 2088 2089 } 2090 2091 //Convert the internal XML DOM tree (dOc) into that of collectionConfig.xml (skeleton) 2092 static private Document convertInternalToCollectionConfig (Document dOc) { 2093 //first parse an empty skeleton of xml config file 2094 //The aim is to convert the internal structure into this skeleton 2095 Document skeleton = XMLTools.parseXMLFile ("xml/CollectionConfig.xml", true); 2096 //Element internal = dOc.getDocumentElement(); 2097 convertMetadataList (dOc, skeleton); 2098 convertDisplayItemList (dOc, skeleton); 2099 convertBuildType (dOc, skeleton); 2100 convertDatabaseType (dOc, skeleton); 2101 convertIndex (dOc, skeleton); 2102 convertPlugin (dOc, skeleton);//also do the plugout element 2103 convertClassifier (dOc, skeleton); 2104 convertSubcollectionIndexes (dOc, skeleton); 2105 convertLanguages (dOc, skeleton); 2106 convertSubcollection (dOc, skeleton); 2107 convertSearchType (dOc, skeleton); 2108 convertSearchFormat (dOc, skeleton); 2109 convertDisplayFormat (dOc, skeleton); 2110 convertReplaceListRef (dOc, skeleton); 2111 convertServiceRackList(dOc, skeleton); 2112 2113 return skeleton; 2114 } 2115 2116 // Append the elements, which are of Element type, in 'list' to Element 'to' 2117 static private void appendArrayList (Element to, ArrayList list) { 2118 if (list == null) return; 2119 2120 for (int i=0; i<list.size (); i++) { 2121 appendProperly (to, (Element)list.get (i)); 2122 } 2123 } 2124 2125 2126 44 public class CollectionConfigXMLReadWrite 45 { 46 47 static final private String PLUGOUT_ELEMENT = "plugout";//used by building flax collections 48 49 /** 50 * ************************************************************************* 51 * ******************************* The code from this point below are used 52 * for greenstone 3 collection configuration, i.e., read ColletionConfig.xml 53 * into the internal DOM tree, and convert the internal DOM tree back to 54 * CollectionConfig.xml. 55 * 56 * Methods named 'doXXXX' are for convert collectionConfig.xml into the 57 * internal configuration xml structure; Methods named 'convertXXXX' are for 58 * convert the internal configuration xml structure back to 59 * collectionConfig.xml. 60 ************************************************************************************************************ */ 61 62 /** 63 * Arguments: metadataListNode->the 'displayItemList' element in 64 * collectionConfig.xml name_value->the value of the 'name' attribute of 65 * 'index' element; att_value->the value of the 'name' attribute of 66 * 'displayItem' element return: an ArrayList of the contructed 67 * 'CollectionMetadata' elements 68 */ 69 static private ArrayList doDisplayItemList(Document to, Node displayListNode, String att_value, String name_value) 70 { 71 Element toElement = to.getDocumentElement(); 72 ArrayList display_item_list = new ArrayList(); 73 ArrayList item_list = XMLTools.getNamedElementList((Element) displayListNode, StaticStrings.DISPLAYITEM_STR, StaticStrings.NAME_ATTRIBUTE, att_value); 74 if (item_list == null) 75 { 76 return null; 77 } 78 79 for (int i = 0; i < item_list.size(); i++) 80 { 81 Element item = (Element) item_list.get(i); 82 String text = XMLTools.getNodeText(item); 83 84 //If there is nothing to display, don't bother creating the element 85 if (text == "") 86 { 87 continue; 88 } 89 //get the value in 'lang=value' 90 String lang = item.getAttribute(StaticStrings.LANG_STR); 91 92 Element e = to.createElement(StaticStrings.COLLECTIONMETADATA_ELEMENT); 93 e.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 94 e.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_value); 95 e.setAttribute(StaticStrings.LANGUAGE_ATTRIBUTE, lang); 96 XMLTools.setNodeText(e, text); 97 display_item_list.add(e); 98 } 99 return display_item_list; 100 } 101 102 static private ArrayList doMetadataList(Document to, Node metadataListNode, String ele_name, String att_value) 103 { 104 Element toElement = to.getDocumentElement(); 105 ArrayList metadata_list = new ArrayList(); 106 107 ArrayList item_list = XMLTools.getNamedElementList((Element) metadataListNode, StaticStrings.METADATA_STR, StaticStrings.NAME_ATTRIBUTE, att_value); 108 if (item_list == null) 109 { 110 return null; 111 } 112 113 for (int i = 0; i < item_list.size(); i++) 114 { 115 Element item = (Element) item_list.get(i); 116 String text = XMLTools.getNodeText(item); 117 118 //If there is nothing to display, don't bother creating the element 119 if (text == "") 120 { 121 continue; 122 } 123 //get the value in 'lang=value' 124 String lang = item.getAttribute(StaticStrings.LANG_STR); 125 126 Element element = to.createElement(ele_name); 127 element.setAttribute(StaticStrings.NAME_ATTRIBUTE, att_value); 128 element.setAttribute(StaticStrings.LANGUAGE_ATTRIBUTE, lang); 129 element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 130 element.setAttribute(StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR); 131 XMLTools.setNodeText(element, text); 132 133 metadata_list.add(element); 134 } 135 return metadata_list; 136 } 137 138 // 'to' is the internal structure 139 static private void doMGIndexes(Document to, Node searchNode) 140 { 141 Element toElement = to.getDocumentElement(); 142 Element indexes_element = to.createElement(StaticStrings.INDEXES_ELEMENT);//<Indexes> 143 indexes_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 144 indexes_element.setAttribute(StaticStrings.MGPP_ATTRIBUTE, StaticStrings.FALSE_STR); 145 146 NodeList index_children = ((Element) searchNode).getElementsByTagName(StaticStrings.INDEX_LOW_STR);//index 147 int num_nodes = index_children.getLength(); 148 149 for (int i = 0; i < num_nodes; i++) 150 { 151 Element e = (Element) index_children.item(i); 152 String index_str = e.getAttribute(StaticStrings.NAME_ATTRIBUTE); 153 String index_str_display = index_str;//used for creating collectionmetadata for this index 154 Element index_element = to.createElement(StaticStrings.INDEX_ELEMENT);//<Index> 155 156 // For mg, it's the 'Old G2.38 and earlier' that use level:source tuplets, but we double check it anyway 157 boolean old_index = true; 158 if (index_str.indexOf(StaticStrings.COLON_CHARACTER) == -1) 159 { 160 // It doesn't contain ':' character 161 System.err.println("Something is wrong! the index should be level:source tuplets."); 162 old_index = false; 163 } 164 else 165 { 166 // Handling 'index' element 167 index_element.setAttribute(StaticStrings.LEVEL_ATTRIBUTE, index_str.substring(0, index_str.indexOf(StaticStrings.COLON_CHARACTER))); 168 index_str = index_str.substring(index_str.indexOf(StaticStrings.COLON_CHARACTER) + 1); 169 170 //Each index may have a list of comma-separated strings. 171 //split them into 'content' elements in the internal structure 172 StringTokenizer content_tokenizer = new StringTokenizer(index_str, StaticStrings.COMMA_CHARACTER); 173 //index_str = ""; 174 while (content_tokenizer.hasMoreTokens()) 175 { 176 // Replace index_str to be qualified name, eg. dc.Subject and keywords insread of dc.Subject. 177 178 Element content_element = to.createElement(StaticStrings.CONTENT_ELEMENT); 179 String content_str = content_tokenizer.nextToken(); 180 // Since the contents of indexes have to be certain keywords, or metadata elements, 181 //if the content isn't a keyword and doesn't yet have a namespace, append the extracted metadata namespace. 182 if (content_str.indexOf(StaticStrings.NS_SEP) == -1) 183 { 184 if (content_str.equals(StaticStrings.TEXT_STR) || (!old_index && content_str.equals(StaticStrings.ALLFIELDS_STR))) 185 { 186 // in this case, do nothing 187 } 188 else 189 { 190 content_str = StaticStrings.EXTRACTED_NAMESPACE + content_str; 191 } 192 } 193 194 content_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, content_str); 195 index_element.appendChild(content_element); 196 content_element = null; 197 } // while ends 198 199 indexes_element.appendChild(index_element); 200 201 // Handling 'displayItem' elements and Constructing 'collectionmetadata' elements 202 // Use the fully qualified index names 203 ArrayList collectionmetadata_list = doDisplayItemList(to, e, StaticStrings.NAME_ATTRIBUTE, index_str_display); 204 appendArrayList(toElement, collectionmetadata_list); 205 } //else ends 206 } //for loop ends 207 appendProperly(toElement, indexes_element); 208 209 //***// 210 // create another set of <indexes> which will be used when user switches to MGPP/LUCENE 211 // i.e. we build a default index set for a start 212 213 String[] index_strs = { StaticStrings.TEXT_STR, StaticStrings.EXTRACTED_NAMESPACE + StaticStrings.TITLE_ELEMENT, StaticStrings.EXTRACTED_NAMESPACE + StaticStrings.SOURCE_ELEMENT }; 214 215 Element mgpp_indexes = to.createElement(StaticStrings.INDEXES_ELEMENT);//<Indexes> 216 mgpp_indexes.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR); 217 mgpp_indexes.setAttribute(StaticStrings.MGPP_ATTRIBUTE, StaticStrings.TRUE_STR); 218 for (int i = 0; i < index_strs.length; i++) 219 { 220 Element index_element = to.createElement(StaticStrings.INDEX_ELEMENT);//<Index> 221 Element content_element = to.createElement(StaticStrings.CONTENT_ELEMENT); 222 content_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, index_strs[i]); 223 index_element.appendChild(content_element); 224 mgpp_indexes.appendChild(index_element); 225 226 // Contructing 'collectionmetadata' elements for 'mgpp' indexes 227 Element collectionmetadata = to.createElement(StaticStrings.COLLECTIONMETADATA_ELEMENT); 228 collectionmetadata.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 229 collectionmetadata.setAttribute(StaticStrings.NAME_ATTRIBUTE, index_strs[i]); 230 collectionmetadata.setAttribute(StaticStrings.LANGUAGE_ATTRIBUTE, StaticStrings.ENGLISH_LANGUAGE_STR); 231 if (index_strs[i].indexOf(StaticStrings.NS_SEP) != -1) 232 { 233 index_strs[i] = index_strs[i].substring(index_strs[i].indexOf(StaticStrings.NS_SEP) + 1); 234 } 235 XMLTools.setNodeText(collectionmetadata, index_strs[i]); 236 237 appendProperly(toElement, collectionmetadata); 238 239 } 240 appendProperly(toElement, mgpp_indexes); 241 } 242 243 //This is actually doing indexes for both mgpp and lucene 244 static private void doMGPPIndexes(Document to, Node searchNode) 245 { 246 Element toElement = to.getDocumentElement(); 247 Element indexes_element = to.createElement(StaticStrings.INDEXES_ELEMENT);//<Indexes> 248 indexes_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 249 indexes_element.setAttribute(StaticStrings.MGPP_ATTRIBUTE, StaticStrings.TRUE_STR); 250 251 NodeList index_children = ((Element) searchNode).getElementsByTagName(StaticStrings.INDEX_LOW_STR);//index 252 int num_nodes = index_children.getLength(); 253 254 for (int i = 0; i < num_nodes; i++) 255 { 256 257 Element index_element = to.createElement(StaticStrings.INDEX_ELEMENT);//<Index> 258 Element e = (Element) index_children.item(i); 259 String index_str = e.getAttribute(StaticStrings.NAME_ATTRIBUTE); 260 String index_str_display = index_str;//for creating collectionmetadata for this index 261 262 // Handling 'index' element 263 // Double check to make sure it's not colon separated style index. 264 boolean old_index = false; 265 if (index_str.indexOf(StaticStrings.COLON_CHARACTER) != -1) 266 { 267 System.err.println("Something is wrong! the index should NOT be level:source tuplets style."); 268 old_index = true; 269 } 270 //Each index may have a list of comma-separated strings. 271 //split them into 'content' elements in the internal structure 272 StringTokenizer content_tokenizer = new StringTokenizer(index_str, StaticStrings.COMMA_CHARACTER); 273 //index_str = ""; 274 while (content_tokenizer.hasMoreTokens()) 275 { 276 // Replace index_str to be qualified name, eg. dc.Subject and keywords insread of dc.Subject. 277 278 Element content_element = to.createElement(StaticStrings.CONTENT_ELEMENT); 279 String content_str = content_tokenizer.nextToken(); 280 // 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. 281 if (content_str.indexOf(StaticStrings.NS_SEP) == -1) 282 { 283 if (content_str.equals(StaticStrings.TEXT_STR)) 284 { 285 // in this case, do nothing 286 } 287 else 288 { 289 content_str = StaticStrings.EXTRACTED_NAMESPACE + content_str; 290 } 291 } 292 content_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, content_str); 293 index_element.appendChild(content_element); 294 content_element = null; 295 } //while ends 296 297 indexes_element.appendChild(index_element); 298 299 index_element = null; 300 301 // Handling 'displayItem' element of this 'index' element 302 // 'e' is the parent element 'index' of 'displayItem' element 303 ArrayList collectionmetadata_list = doDisplayItemList(to, e, StaticStrings.NAME_ATTRIBUTE, index_str_display); 304 appendArrayList(toElement, collectionmetadata_list); 305 306 } // for loop ends 307 toElement.appendChild(indexes_element); 308 309 // create another set of <indexes> which will be used when user switches to MG 310 // i.e. we build a default index set for a start 311 Element mg_indexes = to.createElement(StaticStrings.INDEXES_ELEMENT);//<Indexes> 312 mg_indexes.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR); 313 mg_indexes.setAttribute(StaticStrings.MGPP_ATTRIBUTE, StaticStrings.FALSE_STR); 314 315 //put the namespace '.ex' as prefix to the indexes 316 String[] index_strs = { StaticStrings.TEXT_STR, StaticStrings.EXTRACTED_NAMESPACE + StaticStrings.TITLE_ELEMENT, StaticStrings.EXTRACTED_NAMESPACE + StaticStrings.SOURCE_ELEMENT }; 317 for (int i = 0; i < index_strs.length; i++) 318 { 319 Element index_element = to.createElement(StaticStrings.INDEX_ELEMENT);//<Index> 320 index_element.setAttribute(StaticStrings.LEVEL_ATTRIBUTE, StaticStrings.DOCUMENT_STR); 321 Element content_element = to.createElement(StaticStrings.CONTENT_ELEMENT); 322 content_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, index_strs[i]); 323 index_element.appendChild(content_element); 324 325 mg_indexes.appendChild(index_element); 326 327 // Contructing 'collectionmetadata' elements for 'mg' indexes 328 Element collectionmetadata = to.createElement(StaticStrings.COLLECTIONMETADATA_ELEMENT); 329 collectionmetadata.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 330 String temp = StaticStrings.DOCUMENT_STR.concat(StaticStrings.COLON_CHARACTER).concat(index_strs[i]); 331 collectionmetadata.setAttribute(StaticStrings.NAME_ATTRIBUTE, temp); 332 collectionmetadata.setAttribute(StaticStrings.LANGUAGE_ATTRIBUTE, StaticStrings.ENGLISH_LANGUAGE_STR); 333 if (index_strs[i].indexOf(StaticStrings.NS_SEP) != -1) 334 { 335 index_strs[i] = index_strs[i].substring(index_strs[i].indexOf(StaticStrings.NS_SEP) + 1); 336 } 337 XMLTools.setNodeText(collectionmetadata, index_strs[i]); 338 339 appendProperly(toElement, collectionmetadata); 340 341 } 342 toElement.appendChild(mg_indexes); 343 344 } 345 346 static private void doDisplayFormat(Document to, Element from) 347 { 348 //display element in the xml file 349 Element de = (Element) XMLTools.getChildByTagName(from, StaticStrings.DISPLAY_STR); 350 if (de == null) 351 { 352 return; 353 } 354 //format element in the display element 355 Element fe = (Element) XMLTools.getChildByTagName(de, StaticStrings.FORMAT_STR); 356 357 to.getDocumentElement().appendChild(doFormat(to, fe, StaticStrings.DISPLAY_STR)); 358 } 359 360 //construct 'DefaultIndex' element in the internal structure from collectionConfig.xml 361 static private void doDefaultIndex(Document to, Node searchNode) 362 { 363 Element toElement = to.getDocumentElement(); 364 Element default_index_element = to.createElement(StaticStrings.INDEX_DEFAULT_ELEMENT); 365 default_index_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 366 367 Element e = (Element) XMLTools.getChildByTagName(searchNode, StaticStrings.INDEX_DEFAULT_ELEMENT_LOWERCASE);//defaultIndex 368 if (e == null) 369 { 370 return; 371 } 372 String index_str = e.getAttribute(StaticStrings.NAME_ATTRIBUTE); 373 374 boolean old_index = false; 375 if (index_str.indexOf(StaticStrings.COLON_CHARACTER) != -1) 376 { 377 //The index is 'level:source tuplets' which is for mg. Take out 'level' 378 old_index = true; 379 default_index_element.setAttribute(StaticStrings.LEVEL_ATTRIBUTE, index_str.substring(0, index_str.indexOf(StaticStrings.COLON_CHARACTER))); 380 index_str = index_str.substring(index_str.indexOf(StaticStrings.COLON_CHARACTER) + 1); 381 } 382 else 383 { 384 default_index_element.setAttribute(StaticStrings.LEVEL_ATTRIBUTE, ""); 385 } 386 387 //Each index may have a list of comma-separated strings. 388 //split them into 'content' elements in the internal structure 389 StringTokenizer content_tokenizer = new StringTokenizer(index_str, StaticStrings.COMMA_CHARACTER); 390 while (content_tokenizer.hasMoreTokens()) 391 { 392 Element content_element = to.createElement(StaticStrings.CONTENT_ELEMENT); 393 String content_str = content_tokenizer.nextToken(); 394 // 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. 395 if (content_str.indexOf(StaticStrings.NS_SEP) == -1) 396 { 397 if (content_str.equals(StaticStrings.TEXT_STR) || (!old_index && content_str.equals(StaticStrings.ALLFIELDS_STR))) 398 { 399 // in this case, do nothing 400 } 401 else 402 { 403 content_str = StaticStrings.EXTRACTED_NAMESPACE + content_str; 404 } 405 } 406 407 content_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, content_str); 408 default_index_element.appendChild(content_element); 409 content_element = null; 410 } 411 appendProperly(toElement, default_index_element); 412 } 413 414 // For mg, this method is still called, but make it 'assigned=false' 415 static private void doDefaultLevel(Document to, Node searchNode) 416 { 417 Element toElement = to.getDocumentElement(); 418 Element default_index_option = to.createElement(StaticStrings.INDEXOPTION_DEFAULT_ELEMENT); 419 default_index_option.setAttribute(StaticStrings.NAME_STR, StaticStrings.LEVEL_DEFAULT_STR); 420 421 Element e = (Element) XMLTools.getChildByTagName(searchNode, StaticStrings.LEVEL_DEFAULT_ELEMENT); 422 if (e != null) 423 { 424 default_index_option.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 425 String level = e.getAttribute(StaticStrings.NAME_ATTRIBUTE); 426 default_index_option.setAttribute(StaticStrings.VALUE_ATTRIBUTE, level); 427 } 428 else 429 { 430 //In the case of mg, there's no level! build a default one using 'assigned=false value=document' 431 default_index_option.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR); 432 default_index_option.setAttribute(StaticStrings.VALUE_ATTRIBUTE, StaticStrings.DOCUMENT_STR); 433 } 434 appendProperly(toElement, default_index_option); 435 } 436 437 // Transform plugins (pluginListNode) of collectionConfig.xml into the internal structure (i.e. Document to) 438 static private void doPlugin(Document to, Node pluginListNode) 439 { 440 Element toElement = to.getDocumentElement(); 441 NodeList plugin_children = ((Element) pluginListNode).getElementsByTagName(StaticStrings.PLUGIN_STR); 442 int plugin_nodes = plugin_children.getLength(); 443 444 if (plugin_nodes < 1) 445 { 446 return; 447 } 448 449 for (int i = 0; i < plugin_nodes; i++) 450 { 451 Element e = (Element) plugin_children.item(i); 452 String str = e.getAttribute(StaticStrings.NAME_ATTRIBUTE); 453 str = Utility.ensureNewPluginName(str); 454 Element plugin_element = to.createElement(StaticStrings.PLUGIN_ELEMENT); 455 plugin_element.setAttribute(StaticStrings.TYPE_ATTRIBUTE, str); 456 457 NodeList option_children = e.getElementsByTagName(StaticStrings.OPTION_STR); 458 459 for (int j = 0; j < option_children.getLength(); j++) 460 { 461 Element el = (Element) option_children.item(j); 462 String name_str = el.getAttribute(StaticStrings.NAME_ATTRIBUTE); 463 if (name_str.startsWith(StaticStrings.MINUS_CHARACTER)) 464 { 465 name_str = name_str.substring(1); 466 } 467 String value_str = el.getAttribute(StaticStrings.VALUE_ATTRIBUTE); 468 Element option_element = null; 469 470 if (name_str.equals("") && !value_str.equals("")) 471 { 472 continue; 473 } 474 475 option_element = to.createElement(StaticStrings.OPTION_ELEMENT); 476 option_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 477 if (name_str.equals(StaticStrings.RECPLUG_STR) && value_str.equals(StaticStrings.USE_METADATA_FILES_ARGUMENT)) 478 { 479 continue; // ignore this option 480 } 481 482 if (value_str != null) 483 { 484 // Remove any speech marks appended in strings containing whitespace 485 if (value_str.startsWith(StaticStrings.SPEECH_CHARACTER) && value_str.endsWith(StaticStrings.SPEECH_CHARACTER)) 486 { 487 value_str = value_str.substring(1, value_str.length() - 1); 488 } 489 if (name_str.equals(StaticStrings.METADATA_STR)) 490 { 491 // 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. 492 String[] values = value_str.split(StaticStrings.COMMA_CHARACTER); 493 value_str = ""; 494 for (int k = 0; k <= values.length - 1; k++) 495 { 496 if (values[k].indexOf(StaticStrings.NS_SEP) == -1) 497 { 498 values[k] = StaticStrings.EXTRACTED_NAMESPACE + values[k]; 499 } 500 501 if (k < values.length - 1) 502 { 503 value_str = value_str + values[k] + StaticStrings.COMMA_CHARACTER; 504 505 } 506 else 507 { 508 value_str = value_str + values[k]; 509 } 510 } 511 } 512 } 513 if (!name_str.equals("")) 514 { 515 option_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_str); 516 } 517 if (!value_str.equals("")) 518 { 519 XMLTools.setNodeText(option_element, value_str); 520 } 521 plugin_element.appendChild(option_element); 522 523 } 524 525 appendProperly(toElement, plugin_element); 526 } 527 528 } 529 530 //Handle classifiers 531 static private void doClassifier(Document to, Node browseNode) 532 { 533 Element toElement = to.getDocumentElement(); 534 NodeList classifier_children = ((Element) browseNode).getElementsByTagName(StaticStrings.CLASSIFIER_STR); 535 int num_nodes = classifier_children.getLength(); 536 537 if (num_nodes < 1) 538 { 539 return; 540 } 541 542 for (int i = 0; i < num_nodes; i++) 543 { 544 Element e = (Element) classifier_children.item(i); 545 String str = e.getAttribute(StaticStrings.NAME_ATTRIBUTE); 546 Element classify_element = to.createElement(StaticStrings.CLASSIFY_ELEMENT); 547 classify_element.setAttribute(StaticStrings.TYPE_ATTRIBUTE, str); 548 549 String options_str = ""; 550 NodeList option_children = e.getElementsByTagName(StaticStrings.OPTION_STR); 551 for (int j = 0; j < option_children.getLength(); j++) 552 { 553 Element el = (Element) option_children.item(j); 554 String name_str = el.getAttribute(StaticStrings.NAME_ATTRIBUTE); 555 options_str = options_str + ((name_str.equals("")) ? "" : (" " + name_str)); 556 if (name_str.startsWith(StaticStrings.MINUS_CHARACTER)) 557 { 558 name_str = name_str.substring(1); 559 } 560 String value_str = el.getAttribute(StaticStrings.VALUE_ATTRIBUTE); 561 options_str = options_str + ((name_str.equals("")) ? "" : (" " + value_str)); 562 Element option_element = null; 563 564 if (name_str.equals("") && !value_str.equals("")) 565 { 566 continue; //invalid condition 567 } 568 569 option_element = to.createElement(StaticStrings.OPTION_ELEMENT); 570 option_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 571 572 if (!name_str.equals("")) 573 { 574 option_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_str); 575 } 576 577 if (!value_str.equals("") && name_str.equals(StaticStrings.METADATA_STR)) 578 { 579 // 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. 580 String[] values = value_str.split(StaticStrings.COMMA_CHARACTER); 581 value_str = ""; 582 for (int k = 0; k <= values.length - 1; k++) 583 { 584 if (values[k].indexOf(StaticStrings.NS_SEP) == -1) 585 { 586 values[k] = StaticStrings.EXTRACTED_NAMESPACE + values[k]; 587 } 588 else 589 { 590 MetadataElement metadata_element = MetadataTools.getMetadataElementWithName(values[k]); 591 if (metadata_element != null) 592 { 593 values[k] = metadata_element.getDisplayName(); 594 } 595 } 596 if (k < values.length - 1) 597 { 598 value_str = value_str + values[k] + StaticStrings.COMMA_CHARACTER; 599 } 600 else 601 { 602 value_str = value_str + values[k]; 603 } 604 } 605 } 606 607 if (value_str != null && !value_str.equals("")) 608 { 609 XMLTools.setNodeText(option_element, value_str); 610 } 611 classify_element.appendChild(option_element); 612 } 613 //format element for this classifier 614 Element format = (Element) XMLTools.getChildByTagName(e, StaticStrings.FORMAT_STR); 615 if (format != null) 616 { 617 classify_element.appendChild(doFormat(to, format, null)); 618 } 619 appendProperly(toElement, classify_element); 620 } 621 622 // default format statement for all classifiers 623 Element default_classifier_format = (Element) XMLTools.getChildByTagName(browseNode, StaticStrings.FORMAT_STR); 624 625 to.getDocumentElement().appendChild(doFormat(to, default_classifier_format, StaticStrings.BROWSE_STR)); 626 } 627 628 static private Element doFormat(Document to, Element format, String name_str) 629 { 630 Element format_element = to.createElement(StaticStrings.FORMAT_STR); 631 if (name_str != null) 632 { 633 format_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_str); 634 } 635 636 // Don't write out an empty format statement of <format/> (i.e. format has no child nodes) 637 // as this will end up embedded in another format statement as <format><format/><format /> 638 // This doubling up of format stmts will then prevent GLI from opening the collection again. 639 if (format != null && format.hasChildNodes()) 640 { // not an empty format statement 641 String gsf_text = XMLTools.xmlNodeToStringWithoutIndenting(format); 642 643 if (gsf_text.startsWith("<") && (gsf_text.indexOf("<") != gsf_text.lastIndexOf("<"))) 644 { 645 gsf_text = gsf_text.substring(gsf_text.indexOf("<gsf"), gsf_text.indexOf(StaticStrings.FORMAT_END_TAG)); 646 } 647 648 XMLTools.setNodeText(format_element, gsf_text); 649 } 650 return format_element; 651 } 652 653 // Handling 'subcollection' elements in 'search' element of 'collectionConfig.xml' 654 static private void doSubcollection(Document to, Node searchNode) 655 { 656 Element toElement = to.getDocumentElement(); 657 NodeList sub_children = ((Element) searchNode).getElementsByTagName(StaticStrings.SUBCOLLECTION_STR); 658 int sub_nodes = sub_children.getLength(); 659 660 // There is no subcollection 661 if (sub_nodes < 1) 662 { 663 return; 664 } 665 666 for (int i = 0; i < sub_nodes; i++) 667 { 668 Element sub_child = (Element) sub_children.item(i); 669 String name_str = sub_child.getAttribute(StaticStrings.NAME_ATTRIBUTE); 670 String filter_str = sub_child.getAttribute(StaticStrings.FILTER_ATTRIBUTE); 671 672 // filter_str is in the form '<! (if set)><metadata>/<metadata value>/<flag (if any)>' 673 674 int pos = filter_str.indexOf(StaticStrings.SEPARATOR_CHARACTER); 675 String meta_str = ""; 676 String meta_value_str = ""; 677 String clude_str = ""; 678 String flag_str = ""; 679 if (pos == -1) 680 { 681 682 meta_str = meta_value_str = filter_str; 683 clude_str = StaticStrings.INCLUDE_STR; 684 } 685 else 686 { 687 clude_str = StaticStrings.INCLUDE_STR; 688 if (filter_str.startsWith(StaticStrings.EXCLAMATION_CHARACTER)) 689 { 690 clude_str = StaticStrings.EXCLUDE_STR; 691 // Peel off "!" 692 filter_str = filter_str.substring(StaticStrings.EXCLAMATION_CHARACTER.length()); 693 } 694 695 String[] strs = filter_str.split(StaticStrings.SEPARATOR_CHARACTER); 696 if (strs[0] != null && strs[0] != "") 697 { 698 meta_str = strs[0]; 699 } 700 if (!meta_str.equals(StaticStrings.FILENAME_STR) && meta_str.indexOf(StaticStrings.NS_SEP) == -1) 701 { 702 meta_str = StaticStrings.EXTRACTED_NAMESPACE + meta_str; 703 } 704 705 if (strs[1] != null && strs[1] != "") 706 { 707 meta_value_str = strs[1]; 708 } 709 if (strs.length > 2) 710 { 711 //This means there has been set a flag 712 if (strs[2] != null && strs[2] != "") 713 { 714 flag_str = strs[2]; 715 } 716 } 717 } 718 Element subcollection_element = to.createElement(StaticStrings.SUBCOLLECTION_ELEMENT); 719 subcollection_element.setAttribute(StaticStrings.NAME_STR, name_str); 720 subcollection_element.setAttribute(StaticStrings.CONTENT_ATTRIBUTE, meta_str); 721 subcollection_element.setAttribute(StaticStrings.TYPE_ATTRIBUTE, clude_str); 722 if (flag_str != "") 723 { 724 subcollection_element.setAttribute(StaticStrings.OPTIONS_ATTRIBUTE, flag_str); 725 } 726 XMLTools.setNodeText(subcollection_element, meta_value_str); 727 728 toElement.appendChild(subcollection_element); 729 } 730 } 731 732 //Handle levels (document, section). In the internal structure, the element is called 'IndexOption' 733 static private void doLevel(Document to, Node searchNode) 734 { 735 Element toElement = to.getDocumentElement(); 736 NodeList level_children = ((Element) searchNode).getElementsByTagName(StaticStrings.LEVEL_ATTRIBUTE); 737 int level_nodes = level_children.getLength(); 738 739 // it's mg, there's no level. So we construct a default 'indexOption' in the internal structure 740 if (level_nodes < 1) 741 { 742 Element index_option = to.createElement(StaticStrings.INDEXOPTIONS_ELEMENT); 743 index_option.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR); 744 index_option.setAttribute(StaticStrings.NAME_STR, StaticStrings.LEVELS_STR); 745 746 Element option_element = to.createElement(StaticStrings.OPTION_ELEMENT); 747 option_element.setAttribute(StaticStrings.NAME_STR, StaticStrings.DOCUMENT_STR); 748 index_option.appendChild(option_element); 749 750 appendProperly(toElement, index_option); 751 752 return; 753 } 754 755 Element index_option = to.createElement(StaticStrings.INDEXOPTIONS_ELEMENT); 756 index_option.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 757 index_option.setAttribute(StaticStrings.NAME_STR, StaticStrings.LEVELS_STR); 758 759 for (int i = 0; i < level_nodes; i++) 760 { 761 Element level_element = (Element) level_children.item(i); 762 String level_str = level_element.getAttribute(StaticStrings.NAME_ATTRIBUTE); 763 Element option_element = to.createElement(StaticStrings.OPTION_ELEMENT); 764 option_element.setAttribute(StaticStrings.NAME_STR, level_str); 765 index_option.appendChild(option_element); 766 767 // Contructing 'collectionmetadata' elements from the 'displayItem' of this 'level' element 768 ArrayList displayItem_list = XMLTools.getNamedElementList(level_element, StaticStrings.DISPLAYITEM_STR, StaticStrings.NAME_ATTRIBUTE, StaticStrings.NAME_STR); 769 if (displayItem_list == null) 770 { 771 return; 772 } 773 for (int j = 0; j < displayItem_list.size(); j++) 774 { 775 Element item = (Element) displayItem_list.get(j); 776 String text = XMLTools.getNodeText(item); 777 String lang = item.getAttribute(StaticStrings.LANG_ATTRIBUTE); 778 779 //If there is nothing to display, don't bother creating the element 780 if (text == "") 781 { 782 continue; 783 } 784 Element collectionmetadata = to.createElement(StaticStrings.COLLECTIONMETADATA_ELEMENT); 785 collectionmetadata.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 786 collectionmetadata.setAttribute(StaticStrings.NAME_ATTRIBUTE, level_str); 787 collectionmetadata.setAttribute(StaticStrings.LANGUAGE_ATTRIBUTE, lang); 788 XMLTools.setNodeText(collectionmetadata, text); 789 790 appendProperly(toElement, collectionmetadata); 791 } 792 } 793 appendProperly(toElement, index_option); 794 } 795 796 //Handle 'indexSubcollection' element of collectionConfig.xml, which is called 'SubcollectionIndexes' in the internal structure. These contain the subcollection indexes (i.e. the filter or filter combinations), and displayed words for the filter names. 797 static private void doIndexSubcollection(Document to, Node searchNode) 798 { 799 Element toElement = to.getDocumentElement(); 800 NodeList index_sub_children = ((Element) searchNode).getElementsByTagName(StaticStrings.SUBCOLLECTION_INDEX_ELEMENT); 801 int num_nodes = index_sub_children.getLength(); 802 803 // there is no subcollection index 804 if (num_nodes < 1) 805 { 806 return; 807 } 808 809 Element subcollection_indexes = to.createElement(StaticStrings.SUBCOLLECTION_INDEXES_ELEMENT); 810 811 for (int i = 0; i < num_nodes; i++) 812 { 813 Element index_element = to.createElement(StaticStrings.INDEX_ELEMENT); 814 Element index_sub_child = (Element) index_sub_children.item(i); 815 String name_str = index_sub_child.getAttribute(StaticStrings.NAME_ATTRIBUTE); 816 817 // name_str is in the form of comma separated strings, each of which is a subcollection filter name 818 String[] filters = name_str.split(StaticStrings.COMMA_CHARACTER); 819 for (int j = 0; j < filters.length; j++) 820 { 821 822 Element content_element = to.createElement(StaticStrings.CONTENT_ELEMENT); 823 content_element.setAttribute(StaticStrings.NAME_STR, filters[j]); 824 index_element.appendChild(content_element); 825 } 826 subcollection_indexes.appendChild(index_element); 827 828 // Contructing 'collectionmetadata' elements from the 'displayItem' of this 'indexSubcollection' element 829 ArrayList displayItem_list = XMLTools.getNamedElementList(index_sub_child, StaticStrings.DISPLAYITEM_STR, StaticStrings.NAME_ATTRIBUTE, StaticStrings.NAME_STR); 830 if (displayItem_list == null) 831 { 832 // there is no display item for this element 833 continue; 834 } 835 for (int j = 0; j < displayItem_list.size(); j++) 836 { 837 Element item = (Element) displayItem_list.get(j); 838 String text = XMLTools.getNodeText(item); 839 String lang = item.getAttribute(StaticStrings.LANG_ATTRIBUTE); 840 841 //If there is nothing to display, don't bother creating the element 842 if (text == "") 843 { 844 continue; 845 } 846 Element collectionmetadata = to.createElement(StaticStrings.COLLECTIONMETADATA_ELEMENT); 847 collectionmetadata.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 848 collectionmetadata.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_str); 849 collectionmetadata.setAttribute(StaticStrings.LANGUAGE_ATTRIBUTE, lang); 850 XMLTools.setNodeText(collectionmetadata, text); 851 852 appendProperly(toElement, collectionmetadata); 853 } 854 } 855 appendProperly(toElement, subcollection_indexes); 856 } 857 858 //Handle 'indexLanguage' element of collectionConfig.xml, which is called 'Languages' in the internal structure. These contain the language indexes, and displayed words for those language index names. 859 static private void doIndexLanguage(Document to, Node searchNode) 860 { 861 Element toElement = to.getDocumentElement(); 862 NodeList index_sub_children = ((Element) searchNode).getElementsByTagName(StaticStrings.LANGUAGE_INDEX_ELEMENT); 863 int num_nodes = index_sub_children.getLength(); 864 865 // there is no subcollection index 866 if (num_nodes < 1) 867 { 868 return; 869 } 870 871 Element language_indexes = to.createElement(StaticStrings.LANGUAGES_ELEMENT); 872 873 for (int i = 0; i < num_nodes; i++) 874 { 875 Element language_element = to.createElement(StaticStrings.LANGUAGE_ELEMENT); 876 Element index_sub_child = (Element) index_sub_children.item(i); 877 String name_str = index_sub_child.getAttribute(StaticStrings.NAME_ATTRIBUTE); 878 language_element.setAttribute(StaticStrings.NAME_STR, name_str); 879 language_indexes.appendChild(language_element); 880 881 // Contructing 'collectionmetadata' elements from the 'displayItem' of this 'indexLanguage' element 882 ArrayList displayItem_list = XMLTools.getNamedElementList(index_sub_child, StaticStrings.DISPLAYITEM_STR, StaticStrings.NAME_ATTRIBUTE, StaticStrings.NAME_STR); 883 if (displayItem_list == null) 884 { 885 // there is no display item for this element 886 continue; 887 } 888 for (int j = 0; j < displayItem_list.size(); j++) 889 { 890 Element item = (Element) displayItem_list.get(j); 891 String text = XMLTools.getNodeText(item); 892 String lang = item.getAttribute(StaticStrings.LANG_ATTRIBUTE); 893 894 //If there is nothing to display, don't bother creating the element 895 if (text == "") 896 { 897 continue; 898 } 899 Element collectionmetadata = to.createElement(StaticStrings.COLLECTIONMETADATA_ELEMENT); 900 collectionmetadata.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 901 collectionmetadata.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_str); 902 collectionmetadata.setAttribute(StaticStrings.LANGUAGE_ATTRIBUTE, lang); 903 XMLTools.setNodeText(collectionmetadata, text); 904 905 appendProperly(toElement, collectionmetadata); 906 } 907 } 908 toElement.appendChild(language_indexes); 909 } 910 911 // Handling search types 912 static private void doSearchType(Document to, Node searchNode) 913 { 914 NodeList type_children = ((Element) searchNode).getElementsByTagName(StaticStrings.SEARCHTYPE_ELEMENT); 915 int num_types = type_children.getLength(); 916 String searchtype_str = ""; 917 if (num_types < 1) 918 { 919 // not defined yet, add in default 920 searchtype_str = "plain,simpleform,advancedform"; 921 } 922 else 923 { 924 for (int i = 0; i < num_types; i++) 925 { 926 Node e = type_children.item(i); 927 String t = ((Element) e).getAttribute(StaticStrings.NAME_ATTRIBUTE); 928 if (i > 0) 929 { 930 searchtype_str += ","; 931 } 932 searchtype_str += t; 933 } 934 } 935 936 // pretend its a format statement 937 Element search_type_element = to.createElement(StaticStrings.FORMAT_STR); 938 search_type_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, StaticStrings.SEARCHTYPE_ELEMENT); 939 XMLTools.setNodeText(search_type_element, searchtype_str); 940 appendProperly(to.getDocumentElement(), search_type_element); 941 942 } 943 944 // Handling search format statement 945 static private void doSearchFormat(Document to, Node searchNode) 946 { 947 // THere is currently just one format element for search. HOwever, need to check for old config files which used to have <format name="searchTypes"> 948 NodeList format_children = ((Element) searchNode).getElementsByTagName(StaticStrings.FORMAT_STR); 949 int format_nodes = format_children.getLength(); 950 if (format_nodes < 1) 951 { 952 return; 953 } 954 Element format = null; 955 for (int i = 0; i < format_nodes; i++) 956 { 957 Node e = format_children.item(i); 958 if (e.hasAttributes() == false) 959 { 960 //The format element for format statement has no attribute 961 format = (Element) e; 962 } 963 } 964 //format statement for search 965 if (format != null) 966 { 967 (to.getDocumentElement()).appendChild(doFormat(to, format, StaticStrings.SEARCH_STR)); 968 } 969 } 970 971 // Handling defaultIndexLanguage and languageMetadata in collectionConfig.xml ('elementNameFrom'); in the internal structure, they are called 'DefaultLanguage' and 'LanguageMetadata' ('elementNameTo') respectively. 972 // Converting from collectionConfig.xml to the internal xml structure. 973 static private void doLanguageMetadata(Document to, Node searchNode) 974 { 975 Element toElement = to.getDocumentElement(); 976 String elementNameFrom = StaticStrings.LANGUAGE_METADATA_ELEMENT_STR; 977 String elementNameTo = StaticStrings.LANGUAGE_METADATA_ELEMENT; 978 Node from_element = XMLTools.getChildByTagName(searchNode, elementNameFrom); 979 if (from_element == null) 980 { 981 return; // such an element not found 982 } 983 984 Element to_element = to.createElement(elementNameTo); 985 986 String name_str = ((Element) from_element).getAttribute(StaticStrings.NAME_ATTRIBUTE); 987 if (name_str.indexOf(StaticStrings.NS_SEP) == -1) 988 { 989 name_str = StaticStrings.EXTRACTED_NAMESPACE + name_str; 990 } 991 to_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_str); 992 to_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 993 994 toElement.appendChild(to_element); 995 } 996 997 static private void doReplaceListRef(Document to, Element from) 998 { 999 Element toElement = to.getDocumentElement(); 1000 1001 NodeList replace_elements = from.getElementsByTagName(StaticStrings.REPLACELISTREF_STR); 1002 int num_elems = replace_elements.getLength(); 1003 if (num_elems < 1) 1004 { 1005 return; 1006 } 1007 for (int i = 0; i < num_elems; i++) 1008 { 1009 Element to_element = XMLTools.duplicateElement(to, (Element) replace_elements.item(i), true); 1010 toElement.appendChild(to_element); 1011 } 1012 } 1013 1014 static private void convertReplaceListRef(Document from, Document to) 1015 { 1016 Element toElement = to.getDocumentElement(); 1017 1018 NodeList replace_elements = from.getDocumentElement().getElementsByTagName(StaticStrings.REPLACELISTREF_STR); 1019 int num_elems = replace_elements.getLength(); 1020 if (num_elems < 1) 1021 { 1022 return; 1023 } 1024 for (int i = 0; i < num_elems; i++) 1025 { 1026 Element to_element = XMLTools.duplicateElement(to, (Element) replace_elements.item(i), true); 1027 toElement.appendChild(to_element); 1028 } 1029 } 1030 1031 /** 1032 * serviceRackList is currently not editable in GLI - just copy it in from 1033 * config file and write it out again. 1034 */ 1035 static private void doServiceRackList(Document to, Element from) 1036 { 1037 Element toElement = to.getDocumentElement(); 1038 1039 Node srl_element = XMLTools.getChildByTagName(from, StaticStrings.SERVICE_RACK_LIST_ELEMENT); 1040 if (srl_element == null) 1041 { 1042 return; // such an element not found 1043 } 1044 1045 Element to_element = XMLTools.duplicateElement(to, (Element) srl_element, true); 1046 toElement.appendChild(to_element); 1047 } 1048 1049 static private void convertServiceRackList(Document from, Document to) 1050 { 1051 Element toElement = to.getDocumentElement(); 1052 1053 Node srl_element = XMLTools.getChildByTagName(from.getDocumentElement(), StaticStrings.SERVICE_RACK_LIST_ELEMENT); 1054 if (srl_element == null) 1055 { 1056 return; // such an element not found 1057 } 1058 1059 Element to_element = XMLTools.duplicateElement(to, (Element) srl_element, true); 1060 toElement.appendChild(to_element); 1061 } 1062 1063 static private void doDefaultIndexLanguage(Document to, Node searchNode) 1064 { 1065 Element toElement = to.getDocumentElement(); 1066 String elementNameFrom = StaticStrings.LANGUAGE_DEFAULT_INDEX_ELEMENT; 1067 String elementNameTo = StaticStrings.LANGUAGE_DEFAULT_ELEMENT; 1068 Node from_element = XMLTools.getChildByTagName(searchNode, elementNameFrom); 1069 if (from_element == null) 1070 { 1071 return; // such an element not found 1072 } 1073 1074 Element to_element = to.createElement(elementNameTo); 1075 1076 String name_str = ((Element) from_element).getAttribute(StaticStrings.NAME_ATTRIBUTE); 1077 to_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_str); 1078 to_element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 1079 1080 toElement.appendChild(to_element); 1081 } 1082 1083 //Handle 'indexOption' (i.e. casefold, stem etc). In the internal structure, the element is called 'IndexOption' 1084 static private void doIndexOption(Document to, Node searchNode) 1085 { 1086 Element toElement = to.getDocumentElement(); 1087 Node index_option_node = XMLTools.getChildByTagName(searchNode, StaticStrings.INDEXOPTION_STR); 1088 if (index_option_node == null) 1089 { 1090 return; 1091 } 1092 NodeList option_children = ((Element) index_option_node).getElementsByTagName(StaticStrings.OPTION_STR); 1093 int option_nodes = option_children.getLength(); 1094 1095 // for lucene, there is no 'indexOption'. We build a default 'indexOption' and 'assigned=false' in case the user switches to mg or mgpp 1096 if (option_nodes < 1) 1097 { 1098 Element index_option = to.createElement(StaticStrings.INDEXOPTIONS_ELEMENT); 1099 index_option.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.FALSE_STR); 1100 index_option.setAttribute(StaticStrings.NAME_STR, StaticStrings.INDEXOPTIONS_STR); 1101 String[] option_str = { StaticStrings.CASEFOLD_OPTION_STR, StaticStrings.STEM_OPTION_STR }; 1102 for (int i = 0; i < option_str.length; i++) 1103 { 1104 Element option_element = to.createElement(StaticStrings.OPTION_ELEMENT); 1105 option_element.setAttribute(StaticStrings.NAME_STR, option_str[i]); 1106 index_option.appendChild(option_element); 1107 } 1108 appendProperly(toElement, index_option); 1109 return; 1110 } 1111 1112 Element index_option = to.createElement(StaticStrings.INDEXOPTIONS_ELEMENT); 1113 index_option.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 1114 index_option.setAttribute(StaticStrings.NAME_STR, StaticStrings.INDEXOPTIONS_STR); 1115 1116 for (int i = 0; i < option_nodes; i++) 1117 { 1118 String option_str = ((Element) option_children.item(i)).getAttribute(StaticStrings.NAME_ATTRIBUTE); 1119 Element option_element = to.createElement(StaticStrings.OPTION_ELEMENT); 1120 option_element.setAttribute(StaticStrings.NAME_STR, option_str); 1121 index_option.appendChild(option_element); 1122 } 1123 appendProperly(toElement, index_option); 1124 } 1125 1126 static private Element doBuildType(Document to, String att_value) 1127 { 1128 1129 //construct 'BuildType' element 1130 Element element = to.createElement(StaticStrings.BUILDTYPE_ELEMENT); 1131 element.setAttribute(StaticStrings.NAME_ATTRIBUTE, StaticStrings.BUILDTYPE_STR); 1132 element.setAttribute(StaticStrings.LANGUAGE_ATTRIBUTE, StaticStrings.ENGLISH_LANGUAGE_STR); 1133 element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 1134 element.setAttribute(StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR); 1135 1136 XMLTools.setNodeText(element, att_value); 1137 1138 return element; 1139 } 1140 1141 static private Element doDatabaseType(Document to, String att_value) 1142 { 1143 1144 //construct 'DatabaseType' element 1145 Element element = to.createElement(StaticStrings.DATABASETYPE_ELEMENT); 1146 element.setAttribute(StaticStrings.NAME_ATTRIBUTE, StaticStrings.DATABASETYPE_STR); 1147 element.setAttribute(StaticStrings.LANGUAGE_ATTRIBUTE, StaticStrings.ENGLISH_LANGUAGE_STR); 1148 element.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 1149 element.setAttribute(StaticStrings.SPECIAL_ATTRIBUTE, StaticStrings.TRUE_STR); 1150 1151 XMLTools.setNodeText(element, att_value); 1152 1153 return element; 1154 } 1155 1156 // Convert 'description', 'smallicon' etc. 1157 static private void convertDisplayItemList(Document from, Document to) 1158 { 1159 Element displayItemList = to.createElement(StaticStrings.DISPLAYITEMLIST_STR); 1160 Element destination = to.getDocumentElement(); 1161 1162 String[] att_values = { StaticStrings.COLLECTIONMETADATA_COLLECTIONEXTRA_STR, StaticStrings.COLLECTIONMETADATA_ICONCOLLECTIONSMALL_STR, StaticStrings.COLLECTIONMETADATA_ICONCOLLECTION_STR, StaticStrings.COLLECTIONMETADATA_COLLECTIONNAME_STR }; 1163 1164 String[] map_attrs = { StaticStrings.DESCRIPTION_STR, StaticStrings.SMALLICON_STR, StaticStrings.ICON_STR, StaticStrings.NAME_STR }; 1165 1166 for (int i = 0; i < att_values.length; i++) 1167 { 1168 1169 //dOc 1170 ArrayList e_list = XMLTools.getNamedElementList(from.getDocumentElement(), StaticStrings.COLLECTIONMETADATA_ELEMENT, StaticStrings.NAME_ATTRIBUTE, att_values[i]); 1171 // if such elements don't exist, don't bother 1172 if (e_list == null) 1173 { 1174 continue; 1175 } 1176 for (int j = 0; j < e_list.size(); j++) 1177 { 1178 Element e = (Element) e_list.get(j); 1179 if (e.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) 1180 { 1181 continue; 1182 } 1183 String text = XMLTools.getNodeText(e); 1184 String lang = e.getAttribute(StaticStrings.LANGUAGE_ATTRIBUTE); 1185 1186 Element displayItem = constructElement(StaticStrings.DISPLAYITEM_STR, map_attrs[i], StaticStrings.LANG_STR, lang, text, to); 1187 displayItemList.appendChild(displayItem); 1188 } 1189 1190 } 1191 destination.appendChild(displayItemList); 1192 } 1193 1194 // This method creates a DisplayItem element of the type of 'to' by using the ingredients from the element 'e' 1195 static private Element constructDisplayItem(Element e, Document to) 1196 { 1197 String lang_string = e.getAttribute(StaticStrings.LANGUAGE_ATTRIBUTE); 1198 String text = XMLTools.getNodeText(e); 1199 Element displayItem = to.createElement(StaticStrings.DISPLAYITEM_STR); 1200 displayItem.setAttribute(StaticStrings.NAME_ATTRIBUTE, StaticStrings.NAME_ATTRIBUTE); 1201 displayItem.setAttribute(StaticStrings.LANG_STR, lang_string); 1202 XMLTools.setNodeText(displayItem, text); 1203 return displayItem; 1204 } 1205 1206 static private void convertMetadataList(Document from, Document to) 1207 { 1208 Element metadataList = to.createElement(StaticStrings.METADATALIST_STR); 1209 Element destination = to.getDocumentElement(); 1210 1211 String[] ele_names = { StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT, StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT, StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT }; 1212 String[] att_names = { StaticStrings.COLLECTIONMETADATA_CREATOR_STR, StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR, StaticStrings.COLLECTIONMETADATA_PUBLIC_STR }; 1213 for (int i = 0; i < ele_names.length; i++) 1214 { 1215 Element e = XMLTools.getNamedElement(from.getDocumentElement(), ele_names[i], StaticStrings.NAME_ATTRIBUTE, att_names[i]); 1216 if (e == null) 1217 { 1218 continue; 1219 } 1220 String text = XMLTools.getNodeText(e); 1221 Element metadata = to.createElement(StaticStrings.METADATA_STR); 1222 metadata.setAttribute(StaticStrings.NAME_ATTRIBUTE, att_names[i]); 1223 metadata.setAttribute(StaticStrings.LANG_STR, StaticStrings.ENGLISH_LANGUAGE_STR); 1224 XMLTools.setNodeText(metadata, text); 1225 metadataList.appendChild(metadata); 1226 } 1227 1228 destination.appendChild(metadataList); 1229 } 1230 1231 // This method creates an element with the name 'element_name' of the type of 'to' by using the other three strings 1232 static private Element constructElement(String element_name, String name_value, String lang_att, String lang_value, String text, Document to) 1233 { 1234 Element e = to.createElement(element_name); 1235 e.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 1236 e.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_value); 1237 e.setAttribute(lang_att, lang_value); 1238 XMLTools.setNodeText(e, text); 1239 1240 return e; 1241 } 1242 1243 // Convert classify in the internal(i.e. Document from) to collectionconfig.xml (i.e. Document to) 1244 static private void convertClassifier(Document from, Document to) 1245 { 1246 Element browse_element = to.createElement(StaticStrings.BROWSE_STR); 1247 NodeList children = from.getDocumentElement().getElementsByTagName(StaticStrings.CLASSIFY_ELEMENT); 1248 1249 int num_children = (children == null) ? 0 : children.getLength(); 1250 1251 if (num_children == 0) 1252 { 1253 return; 1254 } 1255 1256 for (int i = 0; i < num_children; i++) 1257 { 1258 1259 Element child = (Element) children.item(i); 1260 if (child.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) 1261 { 1262 continue; 1263 } 1264 String str = child.getAttribute(StaticStrings.TYPE_ATTRIBUTE); 1265 Element classifier_element = to.createElement(StaticStrings.CLASSIFIER_STR); 1266 classifier_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, str); 1267 1268 NodeList option_children = child.getElementsByTagName(StaticStrings.OPTION_ELEMENT); 1269 for (int j = 0; j < option_children.getLength(); j++) 1270 { 1271 Element el = (Element) option_children.item(j); 1272 if (el.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) 1273 { 1274 continue; 1275 } 1276 String name_str = el.getAttribute(StaticStrings.NAME_ATTRIBUTE); 1277 String value_str = XMLTools.getNodeText(el); 1278 1279 if (name_str == null && value_str == null) 1280 { 1281 continue; 1282 } 1283 Element option_element = to.createElement(StaticStrings.OPTION_STR); 1284 if (name_str != null && name_str.equals(StaticStrings.METADATA_STR)) 1285 { 1286 1287 // The metadata argument is the fully qualified name of a metadata element, so if it contains a namespace, remove the extracted metadata namespace as the build process doesn't know about it. 1288 String[] values = value_str.split(StaticStrings.COMMA_CHARACTER); 1289 value_str = ""; 1290 for (int k = 0; k <= values.length - 1; k++) 1291 { 1292 if (values[k].startsWith(StaticStrings.EXTRACTED_NAMESPACE) && values[k].indexOf(StaticStrings.NS_SEP, StaticStrings.EXTRACTED_NAMESPACE.length()) == -1) 1293 { 1294 values[k] = values[k].substring(StaticStrings.EXTRACTED_NAMESPACE.length()); 1295 } 1296 else 1297 { 1298 MetadataElement metadata_element = MetadataTools.getMetadataElementWithDisplayName(values[k]); 1299 if (metadata_element != null) 1300 { 1301 values[k] = metadata_element.getFullName(); 1302 } 1303 } 1304 if (k < values.length - 1) 1305 { 1306 value_str = value_str + values[k] + StaticStrings.COMMA_CHARACTER; 1307 } 1308 else 1309 { 1310 value_str = value_str + values[k]; 1311 } 1312 } 1313 } 1314 1315 if (!name_str.equals("")) 1316 { 1317 if (!name_str.startsWith(StaticStrings.MINUS_CHARACTER)) 1318 { 1319 name_str = StaticStrings.MINUS_CHARACTER + name_str; 1320 } 1321 option_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_str); 1322 } 1323 1324 if (!value_str.equals("")) 1325 { 1326 option_element.setAttribute(StaticStrings.VALUE_ATTRIBUTE, value_str); 1327 } 1328 1329 classifier_element.appendChild(option_element); 1330 } 1331 1332 //format element for this classifier 1333 Element e = (Element) XMLTools.getChildByTagName(child, StaticStrings.FORMAT_STR); 1334 1335 if (e != null) 1336 { 1337 classifier_element.appendChild(convertFormat(to, e)); 1338 } 1339 browse_element.appendChild(classifier_element); 1340 } 1341 1342 //convert default classifier format 1343 Element e = XMLTools.getNamedElement(from.getDocumentElement(), StaticStrings.FORMAT_STR, StaticStrings.NAME_ATTRIBUTE, StaticStrings.BROWSE_STR); 1344 browse_element.appendChild(convertFormat(to, e)); 1345 1346 to.getDocumentElement().appendChild(browse_element); 1347 } 1348 1349 static private Element convertFormat(Document to, Element e) 1350 { 1351 String format_str = XMLTools.getNodeText(e); 1352 Element format = to.createElement(StaticStrings.FORMAT_STR); 1353 //XMLTools.copyAllChildren (format, e); 1354 XMLTools.setNodeText(format, format_str); 1355 return format; 1356 } 1357 1358 //convert format statement for search 1359 static private void convertSearchFormat(Document from, Document to) 1360 { 1361 Element search = (Element) XMLTools.getChildByTagName(to.getDocumentElement(), StaticStrings.SEARCH_STR); 1362 Element e = XMLTools.getNamedElement(from.getDocumentElement(), StaticStrings.FORMAT_STR, StaticStrings.NAME_ATTRIBUTE, StaticStrings.SEARCH_STR); 1363 1364 search.appendChild(convertFormat(to, e)); 1365 1366 } 1367 1368 //convert format statement for display of the documents 1369 static private void convertDisplayFormat(Document from, Document to) 1370 { 1371 Element e = XMLTools.getNamedElement(from.getDocumentElement(), StaticStrings.FORMAT_STR, StaticStrings.NAME_ATTRIBUTE, StaticStrings.DISPLAY_STR); 1372 if (e == null) 1373 { 1374 return; 1375 } 1376 Element display = to.createElement(StaticStrings.DISPLAY_STR); 1377 display.appendChild(convertFormat(to, e)); 1378 to.getDocumentElement().appendChild(display); 1379 } 1380 1381 // Convert plugins in the internal(i.e. Document from) to collectionconfig.xml (i.e. Document to) 1382 static private void convertPlugin(Document from, Document to) 1383 { 1384 Element import_element = to.createElement(StaticStrings.IMPORT_STR); 1385 Element plugin_list_element = to.createElement(StaticStrings.PLUGINLIST_STR); 1386 1387 NodeList children = from.getDocumentElement().getElementsByTagName(StaticStrings.PLUGIN_ELEMENT); 1388 int num_children = (children == null) ? 0 : children.getLength(); 1389 if (num_children == 0) 1390 { 1391 return; 1392 } 1393 1394 for (int i = 0; i < num_children; i++) 1395 { 1396 1397 Element child = (Element) children.item(i); 1398 if (child.getAttribute(StaticStrings.SEPARATOR_ATTRIBUTE).equals(StaticStrings.TRUE_STR)) 1399 { 1400 continue; 1401 } 1402 if (child.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) 1403 { 1404 continue; 1405 } 1406 1407 String str = child.getAttribute(StaticStrings.TYPE_ATTRIBUTE); 1408 Element plugin_element = to.createElement(StaticStrings.PLUGIN_STR); 1409 plugin_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, str); 1410 1411 NodeList option_children = child.getElementsByTagName(StaticStrings.OPTION_ELEMENT); 1412 for (int j = 0; j < option_children.getLength(); j++) 1413 { 1414 Element el = (Element) option_children.item(j); 1415 if (!el.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.TRUE_STR)) 1416 { 1417 continue; 1418 } 1419 String name_str = el.getAttribute(StaticStrings.NAME_ATTRIBUTE); 1420 String value_str = XMLTools.getNodeText(el); 1421 1422 if (name_str == null && value_str == null) 1423 { 1424 continue; 1425 } 1426 Element option_element = to.createElement(StaticStrings.OPTION_STR); 1427 if (name_str != null && name_str.equals(StaticStrings.METADATA_STR)) 1428 { 1429 1430 // The metadata argument is the fully qualified name of a metadata element, so if it contains a namespace, remove the extracted metadata namespace as the build process doesn't know about it, but ONLY if it is not embedded metadata (e.g. ex.dc.*) 1431 String[] values = value_str.split(StaticStrings.COMMA_CHARACTER); 1432 value_str = ""; 1433 for (int k = 0; k <= values.length - 1; k++) 1434 { 1435 if (values[k].startsWith(StaticStrings.EXTRACTED_NAMESPACE) && values[k].indexOf(StaticStrings.NS_SEP, StaticStrings.EXTRACTED_NAMESPACE.length()) == -1) 1436 { 1437 values[k] = values[k].substring(StaticStrings.EXTRACTED_NAMESPACE.length()); 1438 } 1439 1440 if (k < values.length - 1) 1441 { 1442 value_str = value_str + values[k] + StaticStrings.COMMA_CHARACTER; 1443 } 1444 else 1445 { 1446 value_str = value_str + values[k]; 1447 } 1448 } 1449 } 1450 1451 if (!name_str.equals("")) 1452 { 1453 if (!name_str.startsWith(StaticStrings.MINUS_CHARACTER)) 1454 { 1455 name_str = StaticStrings.MINUS_CHARACTER + name_str; 1456 } 1457 option_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_str); 1458 } 1459 1460 if (!value_str.equals("")) 1461 { 1462 option_element.setAttribute(StaticStrings.VALUE_ATTRIBUTE, value_str); 1463 } 1464 1465 plugin_element.appendChild(option_element); 1466 }//for loop ends 1467 1468 plugin_list_element.appendChild(plugin_element); 1469 }//for loop ends 1470 1471 import_element.appendChild(plugin_list_element); 1472 1473 //do the plugout element (used by building flax collections) 1474 Node plugout = XMLTools.getChildByTagNameIndexed(from.getDocumentElement(), PLUGOUT_ELEMENT, 0); 1475 if (plugout != null) 1476 { 1477 Element to_element = XMLTools.duplicateElement(to, (Element) plugout, true); 1478 import_element.appendChild(to_element); 1479 } 1480 1481 to.getDocumentElement().appendChild(import_element); 1482 } 1483 1484 //Handle 'searchType' of collectionConfig.xml. In the internal structure, its also called 'searchType', eg. plain, form 1485 static private void convertSearchType(Document from, Document to) 1486 { 1487 Element e = XMLTools.getNamedElement(from.getDocumentElement(), StaticStrings.FORMAT_STR, StaticStrings.NAME_ATTRIBUTE, StaticStrings.SEARCHTYPE_ELEMENT);//searchType 1488 1489 if (e == null) 1490 { 1491 return; 1492 } 1493 String searchtype_str = XMLTools.getNodeText(e); 1494 //Get the 'search' element from 'to' 1495 Element search = (Element) XMLTools.getChildByTagName(to.getDocumentElement(), StaticStrings.SEARCH_STR); 1496 1497 String[] types = searchtype_str.split(","); 1498 for (int i = 0; i < types.length; i++) 1499 { 1500 Element search_type_element = to.createElement(StaticStrings.SEARCHTYPE_ELEMENT); 1501 search_type_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, types[i]); 1502 search.appendChild(search_type_element); 1503 } 1504 } 1505 1506 static private void convertBuildType(Document from, Document to) 1507 { 1508 Element e = XMLTools.getNamedElement(from.getDocumentElement(), StaticStrings.BUILDTYPE_ELEMENT, StaticStrings.NAME_ATTRIBUTE, StaticStrings.BUILDTYPE_STR); 1509 if (e == null) 1510 { 1511 return; 1512 } 1513 String indexer = XMLTools.getNodeText(e); 1514 Element search = to.createElement(StaticStrings.SEARCH_STR); 1515 search.setAttribute(StaticStrings.TYPE_ATTRIBUTE, indexer); 1516 to.getDocumentElement().appendChild(search); 1517 } 1518 1519 static private void convertDatabaseType(Document from, Document to) 1520 { 1521 Element e = XMLTools.getNamedElement(from.getDocumentElement(), StaticStrings.DATABASETYPE_ELEMENT, StaticStrings.NAME_ATTRIBUTE, StaticStrings.DATABASETYPE_STR); 1522 if (e == null) 1523 { 1524 return; 1525 } 1526 String db = XMLTools.getNodeText(e); 1527 Element dbtype = to.createElement(StaticStrings.INFODB_STR); 1528 dbtype.setAttribute(StaticStrings.TYPE_ATTRIBUTE, db); 1529 to.getDocumentElement().appendChild(dbtype); 1530 } 1531 1532 static private void convertDefaultIndex(Document from, Document to, Element search) 1533 { 1534 Element source = from.getDocumentElement(); 1535 1536 Element default_index_element = (Element) XMLTools.getChildByTagName(source, StaticStrings.INDEX_DEFAULT_ELEMENT); 1537 if (default_index_element == null) 1538 { 1539 return; 1540 } 1541 1542 String indexer = search.getAttribute(StaticStrings.TYPE_ATTRIBUTE); 1543 String level_str = default_index_element.getAttribute(StaticStrings.LEVEL_ATTRIBUTE); 1544 // Debugging purposes 1545 if (level_str.equals("") && indexer.equals(StaticStrings.MG_STR)) 1546 { 1547 System.out.println("Bug: DefaultIndex should have its level attribute not empty."); 1548 } 1549 1550 NodeList content_elements = default_index_element.getElementsByTagName(StaticStrings.CONTENT_ELEMENT); 1551 int content_elements_length = content_elements.getLength(); 1552 1553 // Don't output anything if no indexes are set 1554 if (content_elements_length == 0) 1555 { 1556 return;// 1557 } 1558 1559 String index_str = ""; 1560 1561 if (indexer.equals(StaticStrings.MG_STR)) 1562 { 1563 //combine level with indexes 1564 index_str = level_str + StaticStrings.COLON_CHARACTER; 1565 } 1566 else 1567 { //for mgpp/lucene, just take index 1568 //do nothing 1569 } 1570 1571 for (int k = 0; k < content_elements_length; k++) 1572 { 1573 Element content_element = (Element) content_elements.item(k); 1574 if (content_element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) 1575 { 1576 continue; 1577 } 1578 String name_str = content_element.getAttribute(StaticStrings.NAME_ATTRIBUTE); 1579 1580 if (name_str.startsWith(StaticStrings.EXTRACTED_NAMESPACE) && name_str.indexOf(StaticStrings.NS_SEP, StaticStrings.EXTRACTED_NAMESPACE.length()) == -1) 1581 { 1582 name_str = name_str.substring(StaticStrings.EXTRACTED_NAMESPACE.length()); 1583 } 1584 1585 index_str = index_str + name_str; 1586 1587 // Make it comma separated string 1588 if (k < content_elements_length - 1) 1589 { 1590 index_str = index_str + StaticStrings.COMMA_CHARACTER; 1591 } 1592 content_element = null; 1593 }//for loop ends 1594 1595 Element default_index = to.createElement(StaticStrings.INDEX_DEFAULT_ELEMENT_LOWERCASE); 1596 default_index.setAttribute(StaticStrings.NAME_ATTRIBUTE, index_str); 1597 search.appendChild(default_index); 1598 1599 } 1600 1601 static private void convertSubcollection(Document from, Document to) 1602 { 1603 Element source = from.getDocumentElement(); 1604 //Get the 'search' element from 'to' which has already been created in 'convertBuildType' 1605 Element search = (Element) XMLTools.getChildByTagName(to.getDocumentElement(), StaticStrings.SEARCH_STR); 1606 1607 // Get the Subcollection element from the internal structure 1608 NodeList subcollection_elements = source.getElementsByTagName(StaticStrings.SUBCOLLECTION_ELEMENT); 1609 if (subcollection_elements == null) 1610 { 1611 return; 1612 } 1613 int subcollection_elements_length = subcollection_elements.getLength(); 1614 1615 if (subcollection_elements_length == 0) 1616 { // no 1617 return; 1618 } 1619 1620 for (int j = 0; j < subcollection_elements_length; j++) 1621 { 1622 1623 Element e = (Element) subcollection_elements.item(j); 1624 if (e.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) 1625 { 1626 continue; 1627 } 1628 String content = e.getAttribute(StaticStrings.CONTENT_ATTRIBUTE); 1629 String name = e.getAttribute(StaticStrings.NAME_ATTRIBUTE); 1630 String options = e.getAttribute(StaticStrings.OPTIONS_ATTRIBUTE); 1631 String type = e.getAttribute(StaticStrings.TYPE_ATTRIBUTE); 1632 String text = XMLTools.getNodeText(e); 1633 1634 String filter = ""; 1635 if (type.equals(StaticStrings.EXCLUDE_STR)) 1636 { 1637 filter = StaticStrings.EXCLAMATION_CHARACTER; 1638 } 1639 1640 if (content.startsWith(StaticStrings.EXTRACTED_NAMESPACE) && content.indexOf(StaticStrings.NS_SEP, StaticStrings.EXTRACTED_NAMESPACE.length()) == -1) 1641 { 1642 content = content.substring(StaticStrings.EXTRACTED_NAMESPACE.length()); 1643 } 1644 filter = filter + content + StaticStrings.SEPARATOR_CHARACTER + text; 1645 if (options != null && options != "") 1646 { 1647 filter = filter + StaticStrings.SEPARATOR_CHARACTER + options; 1648 } 1649 Element subcollection = to.createElement(StaticStrings.SUBCOLLECTION_STR); 1650 subcollection.setAttribute(StaticStrings.FILTER_ATTRIBUTE, filter); 1651 subcollection.setAttribute(StaticStrings.NAME_ATTRIBUTE, name); 1652 1653 search.appendChild(subcollection); 1654 } 1655 } 1656 1657 static private void convertSubcollectionIndexes(Document from, Document to) 1658 { 1659 Element source = from.getDocumentElement(); 1660 //Get the 'search' element from 'to' which has already been created in 'convertBuildType' 1661 Element search = (Element) XMLTools.getChildByTagName(to.getDocumentElement(), StaticStrings.SEARCH_STR); 1662 1663 // Get the SubcollectionIndexes element from the internal structure 1664 Element subcollection_indexes = (Element) XMLTools.getChildByTagName(source, StaticStrings.SUBCOLLECTION_INDEXES_ELEMENT); 1665 if (subcollection_indexes == null) 1666 { 1667 return; 1668 } 1669 NodeList index_elements = subcollection_indexes.getElementsByTagName(StaticStrings.INDEX_ELEMENT); 1670 int index_elements_length = index_elements.getLength(); 1671 1672 if (index_elements_length == 0) 1673 { // no indexes 1674 return; 1675 } 1676 1677 for (int j = 0; j < index_elements_length; j++) 1678 { 1679 Element index_element = (Element) index_elements.item(j); 1680 if (index_element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) 1681 { 1682 continue; 1683 } 1684 1685 Element index = to.createElement(StaticStrings.SUBCOLLECTION_INDEX_ELEMENT); 1686 1687 String index_value = ""; 1688 1689 NodeList content_elements = index_element.getElementsByTagName(StaticStrings.CONTENT_ELEMENT); 1690 int content_elements_length = content_elements.getLength(); 1691 1692 for (int k = 0; k < content_elements_length; k++) 1693 { 1694 Element content_element = (Element) content_elements.item(k); 1695 if (content_element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) 1696 { 1697 continue; 1698 } 1699 String name_str = content_element.getAttribute(StaticStrings.NAME_ATTRIBUTE); 1700 index_value += name_str; 1701 // Make it comma separated string 1702 if (k < content_elements_length - 1) 1703 { 1704 index_value += StaticStrings.COMMA_CHARACTER; 1705 } 1706 content_element = null; 1707 }//for loop ends 1708 1709 index.setAttribute(StaticStrings.NAME_ATTRIBUTE, index_value); 1710 1711 // Now constructing 'displayItem' element for this 'indexSubcollection' element 1712 // from the collectionmetadata element 1713 ArrayList collectionmetadata_list = XMLTools.getNamedElementList(source, StaticStrings.COLLECTIONMETADATA_ELEMENT, StaticStrings.NAME_ATTRIBUTE, index_value); 1714 1715 if (collectionmetadata_list != null) 1716 { 1717 1718 for (int k = 0; k < collectionmetadata_list.size(); k++) 1719 { 1720 Element collectionmetadata = (Element) collectionmetadata_list.get(k); 1721 if (collectionmetadata.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) 1722 { 1723 continue; 1724 } 1725 Element displayItem = constructDisplayItem(collectionmetadata, to); 1726 index.appendChild(displayItem); 1727 } 1728 } 1729 1730 search.appendChild(index); 1731 1732 } //for loop ends 1733 } 1734 1735 static private void convertLanguages(Document from, Document to) 1736 { 1737 Element source = from.getDocumentElement(); 1738 //Get the 'search' element from 'to' which has already been created in 'convertBuildType' 1739 Element search = (Element) XMLTools.getChildByTagName(to.getDocumentElement(), StaticStrings.SEARCH_STR); 1740 1741 // Get the Languages element from the internal structure 1742 Element languages = (Element) XMLTools.getChildByTagName(source, StaticStrings.LANGUAGES_ELEMENT); 1743 if (languages == null) 1744 { 1745 return; 1746 } 1747 NodeList language_elements = languages.getElementsByTagName(StaticStrings.LANGUAGE_ELEMENT); 1748 int language_elements_length = language_elements.getLength(); 1749 1750 if (language_elements_length == 0) 1751 { 1752 return; 1753 } 1754 1755 for (int j = 0; j < language_elements_length; j++) 1756 { 1757 Element element = (Element) language_elements.item(j); 1758 if (element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) 1759 { 1760 continue; 1761 } 1762 1763 // Create indexLanguage element 1764 Element index_language = to.createElement(StaticStrings.LANGUAGE_INDEX_ELEMENT); 1765 1766 String name_str = element.getAttribute(StaticStrings.NAME_ATTRIBUTE); 1767 index_language.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_str); 1768 1769 // Now constructing 'displayItem' element for this 'indexLanguage' element 1770 // from the collectionmetadata element 1771 ArrayList collectionmetadata_list = XMLTools.getNamedElementList(source, StaticStrings.COLLECTIONMETADATA_ELEMENT, StaticStrings.NAME_ATTRIBUTE, name_str); 1772 1773 if (collectionmetadata_list != null) 1774 { 1775 1776 for (int k = 0; k < collectionmetadata_list.size(); k++) 1777 { 1778 Element collectionmetadata = (Element) collectionmetadata_list.get(k); 1779 if (collectionmetadata.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) 1780 { 1781 continue; 1782 } 1783 Element displayItem = constructDisplayItem(collectionmetadata, to); 1784 index_language.appendChild(displayItem); 1785 } 1786 } 1787 1788 search.appendChild(index_language); 1789 1790 } //for loop ends 1791 1792 // Convert DefaultLanguage 1793 // Get the DefaultLanguage element from the internal structure 1794 Element default_language = (Element) XMLTools.getChildByTagName(source, StaticStrings.LANGUAGE_DEFAULT_ELEMENT); 1795 if (default_language != null) 1796 { 1797 String lang_name = default_language.getAttribute(StaticStrings.NAME_ATTRIBUTE); 1798 Element default_index_language = to.createElement(StaticStrings.LANGUAGE_DEFAULT_INDEX_ELEMENT); 1799 default_index_language.setAttribute(StaticStrings.NAME_ATTRIBUTE, lang_name); 1800 search.appendChild(default_index_language); 1801 } 1802 // Convert LanguageMetadata 1803 // Get the LanguageMetadata element from the internal structure 1804 Element language_metadata = (Element) XMLTools.getChildByTagName(source, StaticStrings.LANGUAGE_METADATA_ELEMENT); 1805 if (language_metadata != null) 1806 { 1807 String meta_name = language_metadata.getAttribute(StaticStrings.NAME_ATTRIBUTE); 1808 Element language_meta = to.createElement(StaticStrings.LANGUAGE_METADATA_ELEMENT_STR); 1809 if (meta_name.startsWith(StaticStrings.EXTRACTED_NAMESPACE) && meta_name.indexOf(StaticStrings.NS_SEP, StaticStrings.EXTRACTED_NAMESPACE.length()) == -1) 1810 { 1811 meta_name = meta_name.substring(StaticStrings.EXTRACTED_NAMESPACE.length()); 1812 } 1813 language_meta.setAttribute(StaticStrings.NAME_ATTRIBUTE, meta_name); 1814 search.appendChild(language_meta); 1815 } 1816 } 1817 1818 //convert indexes and their displayItems, which go in 'search' element in collectionConfig.xml 1819 //parameter 'to' is the document to be saved as collectionConfig.xml 1820 //parameter 'from' is the internal xml structure 1821 static private void convertIndex(Document from, Document to) 1822 { 1823 Element source = from.getDocumentElement(); 1824 //Get the 'search' element from 'to' which has already been created in 'convertBuildType' 1825 Element search = (Element) XMLTools.getChildByTagName(to.getDocumentElement(), StaticStrings.SEARCH_STR); 1826 1827 //THere are two sets of indexes elements, find the one which is assigned 'true' 1828 Element indexes = XMLTools.getNamedElement(source, StaticStrings.INDEXES_ELEMENT, StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR); 1829 if (indexes == null) 1830 { 1831 return; 1832 } 1833 NodeList index_elements = indexes.getElementsByTagName(StaticStrings.INDEX_ELEMENT); 1834 int index_elements_length = index_elements.getLength(); 1835 1836 if (index_elements_length == 0) 1837 { // no indexes 1838 return; 1839 } 1840 1841 //find out it's mg or mgpp/lucene 1842 String mg = search.getAttribute(StaticStrings.TYPE_ATTRIBUTE); 1843 boolean mg_indexer = false; 1844 if (mg.equals(StaticStrings.MG_STR)) 1845 { 1846 mg_indexer = true;//it's mg, then the level is set as attribute of 1847 } 1848 if (mg_indexer == false) 1849 { 1850 // It's mgpp. Construct 'level' and 'defaultLevel' elements separately. 1851 convertLevels(from, to, search); 1852 } 1853 1854 for (int j = 0; j < index_elements_length; j++) 1855 { 1856 Element index_element = (Element) index_elements.item(j); 1857 if (index_element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) 1858 { 1859 continue; 1860 } 1861 1862 Element index_ele = to.createElement(StaticStrings.INDEX_LOW_STR);//index 1863 1864 // Used for creating displayItem for this element 'index_ele' further below 1865 // full_index_names contain 'ex.' 1866 String full_index_name = ""; 1867 String level_str = ""; 1868 1869 StringBuffer index_value = new StringBuffer(); 1870 if (mg_indexer == true) 1871 { 1872 // For mg indexer, there is a 'level' attribute in the index element of the internal structure 1873 // But mgpp/lucene don't 1874 level_str = index_element.getAttribute(StaticStrings.LEVEL_ATTRIBUTE); 1875 if (level_str.length() > 0) 1876 { 1877 index_value.append(level_str).append(StaticStrings.COLON_CHARACTER); 1878 //index_value = index_value.StaticStrings.COLON_CHARACTER; 1879 } 1880 } 1881 1882 NodeList content_elements = index_element.getElementsByTagName(StaticStrings.CONTENT_ELEMENT); 1883 int content_elements_length = content_elements.getLength(); 1884 1885 for (int k = 0; k < content_elements_length; k++) 1886 { 1887 Element content_element = (Element) content_elements.item(k); 1888 if (content_element.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) 1889 { 1890 continue; 1891 } 1892 String name_str = content_element.getAttribute(StaticStrings.NAME_ATTRIBUTE); 1893 1894 full_index_name = full_index_name + name_str; 1895 if (k < content_elements_length - 1) 1896 { 1897 full_index_name = full_index_name + StaticStrings.COMMA_CHARACTER; 1898 } 1899 1900 if (name_str.startsWith(StaticStrings.EXTRACTED_NAMESPACE) && name_str.indexOf(StaticStrings.NS_SEP, StaticStrings.EXTRACTED_NAMESPACE.length()) == -1) 1901 { 1902 name_str = name_str.substring(StaticStrings.EXTRACTED_NAMESPACE.length()); 1903 } 1904 1905 index_value.append(name_str); 1906 name_str = null; 1907 // Make it comma separated string 1908 if (k < content_elements_length - 1) 1909 { 1910 index_value.append(StaticStrings.COMMA_CHARACTER); 1911 } 1912 content_element = null; 1913 }//for loop ends 1914 1915 String temp_str = index_value.toString(); 1916 index_ele.setAttribute(StaticStrings.NAME_ATTRIBUTE, temp_str); 1917 1918 // Now constructing 'displayItem' element for this 'index_ele' element 1919 // The index names in the collectionmetadata elements in the internal structure are not the names that 1920 // are used in the content elements (i.e. ex.Source or dc.Subject and keywords), but the names that are 1921 // in the configuration files (i.e. Source or dc.Subject) 1922 ArrayList collectionmetadata_list = XMLTools.getNamedElementList(source, StaticStrings.COLLECTIONMETADATA_ELEMENT, StaticStrings.NAME_ATTRIBUTE, temp_str); 1923 1924 if (collectionmetadata_list == null) 1925 { 1926 //try the full name, i.e. with 'ex.' 1927 if (mg_indexer == true) 1928 { 1929 // but first append level info if we are mg 1930 full_index_name = level_str + StaticStrings.COLON_CHARACTER + full_index_name; 1931 } 1932 collectionmetadata_list = XMLTools.getNamedElementList(source, StaticStrings.COLLECTIONMETADATA_ELEMENT, StaticStrings.NAME_ATTRIBUTE, full_index_name); 1933 } 1934 1935 if (collectionmetadata_list != null) 1936 { 1937 1938 for (int k = 0; k < collectionmetadata_list.size(); k++) 1939 { 1940 Element collectionmetadata = (Element) collectionmetadata_list.get(k); 1941 if (collectionmetadata.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) 1942 { 1943 continue; 1944 } 1945 Element displayItem = constructDisplayItem(collectionmetadata, to); 1946 1947 index_ele.appendChild(displayItem); 1948 } 1949 } 1950 1951 search.appendChild(index_ele); 1952 1953 } //for loop ends 1954 1955 //Convert default index 1956 convertDefaultIndex(from, to, search); 1957 convertIndexOptions(from, to, search); 1958 } 1959 1960 // Convert levels for mgpp/lucene. This method is called by converIndex() when mgpp indexer is detected. 1961 static private void convertLevels(Document from, Document to, Element search) 1962 { 1963 Element source = from.getDocumentElement(); 1964 Element index_option = XMLTools.getNamedElement(source, StaticStrings.INDEXOPTIONS_ELEMENT, StaticStrings.NAME_ATTRIBUTE, StaticStrings.LEVELS_STR); 1965 if (index_option == null) 1966 { 1967 return; 1968 } 1969 //Debugging purposes 1970 if (index_option.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) 1971 { 1972 DebugStream.println("For mgpp, there should be an IndexOption element for levels which is assigned 'true': possible bug."); 1973 } 1974 1975 NodeList option_elements = index_option.getElementsByTagName(StaticStrings.OPTION_ELEMENT); 1976 int num_elements = option_elements.getLength(); 1977 1978 // Don't output anything if no indexes are set 1979 if (num_elements == 0) 1980 { 1981 return;// 1982 } 1983 1984 for (int k = 0; k < num_elements; k++) 1985 { 1986 Element e = (Element) option_elements.item(k); 1987 String name_str = e.getAttribute(StaticStrings.NAME_ATTRIBUTE); 1988 Element level_element = to.createElement(StaticStrings.LEVEL_ELEMENT); 1989 level_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_str); 1990 1991 //Now construct displayItem for this level element from collectionmetadata 1992 ArrayList collectionmetadata_list = XMLTools.getNamedElementList(source, StaticStrings.COLLECTIONMETADATA_ELEMENT, StaticStrings.NAME_ATTRIBUTE, name_str); 1993 1994 if (collectionmetadata_list != null) 1995 { 1996 1997 for (int j = 0; j < collectionmetadata_list.size(); j++) 1998 { 1999 Element collectionmetadata = (Element) collectionmetadata_list.get(j); 2000 2001 Element displayItem = constructDisplayItem(collectionmetadata, to); 2002 level_element.appendChild(displayItem); 2003 } 2004 } 2005 search.appendChild(level_element); 2006 } 2007 2008 //Convert default level 2009 Element default_index_option = XMLTools.getNamedElement(source, StaticStrings.INDEXOPTION_DEFAULT_ELEMENT, StaticStrings.NAME_ATTRIBUTE, StaticStrings.LEVEL_DEFAULT_STR); 2010 if (default_index_option == null) 2011 { 2012 return; 2013 } 2014 Element default_level = to.createElement(StaticStrings.LEVEL_DEFAULT_ELEMENT); 2015 String default_level_str = default_index_option.getAttribute(StaticStrings.VALUE_ATTRIBUTE); 2016 default_level.setAttribute(StaticStrings.NAME_ATTRIBUTE, default_level_str); 2017 search.appendChild(default_level); 2018 2019 } 2020 2021 // Convert indexoptions for mg/mgpp/lucene. This method is called by convertIndex(). 2022 static private void convertIndexOptions(Document from, Document to, Element search) 2023 { 2024 Element source = from.getDocumentElement(); 2025 Element index_option = XMLTools.getNamedElement(source, StaticStrings.INDEXOPTIONS_ELEMENT, StaticStrings.NAME_ATTRIBUTE, StaticStrings.INDEXOPTIONS_STR); 2026 if (index_option == null) 2027 { 2028 return; 2029 } 2030 //Debugging purposes 2031 if (index_option.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.FALSE_STR)) 2032 { 2033 DebugStream.println("There should be an IndexOption element which is assigned 'true': possible bug."); 2034 } 2035 Element indexOptionEl = to.createElement(StaticStrings.INDEXOPTION_STR); 2036 NodeList option_elements = index_option.getElementsByTagName(StaticStrings.OPTION_ELEMENT); 2037 int num_elements = option_elements.getLength(); 2038 // Don't output anything if no index 2039 if (num_elements == 0) 2040 { 2041 return;// 2042 } 2043 search.appendChild(indexOptionEl); 2044 2045 for (int k = 0; k < num_elements; k++) 2046 { 2047 Element e = (Element) option_elements.item(k); 2048 String name_att = e.getAttribute(StaticStrings.NAME_ATTRIBUTE); 2049 Element optionEl = to.createElement(StaticStrings.OPTION_STR); 2050 optionEl.setAttribute(StaticStrings.NAME_ATTRIBUTE, name_att); 2051 indexOptionEl.appendChild(optionEl); 2052 } 2053 2054 } 2055 2056 // Append the element son to the element mother in the appropriate position. 2057 static public void appendProperly(Element mother, Element son) 2058 { 2059 if (son == null) 2060 return; 2061 2062 Node reference_node = findInsertionPoint(mother, son); 2063 if (reference_node != null) 2064 { 2065 mother.insertBefore(son, reference_node); 2066 } 2067 else 2068 { 2069 mother.appendChild(son); 2070 } 2071 } 2072 2073 /** 2074 * Find the best insertion position for the given DOM Element 2075 * 'target_element' in the DOM Element 'document_element'. This should try 2076 * to match command tag, and if found should then try to group by name or 2077 * type (eg CollectionMeta), or append to end is no such grouping exists (eg 2078 * Plugins). Failing a command match it will check against the command order 2079 * for the best insertion location. 2080 * 2081 * @param target_element 2082 * the command Element to be inserted 2083 * @return the Element which the given command should be inserted before, or 2084 * null to append to end of list 2085 */ 2086 static public Node findInsertionPoint(Element document_element, Element target_element) 2087 { 2088 ///ystem.err.println("Find insertion point: " + target_element.getNodeName()); 2089 String target_element_name = target_element.getNodeName(); 2090 2091 // Try to find commands with the same tag. 2092 NodeList matching_elements = document_element.getElementsByTagName(target_element_name); 2093 // If we found matching elements, then we have our most likely insertion location, so check within for groupings 2094 if (matching_elements.getLength() != 0) 2095 { 2096 ///ystem.err.println("Found matching elements."); 2097 // Only CollectionMeta are grouped. 2098 if (target_element_name.equals(StaticStrings.COLLECTIONMETADATA_ELEMENT)) 2099 { 2100 ///ystem.err.println("Dealing with collection metadata"); 2101 // 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. 2102 // So if the command to be added is special add it immediately after any other special command 2103 if (target_element.getAttribute(StaticStrings.SPECIAL_ATTRIBUTE).equals(StaticStrings.TRUE_STR)) 2104 { 2105 int index = 0; 2106 Element matched_element = (Element) matching_elements.item(index); 2107 Element sibling_element = (Element) matched_element.getNextSibling(); 2108 while (sibling_element.getAttribute(StaticStrings.SPECIAL_ATTRIBUTE).equals(StaticStrings.TRUE_STR)) 2109 { 2110 index++; 2111 matched_element = (Element) matching_elements.item(index); 2112 sibling_element = (Element) matched_element.getNextSibling(); 2113 } 2114 if (sibling_element.getNodeName().equals(CollectionConfiguration.NEWLINE_ELEMENT)) 2115 { 2116 Element newline_element = document_element.getOwnerDocument().createElement(CollectionConfiguration.NEWLINE_ELEMENT); 2117 document_element.insertBefore(newline_element, sibling_element); 2118 } 2119 return sibling_element; 2120 } 2121 // Otherwise try to find a matching 'name' and add after the last one in that group. 2122 else 2123 { 2124 int index = 0; 2125 target_element_name = target_element.getAttribute(StaticStrings.NAME_ATTRIBUTE); 2126 boolean found = false; 2127 // Skip all of the special metadata 2128 Element matched_element = (Element) matching_elements.item(index); 2129 while (matched_element.getAttribute(StaticStrings.SPECIAL_ATTRIBUTE).equals(StaticStrings.TRUE_STR)) 2130 { 2131 index++; 2132 matched_element = (Element) matching_elements.item(index); 2133 } 2134 // Begin search 2135 while (!found && matched_element != null) 2136 { 2137 if (matched_element.getAttribute(StaticStrings.NAME_ATTRIBUTE).equals(target_element_name)) 2138 { 2139 found = true; 2140 } 2141 else 2142 { 2143 index++; 2144 matched_element = (Element) matching_elements.item(index); 2145 } 2146 } 2147 // If we found a match, we need to continue checking until we find the last name match. 2148 if (found) 2149 { 2150 index++; 2151 Element previous_sibling = matched_element; 2152 Element sibling_element = (Element) matching_elements.item(index); 2153 while (sibling_element != null && sibling_element.getAttribute(StaticStrings.NAME_ATTRIBUTE).equals(target_element_name)) 2154 { 2155 previous_sibling = sibling_element; 2156 index++; 2157 sibling_element = (Element) matching_elements.item(index); 2158 } 2159 // 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! 2160 return previous_sibling.getNextSibling(); 2161 } 2162 // If not found we just add after last metadata element 2163 else 2164 { 2165 Element last_element = (Element) matching_elements.item(matching_elements.getLength() - 1); 2166 return last_element.getNextSibling(); 2167 } 2168 } 2169 2170 } 2171 else 2172 { 2173 ///ystem.err.println("Not dealing with collection meta."); 2174 Element matched_element = (Element) matching_elements.item(matching_elements.getLength() - 1); 2175 // 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) 2176 Node sibling_element = matched_element.getNextSibling(); 2177 if (sibling_element != null && sibling_element.getNodeName().equals(CollectionConfiguration.NEWLINE_ELEMENT)) 2178 { 2179 Element newline_element = document_element.getOwnerDocument().createElement(CollectionConfiguration.NEWLINE_ELEMENT); 2180 document_element.insertBefore(newline_element, sibling_element); 2181 } 2182 return sibling_element; // Note that this may be null 2183 } 2184 } 2185 ///ystem.err.println("No matching elements found."); 2186 // Locate where this command is in the ordering 2187 int command_index = -1; 2188 for (int i = 0; command_index == -1 && i < CollectionConfiguration.COMMAND_ORDER.length; i++) 2189 { 2190 if (CollectionConfiguration.COMMAND_ORDER[i].equals(target_element_name)) 2191 { 2192 command_index = i; 2193 } 2194 } 2195 ///ystem.err.println("Command index is: " + command_index); 2196 // Now move forward, checking for existing elements in each of the preceeding command orders. 2197 int preceeding_index = command_index - 1; 2198 ///ystem.err.println("Searching before the target command."); 2199 while (preceeding_index >= 0) 2200 { 2201 matching_elements = document_element.getElementsByTagName(CollectionConfiguration.COMMAND_ORDER[preceeding_index]); 2202 // If we've found a match 2203 if (matching_elements.getLength() > 0) 2204 { 2205 // We add after the last element 2206 Element matched_element = (Element) matching_elements.item(matching_elements.getLength() - 1); 2207 // 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) 2208 Node sibling_element = matched_element.getNextSibling(); 2209 if (sibling_element != null && sibling_element.getNodeName().equals(CollectionConfiguration.NEWLINE_ELEMENT)) 2210 { 2211 Element newline_element = document_element.getOwnerDocument().createElement(CollectionConfiguration.NEWLINE_ELEMENT); 2212 document_element.insertBefore(newline_element, sibling_element); 2213 } 2214 return sibling_element; // Note that this may be null 2215 } 2216 preceeding_index--; 2217 } 2218 // If all that fails, we now move backwards through the commands 2219 int susceeding_index = command_index + 1; 2220 ///ystem.err.println("Searching after the target command."); 2221 while (susceeding_index < CollectionConfiguration.COMMAND_ORDER.length) 2222 { 2223 matching_elements = document_element.getElementsByTagName(CollectionConfiguration.COMMAND_ORDER[susceeding_index]); 2224 // If we've found a match 2225 if (matching_elements.getLength() > 0) 2226 { 2227 // We add before the first element 2228 Element matched_element = (Element) matching_elements.item(0); 2229 // 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) 2230 Node sibling_element = matched_element.getPreviousSibling(); 2231 if (sibling_element != null && sibling_element.getNodeName().equals(CollectionConfiguration.NEWLINE_ELEMENT)) 2232 { 2233 Element newline_element = document_element.getOwnerDocument().createElement(CollectionConfiguration.NEWLINE_ELEMENT); 2234 document_element.insertBefore(newline_element, sibling_element); 2235 } 2236 return sibling_element; // Note that this may be null 2237 } 2238 susceeding_index++; 2239 } 2240 // Well. Apparently there are no other commands in this collection configuration. So append away... 2241 return null; 2242 } 2243 2244 // From collectionConfig.xml to internal structure:add 'ex.' namespace (if none). 2245 // From internal structure to collectionConfig.xml:always peel off 'ex.' namespace (if any), except for format statement 2246 //This method parses 'xml_file_doc' into 'dOc' 2247 static public void parse(File xml_file, Document dOc) 2248 { 2249 2250 Document xml_file_doc = XMLTools.parseXMLFile(xml_file); 2251 Element fromElement = xml_file_doc.getDocumentElement(); 2252 Element toElement = dOc.getDocumentElement(); 2253 2254 // It's deliberately set that 'creator', 'maintainer', and 'public' are only in English (as they are just names). 2255 // So the following ArrayList have only one element. 2256 Node metadataListNode = XMLTools.getChildByTagNameIndexed(fromElement, StaticStrings.METADATALIST_STR, 0); 2257 if (metadataListNode != null) 2258 { 2259 ArrayList creator = doMetadataList(dOc, metadataListNode, StaticStrings.COLLECTIONMETADATA_CREATOR_ELEMENT, StaticStrings.COLLECTIONMETADATA_CREATOR_STR); 2260 ArrayList maintainer = doMetadataList(dOc, metadataListNode, StaticStrings.COLLECTIONMETADATA_MAINTAINER_ELEMENT, StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR); 2261 ArrayList is_public = doMetadataList(dOc, metadataListNode, StaticStrings.COLLECTIONMETADATA_PUBLIC_ELEMENT, StaticStrings.COLLECTIONMETADATA_PUBLIC_STR); 2262 2263 appendArrayList(toElement, creator); 2264 appendArrayList(toElement, maintainer); 2265 appendArrayList(toElement, is_public); 2266 } 2267 2268 Node databaseNode = XMLTools.getChildByTagNameIndexed(fromElement, StaticStrings.INFODB_STR, 0); 2269 String databasetype_value = "gdbm"; 2270 if (databaseNode != null) 2271 { 2272 databasetype_value = ((Element) databaseNode).getAttribute(StaticStrings.TYPE_ATTRIBUTE);//might be gdbm|jdbm|sqlite OR not yet set (in which case it should default to gdbm) 2273 } 2274 2275 Element databasetype = doDatabaseType(dOc, databasetype_value); 2276 appendProperly(toElement, databasetype); 2277 2278 Node searchNode = XMLTools.getChildByTagNameIndexed(fromElement, StaticStrings.SEARCH_STR, 0); 2279 String buildtype_value = ((Element) searchNode).getAttribute(StaticStrings.TYPE_ATTRIBUTE);//might be mg|mgpp|lucene 2280 Element buildtype = doBuildType(dOc, buildtype_value); 2281 appendProperly(toElement, buildtype); 2282 2283 Node importNode = XMLTools.getChildByTagNameIndexed(fromElement, StaticStrings.IMPORT_STR, 0); 2284 if (importNode == null) 2285 { 2286 System.out.println("There is no content in the 'import' block."); 2287 } 2288 if (importNode != null) 2289 { 2290 //do plugin list nodes 2291 Node pluginListNode = XMLTools.getChildByTagNameIndexed((Element) importNode, StaticStrings.PLUGINLIST_STR, 0); 2292 if (pluginListNode == null) 2293 { 2294 System.out.println("There is no pluginlist set."); 2295 } 2296 if (pluginListNode != null) 2297 { 2298 2299 doPlugin(dOc, pluginListNode); 2300 } 2301 2302 //do the plugout element (used by building flax collections) 2303 Node plugout = XMLTools.getChildByTagNameIndexed((Element) importNode, PLUGOUT_ELEMENT, 0); 2304 if (plugout != null) 2305 { 2306 Element to_element = XMLTools.duplicateElement(dOc, (Element) plugout, true); 2307 toElement.appendChild(to_element); 2308 } 2309 } 2310 2311 Node browseNode = XMLTools.getChildByTagNameIndexed(fromElement, StaticStrings.BROWSE_STR, 0); 2312 if (browseNode != null) 2313 { 2314 if (browseNode == null) 2315 { 2316 System.out.println("There is no classifier."); 2317 } 2318 doClassifier(dOc, browseNode); 2319 } 2320 2321 Node displayItemListNode = XMLTools.getChildByTagNameIndexed(fromElement, StaticStrings.DISPLAYITEMLIST_STR, 0); 2322 if (displayItemListNode != null) 2323 { 2324 ArrayList description = doDisplayItemList(dOc, displayItemListNode, StaticStrings.DESCRIPTION_STR, StaticStrings.COLLECTIONMETADATA_COLLECTIONEXTRA_STR); 2325 ArrayList smallicon = doDisplayItemList(dOc, displayItemListNode, StaticStrings.SMALLICON_STR, StaticStrings.COLLECTIONMETADATA_ICONCOLLECTIONSMALL_STR); 2326 ArrayList icon = doDisplayItemList(dOc, displayItemListNode, StaticStrings.ICON_STR, StaticStrings.COLLECTIONMETADATA_ICONCOLLECTION_STR); 2327 ArrayList name = doDisplayItemList(dOc, displayItemListNode, StaticStrings.NAME_STR, StaticStrings.COLLECTIONMETADATA_COLLECTIONNAME_STR); 2328 2329 appendArrayList(toElement, description); 2330 appendArrayList(toElement, smallicon); 2331 appendArrayList(toElement, icon); 2332 appendArrayList(toElement, name); 2333 } 2334 2335 if (buildtype_value.equalsIgnoreCase("mg")) 2336 { 2337 doMGIndexes(dOc, searchNode); 2338 } 2339 else 2340 { 2341 doMGPPIndexes(dOc, searchNode); 2342 } 2343 2344 doDefaultIndex(dOc, searchNode); 2345 doDefaultLevel(dOc, searchNode); 2346 doLevel(dOc, searchNode); 2347 doIndexOption(dOc, searchNode); 2348 doSubcollection(dOc, searchNode); 2349 doIndexSubcollection(dOc, searchNode); 2350 doIndexLanguage(dOc, searchNode); 2351 doDefaultIndexLanguage(dOc, searchNode); 2352 doLanguageMetadata(dOc, searchNode); 2353 doSearchType(dOc, searchNode); 2354 doSearchFormat(dOc, searchNode); 2355 doDisplayFormat(dOc, fromElement); 2356 doReplaceListRef(dOc, fromElement); 2357 doServiceRackList(dOc, fromElement); 2358 2359 } 2360 2361 static public String generateStringVersion(Document doc) 2362 { 2363 return XMLTools.xmlNodeToString(doc); 2364 } 2365 2366 static public void save(File collect_config_xml_file, Document doc) 2367 { 2368 2369 Document collection_config_xml_document = convertInternalToCollectionConfig(doc); 2370 String[] nonEscapingTagNames = { StaticStrings.FORMAT_STR }; 2371 XMLTools.writeXMLFile(collect_config_xml_file, collection_config_xml_document, nonEscapingTagNames); 2372 2373 } 2374 2375 //Convert the internal XML DOM tree (dOc) into that of collectionConfig.xml (skeleton) 2376 static private Document convertInternalToCollectionConfig(Document dOc) 2377 { 2378 //first parse an empty skeleton of xml config file 2379 //The aim is to convert the internal structure into this skeleton 2380 Document skeleton = XMLTools.parseXMLFile("xml/CollectionConfig.xml", true); 2381 //Element internal = dOc.getDocumentElement(); 2382 convertMetadataList(dOc, skeleton); 2383 convertDisplayItemList(dOc, skeleton); 2384 convertBuildType(dOc, skeleton); 2385 convertDatabaseType(dOc, skeleton); 2386 convertIndex(dOc, skeleton); 2387 convertPlugin(dOc, skeleton);//also do the plugout element 2388 convertClassifier(dOc, skeleton); 2389 convertSubcollectionIndexes(dOc, skeleton); 2390 convertLanguages(dOc, skeleton); 2391 convertSubcollection(dOc, skeleton); 2392 convertSearchType(dOc, skeleton); 2393 convertSearchFormat(dOc, skeleton); 2394 convertDisplayFormat(dOc, skeleton); 2395 convertReplaceListRef(dOc, skeleton); 2396 convertServiceRackList(dOc, skeleton); 2397 2398 return skeleton; 2399 } 2400 2401 // Append the elements, which are of Element type, in 'list' to Element 'to' 2402 static private void appendArrayList(Element to, ArrayList list) 2403 { 2404 if (list == null) 2405 return; 2406 2407 for (int i = 0; i < list.size(); i++) 2408 { 2409 appendProperly(to, (Element) list.get(i)); 2410 } 2411 } 2412 2127 2413 }
Note:
See TracChangeset
for help on using the changeset viewer.