org.dspace.app.oai.DIDLCrosswalk.java Source code

Java tutorial

Introduction

Here is the source code for org.dspace.app.oai.DIDLCrosswalk.java

Source

/**
 * The contents of this file are subject to the license and copyright
 * detailed in the LICENSE and NOTICE files at the root of the source
 * tree and available online at
 *
 * http://www.dspace.org/license/
 */
package org.dspace.app.oai;

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Date;
import java.util.Properties;

import org.apache.commons.codec.binary.Base64;
import org.apache.log4j.Logger;
import org.dspace.app.didl.UUIDFactory;
import org.dspace.content.Bitstream;
import org.dspace.content.Bundle;
import org.dspace.content.Item;
import org.dspace.core.ConfigurationManager;
import org.dspace.core.Context;
import org.dspace.search.HarvestedItemInfo;
import org.dspace.storage.bitstore.BitstreamStorageManager;

import ORG.oclc.oai.server.crosswalk.Crosswalk;
import ORG.oclc.oai.server.verb.CannotDisseminateFormatException;
import ORG.oclc.oai.server.verb.ServerVerb;

/**
 * DSpace Item DIDL crosswalk.
 * 
 * Development of this code was part of the aDORe repository project 
 * by the Research Library of the Los Alamos National Laboratory.
 * 
 * @author Henry Jerez
 * @author Los Alamos National Laboratory
 */

public class DIDLCrosswalk extends Crosswalk {
    private static final Logger log = Logger.getLogger(DIDLCrosswalk.class);

    /** default value if no oai.didl.maxresponse property is defined */
    public static final int MAXRESPONSE_INLINE_BITSTREAM = 0;

    /** another crosswalk that will be used to generate the metadata section */
    private Crosswalk metadataCrosswalk;

    public DIDLCrosswalk(Properties properties) {
        super("urn:mpeg:mpeg21:2002:02-DIDL-NS http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-21_schema_files/did/didl.xsd ");

        // FIXME this should be injected from the configuration... 
        // but it is better than duplicate the OAIDCCrosswalk code! 
        metadataCrosswalk = new OAIDCCrosswalk(properties);
    }

    public boolean isAvailableFor(Object nativeItem) {
        // We have DC for everything
        return true;
    }

    public String createMetadata(Object nativeItem) throws CannotDisseminateFormatException {
        Item item = ((HarvestedItemInfo) nativeItem).item;

        StringBuffer metadata = new StringBuffer();
        String itemhandle = item.getHandle();
        String strMaxSize = ConfigurationManager.getProperty("oai", "didl.maxresponse");
        int maxsize = MAXRESPONSE_INLINE_BITSTREAM;
        if (strMaxSize != null) {
            maxsize = Integer.parseInt(strMaxSize);
        }

        String currdate = ServerVerb.createResponseDate(new Date());

        metadata.append("<didl:DIDL ").append(" xmlns:didl=\"urn:mpeg:mpeg21:2002:02-DIDL-NS\"  ")
                .append(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ")
                .append("xsi:schemaLocation=\"urn:mpeg:mpeg21:2002:02-DIDL-NS http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-21_schema_files/did/didl.xsd \">")
                .append("<didl:DIDLInfo>")
                .append("<dcterms:created xmlns:dcterms=\"http://purl.org/dc/terms/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://purl.org/dc/terms/ \">")
                .append(currdate).append("</dcterms:created> </didl:DIDLInfo>").append("<didl:Item id=\"")
                .append("uuid-" + UUIDFactory.generateUUID().toString() + "\">");
        metadata.append("<didl:Descriptor>").append("<didl:Statement mimeType=\"application/xml; charset=utf-8\">")
                .append("<dii:Identifier xmlns:dii=\"urn:mpeg:mpeg21:2002:01-DII-NS\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"urn:mpeg:mpeg21:2002:01-DII-NS http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-21_schema_files/dii/dii.xsd\">")
                .append("urn:hdl:").append(itemhandle).append("</dii:Identifier>").append("</didl:Statement>")
                .append("</didl:Descriptor>");
        metadata.append("<didl:Descriptor>").append("<didl:Statement mimeType=\"application/xml; charset=utf-8\">");

        // delegate the metadata section to another crosswalk
        metadata.append(metadataCrosswalk.createMetadata(nativeItem));

        metadata.append("</didl:Statement>").append("</didl:Descriptor>");

        /**putfirst item here**/

        //**CYCLE HERE!!!!**//

        try {
            Bundle[] bundles = item.getBundles("ORIGINAL");

            if (bundles.length != 0) {
                /**cycle bundles**/
                for (int i = 0; i < bundles.length; i++) {
                    int flag = 0;
                    Bitstream[] bitstreams = bundles[i].getBitstreams();

                    /**cycle bitstreams**/
                    for (int k = 0; k < bitstreams.length; k++) {
                        // Skip internal types
                        if (!bitstreams[k].getFormat().isInternal()) {
                            if (flag == 0) {
                                flag = 1;
                            }

                            metadata.append("<didl:Component id=" + "\"uuid-"
                                    + UUIDFactory.generateUUID().toString() + "\">");

                            if (bitstreams[k].getSize() > maxsize) {
                                metadata.append(
                                        "<didl:Resource ref=\"" + ConfigurationManager.getProperty("dspace.url")
                                                + "/bitstream/" + itemhandle + "/" + bitstreams[k].getSequenceID()
                                                + "/" + bitstreams[k].getName());
                                metadata.append("\" mimeType=\"");
                                metadata.append(bitstreams[k].getFormat().getMIMEType());
                                metadata.append("\">");
                                metadata.append("</didl:Resource>");
                            } else {
                                try {
                                    metadata.append("<didl:Resource mimeType=\"");
                                    metadata.append(bitstreams[k].getFormat().getMIMEType());
                                    metadata.append("\" encoding=\"base64\">");

                                    /*
                                     * Assume that size of in-line bitstreams will always be
                                     * smaller than MAXINT bytes
                                     */
                                    int intSize = (int) bitstreams[k].getSize();

                                    byte[] buffer = new byte[intSize];

                                    Context contextl = new Context();
                                    InputStream is = BitstreamStorageManager.retrieve(contextl,
                                            bitstreams[k].getID());
                                    BufferedInputStream bis = new BufferedInputStream(is);
                                    try {
                                        bis.read(buffer);
                                    } finally {
                                        if (bis != null) {
                                            try {
                                                bis.close();
                                            } catch (IOException ioe) {
                                            }
                                        }

                                        if (is != null) {
                                            try {
                                                is.close();
                                            } catch (IOException ioe) {
                                            }
                                        }
                                    }

                                    contextl.complete();

                                    String encoding = new String(Base64.encodeBase64(buffer), "ASCII");
                                    metadata.append(encoding);
                                } catch (Exception ex) {
                                    log.error("Error creating resource didl", ex);

                                    metadata.append("<didl:Resource ref=\"")
                                            .append(ConfigurationManager.getProperty("dspace.url"))
                                            .append("/bitstream/").append(itemhandle).append("/")
                                            .append(bitstreams[k].getSequenceID()).append("/")
                                            .append(bitstreams[k].getName());
                                    metadata.append("\" mimeType=\"");
                                    metadata.append(bitstreams[k].getFormat().getMIMEType());
                                    metadata.append("\">");
                                }

                                metadata.append("</didl:Resource>");
                            }
                            metadata.append("</didl:Component>");
                        }
                        /*end bitstream cycle*/
                    }
                    /*end bundle cycle*/
                }
            }
        } catch (SQLException sqle) {
            System.err.println("Caught exception:" + sqle.getCause());
            log.error("Database error", sqle);
        }

        //**END CYCLE HERE **//      

        metadata.append("</didl:Item>").append("</didl:DIDL>");

        return metadata.toString();
    }
}