/**
*#########################################################################
*
* 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.*;
import javax.swing.*;
import javax.swing.tree.*;
import org.greenstone.gatherer.Configuration;
import org.greenstone.gatherer.DebugStream;
import org.greenstone.gatherer.Gatherer;
import org.greenstone.gatherer.cdm.CollectionDesignManager;
import org.greenstone.gatherer.cdm.CollectionMeta;
import org.greenstone.gatherer.cdm.CollectionMetaManager;
import org.greenstone.gatherer.util.StaticStrings;
import org.greenstone.gatherer.util.XMLTools;
import org.w3c.dom.*;
/** Collection provides a common collection point for all the information about a certain collection build session. It keeps a record of several other managers that actually handle the content of the collection, such as metadata sets and metadata itself.
* @author John Thompson, Greenstone Digital Library, University of Waikato
* @version 2.3c
*/
public class Collection {
/** A reference to the Collection Design Manager. */
public CollectionDesignManager cdm;
/** A reference to the build ScriptOptions. */
public ScriptOptions build_options;
/** A reference to the import ScriptOptions. */
public ScriptOptions import_options;
/** true if an error has occurred during construction */
public boolean error = false;
/** true if the currently loaded collection has been saved since the last significant change, false otherwise. */
private boolean saved = false;
/*true if the currently loaded collection has had files added since its last build */
private boolean filesChanged = false;
/*true if the currently loaded collection has had metadata added since its last build */
private boolean metadataChanged = false;
/** The document around which this collection class is based. */
private Document document;
/** The file the collection is in (the file may not actually exist, such in the case of a legacy collection)! */
private File file;
/** The name of the argument element. */
static final private String ARGUMENT = "Argument";
static final private String BASE_COLLECTION = "base_collection";
/** The name of the build element. */
static final private String BUILD = "Build";
/** The name of the build config element. */
static final private String BUILD_CONFIG = "BuildConfig";
/** The name of the collection xml template. */
static final private String COLLECTION_XML_TEMPLATE = "xml/template.col";
/** The name of the import element. */
static final private String IMPORT = "Import";
/** The name of the imported attribute. */
static final private String IMPORTED = "imported";
/** The name of the imported attribute. */
static final private String SKIM_FILE = "skimfile";
/** Constructor. */
public Collection(File collection_xml) {
this.file = collection_xml;
// Try to load this collections details.
document = XMLTools.parseXMLFile(collection_xml);
// If that fails load the default settings for a collection.
if(document == null) {
document = XMLTools.parseXMLFile(COLLECTION_XML_TEMPLATE, true);
}
if (document == null) {
error = true;
return;
}
// Point the Configuration class at our gatherer config arguments.
Configuration.setCollectionConfiguration(document);
if (Gatherer.g_man != null) {
Gatherer.g_man.updateUI();
}
// Finally create all of the child managers that are directly dependant on a collection
build_options = new ScriptOptions(getBuildValues(), "buildcol.pl");
import_options = new ScriptOptions(getImportValues(), "import.pl");
}
/** Destructor.
* @see org.greenstone.gatherer.Configuration
* @see org.greenstone.gatherer.Gatherer
* @see org.greenstone.gatherer.cdm.CollectionDesignManager
*/
public void destroy() {
cdm.destroy();
Configuration.setCollectionConfiguration(null);
// this is called after calling collection.destroy, so we shouldn't need it here too.
// if (Gatherer.g_man != null) {
// Gatherer.g_man.updateUI();
// }
cdm = null;
document = null;
}
/** Determine the number of documents and folders in this collection. */
public int getCount() {
return getCount((TreeNode)Gatherer.c_man.getCollectionTreeModel().getRoot(), true, true);
}
/** Calculates the number of documents in this collection. */
public int getDocumentCount() {
return getCount((TreeNode)Gatherer.c_man.getCollectionTreeModel().getRoot(), false, true);
}
/** Retrieve the description of this collection.
* @return a String
*/
public String getDescription() {
if(cdm == null) {
return StaticStrings.EMPTY_STR;
}
CollectionMeta collection_extra_collectionmeta = cdm.collectionmeta_manager.getMetadatum(StaticStrings.COLLECTIONMETADATA_COLLECTIONEXTRA_STR);
return collection_extra_collectionmeta.getValue(CollectionMeta.TEXT);
}
/** Retrieve the authors email for this collection.
* @return The email as a String.
*/
public String getEmail() {
if(cdm == null) {
return StaticStrings.EMPTY_STR;
}
CollectionMeta creator_collectionmeta = new CollectionMeta(CollectionDesignManager.collect_config.getCreator());
return creator_collectionmeta.getValue(CollectionMeta.TEXT);
}
/** Retrieve the short name for this collection.
* @return The name as a String.
*/
public String getName() {
return file.getParentFile().getName();
}
/** Determine if this collection has been saved since the last major change.
* @return true if it has been saved recently, false otherwise.
*/
public boolean getSaved() {
return saved;
}
/** Determine if this collection has had its collection files changed since the last build.
* @return true if they have been saved, false otherwise.
*/
public boolean getFilesChanged() {
return filesChanged;
}
/** Set the flag that marks weather or not the files has been changed since the last build.
@param changed if files has been added/removed, as a boolean
*/
public void setFilesChanged(boolean changed) {
filesChanged = changed;
}
/** Determine if this collection has had metadata changed since the last build.
* @return true if it has been changed, false otherwise.
*/
public boolean getMetadataChanged() {
return metadataChanged;
}
/** Set the flag that marks weather or not the metadata has been changed since the last build.
@param changed if metadata has been added/changed/removed, as a boolean
*/
public void setMetadataChanged(boolean changed) {
metadataChanged = changed;
}
/** Retrieve the title of this collection.
* @return The title as a String.
*/
public String getTitle() {
if(cdm == null) {
return StaticStrings.EMPTY_STR;
}
CollectionMeta collection_name_collectionmeta = cdm.collectionmeta_manager.getMetadatum(StaticStrings.COLLECTIONMETADATA_COLLECTIONNAME_STR);
return collection_name_collectionmeta.getValue(CollectionMeta.TEXT);
}
/** Save this xml document to the given file. */
public void save() {
XMLTools.writeXMLFile(file, document);
saved = true;
}
public void setBaseCollection(String base_collection) {
set(BASE_COLLECTION, base_collection);
}
/** Set the value of imported to the given value.
* @param value The new value for imported, true if the collection has been imported successfully, false otherwise.
*/
public void setImported(boolean value) {
set(IMPORTED, value);
saved = false;
}
/** Set the value of saved to the given value.
* @param value The new value for saved, true if the collection has been saved recently, false otherwise.
*/
public void setSaved(boolean value) {
saved = value;
}
/** Set the value of title to the given value.
* @param title The new String title.
*/
public void setTitle(String title) {
if(cdm != null) {
CollectionMeta collection_name_collectionmeta = cdm.collectionmeta_manager.getMetadatum(StaticStrings.COLLECTIONMETADATA_COLLECTIONNAME_STR);
collection_name_collectionmeta.setValue(title);
}
}
/** Method called to return a textual representation of a class, which in this case is the collections title.
* @return A String containing the collections title.
*/
public String toString() {
return getTitle();
}
public boolean toSkimFile(){
Element document_element = document.getDocumentElement();
NodeList arguments = document_element.getElementsByTagName(ARGUMENT);
for(int i = 0; i < arguments.getLength(); i++) {
Element argument_element = (Element) arguments.item(i);
if(argument_element.getAttribute(StaticStrings.NAME_ATTRIBUTE).equalsIgnoreCase(SKIM_FILE)) {
String skimfile = XMLTools.getValue(argument_element);
if (skimfile !=null && skimfile.trim().toLowerCase().equals("false")){
return false;
}
}
}
return true;
}
/** Get the value of a collection argument. */
private boolean get(String name) {
boolean result = false;
try {
Element document_element = document.getDocumentElement();
NodeList arguments = document_element.getElementsByTagName(ARGUMENT);
boolean found = false;
for(int i = 0; !found && i < arguments.getLength(); i++) {
Element argument_element = (Element) arguments.item(i);
if(argument_element.getParentNode() == document_element) {
if(argument_element.getAttribute(StaticStrings.NAME_ATTRIBUTE).equalsIgnoreCase(name)) {
String value = XMLTools.getValue(argument_element);
if(value.equalsIgnoreCase(StaticStrings.TRUE_STR)) {
result = true;
}
found = true;
value = null;
}
}
argument_element = null;
}
arguments = null;
document_element = null;
}
catch (Exception error) {
DebugStream.printStackTrace(error);
}
return result;
}
/** Get the value of a collection argument. */
private String getString(String name) {
String result = "";
try {
Element document_element = document.getDocumentElement();
NodeList arguments = document_element.getElementsByTagName(ARGUMENT);
boolean found = false;
for(int i = 0; !found && i < arguments.getLength(); i++) {
Element argument_element = (Element) arguments.item(i);
if(argument_element.getParentNode() == document_element) {
if(argument_element.getAttribute(StaticStrings.NAME_ATTRIBUTE).equalsIgnoreCase(name)) {
result = XMLTools.getValue(argument_element);
found = true;
}
}
argument_element = null;
}
arguments = null;
document_element = null;
}
catch (Exception error) {
DebugStream.printStackTrace(error);
}
return result;
}
/** Method to retrieve the current build options associated with this Collection. */
private Element getBuildValues() {
Element build_values_element = null;
try {
Element document_element = document.getDocumentElement();
Element build_config_element = (Element) XMLTools.getNodeFromNamed(document_element, BUILD_CONFIG);
build_values_element = (Element) XMLTools.getNodeFromNamed(build_config_element, BUILD);
build_config_element = null;
document_element = null;
}
catch (Exception error) {
DebugStream.printStackTrace(error);
}
return build_values_element;
}
/** Count either documents or folders, depending on the state of the given boolean. */
private int getCount(TreeNode node, boolean count_folders, boolean count_files) {
int count = 0;
File file = ((CollectionTreeNode)node).getFile();
if(file.isFile() && count_files) {
count++;
}
else if(file.isDirectory() && count_folders) {
count++;
}
for(int i = 0; !file.getName().equals("CVS") && i < node.getChildCount(); i++) {
count = count + getCount(node.getChildAt(i), count_folders, count_files);
}
return count;
}
/** Method to retrieve the current import options associated with this Collection. */
public Element getImportValues() {
Element import_values_element = null;
try {
Element document_element = document.getDocumentElement();
Element build_config_element = (Element) XMLTools.getNodeFromNamed(document_element, BUILD_CONFIG);
import_values_element = (Element) XMLTools.getNodeFromNamed(build_config_element, IMPORT);
build_config_element = null;
document_element = null;
}
catch (Exception error) {
DebugStream.printStackTrace(error);
}
return import_values_element;
}
/** Set the value of a collection argument. */
private void set(String name, boolean value) {
set(name, (value ? StaticStrings.TRUE_STR : StaticStrings.FALSE_STR));
}
private void set(String name, String value) {
try {
Element document_element = document.getDocumentElement();
NodeList arguments = document_element.getElementsByTagName(ARGUMENT);
boolean found = false;
for(int i = 0; !found && i < arguments.getLength(); i++) {
Element argument_element = (Element) arguments.item(i);
if(argument_element.getParentNode() == document_element) {
if(argument_element.getAttribute(StaticStrings.NAME_ATTRIBUTE).equalsIgnoreCase(name)) {
// Strip any current value nodes.
while(argument_element.hasChildNodes()) {
argument_element.removeChild(argument_element.getFirstChild());
}
// Append new value
argument_element.appendChild(document.createTextNode(value));
found = true;
}
}
argument_element = null;
}
// Append it
if(!found) {
Element argument_element = document.createElement(ARGUMENT);
argument_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name);
argument_element.appendChild(document.createTextNode(value));
document_element.appendChild(argument_element);
argument_element = null;
}
arguments = null;
document_element = null;
}
catch (Exception error) {
DebugStream.printStackTrace(error);
}
}
}