package org.fcrepo.server.validation.ecm;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.xml.bind.JAXB;
import org.fcrepo.server.Context;
import org.fcrepo.server.errors.ServerException;
import org.fcrepo.server.storage.DOReader;
import org.fcrepo.server.storage.ExternalContentManager;
import org.fcrepo.server.storage.RepositoryReader;
import org.fcrepo.server.storage.types.Datastream;
import org.fcrepo.server.storage.types.Validation;
import org.fcrepo.server.validation.ecm.jaxb.DsCompositeModel;
import org.fcrepo.server.validation.ecm.jaxb.DsTypeModel;
/**
* Created by IntelliJ IDEA.
* User: abr
* Date: Jun 26, 2010
* Time: 12:03:15 PM
* To change this template use File | Settings | File Templates.
*/
public class DatastreamValidator {
private SchemaValidator schemaValidator;
private FormValidator formValidator;
private RepositoryReader doMgr;
public DatastreamValidator(RepositoryReader doMgr) {
this.doMgr = doMgr;
schemaValidator = new SchemaValidator();
formValidator = new FormValidator();
}
public void validate(Context context, DOReader currentObjectReader, Date asOfDateTime,
Validation validation, ExternalContentManager m_exExternalContentManager) throws ServerException {
// /Datastream validation stuff
/** Get the objects content models */
List<String> contentmodels = currentObjectReader.getContentModels();
//For each content model, parse the DS-COMPOSITE-MODEL
for (String contentmodel : contentmodels) {
contentmodel = contentmodel.substring("info:fedora/".length());
DOReader contentmodelReader = doMgr.getReader(false, context, contentmodel);
Datastream dscompmodelDS = contentmodelReader.GetDatastream("DS-COMPOSITE-MODEL", asOfDateTime);
if (dscompmodelDS == null) {//NO ds composite model, thats okay, continue to next content model
continue;
}
DsCompositeModel dscompobject = JAXB.unmarshal(dscompmodelDS.getContentStream(), DsCompositeModel.class);
for (DsTypeModel typeModel : dscompobject.getDsTypeModel()) {
String DSID = typeModel.getID();
Datastream objectDatastream = currentObjectReader.GetDatastream(DSID, asOfDateTime);
if (objectDatastream == null) {
Boolean optional = typeModel.isOptional();
if (optional != null && optional) {
//optional datastream can be missing, not a problem
} else {
reportMissingDatastreamError(contentmodel, DSID, validation);
}
continue;
}
formValidator.checkFormAndMime(typeModel, objectDatastream, validation, contentmodelReader);
schemaValidator
.validate(context, typeModel, objectDatastream, validation, contentmodelReader, asOfDateTime,m_exExternalContentManager);
}
}
}
private void reportMissingDatastreamError(String contentmodel, String dsid, Validation validation) {
List<String> problems = validation.getDatastreamProblems().get(dsid);
if (problems == null) {
problems = new ArrayList<String>();
validation.getDatastreamProblems().put(dsid, problems);
}
problems.add(Errors.missingRequiredDatastream(dsid,contentmodel));
validation.setValid(false);
}
}