/* 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.utilities;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import javax.activation.DataHandler;
import javax.mail.util.ByteArrayDataSource;
import org.apache.cxf.jaxrs.ext.multipart.InputStreamDataSource;
import org.fcrepo.server.search.Condition;
import org.fcrepo.server.types.gen.ArrayOfString;
import org.fcrepo.utilities.DateUtility;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* A utility class for converting back and forth from the internal Fedora type
* classes in org.fcrepo.server.storage.types and the generated type classes
* produced by the wsdl2java emitter in org.fcrepo.server.types.gen.gen.
*
* @author Ross Wayland
*/
public abstract class TypeUtility {
private static final Logger logger = LoggerFactory
.getLogger(TypeUtility.class);
private static final String EMPTY_STRING = "";
private static final int INITIAL_SIZE = 1024 * 1024;
private static final int BUFFER_SIZE = 1024;
public static org.fcrepo.server.types.gen.Datastream convertDatastreamToGenDatastream(org.fcrepo.server.storage.types.Datastream in) {
if (in == null) {
return null;
}
org.fcrepo.server.types.gen.Datastream out =
new org.fcrepo.server.types.gen.Datastream();
String group = in.DSControlGrp;
out.setControlGroup(org.fcrepo.server.types.gen.DatastreamControlGroup
.fromValue(group));
if ("R".equals(group) || "E".equals(group)) {
// only given location if it's a redirect or external datastream
out.setLocation(in.DSLocation);
}
out.setCreateDate(DateUtility.convertDateToString(in.DSCreateDT));
out.setID(in.DatastreamID);
org.fcrepo.server.types.gen.ArrayOfString altIDs =
new org.fcrepo.server.types.gen.ArrayOfString();
if (in.DatastreamAltIDs != null)
altIDs.getItem().addAll(Arrays.asList(in.DatastreamAltIDs));
out.setAltIDs(altIDs);
out.setLabel(in.DSLabel);
out.setVersionable(in.DSVersionable);
out.setMIMEType(in.DSMIME);
out.setFormatURI(in.DSFormatURI);
out.setSize(in.DSSize);
out.setState(in.DSState);
out.setVersionID(in.DSVersionID);
out.setChecksum(in.DSChecksum);
out.setChecksumType(in.DSChecksumType);
return out;
}
public static org.fcrepo.server.types.gen.FieldSearchResult convertFieldSearchResultToGenFieldSearchResult(org.fcrepo.server.search.FieldSearchResult result) {
if (result == null) {
return null;
}
org.fcrepo.server.types.gen.FieldSearchResult ret =
new org.fcrepo.server.types.gen.FieldSearchResult();
ret.setResultList(convertSearchObjectFieldsListToGenObjectFieldsArray(result
.objectFieldsList()));
if (result.getToken() != null) {
org.fcrepo.server.types.gen.ListSession sess =
new org.fcrepo.server.types.gen.ListSession();
org.fcrepo.server.types.gen.ObjectFactory factory =
new org.fcrepo.server.types.gen.ObjectFactory();
sess.setToken(result.getToken());
if (result.getCursor() > -1) {
sess.setCursor(new BigInteger("" + result.getCursor()));
}
if (result.getCompleteListSize() > -1) {
sess.setCompleteListSize(new BigInteger(""
+ result.getCompleteListSize()));
}
if (result.getExpirationDate() != null) {
sess.setExpirationDate(factory.createListSessionExpirationDate(DateUtility
.convertDateToString(result.getExpirationDate())));
}
ret.setListSession(factory.createFieldSearchResultListSession(sess));
}
return ret;
}
public static org.fcrepo.server.search.FieldSearchQuery convertGenFieldSearchQueryToFieldSearchQuery(org.fcrepo.server.types.gen.FieldSearchQuery gen)
throws org.fcrepo.server.errors.InvalidOperatorException,
org.fcrepo.server.errors.QueryParseException {
if (gen == null) {
return null;
}
if (gen.getTerms() != null) {
return new org.fcrepo.server.search.FieldSearchQuery(gen.getTerms()
.getValue());
} else if (gen.getConditions() != null) {
return new org.fcrepo.server.search.FieldSearchQuery(convertGenConditionArrayToSearchConditionList(gen
.getConditions().getValue()));
} else {
return new org.fcrepo.server.search.FieldSearchQuery(EMPTY_STRING);
}
}
public static List<Condition> convertGenConditionArrayToSearchConditionList(org.fcrepo.server.types.gen.FieldSearchQuery.Conditions genConditions)
throws org.fcrepo.server.errors.InvalidOperatorException,
org.fcrepo.server.errors.QueryParseException {
if (genConditions == null) {
return null;
}
ArrayList<Condition> list = new ArrayList<Condition>();
if (genConditions != null && genConditions.getCondition() != null) {
for (org.fcrepo.server.types.gen.Condition c : genConditions
.getCondition()) {
list.add(new org.fcrepo.server.search.Condition(c.getProperty(),
c.getOperator() != null ? c
.getOperator()
.value()
: null,
c.getValue()));
}
}
return list;
}
private static org.fcrepo.server.types.gen.FieldSearchResult.ResultList convertSearchObjectFieldsListToGenObjectFieldsArray(List<org.fcrepo.server.search.ObjectFields> sfList) {
if (sfList == null) {
return null;
}
org.fcrepo.server.types.gen.FieldSearchResult.ResultList genFields =
new org.fcrepo.server.types.gen.FieldSearchResult.ResultList();
for (int i = 0; i < sfList.size(); i++) {
org.fcrepo.server.types.gen.ObjectFields gf =
new org.fcrepo.server.types.gen.ObjectFields();
org.fcrepo.server.search.ObjectFields sf = sfList.get(i);
org.fcrepo.server.types.gen.ObjectFactory factory =
new org.fcrepo.server.types.gen.ObjectFactory();
// Repository key fields
if (sf.getPid() != null) {
gf.setPid(factory.createObjectFieldsPid(sf.getPid()));
}
if (sf.getLabel() != null) {
gf.setLabel(factory.createObjectFieldsLabel(sf.getLabel()));
}
if (sf.getState() != null) {
gf.setState(factory.createObjectFieldsState(sf.getState()));
}
if (sf.getOwnerId() != null) {
gf.setOwnerId(factory.createObjectFieldsOwnerId(sf.getOwnerId()));
}
if (sf.getCDate() != null) {
gf.setCDate(factory.createObjectFieldsCDate(DateUtility
.convertDateToString(sf.getCDate())));
}
if (sf.getMDate() != null) {
gf.setMDate(factory.createObjectFieldsMDate(DateUtility
.convertDateToString(sf.getMDate())));
}
if (sf.getDCMDate() != null) {
gf.setDcmDate(factory.createObjectFieldsDcmDate(DateUtility
.convertDateToString(sf.getDCMDate())));
}
// Dublin core fields
if (sf.titles().size() != 0) {
gf.getTitle().addAll(toStringList(sf.titles()));
}
if (sf.creators().size() != 0) {
gf.getCreator().addAll(toStringList(sf.creators()));
}
if (sf.subjects().size() != 0) {
gf.getSubject().addAll(toStringList(sf.subjects()));
}
if (sf.descriptions().size() != 0) {
gf.getDescription().addAll(toStringList(sf.descriptions()));
}
if (sf.publishers().size() != 0) {
gf.getPublisher().addAll(toStringList(sf.publishers()));
}
if (sf.contributors().size() != 0) {
gf.getContributor().addAll(toStringList(sf.contributors()));
}
if (sf.dates().size() != 0) {
gf.getDate().addAll(toStringList(sf.dates()));
}
if (sf.types().size() != 0) {
gf.getType().addAll(toStringList(sf.types()));
}
if (sf.formats().size() != 0) {
gf.getFormat().addAll(toStringList(sf.formats()));
}
if (sf.identifiers().size() != 0) {
gf.getIdentifier().addAll(toStringList(sf.identifiers()));
}
if (sf.sources().size() != 0) {
gf.getSource().addAll(toStringList(sf.sources()));
}
if (sf.languages().size() != 0) {
gf.getLanguage().addAll(toStringList(sf.languages()));
}
if (sf.relations().size() != 0) {
gf.getRelation().addAll(toStringList(sf.relations()));
}
if (sf.coverages().size() != 0) {
gf.getCoverage().addAll(toStringList(sf.coverages()));
}
if (sf.rights().size() != 0) {
gf.getRights().addAll(toStringList(sf.rights()));
}
genFields.getObjectFields().add(gf);
}
return genFields;
}
public static String[] toStringArray(List<DCField> l) {
if (l == null) {
return null;
}
String[] ret = new String[l.size()];
for (int i = 0; i < l.size(); i++) {
ret[i] = l.get(i) != null ? l.get(i).getValue() : null;
}
return ret;
}
private static List<String> toStringList(List<DCField> dcFields) {
if (dcFields == null) {
return null;
}
List<String> ret = new ArrayList<String>(dcFields.size());
for (DCField dcField : dcFields) {
ret.add(dcField != null ? dcField.getValue() : null);
}
return ret;
}
public static org.fcrepo.server.types.gen.MethodParmDef convertMethodParmDefToGenMethodParmDef(org.fcrepo.server.storage.types.MethodParmDef methodParmDef) {
if (methodParmDef != null) {
org.fcrepo.server.types.gen.MethodParmDef genMethodParmDef =
new org.fcrepo.server.types.gen.MethodParmDef();
genMethodParmDef.setParmName(methodParmDef.parmName);
genMethodParmDef.setParmLabel(methodParmDef.parmLabel);
genMethodParmDef
.setParmDefaultValue(methodParmDef.parmDefaultValue);
org.fcrepo.server.types.gen.ArrayOfString parmDomainVals =
new org.fcrepo.server.types.gen.ArrayOfString();
if (methodParmDef.parmDomainValues != null)
parmDomainVals.getItem()
.addAll(Arrays.asList(methodParmDef.parmDomainValues));
genMethodParmDef.setParmDomainValues(parmDomainVals);
genMethodParmDef.setParmRequired(methodParmDef.parmRequired);
genMethodParmDef.setParmType(methodParmDef.parmType);
genMethodParmDef.setParmPassBy(methodParmDef.parmPassBy);
return genMethodParmDef;
} else {
return null;
}
}
public static org.fcrepo.server.types.gen.MIMETypedStream convertMIMETypedStreamToGenMIMETypedStream(org.fcrepo.server.storage.types.MIMETypedStream mimeTypedStream) {
if (mimeTypedStream != null) {
org.fcrepo.server.types.gen.MIMETypedStream genMIMETypedStream =
new org.fcrepo.server.types.gen.MIMETypedStream();
genMIMETypedStream.setMIMEType(mimeTypedStream.getMIMEType());
org.fcrepo.server.storage.types.Property[] header =
mimeTypedStream.header;
org.fcrepo.server.types.gen.MIMETypedStream.Header head =
new org.fcrepo.server.types.gen.MIMETypedStream.Header();
if (header != null) {
for (org.fcrepo.server.storage.types.Property property : header) {
head.getProperty()
.add(convertPropertyToGenProperty(property));
}
}
genMIMETypedStream.setHeader(head);
try{
genMIMETypedStream.setStream(
StreamUtility.getBytes(mimeTypedStream.getStream()));
} catch (IOException ioe) {
logger.error("Error converting types", ioe);
}
return genMIMETypedStream;
} else {
return null;
}
}
// The MIMETypedStream is the only WS data type that differs between
// the standard and MTOM implementations
public static org.fcrepo.server.types.mtom.gen.MIMETypedStream convertMIMETypedStreamToGenMIMETypedStreamMTOM(org.fcrepo.server.storage.types.MIMETypedStream mimeTypedStream) {
if (mimeTypedStream != null) {
org.fcrepo.server.types.mtom.gen.MIMETypedStream genMIMETypedStream =
new org.fcrepo.server.types.mtom.gen.MIMETypedStream();
genMIMETypedStream.setMIMEType(mimeTypedStream.getMIMEType());
org.fcrepo.server.storage.types.Property[] header =
mimeTypedStream.header;
org.fcrepo.server.types.mtom.gen.MIMETypedStream.Header head =
new org.fcrepo.server.types.mtom.gen.MIMETypedStream.Header();
if (header != null) {
for (org.fcrepo.server.storage.types.Property property : header) {
head.getProperty()
.add(convertPropertyToGenProperty(property));
}
}
genMIMETypedStream.setHeader(head);
InputStreamDataSource ds = new InputStreamDataSource(mimeTypedStream.getStream(), mimeTypedStream.getMIMEType());
genMIMETypedStream
.setStream(new DataHandler(ds));
return genMIMETypedStream;
} else {
return null;
}
}
public static List<org.fcrepo.server.types.gen.ObjectMethodsDef> convertObjectMethodsDefArrayToGenObjectMethodsDefList(org.fcrepo.server.storage.types.ObjectMethodsDef[] objectMethodDefs) {
if (objectMethodDefs != null) {
List<org.fcrepo.server.types.gen.ObjectMethodsDef> genObjectMethodDefs =
new ArrayList<org.fcrepo.server.types.gen.ObjectMethodsDef>(objectMethodDefs.length);
for (org.fcrepo.server.storage.types.ObjectMethodsDef objectMethodsDef : objectMethodDefs) {
org.fcrepo.server.types.gen.ObjectMethodsDef genObjectMethodDef =
new org.fcrepo.server.types.gen.ObjectMethodsDef();
genObjectMethodDef.setPID(objectMethodsDef.PID);
genObjectMethodDef
.setServiceDefinitionPID(objectMethodsDef.sDefPID);
genObjectMethodDef.setMethodName(objectMethodsDef.methodName);
org.fcrepo.server.storage.types.MethodParmDef[] methodParmDefs =
objectMethodsDef.methodParmDefs;
org.fcrepo.server.types.gen.ObjectMethodsDef.MethodParmDefs genMethodParmDefs =
new org.fcrepo.server.types.gen.ObjectMethodsDef.MethodParmDefs();
if (methodParmDefs != null) {
for (org.fcrepo.server.storage.types.MethodParmDef methodParmDef : methodParmDefs) {
genMethodParmDefs
.getMethodParmDef()
.add(convertMethodParmDefToGenMethodParmDef(methodParmDef));
}
}
genObjectMethodDef.setMethodParmDefs(genMethodParmDefs);
genObjectMethodDefs.add(genObjectMethodDef);
}
return genObjectMethodDefs;
} else {
return null;
}
}
public static org.fcrepo.server.types.gen.ObjectProfile convertObjectProfileToGenObjectProfile(org.fcrepo.server.access.ObjectProfile objectProfile) {
if (objectProfile != null) {
org.fcrepo.server.types.gen.ObjectProfile genObjectProfile =
new org.fcrepo.server.types.gen.ObjectProfile();
genObjectProfile.setPid(objectProfile.PID);
genObjectProfile.setObjLabel(objectProfile.objectLabel);
org.fcrepo.server.types.gen.ObjectProfile.ObjModels objModels =
new org.fcrepo.server.types.gen.ObjectProfile.ObjModels();
if (objectProfile.objectModels != null) {
objModels.getModel().addAll(objectProfile.objectModels);
}
genObjectProfile.setObjModels(objModels);
genObjectProfile.setObjCreateDate(DateUtility
.convertDateToString(objectProfile.objectCreateDate));
genObjectProfile.setObjLastModDate(DateUtility
.convertDateToString(objectProfile.objectLastModDate));
genObjectProfile
.setObjDissIndexViewURL(objectProfile.dissIndexViewURL);
genObjectProfile
.setObjItemIndexViewURL(objectProfile.itemIndexViewURL);
return genObjectProfile;
} else {
return null;
}
}
public static org.fcrepo.server.types.gen.RepositoryInfo convertReposInfoToGenReposInfo(org.fcrepo.server.access.RepositoryInfo repositoryInfo) {
if (repositoryInfo != null) {
org.fcrepo.server.types.gen.RepositoryInfo genRepositoryInfo =
new org.fcrepo.server.types.gen.RepositoryInfo();
genRepositoryInfo.setRepositoryName(repositoryInfo.repositoryName);
genRepositoryInfo
.setRepositoryBaseURL(repositoryInfo.repositoryBaseURL);
genRepositoryInfo
.setRepositoryVersion(repositoryInfo.repositoryVersion);
genRepositoryInfo
.setRepositoryPIDNamespace(repositoryInfo.repositoryPIDNamespace);
genRepositoryInfo
.setDefaultExportFormat(repositoryInfo.defaultExportFormat);
genRepositoryInfo.setOAINamespace(repositoryInfo.OAINamespace);
if (repositoryInfo.adminEmailList != null) {
org.fcrepo.server.types.gen.ArrayOfString val =
new org.fcrepo.server.types.gen.ArrayOfString();
val.getItem()
.addAll(Arrays.asList(repositoryInfo.adminEmailList));
genRepositoryInfo.setAdminEmailList(val);
}
genRepositoryInfo.setSamplePID(repositoryInfo.samplePID);
genRepositoryInfo
.setSampleOAIIdentifier(repositoryInfo.sampleOAIIdentifer);
genRepositoryInfo
.setSampleSearchURL(repositoryInfo.sampleSearchURL);
genRepositoryInfo
.setSampleAccessURL(repositoryInfo.sampleAccessURL);
genRepositoryInfo.setSampleOAIURL(repositoryInfo.sampleOAIURL);
if (repositoryInfo.retainPIDs != null) {
org.fcrepo.server.types.gen.ArrayOfString val =
new org.fcrepo.server.types.gen.ArrayOfString();
val.getItem().addAll(Arrays.asList(repositoryInfo.retainPIDs));
genRepositoryInfo.setRetainPIDs(val);
}
return genRepositoryInfo;
} else {
return null;
}
}
public static org.fcrepo.server.storage.types.Property[] convertGenPropertyArrayToPropertyArray(org.fcrepo.server.types.gen.GetDissemination.Parameters genProperties) {
if (genProperties != null) {
org.fcrepo.server.storage.types.Property[] properties =
new org.fcrepo.server.storage.types.Property[genProperties
.getParameter() == null ? 0 : genProperties
.getParameter().size()];
int i = 0;
for (org.fcrepo.server.types.gen.Property prop : genProperties
.getParameter()) {
org.fcrepo.server.storage.types.Property property =
new org.fcrepo.server.storage.types.Property();
property = convertGenPropertyToProperty(prop);
properties[i++] = property;
}
return properties;
} else {
return null;
}
}
public static org.fcrepo.server.storage.types.Property[] convertGenPropertyArrayToPropertyArray(org.fcrepo.server.types.mtom.gen.GetDissemination.Parameters genProperties) {
if (genProperties != null) {
org.fcrepo.server.storage.types.Property[] properties =
new org.fcrepo.server.storage.types.Property[genProperties
.getParameter() == null ? 0 : genProperties
.getParameter().size()];
int i = 0;
for (org.fcrepo.server.types.gen.Property prop : genProperties
.getParameter()) {
org.fcrepo.server.storage.types.Property property =
new org.fcrepo.server.storage.types.Property();
property = convertGenPropertyToProperty(prop);
properties[i++] = property;
}
return properties;
} else {
return null;
}
}
public static org.fcrepo.server.storage.types.Property convertGenPropertyToProperty(org.fcrepo.server.types.gen.Property genProperty) {
org.fcrepo.server.storage.types.Property property =
new org.fcrepo.server.storage.types.Property();
if (genProperty != null) {
property.name = genProperty.getName();
property.value = genProperty.getValue();
}
return property;
}
public static org.fcrepo.server.types.gen.Property convertPropertyToGenProperty(org.fcrepo.server.storage.types.Property property) {
org.fcrepo.server.types.gen.Property genProperty =
new org.fcrepo.server.types.gen.Property();
if (property != null) {
genProperty.setName(property.name);
genProperty.setValue(property.value);
}
return genProperty;
}
public static org.fcrepo.server.types.gen.RelationshipTuple convertRelsTupleToGenRelsTuple(org.fcrepo.server.storage.types.RelationshipTuple in) {
if (in == null) {
return null;
}
org.fcrepo.server.types.gen.RelationshipTuple out =
new org.fcrepo.server.types.gen.RelationshipTuple();
out.setSubject(in.subject);
out.setPredicate(in.predicate);
out.setObject(in.object);
out.setIsLiteral(in.isLiteral);
if (in.datatype == null) out.setDatatype(null);
else out.setDatatype(in.datatype.toString());
return out;
}
public static org.fcrepo.server.types.gen.DatastreamDef convertDatastreamDefToGenDatastreamDef(org.fcrepo.server.storage.types.DatastreamDef in) {
if (in == null) {
return null;
}
org.fcrepo.server.types.gen.DatastreamDef out =
new org.fcrepo.server.types.gen.DatastreamDef();
out.setID(in.dsID);
out.setLabel(in.dsLabel);
out.setMIMEType(in.dsMIME);
return out;
}
public static List<org.fcrepo.server.types.gen.DatastreamDef> convertDatastreamDefArrayToGenDatastreamDefList(org.fcrepo.server.storage.types.DatastreamDef[] dsDefs) {
if (dsDefs != null) {
List<org.fcrepo.server.types.gen.DatastreamDef> genDatastreamDefs =
new ArrayList<org.fcrepo.server.types.gen.DatastreamDef>(dsDefs.length);
for (org.fcrepo.server.storage.types.DatastreamDef dsDef : dsDefs) {
genDatastreamDefs
.add(convertDatastreamDefToGenDatastreamDef(dsDef));
}
return genDatastreamDefs;
} else {
return null;
}
}
public static org.fcrepo.server.types.gen.Validation convertValidationToGenValidation(org.fcrepo.server.storage.types.Validation validation) {
if (validation == null) {
return null;
}
org.fcrepo.server.types.gen.Validation genvalid =
new org.fcrepo.server.types.gen.Validation();
genvalid.setValid(validation.isValid());
genvalid.setPid(validation.getPid());
org.fcrepo.server.types.gen.Validation.ObjModels objModels =
new org.fcrepo.server.types.gen.Validation.ObjModels();
objModels.getModel().addAll(validation.getContentModels());
genvalid.setObjModels(objModels);
org.fcrepo.server.types.gen.Validation.ObjProblems objProblems =
new org.fcrepo.server.types.gen.Validation.ObjProblems();
objProblems.getProblem().addAll(validation.getObjectProblems());
genvalid.setObjProblems(objProblems);
Map<String, List<String>> dsprobs = validation.getDatastreamProblems();
org.fcrepo.server.types.gen.Validation.DatastreamProblems problems =
new org.fcrepo.server.types.gen.Validation.DatastreamProblems();
if (dsprobs != null) {
for (String key : dsprobs.keySet()) {
org.fcrepo.server.types.gen.DatastreamProblem dsProblem =
new org.fcrepo.server.types.gen.DatastreamProblem();
dsProblem.setDatastreamID(key);
dsProblem.getProblem().addAll(dsprobs.get(key));
problems.getDatastream().add(dsProblem);
}
}
genvalid.setDatastreamProblems(problems);
return genvalid;
}
public static byte[] convertDataHandlerToBytes(DataHandler dh) {
if (dh != null) {
ByteArrayOutputStream bos = new ByteArrayOutputStream(INITIAL_SIZE);
InputStream in;
try {
in = dh.getInputStream();
byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead;
while ((bytesRead = in.read(buffer)) >= 0) {
bos.write(buffer, 0, bytesRead);
}
return bos.toByteArray();
} catch (IOException e) {
return null;
}
} else
return null;
}
public static DataHandler convertBytesToDataHandler(byte[] content) {
if (content != null) {
return new DataHandler(new ByteArrayDataSource(content, "text/xml"));
} else
return null;
}
public static ArrayOfString convertStringtoAOS(String[] arr) {
if (arr != null) {
ArrayOfString arofs = new ArrayOfString();
arofs.getItem().addAll(Arrays.asList(arr));
return arofs;
} else
return null;
}
}