blob: 82e80d687229b951e0c6a41a9ba8ec0295d45ce9 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* $Id$ */
package org.apache.xmlgraphics.xmp;
import java.io.StringReader;
import java.net.URL;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import javax.xml.transform.TransformerException;
import javax.xml.transform.stream.StreamSource;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import org.apache.xmlgraphics.xmp.schemas.DublinCoreAdapter;
import org.apache.xmlgraphics.xmp.schemas.DublinCoreSchema;
import org.apache.xmlgraphics.xmp.schemas.XMPBasicAdapter;
import org.apache.xmlgraphics.xmp.schemas.XMPBasicSchema;
import org.apache.xmlgraphics.xmp.schemas.pdf.AdobePDFAdapter;
import org.apache.xmlgraphics.xmp.schemas.pdf.AdobePDFSchema;
/**
* Tests for the XMP parser.
*/
public class XMPParserTestCase {
@Test
public void testParseBasics() throws Exception {
URL url = getClass().getResource("test-basics.xmp");
Metadata meta = XMPParser.parseXMP(url);
DublinCoreAdapter dcAdapter = DublinCoreSchema.getAdapter(meta);
XMPBasicAdapter basicAdapter = XMPBasicSchema.getAdapter(meta);
AdobePDFAdapter pdfAdapter = AdobePDFSchema.getAdapter(meta);
XMPProperty prop;
prop = meta.getProperty(XMPConstants.DUBLIN_CORE_NAMESPACE, "creator");
XMPArray array;
array = prop.getArrayValue();
assertEquals(1, array.getSize());
assertEquals("John Doe", array.getValue(0).toString());
assertEquals("John Doe", dcAdapter.getCreators()[0]);
prop = meta.getProperty(XMPConstants.DUBLIN_CORE_NAMESPACE, "title");
assertEquals("Example document", prop.getValue().toString());
assertEquals("Example document", dcAdapter.getTitle());
prop = meta.getProperty(XMPConstants.XMP_BASIC_NAMESPACE, "CreateDate");
//System.out.println("Creation Date: " + prop.getValue() + " " + prop.getClass().getName());
prop = meta.getProperty(XMPConstants.XMP_BASIC_NAMESPACE, "CreatorTool");
assertEquals("An XML editor", prop.getValue().toString());
assertEquals("An XML editor", basicAdapter.getCreatorTool());
prop = meta.getProperty(XMPConstants.ADOBE_PDF_NAMESPACE, "Producer");
assertEquals("Apache FOP Version SVN trunk", prop.getValue().toString());
assertEquals("Apache FOP Version SVN trunk", pdfAdapter.getProducer());
prop = meta.getProperty(XMPConstants.ADOBE_PDF_NAMESPACE, "PDFVersion");
assertEquals("1.4", prop.getValue().toString());
assertEquals("1.4", pdfAdapter.getPDFVersion());
}
@Test
public void testParse1() throws Exception {
URL url = getClass().getResource("unknown-schema.xmp");
Metadata meta = XMPParser.parseXMP(url);
DublinCoreAdapter dcAdapter = DublinCoreSchema.getAdapter(meta);
XMPProperty prop;
//Access through the known schema as reference
prop = meta.getProperty(XMPConstants.DUBLIN_CORE_NAMESPACE, "title");
assertEquals("Unknown Schema", prop.getValue().toString());
assertEquals("Unknown Schema", dcAdapter.getTitle());
//Access through a schema unknown to the XMP framework
prop = meta.getProperty("http://unknown.org/something", "dummy");
assertEquals("Dummy!", prop.getValue().toString());
}
@Test
public void testParseStructures() throws Exception {
URL url = getClass().getResource("test-structures.xmp");
Metadata meta = XMPParser.parseXMP(url);
XMPProperty prop;
String testns = "http://foo.bar/test/";
prop = meta.getProperty(testns, "something");
assertEquals("blablah", prop.getValue().toString());
prop = meta.getProperty(testns, "ingredients");
XMPArray array = prop.getArrayValue();
assertEquals(3, array.getSize());
XMPStructure struct = array.getStructure(0);
assertEquals(2, struct.getPropertyCount());
prop = struct.getValueProperty();
assertEquals("Apples", prop.getValue());
prop = struct.getProperty(testns, "amount");
assertEquals("4", prop.getValue());
prop = meta.getProperty(testns, "villain");
XMPProperty prop1;
prop1 = prop.getStructureValue().getProperty(testns, "name");
assertEquals("Darth Sidious", prop1.getValue());
prop1 = prop.getStructureValue().getProperty(testns, "other-name");
assertEquals("Palpatine", prop1.getValue());
//Test shorthand form
prop = meta.getProperty(testns, "project");
prop1 = prop.getStructureValue().getProperty(testns, "name");
assertEquals("Apache XML Graphics", prop1.getValue());
prop1 = prop.getStructureValue().getProperty(testns, "url");
assertEquals("http://xmlgraphics.apache.org/", prop1.getValue());
}
@Test
public void testAttributeValues() throws Exception {
URL url = getClass().getResource("test-attribute-values.xmp");
Metadata meta = XMPParser.parseXMP(url);
DublinCoreAdapter dcAdapter = DublinCoreSchema.getAdapter(meta);
assertEquals("Ender's Game", dcAdapter.getTitle());
assertEquals("Orson Scott Card", dcAdapter.getCreators()[0]);
}
@Test
public void testParseDates() throws Exception {
URL url = getClass().getResource("test-dates.xmp");
Metadata meta = XMPParser.parseXMP(url);
XMPProperty prop;
DublinCoreAdapter dcAdapter = DublinCoreSchema.getAdapter(meta);
//Simple adapter access
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+2:00"));
cal.set(2006, Calendar.JUNE, 2, 10, 36, 40);
cal.set(Calendar.MILLISECOND, 0);
assertEquals(cal.getTime(), dcAdapter.getDate());
Date[] dates = dcAdapter.getDates();
assertEquals(2, dates.length);
//The second is the most recent and should match the simple value
assertEquals(dates[1], dcAdapter.getDate());
prop = meta.getProperty(XMPConstants.DUBLIN_CORE_NAMESPACE, "date");
assertNotNull(prop.getArrayValue());
assertEquals(2, prop.getArrayValue().getSize());
//Now add a new date and check if the adapter's getDate() method returns the new date.
cal.set(2008, Calendar.NOVEMBER, 1, 10, 10, 0);
dcAdapter.addDate(cal.getTime());
assertEquals(3, dcAdapter.getDates().length);
prop = meta.getProperty(XMPConstants.DUBLIN_CORE_NAMESPACE, "date");
assertNotNull(prop.getArrayValue());
assertEquals(3, prop.getArrayValue().getSize());
assertEquals(cal.getTime(), dcAdapter.getDate());
}
@Test
public void testParseEmptyValues() throws Exception {
URL url = getClass().getResource("empty-values.xmp");
Metadata meta = XMPParser.parseXMP(url);
DublinCoreAdapter dc = DublinCoreSchema.getAdapter(meta);
String title = dc.getTitle();
assertEquals("empty", title);
title = dc.getTitle("fr"); //Does not exist
assertNull(title);
title = dc.getTitle("de");
assertNull(title); //Empty value treated same as not existant
}
@Test
public void testExternalDTD() {
String payload = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<!DOCTYPE root [\n<!ENTITY % remote SYSTEM \"http://127.0.0.1:9999/eval.xml\">\n%remote;]>\n"
+ "<root></root>";
StreamSource streamSource = new StreamSource(new StringReader(payload));
String msg = "";
try {
XMPParser.parseXMP(streamSource);
} catch (TransformerException e) {
msg = e.getMessage();
}
assertTrue(msg, msg.contains("accessExternalDTD"));
}
}