/* The contents of this file are subject to the license and copyright terms
* detailed in the license directory at the root of the source tree (also
* available online at http://fedora-commons.org/license/).
*/
package fedora.server.storage.types;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import com.sun.org.apache.xml.internal.serialize.OutputFormat;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
/**
* @author Sandy Payette
*/
public class DatastreamXMLMetadata
extends Datastream {
// techMD (technical metadata),
// sourceMD (analog/digital source metadata),
// rightsMD (intellectual property rights metadata),
// digiprovMD (digital provenance metadata).
// dmdSec (descriptive metadata).
/** Technical XML metadata */
public final static int TECHNICAL = 1;
/** Source XML metatdata */
public final static int SOURCE = 2;
/** Rights XML metatdata */
public final static int RIGHTS = 3;
/** Digital provenance XML metadata */
public final static int DIGIPROV = 4;
/** Descriptive XML metadata */
public final static int DESCRIPTIVE = 5;
// FIXME:xml datastream contents are held in memory...this could be expensive.
public byte[] xmlContent;
/**
* The class of XML metadata (TECHNICAL, SOURCE, RIGHTS, DIGIPROV, or
* DESCRIPTIVE)
*/
public int DSMDClass = 0;
private final String m_encoding;
public DatastreamXMLMetadata() {
m_encoding = "UTF-8";
}
public DatastreamXMLMetadata(String encoding) {
m_encoding = encoding;
}
@Override
public Datastream copy() {
DatastreamXMLMetadata ds = new DatastreamXMLMetadata(m_encoding);
copy(ds);
if (xmlContent != null) {
ds.xmlContent = new byte[xmlContent.length];
for (int i = 0; i < xmlContent.length; i++) {
ds.xmlContent[i] = xmlContent[i];
}
}
ds.DSMDClass = DSMDClass;
return ds;
}
@Override
public InputStream getContentStream() {
return new ByteArrayInputStream(xmlContent);
}
@Override
public InputStream getContentStreamForChecksum() {
BufferedReader br;
try {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
OutputFormat fmt = new OutputFormat("XML", "UTF-8", false);
fmt.setIndent(0);
fmt.setLineWidth(0);
fmt.setPreserveSpace(false);
XMLSerializer ser = new XMLSerializer(outStream, fmt);
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new ByteArrayInputStream(xmlContent));
ser.serialize(doc);
br =
new BufferedReader(new InputStreamReader(new ByteArrayInputStream(outStream
.toByteArray()),
m_encoding));
String line;
StringBuffer buf = new StringBuffer();
while ((line = br.readLine()) != null) {
line = line.trim();
buf = buf.append(line);
}
String bufStr = buf.toString();
return new ByteArrayInputStream(bufStr.getBytes(m_encoding));
} catch (UnsupportedEncodingException e) {
return getContentStream();
} catch (IOException e) {
return getContentStream();
} catch (ParserConfigurationException e) {
return getContentStream();
} catch (SAXException e) {
return getContentStream();
}
}
public InputStream getContentStreamAsDocument()
throws UnsupportedEncodingException {
// *with* the <?xml version="1.0" encoding="m_encoding" ?> line
String firstLine =
"<?xml version=\"1.0\" encoding=\"" + m_encoding + "\" ?>\n";
byte[] firstLineBytes = firstLine.getBytes(m_encoding);
byte[] out = new byte[xmlContent.length + firstLineBytes.length];
for (int i = 0; i < firstLineBytes.length; i++) {
out[i] = firstLineBytes[i];
}
for (int i = firstLineBytes.length; i < firstLineBytes.length
+ xmlContent.length; i++) {
out[i] = xmlContent[i - firstLineBytes.length];
}
return new ByteArrayInputStream(out);
}
}