/* 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 org.fcrepo.server.access.defaultdisseminator;
import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;
import java.util.Date;
import org.fcrepo.common.Constants;
import org.fcrepo.server.Context;
import org.fcrepo.server.access.ObjectProfile;
import org.fcrepo.server.errors.ObjectIntegrityException;
import org.fcrepo.server.errors.ServerException;
import org.fcrepo.server.errors.StreamIOException;
import org.fcrepo.server.rest.DefaultSerializer;
import org.fcrepo.server.storage.DOReader;
import org.fcrepo.server.storage.types.Datastream;
import org.fcrepo.server.storage.types.ObjectMethodsDef;
import org.fcrepo.server.utilities.DCFields;
import org.fcrepo.server.utilities.StreamUtility;
import org.fcrepo.utilities.DateUtility;
import org.fcrepo.utilities.ReadableCharArrayWriter;
/**
* Provide an XML encoding of various object components.
*
* @author Sandy Payette
* @version $Id$
*/
public class ObjectInfoAsXML
implements Constants {
@SuppressWarnings("unused")
private final Context m_context;
public ObjectInfoAsXML(Context context) {
m_context = context;
}
public static String getObjectProfile(String reposBaseURL,
ObjectProfile objProfile,
Date versDateTime) throws ServerException {
ReadableCharArrayWriter buffer = new ReadableCharArrayWriter(1024);
getObjectProfile(reposBaseURL, objProfile, versDateTime, buffer);
return buffer.getString();
}
public static void getObjectProfile(String reposBaseURL,
ObjectProfile objProfile,
Date versDateTime, Writer out) throws ServerException {
// use REST serializer
try {
DefaultSerializer.objectProfileToXML(objProfile, versDateTime, out);
} catch (IOException e) {
throw new StreamIOException(e.getMessage(), e);
}
}
public static String getItemIndex(String reposBaseURL,
String applicationContext,
DOReader reader,
Date versDateTime) throws ServerException {
ReadableCharArrayWriter out = new ReadableCharArrayWriter(512);
getItemIndex(reposBaseURL, applicationContext, reader, versDateTime, out);
return out.getString();
}
public static void getItemIndex(String reposBaseURL,
String applicationContext,
DOReader reader,
Date versDateTime,
Writer out) throws ServerException {
try {
Datastream[] datastreams =
reader.GetDatastreams(versDateTime, null);
out.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<objectItemIndex PID=\"");
out.append(reader.GetObjectPID());
out.append('"');
if (versDateTime != null) {
out.append(" dateTime=\"");
out.append(DateUtility.convertDateToString(versDateTime));
out.append('"');
}
out.append(" xmlns:xsi=\"");
out.append(XSI.uri);
out.append("\" xsi:schemaLocation=\"");
out.append(ACCESS.uri);
out.append(' ');
out.append(OBJ_ITEMS1_0.xsdLocation);
out.append("\">");
for (Datastream element : datastreams) {
out.append("<item>\n<itemId>");
StreamUtility.enc(element.DatastreamID, out);
out.append("</itemId>\n");
String label = element.DSLabel;
out.append("<itemLabel>");
StreamUtility.enc(label, out);
out.append("</itemLabel>\n");
String itemDissURL =
getItemDissURL(reposBaseURL,
applicationContext,
reader.GetObjectPID(),
element.DatastreamID,
versDateTime);
out.append("<itemURL>");
StreamUtility.enc(itemDissURL, out);
out.append("</itemURL>\n<itemMIMEType>");
StreamUtility.enc(element.DSMIME, out);
out.append("</itemMIMEType>\n</item>\n");
}
out.append("</objectItemIndex>");
} catch (Exception e) {
e.printStackTrace();
throw new ObjectIntegrityException(e.getMessage());
}
}
public static String getMethodIndex(String reposBaseURL,
String PID,
ObjectMethodsDef[] methods,
Date versDateTime) throws ServerException {
ReadableCharArrayWriter buffer =
new ReadableCharArrayWriter(1024);
getMethodIndex(reposBaseURL, PID, methods, versDateTime, buffer);
return buffer.getString();
}
public static void getMethodIndex(String reposBaseURL,
String PID,
ObjectMethodsDef[] methods,
Date versDateTime,
Writer buffer) throws ServerException {
// use REST serializer
try {
DefaultSerializer.objectMethodsToXml(reposBaseURL, methods, PID, null, versDateTime, buffer);
} catch (IOException e) {
throw new StreamIOException(e.getMessage(), e);
}
}
public static String getOAIDublinCore(Datastream dublinCore)
throws ServerException {
DCFields dc;
if (dublinCore == null) {
dc = new DCFields();
} else {
InputStream in = dublinCore.getContentStream();
dc = new DCFields(in);
}
return dc.getAsXML();
}
public static void getOAIDublinCore(Datastream dublinCore, Writer out)
throws ServerException {
DCFields dc;
if (dublinCore == null) {
dc = new DCFields();
} else {
InputStream in = dublinCore.getContentStream();
dc = new DCFields(in);
}
try {
dc.getAsXML(out);
} catch (IOException e) {
throw new StreamIOException(e.getMessage(), e);
}
}
private static String getItemDissURL(String reposBaseURL,
String applicationContext,
String PID,
String datastreamID,
Date versDateTime) {
String itemDissURL = null;
if (versDateTime == null) {
itemDissURL =
reposBaseURL + "/" + applicationContext + "/get/" + PID + "/" + datastreamID;
} else {
itemDissURL =
reposBaseURL + "/" + applicationContext + "/get/" + PID + "/" + datastreamID
+ "/"
+ DateUtility.convertDateToString(versDateTime);
}
return itemDissURL;
}
}