/* 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.access.defaultdisseminator;
import java.io.InputStream;
import java.util.Date;
import fedora.common.Constants;
import fedora.server.access.ObjectProfile;
import fedora.server.errors.ObjectIntegrityException;
import fedora.server.errors.ServerException;
import fedora.server.storage.DOReader;
import fedora.server.storage.types.Datastream;
import fedora.server.storage.types.DatastreamXMLMetadata;
import fedora.server.storage.types.MethodParmDef;
import fedora.server.storage.types.ObjectMethodsDef;
import fedora.server.utilities.DCFields;
import fedora.server.utilities.DateUtility;
import fedora.server.utilities.StreamUtility;
/**
* Provide an XML encoding of various object components.
*
* @author Sandy Payette
* @version $Id$
*/
public class ObjectInfoAsXML
implements Constants {
public ObjectInfoAsXML() {
}
public String getObjectProfile(String reposBaseURL,
ObjectProfile objProfile,
Date versDateTime) throws ServerException {
StringBuffer out = new StringBuffer();
out.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
out.append("<objectProfile");
out.append(" pid=\"" + objProfile.PID + "\"");
if (versDateTime != null) {
out.append(" dateTime=\"");
out.append(DateUtility.convertDateToString(versDateTime));
out.append("\"");
}
out.append(" xmlns:xsi=\"" + XSI.uri + "\"");
out.append(" xsi:schemaLocation=\"" + ACCESS.uri + " ");
out.append(OBJ_PROFILE1_0.xsdLocation + "\">");
// PROFILE FIELDS SERIALIZATION
out.append("<objLabel>" + StreamUtility.enc(objProfile.objectLabel)
+ "</objLabel>");
String cDate =
DateUtility.convertDateToString(objProfile.objectCreateDate);
out.append("<objCreateDate>" + cDate + "</objCreateDate>");
String mDate =
DateUtility.convertDateToString(objProfile.objectLastModDate);
out.append("<objLastModDate>" + mDate + "</objLastModDate>");
out.append("<objDissIndexViewURL>"
+ StreamUtility.enc(objProfile.dissIndexViewURL)
+ "</objDissIndexViewURL>");
out.append("<objItemIndexViewURL>"
+ StreamUtility.enc(objProfile.itemIndexViewURL)
+ "</objItemIndexViewURL>");
out.append("</objectProfile>");
return out.toString();
}
public String getItemIndex(String reposBaseURL,
String applicationContext,
DOReader reader,
Date versDateTime) throws ServerException {
try {
Datastream[] datastreams =
reader.GetDatastreams(versDateTime, null);
StringBuffer out = new StringBuffer();
out.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
out.append("<objectItemIndex");
out.append(" PID=\"" + reader.GetObjectPID() + "\"");
if (versDateTime != null) {
out.append(" dateTime=\"");
out.append(DateUtility.convertDateToString(versDateTime));
out.append("\"");
}
out.append(" xmlns:xsi=\"" + XSI.uri + "\"");
out.append(" xsi:schemaLocation=\"" + ACCESS.uri + " ");
out.append(OBJ_ITEMS1_0.xsdLocation + "\">");
for (Datastream element : datastreams) {
out.append("<item>\n");
out.append("<itemId>" + StreamUtility.enc(element.DatastreamID)
+ "</itemId>\n");
String label = element.DSLabel;
if (label == null) {
label = "";
}
out.append("<itemLabel>" + StreamUtility.enc(label)
+ "</itemLabel>\n");
String itemDissURL =
getItemDissURL(reposBaseURL,
applicationContext,
reader.GetObjectPID(),
element.DatastreamID,
versDateTime);
out.append("<itemURL>" + StreamUtility.enc(itemDissURL)
+ "</itemURL>\n");
out.append("<itemMIMEType>" + StreamUtility.enc(element.DSMIME)
+ "</itemMIMEType>\n");
out.append("</item>\n");
}
out.append("</objectItemIndex>");
return out.toString();
} catch (Exception e) {
e.printStackTrace();
throw new ObjectIntegrityException(e.getMessage());
}
}
public String getMethodIndex(String reposBaseURL,
String PID,
ObjectMethodsDef[] methods,
Date versDateTime) throws ServerException {
StringBuffer out = new StringBuffer();
out.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
out.append("<objectMethods");
out.append(" pid=\"" + PID + "\"");
if (versDateTime != null) {
out.append(" dateTime=\"");
out.append(DateUtility.convertDateToString(versDateTime));
out.append("\"");
}
out.append(" xmlns:xsi=\"" + XSI.uri + "\"");
out.append(" xsi:schemaLocation=\"" + ACCESS.uri + " ");
out.append(OBJ_METHODS1_0.xsdLocation + "\">");
String nextSdef = "null";
String currentSdef = "";
for (int i = 0; i < methods.length; i++) {
currentSdef = methods[i].sDefPID;
if (!currentSdef.equalsIgnoreCase(nextSdef)) {
if (i != 0) {
out.append("</sdef>");
}
out.append("<sdef pid=\""
+ StreamUtility.enc(methods[i].sDefPID) + "\" >");
}
String versDate =
DateUtility.convertDateToString(methods[i].asOfDate);
out.append("<method name=\""
+ StreamUtility.enc(methods[i].methodName)
+ "\" asOfDateTime=\"" + versDate + "\" >");
MethodParmDef[] methodParms = methods[i].methodParmDefs;
for (MethodParmDef element : methodParms) {
out.append("<parm parmName=\""
+ StreamUtility.enc(element.parmName)
+ "\" parmDefaultValue=\""
+ StreamUtility.enc(element.parmDefaultValue)
+ "\" parmRequired=\"" + element.parmRequired
+ "\" parmType=\""
+ StreamUtility.enc(element.parmType)
+ "\" parmLabel=\""
+ StreamUtility.enc(element.parmLabel) + "\" >");
if (element.parmDomainValues.length > 0) {
out.append("<parmDomainValues>");
for (String element2 : element.parmDomainValues) {
out.append("<value>" + StreamUtility.enc(element2)
+ "</value>");
}
out.append("</parmDomainValues>");
}
out.append("</parm>");
}
out.append("</method>");
nextSdef = currentSdef;
}
out.append("</sdef>");
out.append("</objectMethods>");
return out.toString();
}
public String getOAIDublinCore(DatastreamXMLMetadata dublinCore)
throws ServerException {
DCFields dc;
if (dublinCore == null) {
dc = new DCFields();
} else {
InputStream in = dublinCore.getContentStream();
dc = new DCFields(in);
}
return dc.getAsXML();
}
private 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;
}
}