/** * 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.xoai.util; import com.lyncode.xoai.dataprovider.xml.xoai.Element; import com.lyncode.xoai.dataprovider.xml.xoai.Metadata; import com.lyncode.xoai.util.Base64Utils; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; import org.dspace.content.Metadatum; import org.dspace.content.Item; import org.dspace.content.authority.Choices; import org.dspace.core.ConfigurationManager; import org.dspace.core.Constants; import org.dspace.core.Utils; import org.dspace.xoai.data.DSpaceItem; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.sql.SQLException; import java.util.List; /** * * @author Lyncode Development Team <dspace@lyncode.com> */ @SuppressWarnings("deprecation") public class ItemUtils { private static Logger log = LogManager .getLogger(ItemUtils.class); private static Element getElement(List<Element> list, String name) { for (Element e : list) if (name.equals(e.getName())) return e; return null; } private static Element create(String name) { Element e = new Element(); e.setName(name); return e; } private static Element.Field createValue( String name, String value) { Element.Field e = new Element.Field(); e.setValue(value); e.setName(name); return e; } public static Metadata retrieveMetadata (Item item) { Metadata metadata; //DSpaceDatabaseItem dspaceItem = new DSpaceDatabaseItem(item); // read all metadata into Metadata Object metadata = new Metadata(); Metadatum[] vals = item.getMetadata(Item.ANY, Item.ANY, Item.ANY, Item.ANY); for (Metadatum val : vals) { Element valueElem = null; Element schema = getElement(metadata.getElement(), val.schema); if (schema == null) { schema = create(val.schema); metadata.getElement().add(schema); } valueElem = schema; // Has element.. with XOAI one could have only schema and value if (val.element != null && !val.element.equals("")) { Element element = getElement(schema.getElement(), val.element); if (element == null) { element = create(val.element); schema.getElement().add(element); } valueElem = element; // Qualified element? if (val.qualifier != null && !val.qualifier.equals("")) { Element qualifier = getElement(element.getElement(), val.qualifier); if (qualifier == null) { qualifier = create(val.qualifier); element.getElement().add(qualifier); } valueElem = qualifier; } } // Language? if (val.language != null && !val.language.equals("")) { Element language = getElement(valueElem.getElement(), val.language); if (language == null) { language = create(val.language); valueElem.getElement().add(language); } valueElem = language; } else { Element language = getElement(valueElem.getElement(), "none"); if (language == null) { language = create("none"); valueElem.getElement().add(language); } valueElem = language; } valueElem.getField().add(createValue("value", val.value)); if (val.authority != null) { valueElem.getField().add(createValue("authority", val.authority)); if (val.confidence != Choices.CF_NOVALUE) valueElem.getField().add(createValue("confidence", val.confidence + "")); } } // Done! Metadata has been read! // Now adding bitstream info Element bundles = create("bundles"); metadata.getElement().add(bundles); Bundle[] bs; try { bs = item.getBundles(); for (Bundle b : bs) { Element bundle = create("bundle"); bundles.getElement().add(bundle); bundle.getField() .add(createValue("name", b.getName())); Element bitstreams = create("bitstreams"); bundle.getElement().add(bitstreams); Bitstream[] bits = b.getBitstreams(); for (Bitstream bit : bits) { Element bitstream = create("bitstream"); bitstreams.getElement().add(bitstream); String url = ""; String bsName = bit.getName(); String sid = String.valueOf(bit.getSequenceID()); String baseUrl = ConfigurationManager.getProperty("oai", "bitstream.baseUrl"); String handle = null; // get handle of parent Item of this bitstream, if there // is one: Bundle[] bn = bit.getBundles(); if (bn.length > 0) { Item bi[] = bn[0].getItems(); if (bi.length > 0) { handle = bi[0].getHandle(); } } if (bsName == null) { String ext[] = bit.getFormat().getExtensions(); bsName = "bitstream_" + sid + (ext.length > 0 ? ext[0] : ""); } if (handle != null && baseUrl != null) { url = baseUrl + "/bitstream/" + handle + "/" + sid + "/" + URLUtils.encode(bsName); } else { url = URLUtils.encode(bsName); } String cks = bit.getChecksum(); String cka = bit.getChecksumAlgorithm(); String oname = bit.getSource(); String name = bit.getName(); String description = bit.getDescription(); if (name != null) bitstream.getField().add( createValue("name", name)); if (oname != null) bitstream.getField().add( createValue("originalName", name)); if (description != null) bitstream.getField().add( createValue("description", description)); bitstream.getField().add( createValue("format", bit.getFormat() .getMIMEType())); bitstream.getField().add( createValue("size", "" + bit.getSize())); bitstream.getField().add(createValue("url", url)); bitstream.getField().add( createValue("checksum", cks)); bitstream.getField().add( createValue("checksumAlgorithm", cka)); bitstream.getField().add( createValue("sid", bit.getSequenceID() + "")); } } } catch (SQLException e1) { e1.printStackTrace(); } // Other info Element other = create("others"); other.getField().add( createValue("handle", item.getHandle())); other.getField().add( createValue("identifier", DSpaceItem.buildIdentifier(item.getHandle()))); other.getField().add( createValue("lastModifyDate", item .getLastModified().toString())); metadata.getElement().add(other); // Repository Info Element repository = create("repository"); repository.getField().add( createValue("name", ConfigurationManager.getProperty("dspace.name"))); repository.getField().add( createValue("mail", ConfigurationManager.getProperty("mail.admin"))); metadata.getElement().add(repository); // Licensing info Element license = create("license"); Bundle[] licBundles; try { licBundles = item.getBundles(Constants.LICENSE_BUNDLE_NAME); if (licBundles.length > 0) { Bundle licBundle = licBundles[0]; Bitstream[] licBits = licBundle.getBitstreams(); if (licBits.length > 0) { Bitstream licBit = licBits[0]; InputStream in; try { in = licBit.retrieve(); ByteArrayOutputStream out = new ByteArrayOutputStream(); Utils.bufferedCopy(in, out); license.getField().add( createValue("bin", Base64Utils.encode(out.toString()))); metadata.getElement().add(license); } catch (AuthorizeException e) { log.warn(e.getMessage(), e); } catch (IOException e) { log.warn(e.getMessage(), e); } catch (SQLException e) { log.warn(e.getMessage(), e); } } } } catch (SQLException e1) { log.warn(e1.getMessage(), e1); } return metadata; } }