/*
* #%L
* BSD implementations of Bio-Formats readers and writers
* %%
* Copyright (C) 2005 - 2015 Open Microscopy Environment:
* - Board of Regents of the University of Wisconsin-Madison
* - Glencoe Software, Inc.
* - University of Dundee
* %%
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
* #L%
*/
package spec.schema;
//Java imports
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.xml.transform.stream.StreamSource;
//Third-party libraries
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
//Application-internal dependencies
import spec.AbstractTest;
import ome.specification.OmeValidator;
import ome.specification.XMLMockObjects;
import ome.specification.XMLWriter;
import org.testng.Assert;
/**
* Collections of tests.
* Checks if the downgrade from current schema to 2003-FC schema works.
*
* @author Jean-Marie Burel
* <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a>
* @author Donald MacDonald
* <a href="mailto:donald@lifesci.dundee.ac.uk">donald@lifesci.dundee.ac.uk</a>
* @version 3.0
* <small>
* (<b>Internal version:</b> $Revision: $Date: $)
* </small>
* @since 3.0-Beta4
*/
public class SchemaCurrent_TO_2003_FC_Test
extends AbstractTest
{
/** The collection of files that have to be deleted. */
private List<File> files;
/** The transforms */
private InputStream STYLESHEET_A;
private InputStream STYLESHEET_B;
private InputStream STYLESHEET_C;
/** The target schema */
private StreamSource[] schemaArray;
/** A validator used to check transformed files */
private OmeValidator anOmeValidator = new OmeValidator();
/** The path in front of ID. */
private String XSLT_PATH_ID = "xslt.fix";
/**
* Checks if the <code>Image</code> tag was correctly transformed.
*
* @param destNode The node from the transformed file.
* @param srcNode The Image node from the source file
*/
private void checkImageNode(Node destNode, Node srcNode)
{
String IMAGE_ID_PATH = XSLT_PATH_ID+":Image:XSLT:";
Assert.assertNotNull(destNode);
Assert.assertNotNull(srcNode);
NamedNodeMap attributesSrc = srcNode.getAttributes();
String nameSrc = "";
String idSrc = "";
Node n;
String name;
for (int i = 0; i < attributesSrc.getLength(); i++) {
n = attributesSrc.item(i);
name = n.getNodeName();
if (name.equals(XMLWriter.ID_ATTRIBUTE))
idSrc = n.getNodeValue();
else if (name.equals(XMLWriter.NAME_ATTRIBUTE))
nameSrc = n.getNodeValue();
}
NamedNodeMap attributes = destNode.getAttributes();
for (int i = 0; i < attributes.getLength(); i++) {
n = attributes.item(i);
if (n != null) {
name = n.getNodeName();
if (name.equals(XMLWriter.ID_ATTRIBUTE))
Assert.assertEquals(n.getNodeValue(), IMAGE_ID_PATH+idSrc);
else if (name.equals(XMLWriter.NAME_ATTRIBUTE))
Assert.assertEquals(n.getNodeValue(), nameSrc);
}
}
Node pixelsNode = null;
NodeList list = srcNode.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
n = list.item(i);
if (n != null) {
name = n.getNodeName();
if (name.contains(XMLWriter.PIXELS_TAG))
pixelsNode = n;
}
}
list = destNode.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
n = list.item(i);
if (n != null) {
name = n.getNodeName();
if (name.contains(XMLWriter.PIXELS_TAG))
checkPixelsNode(n, pixelsNode);
}
}
}
/**
* Checks if the <code>Pixels</code> tag was correctly transformed.
*
* @param destNode The node from the transformed file.
* @param srcNode The Image node from the source file
*/
private void checkPixelsNode(Node destNode, Node srcNode)
{
String PIXELS_ID_PATH = XSLT_PATH_ID+":Pixels:XSLT:";
NamedNodeMap attributesSrc = srcNode.getAttributes();
String nameSrc = "";
String idSrc = "";
String sizeX = "";
String sizeY = "";
String sizeZ = "";
String sizeC = "";
String sizeT = "";
String pixelsType = "";
String dimensionOrder = "";
Node n;
String name;
for (int i = 0; i < attributesSrc.getLength(); i++) {
n = attributesSrc.item(i);
name = n.getNodeName();
if (name.equals(XMLWriter.ID_ATTRIBUTE))
idSrc = n.getNodeValue();
else if (name.equals(XMLWriter.NAME_ATTRIBUTE))
nameSrc = n.getNodeValue();
else if (name.equals(XMLWriter.SIZE_X_ATTRIBUTE))
sizeX = n.getNodeValue();
else if (name.equals(XMLWriter.SIZE_Y_ATTRIBUTE))
sizeY = n.getNodeValue();
else if (name.equals(XMLWriter.SIZE_Z_ATTRIBUTE))
sizeZ = n.getNodeValue();
else if (name.equals(XMLWriter.SIZE_C_ATTRIBUTE))
sizeC = n.getNodeValue();
else if (name.equals(XMLWriter.SIZE_T_ATTRIBUTE))
sizeT = n.getNodeValue();
else if (name.equals(XMLWriter.PIXELS_TYPE_ATTRIBUTE))
pixelsType = n.getNodeValue();
else if (name.equals(XMLWriter.DIMENSION_ORDER_ATTRIBUTE))
dimensionOrder = n.getNodeValue();
}
String bigEndianDst = "";
NamedNodeMap attributes = destNode.getAttributes();
for (int i = 0; i < attributes.getLength(); i++) {
n = attributes.item(i);
if (n != null) {
name = n.getNodeName();
if (name.equals(XMLWriter.ID_ATTRIBUTE))
Assert.assertEquals(n.getNodeValue(), PIXELS_ID_PATH+idSrc);
else if (name.equals(XMLWriter.NAME_ATTRIBUTE))
Assert.assertEquals(n.getNodeValue(), nameSrc);
else if (name.equals(XMLWriter.SIZE_X_ATTRIBUTE))
Assert.assertEquals(n.getNodeValue(), sizeX);
else if (name.equals(XMLWriter.SIZE_Y_ATTRIBUTE))
Assert.assertEquals(n.getNodeValue(), sizeY);
else if (name.equals(XMLWriter.SIZE_Z_ATTRIBUTE))
Assert.assertEquals(n.getNodeValue(), sizeZ);
else if (name.equals(XMLWriter.SIZE_C_ATTRIBUTE))
Assert.assertEquals(n.getNodeValue(), sizeC);
else if (name.equals(XMLWriter.SIZE_T_ATTRIBUTE))
Assert.assertEquals(n.getNodeValue(), sizeT);
// TODO - Review
// else if (name.equals(XMLWriter.PIXELS_TYPE_ATTRIBUTE))
// Assert.assertEquals(n.getNodeValue(), pixelsType);
else if (name.equals(XMLWriter.DIMENSION_ORDER_ATTRIBUTE))
Assert.assertEquals(n.getNodeValue(), dimensionOrder);
else if (name.equals(XMLWriter.BIG_ENDIAN_ATTRIBUTE))
bigEndianDst = n.getNodeValue();
}
}
//check the tag now.
NodeList list = srcNode.getChildNodes();
List<Node> binDataNodeSrc = new ArrayList<Node>();
for (int i = 0; i < list.getLength(); i++) {
n = list.item(i);
if (n != null) {
name = n.getNodeName();
if (name.contains(XMLWriter.BIN_DATA_TAG))
binDataNodeSrc.add(n);
}
}
list = destNode.getChildNodes();
List<Node> binDataNodeDest = new ArrayList<Node>();
for (int i = 0; i < list.getLength(); i++) {
n = list.item(i);
if (n != null) {
name = n.getNodeName();
if (name.contains(XMLWriter.BIN_DATA_TAG))
binDataNodeDest.add(n);
}
}
Assert.assertTrue(binDataNodeSrc.size() > 0);
Assert.assertEquals(binDataNodeSrc.size(), binDataNodeDest.size());
for (int i = 0; i < binDataNodeDest.size(); i++) {
checkBinDataNode(binDataNodeDest.get(i), binDataNodeSrc.get(i));
}
n = binDataNodeSrc.get(0);
attributesSrc = n.getAttributes();
//now check that
for (int i = 0; i < attributesSrc.getLength(); i++) {
n = attributesSrc.item(i);
if (n != null) {
name = n.getNodeName();
if (name.contains(XMLWriter.BIG_ENDIAN_ATTRIBUTE))
Assert.assertEquals(n.getNodeValue(), bigEndianDst);
}
}
}
/**
* Checks if the <code>Image</code> tag was correctly transformed.
*
* @param destNode The node from the transformed file.
* @param srcNode The Image node from the source file
*/
private void checkBinDataNode(Node destNode, Node srcNode)
{
Assert.assertNotNull(destNode);
Assert.assertNotNull(srcNode);
NamedNodeMap attributesSrc = srcNode.getAttributes();
String compression = "";
Node n;
String name;
for (int i = 0; i < attributesSrc.getLength(); i++) {
n = attributesSrc.item(i);
name = n.getNodeName();
if (name.equals(XMLWriter.COMPRESSION_ATTRIBUTE))
compression = n.getNodeValue();
}
NamedNodeMap attributes = destNode.getAttributes();
for (int i = 0; i < attributes.getLength(); i++) {
n = attributes.item(i);
if (n != null) {
name = n.getNodeName();
if (name.equals(XMLWriter.COMPRESSION_ATTRIBUTE))
Assert.assertEquals(n.getNodeValue(), compression);
}
}
Assert.assertEquals(destNode.getTextContent(), srcNode.getTextContent());
}
/**
* Overridden to initialize the list.
* @see AbstractTest#setUp()
*/
@Override
@BeforeClass
protected void setUp()
throws Exception
{
super.setUp();
/** The target schema file */
schemaArray = new StreamSource[1];
schemaArray[0] = new StreamSource(this.getClass().getResourceAsStream("/released-schema/2003-FC/ome.xsd"));
//components/specification/released-schema/2003-FC/
/** The transforms */
STYLESHEET_A = this.getClass().getResourceAsStream("/transforms/2012-06-to-2011-06.xsl");
STYLESHEET_B = this.getClass().getResourceAsStream("/transforms/2011-06-to-2010-06.xsl");
STYLESHEET_C = this.getClass().getResourceAsStream("/transforms/2010-06-to-2003-FC.xsl");
//components/specification/transforms/
files = new ArrayList<File>();
}
/**
* Overridden to delete the files.
* @see AbstractTest#tearDown()
*/
@Override
@AfterClass
public void tearDown()
throws Exception
{
Iterator<File> i = files.iterator();
while (i.hasNext()) {
i.next().delete();
}
files.clear();
}
/**
* Tests the XSLT used to downgrade from current schema to 2003-FC.
* An XML file with an image is created and the stylesheet is applied.
* @throws Exception Thrown if an error occurred.
*/
@Test(enabled = false)
public void testDowngradeTo2003FCImageNoMetadata()
throws Exception
{
File inFile = File.createTempFile("testDowngradeTo2003FCImageNoMetadata",
"."+OME_XML_FORMAT);
files.add(inFile);
File middleFileA = File.createTempFile("testDowngradeTo2003FCImageNoMetadataMiddleA",
"."+OME_XML_FORMAT);
files.add(middleFileA);
File middleFileB = File.createTempFile("testDowngradeTo2003FCImageNoMetadataMiddleB",
"."+OME_XML_FORMAT);
files.add(middleFileB);
File outputFile = File.createTempFile(
"testDowngradeTo2003FCImageNoMetadataOutput",
"."+OME_XML_FORMAT);
files.add(outputFile);
XMLMockObjects xml = new XMLMockObjects();
XMLWriter writer = new XMLWriter();
writer.writeFile(inFile, xml.createImage(), true);
transformFileWithStream(inFile, middleFileA, STYLESHEET_A);
transformFileWithStream(middleFileA, middleFileB, STYLESHEET_B);
transformFileWithStream(middleFileB, outputFile, STYLESHEET_C);
Document doc = anOmeValidator.parseFileWithStreamArray(outputFile, schemaArray);
Assert.assertNotNull(doc);
//Should only have one root node i.e. OME node
NodeList list = doc.getChildNodes();
Assert.assertEquals(list.getLength(), 1);
Node root = list.item(0);
Assert.assertEquals(root.getNodeName(), XMLWriter.OME_TAG);
//now analyse the root node
list = root.getChildNodes();
String name;
Node n;
Document docSrc = anOmeValidator.parseFile(inFile, null);
Node rootSrc = docSrc.getChildNodes().item(0);
Node imageNode = null;
NodeList listSrc = rootSrc.getChildNodes();
for (int i = 0; i < listSrc.getLength(); i++) {
n = listSrc.item(i);
name = n.getNodeName();
if (name != null) {
if (name.contains(XMLWriter.IMAGE_TAG))
imageNode = n;
}
}
for (int i = 0; i < list.getLength(); i++) {
n = list.item(i);
name = n.getNodeName();
if (name != null) {
//TODO: add other node
if (name.contains(XMLWriter.IMAGE_TAG) && imageNode != null)
checkImageNode(n, imageNode);
}
}
}
}