source: VirtualCollectionRegistry/branches/VirtualCollectionRegistry-1.0-beta/src/test/java/eu/clarin/cmdi/virtualcollectionregistry/service/impl/VirtualCollectionCMDIWriterImplTest.java @ 5605

Last change on this file since 5605 was 5605, checked in by Twan Goosen, 10 years ago

merged addition of 'keyword' to CMDI output

  • Property svn:eol-style set to native
File size: 6.1 KB
Line 
1package eu.clarin.cmdi.virtualcollectionregistry.service.impl;
2
3import eu.clarin.cmdi.virtualcollectionregistry.model.Creator;
4import eu.clarin.cmdi.virtualcollectionregistry.model.Resource;
5import eu.clarin.cmdi.virtualcollectionregistry.model.User;
6import eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollection;
7import eu.clarin.cmdi.virtualcollectionregistry.pid.PersistentIdentifier;
8import java.io.IOException;
9import java.io.InputStreamReader;
10import java.io.StringReader;
11import java.io.StringWriter;
12import java.text.DateFormat;
13import static java.text.DateFormat.SHORT;
14import java.text.ParseException;
15import java.util.List;
16import java.util.Locale;
17import java.util.concurrent.CopyOnWriteArrayList;
18import java.util.regex.Pattern;
19import javax.xml.stream.XMLOutputFactory;
20import javax.xml.stream.XMLStreamWriter;
21import org.custommonkey.xmlunit.Diff;
22import org.custommonkey.xmlunit.Difference;
23import org.custommonkey.xmlunit.DifferenceListener;
24import org.custommonkey.xmlunit.XMLTestCase;
25import org.custommonkey.xmlunit.XMLUnit;
26import org.junit.Test;
27import org.w3c.dom.Node;
28import org.xml.sax.SAXException;
29
30/**
31 *
32 * @author twagoo
33 */
34public class VirtualCollectionCMDIWriterImplTest extends XMLTestCase {
35
36    private static final String CONTROL_INSTANCE = "/vc-instance1.xml";
37
38    /**
39     * Patterns for paths to be ignored in XML comparison
40     */
41    private final List<Pattern> IGNORE_PATHS = new CopyOnWriteArrayList<>(new Pattern[]{
42        //ignore creation date
43        Pattern.compile("\\/CMD\\[1\\]\\/Header\\[1\\]\\/MdCreationDate\\[1\\]\\/text\\(\\).*"),
44        //ignore resource proxy id's
45        Pattern.compile("\\/CMD\\[1\\]\\/Resources\\[1\\]\\/ResourceProxyList\\[1\\]\\/ResourceProxy\\[.*\\]\\/@id"),
46        //ignore resource proxy references from Resource component instances
47        Pattern.compile("\\/CMD\\[1\\]\\/Components\\[1\\]\\/VirtualCollection\\[1\\]\\/Resource\\[.*\\]\\/@ref")
48    });
49
50    /**
51     * Test of writeCMDI method, of class VirtualCollectionCMDIWriterImpl.
52     *
53     * @throws java.lang.Exception
54     */
55    @Test
56    public void testWriteCMDIExtensional() throws Exception {
57        final VirtualCollectionCMDIWriterImpl instance = new VirtualCollectionCMDIWriterImpl(new VirtualCollectionCMDICreatorImpl());
58
59        // create a collection to serialize
60        final VirtualCollection vc = createTestVC();
61
62        // prepare an output writer
63        final XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newFactory();
64        final StringWriter stringWriter = new StringWriter();
65        final XMLStreamWriter xmlWriter = xmlOutputFactory.createXMLStreamWriter(stringWriter);
66
67        // write CMDI for instance to the writer
68        xmlWriter.writeStartDocument();
69        instance.writeCMDI(xmlWriter, vc);
70        xmlWriter.writeEndDocument();
71        xmlWriter.close();
72
73        // compare output to control document
74        final StringReader testOutputReader = new StringReader(stringWriter.toString());
75        final InputStreamReader controlReader = new InputStreamReader(getClass().getResourceAsStream(CONTROL_INSTANCE));
76
77        assertCMDIEqual(controlReader, testOutputReader);
78    }
79
80    private VirtualCollection createTestVC() throws ParseException {
81        final VirtualCollection vc = new VirtualCollection();
82        vc.setName("Virtual Collection Name");
83        vc.setDescription("Test collection description");
84        vc.setType(VirtualCollection.Type.EXTENSIONAL);
85        vc.setReproducibility(VirtualCollection.Reproducibility.INTENDED);
86        vc.setPurpose(VirtualCollection.Purpose.SAMPLE);
87
88        vc.setOwner(new User("Test user"));
89        vc.setCreationDate(DateFormat.getDateInstance(SHORT, Locale.US).parse("01/01/14"));
90
91        vc.setState(VirtualCollection.State.PUBLIC_PENDING);
92        //setting the pid requires 'public pending' state and will set the state to public
93        vc.setPersistentIdentifier(new PersistentIdentifier(vc, PersistentIdentifier.Type.HANDLE, "9999/1234-5678"));
94
95        vc.getKeywords().add("keyword1");
96        vc.getKeywords().add("keyword2");
97
98        final Creator creator = new Creator("Test creator");
99        creator.setEMail("test@creator.org");
100        creator.setOrganisation("Test Inc.");
101        vc.getCreators().add(creator);
102
103        final Resource resource1 = new Resource(Resource.Type.METADATA, "http://my/metadata.cmdi");
104        resource1.setLabel("Label of first");
105        vc.getResources().add(resource1);
106
107        final Resource resource2 = new Resource(Resource.Type.RESOURCE, "http://my/resource.mpg");
108        resource2.setDescription("Description of second");
109        vc.getResources().add(resource2);
110
111        // add one without label or description
112        vc.getResources().add(new Resource(Resource.Type.RESOURCE, "http://other/resource.mpg"));
113        return vc;
114    }
115
116    private void assertCMDIEqual(final InputStreamReader controlReader, final StringReader testOutputReader) throws IOException, SAXException {
117        XMLUnit.setIgnoreWhitespace(true);
118        XMLUnit.setIgnoreAttributeOrder(true);
119
120        final Diff diff = XMLUnit.compareXML(controlReader, testOutputReader);
121        setIgnorePaths(diff);
122
123        assertTrue(diff.toString(), diff.similar());
124    }
125
126    /**
127     * approach based on
128     * http://ayazanwar.wordpress.com/2012/09/23/xmlunit-ignoring-certain-pieces-of-xml-during-xml-comparison-using-regular-expression/
129     *
130     * @param diff
131     * @param ignorePaths
132     */
133    private void setIgnorePaths(final Diff diff) {
134        diff.overrideDifferenceListener(new DifferenceListener() {
135
136            @Override
137            public int differenceFound(Difference difference) {
138                final String testXPath = difference.getTestNodeDetail().getXpathLocation();
139                for (Pattern ignorePath : IGNORE_PATHS) {
140                    if (ignorePath.matcher(testXPath).find()) {
141                        return DifferenceListener.RETURN_IGNORE_DIFFERENCE_NODES_SIMILAR;
142                    }
143                }
144                return DifferenceListener.RETURN_ACCEPT_DIFFERENCE;
145            }
146
147            @Override
148            public void skippedComparison(Node control, Node test) {
149            }
150        });
151    }
152
153}
Note: See TracBrowser for help on using the repository browser.