/*
* Copyright 2003-2010 Tufts University Licensed under the
* Educational Community License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may
* obtain a copy of the License at
*
* http://www.osedu.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an "AS IS"
* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
/*
* Repository.java
*
* Created on April 7, 2006, 2:03 PM
*/
/**
*
* @author akumar03
*/
package edu.tufts.osidimpl.repository.fedora_2_2;
import org.osid.repository.*;
import tufts.oki.shared.TypeIterator;
import java.util.prefs.Preferences;
import java.util.*;
import java.net.*;
import java.io.*;
import javax.swing.JOptionPane;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.mapping.MappingException;
import java.io.OutputStreamWriter;
import org.xml.sax.InputSource;
// these classses are required for soap implementation of
import javax.xml.namespace.QName;
import fedora.server.types.gen.*;
import fedora.server.utilities.DateUtility;
//axis files
import org.apache.axis.encoding.ser.*;
import org.apache.axis.types.NonNegativeInteger;
import org.apache.axis.client.Service;
//import org.apache.axis.client.Call;
import javax.xml.rpc.ServiceException;
import java.rmi.RemoteException ;
// for FTP
import org.apache.commons.net.ftp.*;
// APIM
import fedora.server.management.FedoraAPIM;
import fedora.server.utilities.StreamUtility;
public class Repository implements org.osid.repository.Repository {
public final boolean DEBUG = false;
public static final String DC_NAMESPACE = "dc:";
public static final String[] DC_FIELDS = {"title","creator","subject","date","type","format","identifier","collection","coverage"};
public static final String FEDORA_PROTOCOL = "http://";
public static final String FEDORA_URL = "/fedora/";
public static final String BDEF="fedora:BDEF";
public static final String BMECH="fedora:BMECH";
private Preferences prefs = null;
private String displayName = "";
private String description = "";
private String address = null;
private int port = 8080; // default port for fedora
private String userName = null;
private String password = null;
private String conf = null;
private java.util.Vector recordStructures = new java.util.Vector();
private java.util.Vector assetTypes = new java.util.Vector();
private java.util.Vector searchTypes = new java.util.Vector();
private java.util.Vector assets = new java.util.Vector();
private java.util.Properties configuration;
private org.osid.shared.Id id = null;
// private URL configuration = null;
private org.osid.shared.Type keywordSearchType = new Type("mit.edu","search","keyword");
private org.osid.shared.Type multiFieldSearchType = new Type("mit.edu","search","multiField");
private org.osid.shared.Type repositoryType = new Type("tufts.edu","repository","fedora_2_2");
// this object stores the information to access soap. These variables will not be required if Preferences becomes serializable
private Properties fedoraProperties;
/** Creates a new instance of Repository */
public Repository(String conf,
String id,
String displayName,
String address,
String port,
String userName,
String password)
throws org.osid.repository.RepositoryException {
try {
this.id = new PID(id);
this.displayName = displayName;
this.description = description;
setAddress(address);
this.port = new Integer(port).intValue();
this.userName = userName;
this.password = password;
this.conf = conf;
setFedoraProperties();
loadFedoraObjectAssetTypes();
searchTypes.add(keywordSearchType);
searchTypes.add(multiFieldSearchType);
} catch (Throwable t) { t.printStackTrace(); }
}
// This constructor shall eventually replace the above constructor.
//This is robust and has access to all the configuration informaiton from osid
public Repository(Properties configuration, String id) throws org.osid.repository.RepositoryException {
try {
this.id = new PID(id);
String displayName = configuration.getProperty("fedora22DisplayName");
if (displayName != null) this.displayName = displayName;
String address = configuration.getProperty("fedora22Address");
if(address != null) setAddress(address);
String port = configuration.getProperty("fedora22Port");
if(port !=null) this.port = new Integer(port).intValue();
String userName = configuration.getProperty("fedora22UserName");
if(userName != null ) this.userName = userName;
String password = configuration.getProperty("fedora22Password");
if(password != null) this.password = password;
setFedoraProperties();
loadFedoraObjectAssetTypes();
searchTypes.add(keywordSearchType);
searchTypes.add(multiFieldSearchType);
this.configuration = configuration;
} catch (Throwable t) { t.printStackTrace(); }
}
/** sets a soap call to perform all digital repository operations
* @throws RepositoryException if Soap call can't be made
*/
public void setFedoraProperties(Properties fedoraProperties) {
this.fedoraProperties = fedoraProperties;
}
public void setFedoraProperties() {
String url = FEDORA_PROTOCOL+this.address+":"+this.port+FEDORA_URL;
fedoraProperties = new Properties();
try {
// prefs = FedoraUtils.getPreferences(this);
fedoraProperties.setProperty("url.fedora.api", "http://www.fedora.info/definitions/1/0/api/");
fedoraProperties.setProperty("url.fedora.type", "http://www.fedora.info/definitions/1/0/types/");
fedoraProperties.setProperty("url.fedora.soap.access",url+"access/soap");
fedoraProperties.setProperty("url.fedora.get", url+"get/");
fedoraProperties.setProperty("url.seastar.fedora.get", "http://seastar.lib.tufts.edu:8080/fedora/get/");
fedoraProperties.setProperty("fedora.types","TUFTS_STD_IMAGE,XML_TO_HTMLDOC,TUFTS_BINARY_FILE,TUFTS_VUE_CONCEPT_MAP,UVA_EAD_FINDING_AID,UVA_STD_IMAGE,UVA_MRSID_IMAGE,SIMPLE_DOC,MassIngest");
fedoraProperties.setProperty("ImageRecordStructureId","edu.mit.image.recordStructureId");
fedoraProperties.setProperty("VUEDefaultViewInfoPartId","edu.tufts.defaultView.partStructureId");
fedoraProperties.setProperty("ThumbnailPartStructureId","mit.edu.thumbnail.partStructureId");
fedoraProperties.setProperty("URLPartStructureId","mit.edu.partStructureId");
fedoraProperties.setProperty("dissemination.dc","bdef:TuftsMetadata/getDublinCore/");
fedoraProperties.setProperty("type.image", "tufts/image/archival");
fedoraProperties.setProperty("assetDef.fullView" , "bdef:AssetDef/getFullView");
} catch (Exception ex) { ex.printStackTrace(); System.out.println("Unable to load fedora Properties"+ex);}
}
private void loadFedoraObjectAssetTypes() {
try {
// System.out.println("fedora types " + fedoraProperties.getProperty("fedora.types"));
Vector fedoraTypesVector = FedoraUtils.stringToVector(fedoraProperties.getProperty("fedora.types"));
Iterator i =fedoraTypesVector.iterator();
while(i.hasNext()) {
createFedoraObjectAssetType((String)i.next());
}
} catch (Throwable t) {
t.printStackTrace();
System.out.println("Unable to load fedora types"+t.getMessage());
}
}
public Properties getFedoraProperties() {
return fedoraProperties;
}
//TODO: remove this method completely in future
/**To create AssetTypes that don't exist when repository is loaded. OKI NEEDS to add such a feature
*@ param String type
*@ return FedoraObjectAssetType
*@throws org.osid.repository.RepositoryException
*/
public FedoraObjectAssetType createFedoraObjectAssetType(String type) throws org.osid.repository.RepositoryException {
java.util.Iterator i = assetTypes.iterator();
while(i.hasNext()) {
FedoraObjectAssetType fedoraObjectAssetType = (FedoraObjectAssetType) i.next();
if(fedoraObjectAssetType.getType().equals(type))
return fedoraObjectAssetType;
}
FedoraObjectAssetType fedoraObjectAssetType = new FedoraObjectAssetType(this,type);
org.osid.repository.RecordStructureIterator iter = fedoraObjectAssetType.getRecordStructures();
while(iter.hasNextRecordStructure()) {
org.osid.repository.RecordStructure recordStructure = (org.osid.repository.RecordStructure)iter.nextRecordStructure();
if(recordStructures.indexOf(recordStructure) < 0)
recordStructures.add(recordStructure);
}
assetTypes.add(fedoraObjectAssetType);
return fedoraObjectAssetType;
}
/** AssetTypes are loaded from the configuration file. In future versions these will be loaded directly from FEDORA.
* OKI Team recommends having an object in digital repository that maintains this information.
* @ throws RepositoryException
*/
private void loadAssetTypes() throws org.osid.repository.RepositoryException {
FedoraObjectAssetType fedoraObjectAssetType = new FedoraObjectAssetType(this,"TUFTS_STD_IMAGE");
}
public FedoraObjectAssetType getAssetType(String type) throws org.osid.repository.RepositoryException {
java.util.Iterator i = assetTypes.iterator();
while(i.hasNext()) {
FedoraObjectAssetType fedoraObjectAssetType = (FedoraObjectAssetType) i.next();
if(fedoraObjectAssetType.getType().equals(type))
return fedoraObjectAssetType;
}
return createFedoraObjectAssetType(type);
}
public boolean isFedoraObjectAssetTypeSupported(String type) {
java.util.Iterator i = assetTypes.iterator();
while(i.hasNext()) {
FedoraObjectAssetType fedoraObjectAssetType = (FedoraObjectAssetType) i.next();
if(fedoraObjectAssetType.getType().equals(type))
return true;
}
return false;
}
/** Create a new Asset of this AssetType to this Repository. The implementation of this method sets the Id for the new object.
* @return Asset
* @throws RepositoryException if there is a general failure or if the Type is unknown
*/
public org.osid.repository.Asset createAsset(String displayName, String description, org.osid.shared.Type assetType) throws org.osid.repository.RepositoryException{
if(!assetTypes.contains(assetType))
assetTypes.add(assetType);
try {
org.osid.repository.Asset obj = new Asset(this,displayName,description,assetType);
assets.add(obj);
return obj;
} catch(org.osid.shared.SharedException ex) {
throw new org.osid.repository.RepositoryException("DR.createAsset"+ex.getMessage());
}
}
/** Delete an Asset from this Repository.
* @param org.osid.shared.Id
* @throws RepositoryException if there is a general failure or if the object has not been created
*/
public void deleteAsset(org.osid.shared.Id assetId) throws org.osid.repository.RepositoryException {
throw new org.osid.repository.RepositoryException(org.osid.OsidException.UNIMPLEMENTED);
}
public org.osid.repository.RecordStructureIterator getRecordStructuresByType(org.osid.shared.Type recordStructureType) throws org.osid.repository.RepositoryException {
throw new org.osid.repository.RepositoryException(org.osid.OsidException.UNIMPLEMENTED);
}
/** Get all the AssetTypes in this Repository. AssetTypes are used to categorize Assets. Iterators return a set, one at a time. The Iterator's hasNext method returns true if there are additional objects available; false otherwise. The Iterator's next method returns the next object.
* @return org.osid.shared.TypeIterator The order of the objects returned by the Iterator is not guaranteed.
* @throws RepositoryException if there is a general failure
*/
public org.osid.shared.TypeIterator getAssetTypes() throws org.osid.repository.RepositoryException {
// this method needs an implementation of TypeIterator which has not yet been implemented
return new tufts.oki.shared2.TypeIterator(assetTypes);
}
/** Get all the Assets in this Repository. Iterators return a set, one at a time. The Iterator's hasNext method returns true if there are additional objects available; false otherwise. The Iterator's next method returns the next object.
* @return AssetIterator The order of the objects returned by the Iterator is not guaranteed.
* @throws RepositoryException if there is a general failure
*/
public org.osid.repository.AssetIterator getAssets() throws org.osid.repository.RepositoryException {
Vector assetVector = new Vector();
String assetId = "tufts:";
String location = null;
try {
for(int i=1;i<=10;i++) {
// location = getObject(assetId+i);
// FedoraObject obj = createObject(location);
org.osid.repository.Asset asset = new Asset(new PID(assetId+i),this);
assetVector.add(asset);
}
} catch(Throwable t) {
throw new RepositoryException(t.getMessage());
}
return (org.osid.repository.AssetIterator) new AssetIterator(assetVector);
}
/** Get all the Assets of the specified AssetType in this Repository. Iterators return a set, one at a time. The Iterator's hasNext method returns true if there are additional objects available; false otherwise. The Iterator's next method returns the next object.
* @return AssetIterator The order of the objects returned by the Iterator is not guaranteed.
* @throws RepositoryException if there is a general failure or if the Type is unknown
*/
/** Get the description for this Repository.
* @return String the name
* @throws RepositoryException if there is a general failure
*/
public String getDescription() throws org.osid.repository.RepositoryException {
return this.description;
}
/** Get the name for this Repository.
* @return String the name
* @throws RepositoryException if there is a general failure
*/
public String getDisplayName() throws org.osid.repository.RepositoryException {
return displayName;
}
/** Get the Unique Id for this Repository.
* @return org.osid.shared.Id Unique Id this is usually set by a create method's implementation
* @throws RepositoryException if there is a general failure
*/
public org.osid.shared.Id getId() throws org.osid.repository.RepositoryException {
return id;
}
/** Get all the InfoStructures in this Repository. InfoStructures are used to categorize information about Assets. Iterators return a set, one at a time. The Iterator's hasNext method returns true if there are additional objects available; false otherwise. The Iterator's next method returns the next object.
* @return InfoStructureIterator The order of the objects returned by the Iterator is not guaranteed.
* @throws RepositoryException if there is a general failure
*/
public org.osid.repository.RecordStructureIterator getRecordStructures() throws org.osid.repository.RepositoryException {
return (org.osid.repository.RecordStructureIterator) new RecordStructureIterator(recordStructures);
}
/** Get the InfoStructures that this AssetType must support. InfoStructures are used to categorize information about Assets. Iterators return a set, one at a time. The Iterator's hasNext method returns true if there are additional objects available; false otherwise. The Iterator's next method returns the next object.
* @return InfoStructureIterator The order of the objects returned by the Iterator is not guaranteed.
* @throws RepositoryException if there is a general failure
*/
public org.osid.repository.RecordStructureIterator getMandatoryRecordStructures(org.osid.shared.Type assetType) throws org.osid.repository.RepositoryException {
java.util.Vector v = new java.util.Vector();
v.addElement(new ImageRecordStructure(this));
return new RecordStructureIterator(v);
}
/** Get all the SearchTypes supported by this Repository. Iterators return a set, one at a time. The Iterator's hasNext method returns true if there are additional objects available; false otherwise. The Iterator's next method returns the next object.
* @return org.osid.shared.TypeIterator The order of the objects returned by the Iterator is not guaranteed.
* @throws RepositoryException if there is a general failure
*/
public org.osid.shared.TypeIterator getSearchTypes() throws org.osid.repository.RepositoryException {
return new tufts.oki.shared2.TypeIterator(searchTypes);
}
/** Get the the StatusTypes of this Asset.
* @return org.osid.shared.Type
* @throws RepositoryException if there is a general failure
*/
public org.osid.shared.Type getStatus(org.osid.shared.Id assetId) throws org.osid.repository.RepositoryException {
throw new org.osid.repository.RepositoryException(org.osid.OsidException.UNIMPLEMENTED);
}
/** Get all the StatusTypes supported by this Repository. Iterators return a set, one at a time. The Iterator's hasNext method returns true if there are additional objects available; false otherwise. The Iterator's next method returns the next object.
* @return org.osid.shared.TypeIterator The order of the objects returned by the Iterator is not guaranteed.
* @throws RepositoryException if there is a general failure
*/
public org.osid.shared.TypeIterator getStatusTypes() throws org.osid.repository.RepositoryException {
throw new org.osid.repository.RepositoryException(org.osid.OsidException.UNIMPLEMENTED);
}
/** Update the description for this Repository.
* @param String description
* @throws RepositoryException if there is a general failure
*/
public void updateDescription(String description) throws org.osid.repository.RepositoryException {
this.description = description;
}
/** Update the "tufts/dr/fedora/temp/"name for this Repository.
* @param String name
* @throws RepositoryException if there is a general failure
*/
public void updateDisplayName(String displayName) throws org.osid.repository.RepositoryException {
this.displayName = displayName;
}
/** Set the Asset's status Type accordingly and relax validation checking when creating InfoRecords and InfoFields or updating InfoField's values.
* @param org.osid.shared.Id
* @return boolean
* @throws RepositoryException if there is a general failure
*/
public void invalidateAsset(org.osid.shared.Id assetId) throws org.osid.repository.RepositoryException {
throw new org.osid.repository.RepositoryException(org.osid.OsidException.UNIMPLEMENTED);
}
/** Validate all the InfoRecords for an Asset and set its status Type accordingly. If the Asset is valid, return true; otherwise return false. The implementation may throw an Exception for any validation failures and use the Exception's message to identify specific causes.
* @param org.osid.shared.Id
* @return boolean
* @throws RepositoryException if there is a general failure
*/
public boolean validateAsset(org.osid.shared.Id assetId) throws org.osid.repository.RepositoryException {
throw new org.osid.repository.RepositoryException(org.osid.OsidException.UNIMPLEMENTED);
}
public org.osid.shared.Id copyAsset(org.osid.repository.Asset asset) throws org.osid.repository.RepositoryException {
throw new org.osid.repository.RepositoryException(org.osid.OsidException.UNIMPLEMENTED);
}
public org.osid.repository.Asset getAsset(org.osid.shared.Id assetId) throws org.osid.repository.RepositoryException {
Condition[] condition = new Condition[1];
condition[0] = new Condition();
condition[0].setProperty("pid");
condition[0].setOperator(ComparisonOperator.eq);
try {
System.out.println("Searching for object ="+assetId.getIdString());
condition[0].setValue(assetId.getIdString());
} catch(org.osid.shared.SharedException ex) {
throw new org.osid.repository.RepositoryException(ex.getMessage());
}
SearchCriteria searchCriteria = new SearchCriteria();
searchCriteria.setConditions(condition);
searchCriteria.setMaxReturns("1");
org.osid.repository.AssetIterator mAssetIterator = FedoraRESTSearchAdapter.advancedSearch(this,searchCriteria);
if(mAssetIterator.hasNextAsset())
return mAssetIterator.nextAsset();
else
throw new org.osid.repository.RepositoryException(org.osid.repository.RepositoryException.UNKNOWN_ID);
}
public org.osid.repository.Asset getAsset(org.osid.shared.Id assetId, long date) throws org.osid.repository.RepositoryException {
throw new org.osid.repository.RepositoryException(org.osid.OsidException.UNIMPLEMENTED);
}
public org.osid.shared.PropertiesIterator getProperties() throws org.osid.repository.RepositoryException {
throw new org.osid.repository.RepositoryException(org.osid.OsidException.UNIMPLEMENTED);
}
public org.osid.shared.Properties getPropertiesByType(org.osid.shared.Type propertiesType) throws org.osid.repository.RepositoryException {
throw new org.osid.repository.RepositoryException(org.osid.OsidException.UNIMPLEMENTED);
}
public org.osid.shared.TypeIterator getPropertyTypes() throws org.osid.repository.RepositoryException {
throw new org.osid.repository.RepositoryException(org.osid.OsidException.UNIMPLEMENTED);
}
public org.osid.shared.LongValueIterator getAssetDates(org.osid.shared.Id assetId) throws org.osid.repository.RepositoryException {
throw new org.osid.repository.RepositoryException(org.osid.OsidException.UNIMPLEMENTED);
}
public org.osid.repository.AssetIterator getAssets(java.io.Serializable searchCriteria, org.osid.shared.Type searchType) throws org.osid.repository.RepositoryException {
if ( (searchCriteria instanceof String) &&
(searchType.isEqual(keywordSearchType) || searchType.isEqual(multiFieldSearchType)) ) {
return new AssetIterator(this, searchCriteria, searchType);
} else {
throw new org.osid.repository.RepositoryException(org.osid.repository.RepositoryException.UNKNOWN_TYPE);
}
}
public org.osid.shared.Type getType() throws org.osid.repository.RepositoryException {
return repositoryType;
}
public org.osid.repository.Asset getAssetByDate(org.osid.shared.Id id, long date) throws org.osid.repository.RepositoryException {
return getAsset(id,date);
}
public org.osid.repository.AssetIterator getAssetsBySearch(java.io.Serializable serializable, org.osid.shared.Type type, org.osid.shared.Properties properties) throws org.osid.repository.RepositoryException {
return getAssets(serializable, type);
}
public org.osid.repository.AssetIterator getAssetsByType(org.osid.shared.Type type) throws org.osid.repository.RepositoryException {
return getAssets();
}
public boolean supportsUpdate() throws org.osid.repository.RepositoryException {
return false;
}
public boolean supportsVersioning() throws org.osid.repository.RepositoryException {
return false;
}
public String getAddress() {
return this.address;
}
public void setAddress(String address) {
this.address = address;
}
public String getUserName() {
return this.userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return this.password;
}
public void setPassword() {
this.password = password;
}
public String getConf() {
return this.conf;
}
public void setConf(String conf) {
this.conf = conf;
}
public int getPort() {
return this.port;
}
public void setPort(int port) {
this.port = port;
}
public Properties getConfiguration() {
return this.configuration;
}
}