/* 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.client.utility.validate.types;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.junit.Test;
import fedora.client.utility.validate.InvalidContentModelException;
import fedora.client.utility.validate.types.DsCompositeModelDoc.DsTypeModel;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;
/**
* @author Jim Blake
*/
public class TestDsCompositeModelDoc {
public static final String TYPICAL_MODEL =
"<dsCompositeModel xmlns=\"info:fedora/fedora-system:def/dsCompositeModel#\">\n"
+ " <dsTypeModel ID=\"DC\">\n"
+ " <form MIME=\"text/xml\">\n"
+ " </form>\n"
+ " </dsTypeModel>\n"
+ " <dsTypeModel ID=\"RELS-EXT\">\n"
+ " <form MIME=\"application/rdf+xml\">\n"
+ " </form>\n"
+ " </dsTypeModel>\n"
+ " <dsTypeModel ID=\"XML_SOURCE\">\n"
+ " <form MIME=\"text/xml\">\n"
+ " </form>\n"
+ " </dsTypeModel>\n"
+ " <dsTypeModel ID=\"XSL_STYLESHEET1\">\n"
+ " <form MIME=\"text/xml\">\n"
+ " </form>\n"
+ " </dsTypeModel>\n"
+ " <dsTypeModel ID=\"XSL_STYLESHEET2\">\n"
+ " <form MIME=\"text/xml\">\n"
+ " </form>\n"
+ " </dsTypeModel>\n" + "</dsCompositeModel>";
public static final ExpectedTypeModel[] TYPICAL_RESULTS =
new ExpectedTypeModel[] {
new ExpectedTypeModel("DC",
new ExpectedForm[] {new ExpectedForm("text/xml",
null)}),
new ExpectedTypeModel("RELS-EXT",
new ExpectedForm[] {new ExpectedForm("application/rdf+xml",
null)}),
new ExpectedTypeModel("XML_SOURCE",
new ExpectedForm[] {new ExpectedForm("text/xml",
null)}),
new ExpectedTypeModel("XSL_STYLESHEET1",
new ExpectedForm[] {new ExpectedForm("text/xml",
null)}),
new ExpectedTypeModel("XSL_STYLESHEET2",
new ExpectedForm[] {new ExpectedForm("text/xml",
null)}),};
public static final String ASSORTED_FORMS =
"<dsCompositeModel xmlns=\"info:fedora/fedora-system:def/dsCompositeModel#\">\n"
+ " <dsTypeModel ID=\"NoForms\">\n"
+ " </dsTypeModel>\n"
+ " <dsTypeModel ID=\"MultipleForms\">\n"
+ " <form MIME=\"application/rdf+xml\" FORMAT_URI=\"someUri\"/>\n"
+ " <form MIME=\"text/xml\"/>\n"
+ " <form FORMAT_URI=\"otherUri\"/>\n"
+ " <form/>\n"
+ " </dsTypeModel>\n"
+ "</dsCompositeModel>";
public static final ExpectedTypeModel[] ASSORTED_RESULTS =
new ExpectedTypeModel[] {
new ExpectedTypeModel("MultipleForms", new ExpectedForm[] {
new ExpectedForm("application/rdf+xml", "someUri"),
new ExpectedForm("text/xml", null),
new ExpectedForm(null, "otherUri"),
new ExpectedForm(null, null)}),
new ExpectedTypeModel("NoForms", new ExpectedForm[] {})};
public static final String EMPTY_MODEL =
"<dsCompositeModel xmlns=\"info:fedora/fedora-system:def/dsCompositeModel#\">\n"
+ "</dsCompositeModel>";
public static final ExpectedTypeModel[] EMPTY_RESULTS =
new ExpectedTypeModel[0];
public static final String BROKEN_TYPE_MODEL =
"<dsCompositeModel xmlns=\"info:fedora/fedora-system:def/dsCompositeModel#\">\n"
+ " <dsTypeModel >\n"
+ " </dsTypeModel>\n"
+ "</dsCompositeModel>";
@Test
public void typicalModel() throws InvalidContentModelException {
DsCompositeModelDoc doc =
new DsCompositeModelDoc("junkPid", TYPICAL_MODEL.getBytes());
DsTypeModel[] actualModels = getSortedTypeModelsArray(doc);
assertExpectedResults(TYPICAL_RESULTS, actualModels);
}
@Test
public void assortedForms() throws InvalidContentModelException {
DsCompositeModelDoc doc =
new DsCompositeModelDoc("junkPid", ASSORTED_FORMS.getBytes());
DsTypeModel[] actualModels = getSortedTypeModelsArray(doc);
assertExpectedResults(ASSORTED_RESULTS, actualModels);
}
@Test
public void emptyModel() throws InvalidContentModelException {
DsCompositeModelDoc doc =
new DsCompositeModelDoc("junkPid", EMPTY_MODEL.getBytes());
DsTypeModel[] actualModels = getSortedTypeModelsArray(doc);
assertExpectedResults(EMPTY_RESULTS, actualModels);
}
@Test(expected = InvalidContentModelException.class)
public void typeModelHasNoId() throws InvalidContentModelException {
new DsCompositeModelDoc("junkPid", BROKEN_TYPE_MODEL.getBytes());
}
private void assertExpectedResults(ExpectedTypeModel[] expectedModels,
DsTypeModel[] actualModels) {
assertEquals("number of models",
expectedModels.length,
actualModels.length);
for (int i = 0; i < actualModels.length; i++) {
DsTypeModel actualModel = actualModels[i];
String actualId = actualModel.getId();
assertEquals("id", expectedModels[i].id, actualId);
assertEqualForms(actualId, expectedModels[i].forms, actualModel
.getForms());
}
}
// No type models
// No forms in a type model
// Multiple forms in a type model
// Form with neither Mime nor FormatUri
// Form with either or both Mime or FormatUri
private DsTypeModel[] getSortedTypeModelsArray(DsCompositeModelDoc doc) {
Set<ContentModelInfo.DsTypeModel> tmSet = doc.getTypeModels();
DsTypeModel[] result = tmSet.toArray(new DsTypeModel[tmSet.size()]);
Arrays.sort(result, new Comparator<DsTypeModel>() {
public int compare(DsTypeModel obj1, DsTypeModel obj2) {
return obj1.getId().compareTo(obj2.getId());
}
});
return result;
}
private void assertEqualForms(String dsId,
ExpectedForm[] expected,
Set<ContentModelInfo.Form> actual) {
Set<ContentModelInfo.Form> extras =
new HashSet<ContentModelInfo.Form>(actual);
Set<ExpectedForm> missing = new HashSet<ExpectedForm>();
outer: for (int i = 0; i < expected.length; i++) {
ExpectedForm expectedForm = expected[i];
for (Iterator<ContentModelInfo.Form> actuals = extras.iterator(); actuals
.hasNext();) {
ContentModelInfo.Form actualForm = actuals.next();
if (equivalent(expectedForm.mime, actualForm.getMimeType())
&& equivalent(expectedForm.formatUri, actualForm
.getFormatUri())) {
actuals.remove();
continue outer;
}
}
missing.add(expectedForm);
}
assertTrue("dsId: " + dsId + ", unexpected forms: " + extras
+ "\nmissing forms: " + missing, missing.isEmpty()
&& extras.isEmpty());
}
private boolean equivalent(Object obj1, Object obj2) {
return (obj1 == null) ? obj2 == null : obj1.equals(obj2);
}
private static class ExpectedTypeModel {
public final String id;
public final ExpectedForm[] forms;
public ExpectedTypeModel(String id, ExpectedForm[] forms) {
this.id = id;
this.forms = forms;
}
}
private static class ExpectedForm {
public final String mime;
public final String formatUri;
public ExpectedForm(String mime, String formatUri) {
this.mime = mime;
this.formatUri = formatUri;
}
@Override
public String toString() {
return "ExpectedForm[mime=" + mime + ", formatUri=" + formatUri
+ "]";
}
}
}