blob: 7f6db7c264d859a18c63c2ca4ce8179d528f08fa [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.oxm.xmlconversionmanager;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.StringReader;
import java.util.Calendar;
import java.util.TimeZone;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeConstants;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.Duration;
import javax.xml.datatype.XMLGregorianCalendar;
import org.eclipse.persistence.Version;
import org.eclipse.persistence.internal.helper.ClassConstants;
import org.eclipse.persistence.internal.helper.JavaPlatform;
import org.eclipse.persistence.internal.oxm.XMLConversionManager;
import org.eclipse.persistence.oxm.XMLConstants;
import org.eclipse.persistence.oxm.XMLContext;
import org.eclipse.persistence.testing.oxm.OXTestCase;
import org.eclipse.persistence.testing.oxm.mappings.XMLMappingTestCases;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
public class XMLGregorianCalendarTestCases extends XMLMappingTestCases {
private DatatypeProject proj = new DatatypeProject();
public XMLGregorianCalendarTestCases(String name) throws Exception {
super(name);
setProject(proj);
setControlDocument("org/eclipse/persistence/testing/oxm/xmlconversionmanager/emp.xml");
}
@Override
public void setUp() throws Exception {
super.setUp();
getXmlConversionManager().setTimeZoneQualified(true);
getXmlConversionManager().setTimeZone(TimeZone.getTimeZone("GMT+3"));
}
@Override
public Object getControlObject() {
try {
Calendar cal = Calendar.getInstance();
cal.clear();
cal.set(1976, Calendar.FEBRUARY, 17, 06, 15, 30);
cal.setTimeZone(TimeZone.getTimeZone("GMT+3"));
XMLGregorianCalendar xcal = DatatypeFactory.newInstance().newXMLGregorianCalendar();
xcal.setYear(2009);
xcal.setMonth(2);
xcal.setDay(17);
xcal.setHour(07);
xcal.setMinute(30);
xcal.setSecond(0);
xcal.setMillisecond(0);
xcal.setTimezone(+180);
Duration dur = DatatypeFactory.newInstance().newDurationDayTime(true, 14, 3, 30, 0);
DatatypeEmployee emp = new DatatypeEmployee();
emp.name = "Alan Smithee";
emp.deptNumber = 172;
emp.birthDate = cal;
emp.hireDate = xcal;
emp.vacationTaken = dur;
return emp;
} catch (DatatypeConfigurationException dce) {
dce.printStackTrace();
return null;
}
}
@Override
public Document getWriteControlDocument() throws Exception {
InputStream inputStream = ClassLoader.getSystemResourceAsStream("org/eclipse/persistence/testing/oxm/xmlconversionmanager/emp-write.xml");
Document doc = parser.parse(inputStream);
removeEmptyTextNodes(doc);
inputStream.close();
return doc;
}
public void testRoundtrip() throws Exception {
getXmlConversionManager().setTimeZoneQualified(true);
Document controlDoc = getWriteControlDocument();
InputStream inputStream = ClassLoader.getSystemResourceAsStream("org/eclipse/persistence/testing/oxm/xmlconversionmanager/emp.xml");
Object objFromXML = xmlUnmarshaller.unmarshal(inputStream);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
xmlMarshaller.marshal(objFromXML, outputStream);
StringReader sreader = new StringReader(outputStream.toString());
InputSource inputSource = new InputSource(sreader);
Document testDoc = parser.parse(inputSource);
removeEmptyTextNodes(testDoc);
sreader.close();
assertXMLIdentical(controlDoc, testDoc);
}
public void testRoundtripNoTimeZone() throws Exception {
// Temporarily undo the TimeZone configuration so that our Object will be
// in the VM's time zone:
getXmlConversionManager().setTimeZone(null);
Document controlDoc = getWriteControlDocument();
InputStream inputStream = ClassLoader.getSystemResourceAsStream("org/eclipse/persistence/testing/oxm/xmlconversionmanager/emp.xml");
Object objFromXML = xmlUnmarshaller.unmarshal(inputStream);
// Now set the TimeZone again, to ensure XMLConversionManager is making the
// proper adjustments:
getXmlConversionManager().setTimeZone(TimeZone.getTimeZone("GMT+3"));
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
xmlMarshaller.marshal(objFromXML, outputStream);
StringReader sreader = new StringReader(outputStream.toString());
InputSource inputSource = new InputSource(sreader);
Document testDoc = parser.parse(inputSource);
removeEmptyTextNodes(testDoc);
sreader.close();
assertXMLIdentical(controlDoc, testDoc);
}
public void testConversionFromObjectWithSchemaType() throws Exception {
XMLGregorianCalendar aCal = DatatypeFactory.newInstance().newXMLGregorianCalendar();
aCal.setYear(2009);
aCal.setMonth(2);
aCal.setDay(17);
aCal.setHour(07);
aCal.setMinute(30);
aCal.setSecond(0);
aCal.setMillisecond(0);
aCal.setTimezone(+180);
String testString;
String gDayString = "---17+03:00";
String gMonthString = "--02+03:00";
String gMonthDayString = "--02-17+03:00";
String gYearString = "2009+03:00";
String gYearMonthString = "2009-02+03:00";
String dateString = "2009-02-17+03:00";
String timeString = "07:30:00+03:00";
String dateTimeString = "2009-02-17T07:30:00.000+03:00";
testString = (String) getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.G_DAY_QNAME);
assertEquals("Object to String conversion failed.", gDayString, testString);
testString = (String) getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.G_MONTH_QNAME);
assertEquals("Object to String conversion failed.", gMonthString, testString);
testString = (String) getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.G_MONTH_DAY_QNAME);
assertEquals("Object to String conversion failed.", gMonthDayString, testString);
testString = (String) getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.G_YEAR_QNAME);
assertEquals("Object to String conversion failed.", gYearString, testString);
testString = (String) getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
assertEquals("Object to String conversion failed.", gYearMonthString, testString);
testString = (String) getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.DATE_QNAME);
assertEquals("Object to String conversion failed.", dateString, testString);
testString = (String) getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.TIME_QNAME);
assertEquals("Object to String conversion failed.", timeString, testString);
testString = (String) getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.DATE_TIME_QNAME);
assertEquals("Object to String conversion failed.", dateTimeString, testString);
}
public void testConversionFromStringWithSchemaType() throws Exception {
String aString = "2009-02-17T07:30:00.000+03:00";
XMLGregorianCalendar c = getXmlConversionManager().convertStringToXMLGregorianCalendar(aString, XMLConstants.DATE_QNAME);
assertEquals("Calendar's 'hour' field was not cleared.", c.getHour(), DatatypeConstants.FIELD_UNDEFINED);
assertEquals("Calendar's 'minute' field was not cleared.", c.getMinute(), DatatypeConstants.FIELD_UNDEFINED);
assertEquals("Calendar's 'second' field was not cleared.", c.getSecond(), DatatypeConstants.FIELD_UNDEFINED);
assertEquals("Calendar's 'millisecond' field was not cleared.", c.getMillisecond(), DatatypeConstants.FIELD_UNDEFINED);
assertNotSame("Calendar's 'year' field was not set.", c.getYear(), DatatypeConstants.FIELD_UNDEFINED);
assertNotSame("Calendar's 'month' field was not set.", c.getMonth(), DatatypeConstants.FIELD_UNDEFINED);
assertNotSame("Calendar's 'day' field was not set.", c.getDay(), DatatypeConstants.FIELD_UNDEFINED);
}
public void testConversionFromEmptyString() throws Exception {
String aString = "";
try {
XMLGregorianCalendar c = getXmlConversionManager().convertStringToXMLGregorianCalendar(aString);
} catch(Exception ex) {
fail("An unexpect exception was thrown when coverting empty string to Gregorian Calendar");
}
}
public XMLConversionManager getXmlConversionManager() {
return (XMLConversionManager) xmlContext.getSession(0).getDatasourceLogin().getDatasourcePlatform().getConversionManager();
}
}