/**
*#########################################################################
*
* A component of the Gatherer application, part of the Greenstone digital
* library suite from the New Zealand Digital Library Project at the
* University of Waikato, New Zealand.
*
*
*
* Author: John Thompson, Greenstone Digital Library, University of Waikato
*
*
*
* Copyright (C) 1999 New Zealand Digital Library Project
*
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
*
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*########################################################################
*/
package org.greenstone.gatherer.collection;
import java.io.*;
import java.util.ArrayList;
import org.greenstone.gatherer.Configuration;
import org.greenstone.gatherer.DebugStream;
import org.greenstone.gatherer.Dictionary;
import org.greenstone.gatherer.Gatherer;
import org.greenstone.gatherer.cdm.CommandTokenizer;
import org.greenstone.gatherer.util.Codec;
import org.greenstone.gatherer.util.StaticStrings;
import org.greenstone.gatherer.util.XMLTools;
import org.w3c.dom.*;
/** This class provides access to a collection configuration file. This version accepts either a valid xml document or a historical collect.cfg file. */
public class BasicCollectionConfiguration
implements Comparable {
private File file;
private String creator = "";
private String description = "";
private String maintainer = "";
private String name = "";
private String is_public = "";
private String collectgroup = "false";
private String short_name = "";
private String site = null; // used for gs3 colls
public BasicCollectionConfiguration(File file) {
this.file = file;
try {
String filename = file.getName().toLowerCase();
if(!file.exists()) {
return;
}
if(filename.endsWith(".cfg")) {
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String command = null;
while((command = br.readLine()) != null) {
if (command.startsWith("#")) {
// a comment
continue;
}
if(command.length() > 0) {
// We have to test the end of command for the special character '\'. If found, remove it and append the next line, then repeat.
while(command.trim().endsWith("\\")) {
command = command.substring(0, command.lastIndexOf("\\"));
String next_line = br.readLine();
if (next_line != null) {
command = command + "\n" + next_line;
}
next_line = null;
}
CommandTokenizer tokenizer = new CommandTokenizer(command, br);
String command_type_str = tokenizer.nextToken();
if (command_type_str == null) {
// Bad command. Do nothing
continue;
}
command_type_str = command_type_str.toLowerCase();
if(command_type_str.equals(StaticStrings.COLLECTIONMETADATA_CREATOR_STR)) {
creator = tokenizer.nextToken();
}
else if(command_type_str.equals(StaticStrings.COLLECTIONMETADATA_MAINTAINER_STR)) {
maintainer = tokenizer.nextToken();
}
else if(command_type_str.equals(StaticStrings.COLLECTIONMETADATA_COLLECTGROUP_STR)) {
collectgroup = tokenizer.nextToken();
}
else if(command_type_str.equalsIgnoreCase(StaticStrings.COLLECTIONMETADATA_STR)) {
String meta_type_str = tokenizer.nextToken();
String value_str = tokenizer.nextToken();
// check for language
String language_str = StaticStrings.ENGLISH_LANGUAGE_STR; // assume the no-lang ones are english, but we shouldn't really do this.
if(meta_type_str != null && value_str != null) {
meta_type_str = meta_type_str.toLowerCase();
if(value_str.startsWith(StaticStrings.LBRACKET_CHARACTER) && value_str.endsWith(StaticStrings.RBRACKET_CHARACTER)) {
language_str = value_str.substring(value_str.indexOf(StaticStrings.EQUALS_CHARACTER) + 1, value_str.length() - 1);
language_str = language_str.toLowerCase();
value_str = tokenizer.nextToken();
}
// now we can work out which coll meta we are dealing with
if (meta_type_str.equals(StaticStrings.COLLECTIONMETADATA_COLLECTIONNAME_STR)) {
// If this is the first collection title found, then use it, otherwise search for one that more closely matches our choosen interface language
if (name == null || language_str.equals(Dictionary.getLanguage())) {
name = Codec.transform(value_str, Codec.GREENSTONE_TO_TEXT);
}
}
else if (meta_type_str.equals(StaticStrings.COLLECTIONMETADATA_COLLECTIONEXTRA_STR)) {
// Again we are either looking for the first description, then after that a language specific one
if (description == null || language_str.equals(Dictionary.getLanguage())) {
description = Codec.transform(value_str, Codec.GREENSTONE_TO_TEXT);
}
}
}
language_str = null;
value_str = null;
meta_type_str = null;
} else {
// we want to process all the tokens to make sure we get rid of multi line commands before trying to find the next one
while (tokenizer.hasMoreTokens()) {
tokenizer.nextToken();
}
} // end of coll meta bit
command_type_str = null;
tokenizer = null;
} // if command.length > 0
} // while
command = null;
br.close();
isr.close();
br = null;
isr = null;
} // cfg file
///ystem.err.println("Parsed collect.cfg");
///ystem.err.println("name = " + name);
///ystem.err.println("creator = " + creator);
///ystem.err.println("maintainer = " + maintainer);
///ystem.err.println("description = " + description);
if(filename.endsWith(".xml")) {
Document xml_file_doc = XMLTools.parseXMLFile(file);
Element root = xml_file_doc.getDocumentElement();
Node metadataListNode = XMLTools.getChildByTagName(root, StaticStrings.METADATALIST_STR);
Node displayItemListNode = XMLTools.getChildByTagName(root, StaticStrings.DISPLAYITEMLIST_STR);
// Get the metadataList and displayItemList metadata for the current gli language
String default_language = StaticStrings.ENGLISH_LANGUAGE_STR; // is this always the case?
String gli_language_code = Configuration.getLanguage(); // definitely returns some language code
if (metadataListNode != null) {
ArrayList metadata_list = XMLTools.getChildElementsByTagName((Element)metadataListNode, StaticStrings.METADATA_STR);
String fallback_lang_creator = "";
String fallback_lang_maintainer = "";
String fallback_lang_is_public = "";
for (int i=0; i(): " + error);
DebugStream.printStackTrace(error);
}
}
/** Compare this configuration to another for ordering, which essentially compares two strings for ordering.
* @param other the other Object which is presumably another basic collection configuration
* @return an integer which is either <0, 0 or >0 if this configuration is naturally less than, equal to or greater than the target object
*/
public int compareTo(Object other) {
if(other == null) {
return -1;
}
return toString().compareTo(other.toString());
}
public boolean equals(Object other) {
return (compareTo(other) == 0);
}
/** Retrieve the creators email for this collection.
* @return a String
*/
public String getCreator() {
return creator;
}
public String getDescription() {
return description;
}
public File getFile() {
return file;
}
public String getMaintainer() {
return maintainer;
}
public String getName() {
return name;
}
public String getIsPublic() {
return is_public;
}
public String getCollectGroup() {
return collectgroup;
}
/** Retrieve the short name for this collection which, given this current file is in /etc/collect.cfg, is the name of this file's parent file's parent.
* @return the short name of this collection as a String
*/
public String getShortName() {
if (short_name.equals("")) {
String collectDir = Gatherer.getCollectDirectoryPath();
String currentCollDir = file.getParentFile().getParentFile().getAbsolutePath();
if (currentCollDir.startsWith(collectDir)) {
short_name = currentCollDir.substring(collectDir.length());
short_name = short_name.replace('\\', '/');
} else {
short_name = file.getParentFile().getParentFile().getName();
}
}
return short_name;
}
/** set the site for this coll */
public void setSite(String site) {
this.site = site;
}
/** Display the title for this collection. */
public String toString() {
if (this.site == null) {
return getName() + StaticStrings.SPACE_CHARACTER + StaticStrings.OPEN_PARENTHESIS_CHARACTER + getShortName() + StaticStrings.CLOSE_PARENTHESIS_CHARACTER;
} else {
return getName() + StaticStrings.SPACE_CHARACTER + StaticStrings.OPEN_PARENTHESIS_CHARACTER + getShortName()+", "+this.site + StaticStrings.CLOSE_PARENTHESIS_CHARACTER;
}
}
}