tufts.oki.dr.fedora.DR.java Source code

Java tutorial

Introduction

Here is the source code for tufts.oki.dr.fedora.DR.java

Source

/*
* 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.
 */

package tufts.oki.dr.fedora;

/*
 * DR.java
 *
 * Created on May 7, 2003, 2:03 PM
 */

/**
 *
 * @author  akumar03
 */

import osid.dr.*;
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;
import fedora.client.utility.ingest.AutoIngestor;

public class DR implements osid.dr.DigitalRepository {
    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" };

    private Preferences prefs = null;
    private String displayName = "";
    private String description = "";
    private URL address = null;
    private String userName = null;
    private String password = null;
    private String conf = null;
    private java.util.Vector infoStructures = 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 osid.shared.Id id = null;
    private URL configuration = null;

    // 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 DR */
    public DR(String conf, String id, String displayName, String description, URL address, String userName,
            String password) throws osid.dr.DigitalRepositoryException, osid.shared.SharedException {
        System.out.println("DR CONSTRUCTING[" + conf + ", " + id + ", " + displayName + ", " + description + ", "
                + address + ", " + userName + ", " + password + "] " + this);
        try {
            this.id = new PID(id);
            this.displayName = displayName;
            this.description = description;
            this.address = address;
            this.userName = userName;
            this.password = password;
            this.conf = conf;
            this.configuration = getResource(conf);

            setFedoraProperties(configuration);
            loadFedoraObjectAssetTypes();
            //setFedoraProperties(FedoraUtils.CONF);
            searchTypes.add(new SearchType("Search"));
            searchTypes.add(new SearchType("Advanced Search"));
            //loadAssetTypes();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    /** sets a soap call to perform all digital repository operations
     * @throws DigitalRepositoryException if Soap call can't be made
     */

    public void setFedoraProperties(Properties fedoraProperties) {
        this.fedoraProperties = fedoraProperties;
    }

    public void setFedoraProperties(java.net.URL conf) {
        String url = address.getProtocol() + "://" + address.getHost() + ":" + address.getPort() + "/"
                + address.getFile();
        System.out.println("FEDORA Address = " + url);
        fedoraProperties = new Properties();
        try {
            System.out.println("Fedora Properties " + conf);
            prefs = FedoraUtils.getPreferences(this);
            fedoraProperties.setProperty("url.fedora.api", prefs.get("url.fedora.api", ""));
            fedoraProperties.setProperty("url.fedora.type", prefs.get("url.fedora.type", ""));
            fedoraProperties.setProperty("url.fedora.soap.access", url + prefs.get("url.fedora.soap.access", ""));
            fedoraProperties.setProperty("url.fedora.get", url + prefs.get("url.fedora.get", ""));
            fedoraProperties.setProperty("fedora.types", prefs.get("fedora.types", ""));
        } catch (Exception ex) {
            System.out.println("Unable to load fedora Properties" + ex);
        }

    }

    private void loadFedoraObjectAssetTypes() {
        try {
            Vector fedoraTypesVector = FedoraUtils.stringToVector(fedoraProperties.getProperty("fedora.types"));
            Iterator i = fedoraTypesVector.iterator();
            while (i.hasNext()) {
                createFedoraObjectAssetType((String) i.next());
            }
        } catch (Exception ex) {
            System.out.println("Unable to load fedora types" + ex);
        }
    }

    public Properties getFedoraProperties() {
        return fedoraProperties;
    }

    public URL getConfiguration() {
        return configuration;
    }

    /**To create AssetTypes that don't exist when repository is loaded. OKI NEEDS to add such a feature
     *@ param String type
     *@ return FedoraObjectAssetType
     *@throws osid.dr.DigitalRepositoryException
     */

    public FedoraObjectAssetType createFedoraObjectAssetType(String type)
            throws osid.dr.DigitalRepositoryException {
        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);
        osid.dr.InfoStructureIterator iter = fedoraObjectAssetType.getInfoStructures();
        while (iter.hasNext()) {
            osid.dr.InfoStructure infoStructure = (osid.dr.InfoStructure) iter.next();
            if (infoStructures.indexOf(infoStructure) < 0)
                infoStructures.add(infoStructure);
        }
        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 DigitalRepositoryException
     */

    private void loadAssetTypes() throws osid.dr.DigitalRepositoryException {
        FedoraObjectAssetType fedoraObjectAssetType = new FedoraObjectAssetType(this, "TUFTS_STD_IMAGE");
    }

    public FedoraObjectAssetType getAssetType(String type) throws osid.dr.DigitalRepositoryException {
        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 DigitalRepository.  The implementation of this method sets the Id for the new object.
     *     @return Asset
     *     @throws DigitalRepositoryException if there is a general failure or if the Type is unknown
     */
    public Asset createAsset(String displayName, String description, osid.shared.Type assetType)
            throws osid.dr.DigitalRepositoryException {
        if (!assetTypes.contains(assetType))
            assetTypes.add(assetType);
        try {
            FedoraObject obj = new FedoraObject(this, displayName, description, assetType);
            assets.add(obj);
            return obj;
        } catch (osid.shared.SharedException ex) {
            throw new osid.dr.DigitalRepositoryException("DR.createAsset" + ex.getMessage());
        }
    }

    /**     Delete an Asset from this DigitalRepository.
     *     @param osid.shared.Id
     *     @throws DigitalRepositoryException if there is a general failure  or if the object has not been created
     */
    public void deleteAsset(osid.shared.Id assetId) throws osid.dr.DigitalRepositoryException {

    }

    /**     Get all the AssetTypes in this DigitalRepository.  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 osid.shared.TypeIterator  The order of the objects returned by the Iterator is not guaranteed.
     *     @throws DigitalRepositoryException if there is a general failure
     */
    public osid.shared.TypeIterator getAssetTypes() throws osid.dr.DigitalRepositoryException {
        // this method needs an implementation of TypeIterator which has not yet been implemented
        return new TypeIterator(assetTypes);
    }

    /**     Get all the Assets in this DigitalRepository.  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 DigitalRepositoryException if there is a general failure
     */

    public osid.dr.AssetIterator getAssets() throws osid.dr.DigitalRepositoryException {
        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);
                FedoraObject obj = new FedoraObject(new PID(assetId + i), this);
                assetVector.add(obj);
            }
        } catch (Exception ex) {
            throw new DigitalRepositoryException(ex.getMessage());
        }
        return (osid.dr.AssetIterator) new FedoraObjectIterator(assetVector);
    }

    /**     Get all the Assets of the specified AssetType in this DigitalRepository.  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 DigitalRepositoryException if there is a general failure   or if the Type is unknown
     */

    /**     Get the description for this DigitalRepository.
     *     @return String the name
     *     @throws DigitalRepositoryException if there is a general failure
     */
    public String getDescription() throws osid.dr.DigitalRepositoryException {
        return this.description;
    }

    /**     Get the name for this DigitalRepository.
     *     @return String the name
     *     @throws DigitalRepositoryException if there is a general failure
     */
    public String getDisplayName() throws osid.dr.DigitalRepositoryException {
        return displayName;
    }

    /**     Get the Unique Id for this DigitalRepository.
     *     @return osid.shared.Id Unique Id this is usually set by a create method's implementation
     *     @throws DigitalRepositoryException if there is a general failure
     */
    public osid.shared.Id getId() throws osid.dr.DigitalRepositoryException {
        return id;
    }

    /**     Get all the InfoStructures in this DigitalRepository.  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 DigitalRepositoryException if there is a general failure
     */
    public osid.dr.InfoStructureIterator getInfoStructures() throws osid.dr.DigitalRepositoryException {
        return (osid.dr.InfoStructureIterator) new InfoStructureIterator(infoStructures);
    }

    /**     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 DigitalRepositoryException if there is a general failure
     */
    public osid.dr.InfoStructureIterator getMandatoryInfoStructures(osid.shared.Type assetType)
            throws osid.dr.DigitalRepositoryException {
        return null;
    }

    /**     Get all the SearchTypes supported by this DigitalRepository.  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 osid.shared.TypeIterator  The order of the objects returned by the Iterator is not guaranteed.
     *     @throws DigitalRepositoryException if there is a general failure
     */
    public osid.shared.TypeIterator getSearchTypes() throws osid.dr.DigitalRepositoryException {
        return new TypeIterator(searchTypes);
    }

    /**     Get the the StatusTypes of this Asset.
     *     @return osid.shared.Type
     *     @throws DigitalRepositoryException if there is a general failure
     */
    public osid.shared.Type getStatus(osid.shared.Id assetId) throws osid.dr.DigitalRepositoryException {
        throw new osid.dr.DigitalRepositoryException("Not Implemented");
    }

    /**     Get all the StatusTypes supported by this DigitalRepository.  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 osid.shared.TypeIterator  The order of the objects returned by the Iterator is not guaranteed.
     *     @throws DigitalRepositoryException if there is a general failure
     */
    public osid.shared.TypeIterator getStatusTypes() throws osid.dr.DigitalRepositoryException {
        throw new osid.dr.DigitalRepositoryException("Not Implemented");
    }

    /**     Update the description for this DigitalRepository.
     *     @param String description
     *     @throws DigitalRepositoryException if there is a general failure
     */
    public void updateDescription(String description) throws osid.dr.DigitalRepositoryException {
        this.description = description;
    }

    /**     Update the "tufts/dr/fedora/temp/"name for this DigitalRepository.
     *     @param String name
     *     @throws DigitalRepositoryException if there is a general failure
     */
    public void updateDisplayName(String displayName) throws osid.dr.DigitalRepositoryException {
        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 osid.shared.Id
     *     @return boolean
     *     @throws DigitalRepositoryException if there is a general failure
     */
    public void invalidateAsset(osid.shared.Id assetId) throws osid.dr.DigitalRepositoryException {
        throw new osid.dr.DigitalRepositoryException("Not Implemented");
    }

    /**     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 osid.shared.Id
     *     @return boolean
     *     @throws DigitalRepositoryException if there is a general failure
     */
    public boolean validateAsset(osid.shared.Id assetId) throws osid.dr.DigitalRepositoryException {
        throw new osid.dr.DigitalRepositoryException("Not Implemented");
    }

    public osid.shared.Id copyAsset(osid.dr.Asset asset) throws osid.dr.DigitalRepositoryException {
        throw new osid.dr.DigitalRepositoryException("Not Implemented");
    }

    public Asset getAsset(osid.shared.Id assetId) throws osid.dr.DigitalRepositoryException {
        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 (osid.shared.SharedException ex) {
            throw new osid.dr.DigitalRepositoryException(ex.getMessage());
        }
        SearchCriteria searchCriteria = new SearchCriteria();
        searchCriteria.setConditions(condition);
        searchCriteria.setMaxReturns("1");
        osid.dr.AssetIterator mAssetIterator = FedoraSoapFactory.advancedSearch(this, searchCriteria);
        if (mAssetIterator.hasNext())
            return mAssetIterator.next();
        else
            throw new osid.dr.DigitalRepositoryException("Object not found");

    }

    public Asset getAsset(osid.shared.Id assetId, java.util.Calendar date)
            throws osid.dr.DigitalRepositoryException {
        throw new osid.dr.DigitalRepositoryException("Not Implemented");
    }

    public osid.shared.CalendarIterator getAssetDates(osid.shared.Id assetId)
            throws osid.dr.DigitalRepositoryException {
        throw new osid.dr.DigitalRepositoryException("Not Implemented");
    }

    public osid.dr.AssetIterator getAssets(java.io.Serializable searchCriteria, osid.shared.Type searchType)
            throws osid.dr.DigitalRepositoryException {

        SearchCriteria lSearchCriteria = null;
        if (searchCriteria instanceof String) {
            lSearchCriteria = new SearchCriteria();
            lSearchCriteria.setKeywords((String) searchCriteria);
            lSearchCriteria.setMaxReturns("10");
            lSearchCriteria.setSearchOperation(SearchCriteria.FIND_OBJECTS);
            lSearchCriteria.setResults(0);
        } else if (searchCriteria instanceof SearchCriteria) {
            lSearchCriteria = (SearchCriteria) searchCriteria;
        } else {
            throw new osid.dr.DigitalRepositoryException(osid.dr.DigitalRepositoryException.UNKNOWN_TYPE);
        }

        if ((searchType.getKeyword().equals("Search"))) {
            return (FedoraSoapFactory.search(this, lSearchCriteria));
        } else if (searchType.getKeyword().equals("Advanced Search")) {
            return (FedoraSoapFactory.advancedSearch(this, lSearchCriteria));
        } else {
            if (!(searchCriteria instanceof String)) {
                throw new osid.dr.DigitalRepositoryException(osid.dr.DigitalRepositoryException.UNKNOWN_TYPE);
            }
            try {
                java.util.Vector results = new java.util.Vector();
                java.util.Vector ids = new java.util.Vector();
                java.util.StringTokenizer st = new java.util.StringTokenizer((String) searchCriteria, ",");
                while (st.hasMoreTokens()) {
                    String nextKeyword = st.nextToken().trim();
                    lSearchCriteria = new SearchCriteria();
                    lSearchCriteria.setKeywords(nextKeyword);
                    lSearchCriteria.setMaxReturns("10");
                    lSearchCriteria.setSearchOperation(SearchCriteria.FIND_OBJECTS);
                    lSearchCriteria.setResults(0);
                    osid.dr.AssetIterator ai = FedoraSoapFactory.search(this, lSearchCriteria);
                    while (ai.hasNext()) {
                        osid.dr.Asset asset = ai.next();
                        String idString = asset.getId().getIdString();
                        if (ids.indexOf(idString) == -1) {
                            results.addElement(asset);
                            ids.addElement(idString);
                        }
                    }
                }
                return new AssetIterator(results);
            } catch (Throwable t) {
                throw new osid.dr.DigitalRepositoryException(osid.dr.DigitalRepositoryException.OPERATION_FAILED);
            }
        }
    }

    public osid.shared.Type getType() throws osid.dr.DigitalRepositoryException {
        throw new osid.dr.DigitalRepositoryException(osid.dr.DigitalRepositoryException.UNIMPLEMENTED);
    }

    public osid.dr.Asset getAssetByDate(osid.shared.Id id, java.util.Calendar calendar)
            throws osid.dr.DigitalRepositoryException {
        return getAsset(id, calendar);
    }

    public osid.dr.AssetIterator getAssetsBySearch(java.io.Serializable serializable, osid.shared.Type type)
            throws osid.dr.DigitalRepositoryException {
        return getAssets(serializable, type);
    }

    public osid.dr.AssetIterator getAssetsByType(osid.shared.Type type) throws osid.dr.DigitalRepositoryException {
        return null;
    }

    public osid.shared.Id ingest(String fileName, String templateFileName, String fileType, File file,
            Properties properties) throws osid.dr.DigitalRepositoryException, java.net.SocketException,
            java.io.IOException, osid.shared.SharedException, javax.xml.rpc.ServiceException {
        long sTime = System.currentTimeMillis();
        if (DEBUG)
            System.out
                    .println("INGESTING FILE TO FEDORA:fileName =" + fileName + "fileType =" + fileType + "t = 0");
        // this part transfers file to a ftp server.  this is required since the content management part of fedora server needs object to be on web server
        String host = FedoraUtils.getFedoraProperty(this, "admin.ftp.address");
        String url = FedoraUtils.getFedoraProperty(this, "admin.ftp.url");
        int port = Integer.parseInt(FedoraUtils.getFedoraProperty(this, "admin.ftp.port"));
        String userName = FedoraUtils.getFedoraProperty(this, "admin.ftp.username");
        String password = FedoraUtils.getFedoraProperty(this, "admin.ftp.password");
        String directory = FedoraUtils.getFedoraProperty(this, "admin.ftp.directory");
        FTPClient client = new FTPClient();
        client.connect(host, port);
        client.login(userName, password);
        client.changeWorkingDirectory(directory);
        client.setFileType(FTP.BINARY_FILE_TYPE);
        client.storeFile(fileName, new FileInputStream(file.getAbsolutePath().replaceAll("%20", " ")));
        client.logout();
        client.disconnect();
        if (DEBUG)
            System.out.println(
                    "INGESTING FILE TO FEDORA: Writting to FTP Server:" + (System.currentTimeMillis() - sTime));
        fileName = url + fileName;
        // this part does the creation of METSFile
        int BUFFER_SIZE = 10240;
        StringBuffer sb = new StringBuffer();
        String s = new String();
        BufferedInputStream fis = new BufferedInputStream(
                new FileInputStream(new File(getResource(templateFileName).getFile().replaceAll("%20", " "))));
        //FileInputStream fis = new FileInputStream(new File(templateFileName));
        //DataInputStream in = new DataInputStream(fis);
        byte[] buf = new byte[BUFFER_SIZE];
        int ch;
        int len;
        while ((len = fis.read(buf)) > 0) {
            s = s + new String(buf);
        }
        fis.close();
        if (DEBUG)
            System.out.println("INGESTING FILE TO FEDORA: Read Mets File:" + (System.currentTimeMillis() - sTime));

        //in.close();
        //  s = sb.toString();
        //String r =  s.replaceAll("%file.location%", fileName).trim();
        String r = updateMetadata(s, fileName, file.getName(), fileType, properties);
        if (DEBUG)
            System.out.println(
                    "INGESTING FILE TO FEDORA: Resplaced Metadata:" + (System.currentTimeMillis() - sTime));

        //writing the to outputfile
        File METSfile = File.createTempFile("vueMETSMap", ".xml");
        FileOutputStream fos = new FileOutputStream(METSfile);
        fos.write(r.getBytes());
        fos.close();

        //  AutoIngestor a = new AutoIngestor(address.getHost(), address.getPort(),FedoraUtils.getFedoraProperty(this,"admin.fedora.username"),FedoraUtils.getFedoraProperty(this,"admin.fedora.username"));
        //THIS WILL NOT WORK IN NEWER VERSION OF FEDORA
        // String pid =  AutoIngestor.ingestAndCommit(new FileInputStream(METSfile),"foxml1.","Test Ingest");
        if (DEBUG)
            System.out.println("INGESTING FILE TO FEDORA: Ingest complete:" + (System.currentTimeMillis() - sTime));
        String pid = "Method Not Supported any more";
        System.out.println(" METSfile= " + METSfile.getPath() + " PID = " + pid);
        return new PID(pid);
    }

    private String updateMetadata(String s, String fileLocation, String fileTitle, String fileType,
            Properties dcFields) {
        Calendar calendar = new GregorianCalendar();
        //String created = calendar.get(Calendar.YEAR)+"-"+calendar.get(Calendar.MONTH)+"-"+calendar.get(Calendar.DAY_OF_MONTH);
        //created += "T"+calendar.get(Calendar.HOUR)+":"+calendar.get(Calendar.MINUTE)+":"+calendar.get(Calendar.SECOND);
        java.text.SimpleDateFormat date = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        String created = date.format(calendar.getTime());
        String dcMetadata;
        s = s.replaceAll("%file.location%", fileLocation).trim();
        s = s.replaceAll("%file.title%", fileTitle);
        s = s.replaceAll("%file.type%", fileType);
        s = s.replaceAll("%file.created%", created);
        s = s.replaceAll("%dc.Metadata%", getMetadataString(dcFields));
        return s;

    }

    private java.net.URL getResource(String name) {
        java.net.URL url = null;
        java.io.File f = new java.io.File(name);
        if (f.exists()) {
            try {
                url = f.toURL();
            } catch (Exception e) {
                e.printStackTrace();
                f = null;
            }
        }
        if (url == null)
            url = getClass().getResource(name);
        System.out.println("DR.getResource(" + name + ") = " + url + " f=" + f);
        return url;
    }

    public static boolean isSupportedMetadataField(String field) {
        for (int i = 0; i < DC_FIELDS.length; i++) {
            if (DC_FIELDS[i].equalsIgnoreCase(field))
                return true;
        }
        return false;
    }

    public static String getMetadataString(Properties dcFields) {
        String metadata = "";
        Enumeration e = dcFields.keys();
        while (e.hasMoreElements()) {
            String field = (String) e.nextElement();
            if (isSupportedMetadataField(field))
                metadata += "<" + DC_NAMESPACE + field + ">" + dcFields.getProperty(field) + "</" + DC_NAMESPACE
                        + field + ">";
        }
        return metadata;
    }

    public String getAddress() {
        return this.address.getHost();
    }

    public void setAddress(String address) throws java.net.MalformedURLException {

        this.address = new URL("http", address, 8080, "fedora/");

    }

    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 Preferences getPrefernces() {
        return this.prefs;
    }

    public void setConf(Preferences prefs) {
        this.prefs = prefs;
    }
}