/* * Copyright (c) 2007, James Leigh All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * - 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. * - Neither the name of the openrdf.org nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * 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 OWNER 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. * */ package org.openrdf.repository.object; import java.util.Calendar; import java.util.Collection; import java.util.Currency; import java.util.Date; import java.util.GregorianCalendar; import java.util.Iterator; import java.util.TimeZone; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; import junit.framework.Test; import org.openrdf.annotations.Iri; import org.openrdf.model.Literal; import org.openrdf.model.Resource; import org.openrdf.model.URI; import org.openrdf.model.ValueFactory; import org.openrdf.model.impl.LiteralImpl; import org.openrdf.model.impl.URIImpl; import org.openrdf.model.vocabulary.RDF; import org.openrdf.model.vocabulary.RDFS; import org.openrdf.model.vocabulary.XMLSchema; import org.openrdf.repository.Repository; import org.openrdf.repository.RepositoryConnection; import org.openrdf.repository.RepositoryException; import org.openrdf.repository.object.advisers.helpers.CachedPropertySet; import org.openrdf.repository.object.advisers.helpers.PropertySetModifier; import org.openrdf.repository.object.base.RepositoryTestCase; import org.openrdf.repository.object.config.ObjectRepositoryConfig; import org.openrdf.repository.object.config.ObjectRepositoryFactory; import org.openrdf.repository.object.exceptions.ObjectConversionException; import org.openrdf.repository.object.exceptions.ObjectPersistException; import org.openrdf.repository.object.traits.ManagedRDFObject; import org.openrdf.rio.RDFFormat; public class LiteralTest extends RepositoryTestCase { public static Test suite() throws Exception { return RepositoryTestCase.suite(LiteralTest.class); } private ObjectRepository factory; private ObjectConnection manager; private URI dateURI = new URIImpl("urn:aDate"); private ObjectRepositoryConfig module; @Override public void setUp() throws Exception { module = new ObjectRepositoryConfig(); module.addBehaviour(TestSupport.class); module.addConcept(TestConcept.class); module.addDatatype(SomeLiteral.class, new URIImpl("urn:SomeLiteral")); super.setUp(); RepositoryConnection connection = repository.getConnection(); // import RDF schema and datatype hierarchy connection.add(getClass().getResourceAsStream( "/testcases/schemas/rdfs-schema.rdf"), "", RDFFormat.RDFXML); connection.add(getClass().getResourceAsStream( "/testcases/schemas/owl-schema.rdf"), "", RDFFormat.RDFXML); connection.add(getClass().getResourceAsStream( "/testcases/schemas/xsd-datatypes.rdf"), "", RDFFormat.RDFXML); connection.close(); factory = (ObjectRepository) repository; this.manager = factory.getConnection(); } @Override protected Repository getRepository() throws Exception { return new ObjectRepositoryFactory().createRepository(module,super.getRepository()); } @Override protected void tearDown() throws Exception { manager.close(); factory.shutDown(); super.tearDown(); } private ValueFactory getValueFactory() { return manager.getValueFactory(); } public void testCalendar() throws Exception { TestConcept tester = manager.addDesignation(manager.getObjectFactory().createObject(), TestConcept.class); assertFalse(tester.equal(new Object(), new Object())); Calendar cal = Calendar.getInstance(); cal.set(1970, 0, 1, 0, 0, 0); cal.set(Calendar.MILLISECOND, 0); tester.setADate(cal.getTime()); Date date2 = tester.getADate(); assertEquals(cal.getTime(), date2); } public void testDate() throws Exception { TestConcept tester = manager.addDesignation(manager.getObjectFactory().createObject(), TestConcept.class); Calendar cal = Calendar.getInstance(); cal.set(1970, 0, 1, 0, 0, 0); cal.set(Calendar.MILLISECOND, 0); Date date = cal.getTime(); tester.setADate(date); cal.setTime(tester.getADate()); assertEquals(date, cal.getTime()); } public void testDay() throws Exception { TestConcept tester = manager.addDesignation(manager.getObjectFactory().createObject(), TestConcept.class); Resource bNode = (Resource) manager.addObject(tester); Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); cal.set(1970, 0, 1, 0, 0, 0); cal.set(Calendar.MILLISECOND, 0); Date date = cal.getTime(); try { manager.add(bNode, dateURI, getValueFactory().createLiteral( "1970-01-01Z", XMLSchema.DATE)); } catch (RepositoryException e) { throw new ObjectPersistException(e); } cal.setTime(tester.getADate()); assertEquals(date, cal.getTime()); } public void testDateTimeS() throws Exception { TestConcept tester = manager.addDesignation(manager.getObjectFactory().createObject(), TestConcept.class); Resource bNode = (Resource) manager.addObject(tester); Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); cal.set(2001, 6, 4, 12, 8, 56); cal.set(Calendar.MILLISECOND, 0); cal.set(Calendar.ZONE_OFFSET, -7 * 60 * 60 * 1000); try { manager.add(bNode, dateURI, getValueFactory().createLiteral( "2001-07-04T12:08:56-07:00", XMLSchema.DATETIME)); } catch (RepositoryException e) { throw new ObjectPersistException(e); } Date date = tester.getADate(); assertEquals(cal.getTime(), date); } public void testDateTimeMS() throws Exception { TestConcept tester = manager.addDesignation(manager.getObjectFactory().createObject(), TestConcept.class); Resource bNode = (Resource) manager.addObject(tester); Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); cal.set(2001, 6, 4, 12, 8, 56); cal.set(Calendar.MILLISECOND, 27); cal.set(Calendar.ZONE_OFFSET, -7 * 60 * 60 * 1000); try { Literal literal = getValueFactory().createLiteral( "2001-07-04T12:08:56.027-07:00", XMLSchema.DATETIME); manager.add(bNode, dateURI, literal); } catch (RepositoryException e) { throw new ObjectPersistException(e); } Date date = tester.getADate(); assertEquals(cal.getTime(), date); } public void testInteger() throws Exception { TestConcept tester = manager.addDesignation(manager.getObjectFactory().createObject(), TestConcept.class); Integer integer = new Integer(72); tester.setInteger(integer); assertEquals(integer, tester.getInteger()); } public void testCurrency() throws Exception { TestConcept tester = manager.addDesignation(manager.getObjectFactory().createObject(), TestConcept.class); Currency cur = Currency.getInstance("CAD"); tester.setCurrency(cur); assertEquals(cur, tester.getCurrency()); } public void testSomeLiteral() throws Exception { TestConcept tester = manager.addDesignation(manager.getObjectFactory().createObject(), TestConcept.class); SomeLiteral so = new SomeLiteral("blah"); tester.setSomeLiteral(so); assertEquals(so, tester.getSomeLiteral()); } public void testMixProperty() throws Exception { TestConcept tester = manager.addDesignation(manager.getObjectFactory().createObject(), TestConcept.class); Resource bNode = (Resource) manager.addObject(tester); manager.add(getValueFactory().createURI("urn:SomeLiteral"), RDFS.SUBCLASSOF, RDFS.LITERAL); manager.add(bNode, RDFS.SEEALSO, new LiteralImpl("a string")); manager.add(bNode, RDFS.SEEALSO, new LiteralImpl("a literal object", new URIImpl("urn:SomeLiteral"))); manager.add(bNode, RDFS.SEEALSO, new URIImpl("urn:aResourceTester")); manager.add(getValueFactory().createURI("urn:aResourceTester"), RDF.TYPE, new URIImpl("urn:TestConcept")); Collection<Object> col = new CachedPropertySet((ManagedRDFObject) tester, new PropertySetModifier(RDFS.SEEALSO)); int stringCount = 0; int someLiteralCount = 0; int resourceTestObjectCount = 0; Iterator<Object> it = col.iterator(); try { while (it.hasNext()) { Object res = it.next(); if (!(res instanceof RDFObject)) { if (res instanceof String) { stringCount++; } else if (res instanceof SomeLiteral) { someLiteralCount++; } else { fail("unknow literal: " + res.getClass()); } } else { if (res instanceof TestConcept) { resourceTestObjectCount++; } else { fail("unknow resource: " + res.getClass()); } } } } finally { manager.close(it); } assertEquals(1, resourceTestObjectCount); assertEquals(1, someLiteralCount); assertEquals(1, stringCount); } public void testEnums() throws Exception { TestConcept tester = manager.addDesignation(manager.getObjectFactory().createObject(), TestConcept.class); tester.setEnumLiteral(EnumLiteral.ONE); assertEquals(EnumLiteral.ONE, tester.getEnumLiteral()); } public static enum EnumLiteral { ONE, TWO, THREE } public interface TestBehaviour { public Date getADate(); public void setADate(Date date); public boolean equal(Object o1, Object o2); } @Iri("urn:TestConcept") public interface TestConcept extends TestBehaviour { @Iri("urn:integer") public Integer getInteger(); public void setInteger(Integer integer); @Iri("urn:someLiteral") public SomeLiteral getSomeLiteral(); public void setSomeLiteral(SomeLiteral someLiteral); @Iri("urn:enumLiteral") public EnumLiteral getEnumLiteral(); public void setEnumLiteral(EnumLiteral value); @Iri("urn:currency") public Currency getCurrency(); public void setCurrency(Currency currency); @Iri("urn:aDate") public abstract XMLGregorianCalendar getXMLGregorianCalendar(); public abstract void setXMLGregorianCalendar(XMLGregorianCalendar date); } public static abstract class TestSupport implements TestConcept { public Date getADate() { XMLGregorianCalendar xgc = getXMLGregorianCalendar(); if (xgc == null) return null; return xgc.toGregorianCalendar().getTime(); } public void setADate(Date date) { DatatypeFactory factory; try { factory = DatatypeFactory.newInstance(); } catch (DatatypeConfigurationException e) { throw new ObjectConversionException(e); } GregorianCalendar gc = new GregorianCalendar(0, 0, 0); gc.setTime(date); XMLGregorianCalendar xgc = factory.newXMLGregorianCalendar(gc); setXMLGregorianCalendar(xgc); } public boolean equal(Object o1, Object o2) { return o1.equals(o2); } } public static class SomeLiteral { public String value; public SomeLiteral(CharSequence string) { value = string.toString(); } @Override public String toString() { return value; } @Override public boolean equals(Object o) { return value.equals(o.toString()); } } }