/* Copyright 2004 The Apache Software Foundation * * Licensed 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. */ package org.apache.xmlbeans.samples.datetime; import java.io.File; import java.io.IOException; import java.util.Calendar; import java.util.ArrayList; import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlOptions; import org.apache.xmlbeans.XmlError; import org.apache.xmlbeans.XmlObject; import org.apache.xmlbeans.GDuration; import org.apache.xmlbeans.XmlDate; import org.apache.xmlbeans.XmlCalendar; import java.util.Calendar; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.xmlbeans.samples.datetime.ImportantDate; import org.apache.xmlbeans.samples.datetime.DatetimeDocument; /** * The sample illustrates how you can work with XML Schema types date, * dateTime, time, duration, gDay. * It parses the XML Document, prints first occurence of <important-date> * value, creates a new <important-date> element and saves it in a new XML Document. * This sample illustrates how you can convert XMLBean types to Java types * (java.util.Date, java.util.Calendar). * It uses the schema defined in datetime.xsd. */ public class DateTime { /** * Receives an XML Instance and prints the element values, * Also creates a new XML Instance. * * @param args An array containing * (a)Path to the XML Instance conforming to the XML schema in datetime.xsd. * (b)Path for creating a new XML Instance. */ public static void main(String args[]){ // Create an instance of this class to work with. DateTime dt = new DateTime(); // Create an instance of a Datetime type based on the received XML's schema DatetimeDocument doc = dt.parseXml(args[0]); // Prints the element values from the XML dt.printInstance(doc); // Creates a new XML and saves the file dt.createDocument(doc,args[1]); } /** * Creates a File from the XML path provided in main arguments, then * parses the file's contents into a type generated from schema. */ public DatetimeDocument parseXml(String file){ // Get the XML instance into a file using the path provided. File xmlfile = new File(file); // Create an instance of a type generated from schema to hold the XML. DatetimeDocument doc = null; try { // Parse the instance into the type generated from the schema. doc = DatetimeDocument.Factory.parse(xmlfile); } catch(XmlException e){ e.printStackTrace(); } catch(IOException e){ e.printStackTrace(); } return doc; } /** * This method prints first occurence of <important-date> * value. It also prints converted values from XMLBean types to Java types * (java.util.Date, java.util.Calendar) and org.apache.xmlbeans.GDate. */ public void printInstance(DatetimeDocument doc){ // Retrieve the <datetime> element and get an array of // the <important-date> elements it contains. DatetimeDocument.Datetime dtelement = doc.getDatetime(); ImportantDate[] impdate = dtelement.getImportantDateArray(); // Loop through the <important-date> elements, printing the // values for each. for (int i=0;i<impdate.length;i++){ //For purpose of simplicity in output, only first occurrence is printed. if (i==0){ //Retrieving all <holiday> elements within <important-date> element XmlDate[] holiday = impdate[i].xgetHolidayArray(); System.out.println("Holiday(xs:date): "); for (int j=0;j<holiday.length;j++){ if (j==0){ //XmlDate to java.util.Calendar,org.apache.xmlbeans.GDate, java.util.Date System.out.println("Calendar:" + holiday[j].getCalendarValue() ); System.out.println("Date:"+holiday[j].getDateValue() ); System.out.println("GDate:"+holiday[j].getGDateValue() +"\n"); } } //XmlTime to java.util.Calendar, org.apache.xmlbeans.GDate, java.util.Date System.out.println("Fun Begin Time(xs:time): "); System.out.println("Calendar:"+impdate[i].getFunBeginTime()); System.out.println("GDate:"+impdate[i].xgetFunBeginTime().getGDateValue() ); //To convert java.util.Calendar to java.util.Date SimpleDateFormat sdf = new SimpleDateFormat("H:mm:ss"); Date dt = impdate[i].getFunBeginTime().getTime(); System.out.println("Date:"+ sdf.format(dt) +"\n" ); //XmlDuration to org.apache.xmlbeans.GDuration System.out.println("Job Duration(xs:duration): "); System.out.println("GDuration:"+impdate[i].getJobDuration() +"\n" ); //XmlDate to Calendar,GDate, Date System.out.println("Birth DateTime(xs:dateTime): "); System.out.println("Calendar:"+impdate[i].getBirthdatetime()); System.out.println("Date:"+impdate[i].xgetBirthdatetime().getDateValue()); System.out.println("GDate:"+impdate[i].xgetBirthdatetime().getGDateValue() +"\n" ); //XmlGday to Calendar,GDate, Day - primitive java int System.out.println("Pay Day(xs:gDay): "); System.out.println("Calendar:"+impdate[i].getPayday()); System.out.println("GDate:"+impdate[i].xgetPayday().getGDateValue()); System.out.println("Day:"+ impdate[i].xgetPayday().getGDateValue().getDay() +"\n" ); System.out.println("\n\n"); } } } /** * This method creates an new <important-date> element and attaches to the existing XML Instance, and saves the * new Instance to a file(args[1]). */ public void createDocument(DatetimeDocument doc , String file){ // Retrieve the <datetime> element and add a new <important-date> element. DatetimeDocument.Datetime dtelement = doc.getDatetime(); // // add an important date using XmlCalendar // ImportantDate impdate = dtelement.addNewImportantDate(); //Creating value for <holiday> element Calendar holiday = new XmlCalendar("2004-07-04"); //Creating value for <fun-begin-time> element Calendar funbegintime = new XmlCalendar("10:30:33"); //Creating value for <fun-end-time> element Calendar funendtime = new XmlCalendar("12:40:12"); //Creating value for <birthdatetime> element Calendar birthdatetime = new XmlCalendar("1977-11-29T10:10:12"); //Creating value for <job-duration> element GDuration jobduration = new GDuration(1,2,4,5,10,12,15,null); //Creating value for <payday> element Calendar payday = new XmlCalendar("---12"); //Setting all the elements impdate.addHoliday(holiday); impdate.setFunBeginTime(funbegintime); impdate.setFunEndTime(funendtime); impdate.setJobDuration(jobduration); impdate.setBirthdatetime(birthdatetime); impdate.setPayday(payday); impdate.setDescription("Using XmlCalendar"); // // add another important date using Calendar // impdate = dtelement.addNewImportantDate(); //Creating value for <holiday> element using XmlCalendar holiday = new XmlCalendar("2004-07-04"); //Creating value for <fun-begin-time> element using GregorianCalendar funbegintime = Calendar.getInstance(); funbegintime.clear(); funbegintime.set(Calendar.AM_PM , Calendar.AM); funbegintime.set(Calendar.HOUR, 10); funbegintime.set(Calendar.MINUTE, 30 ); funbegintime.set(Calendar.SECOND, 35 ); //Creating value for <fun-end-time> element funendtime = Calendar.getInstance(); funendtime.clear(); funendtime.set(Calendar.AM_PM , Calendar.AM); funendtime.set(Calendar.HOUR, 12); funendtime.set(Calendar.MINUTE, 40 ); funendtime.set(Calendar.SECOND, 12 ); //Creating value for <birthdatetime> element birthdatetime = Calendar.getInstance(); birthdatetime.clear(); birthdatetime.set(1977,10,29,10,10,12); //Creating value for <job-duration> element jobduration = new GDuration(1,2,4,5,10,12,15,null); //Creating value for <payday> element payday = Calendar.getInstance(); payday.clear(); payday.set(Calendar.DAY_OF_MONTH,12); //Setting all the elements impdate.addHoliday(holiday); impdate.setFunBeginTime(funbegintime); impdate.setFunEndTime(funendtime); impdate.setJobDuration(jobduration); impdate.setBirthdatetime(birthdatetime); impdate.setPayday(payday); impdate.setDescription("Using Calendar"); XmlOptions xmlOptions = new XmlOptions(); xmlOptions.setSavePrettyPrint(); // Validate the new XML boolean isXmlValid = validateXml(doc); if (isXmlValid) { File f = new File(file); try{ //Writing the XML Instance to a file. doc.save(f,xmlOptions); } catch(IOException e){ e.printStackTrace(); } System.out.println("\nXML Instance Document saved at : " + f.getPath()); } } /** * <p>Validates the XML, printing error messages when the XML is invalid. Note * that this method will properly validate any instance of a compiled schema * type because all of these types extend XmlObject.</p> * * <p>Note that in actual practice, you'll probably want to use an assertion * when validating if you want to ensure that your code doesn't pass along * invalid XML. This sample prints the generated XML whether or not it's * valid so that you can see the result in both cases.</p> * * @param xml The XML to validate. * @return <code>true</code> if the XML is valid; otherwise, <code>false</code> */ public boolean validateXml(XmlObject xml) { boolean isXmlValid = false; // A collection instance to hold validation error messages. ArrayList validationMessages = new ArrayList(); // Validate the XML, collecting messages. isXmlValid = xml.validate(new XmlOptions().setErrorListener(validationMessages)); if (!isXmlValid) { System.out.println("Invalid XML: "); for (int i = 0; i < validationMessages.size(); i++) { XmlError error = (XmlError) validationMessages.get(i); System.out.println(error.getMessage()); System.out.println(error.getObjectLocation()); } } return isXmlValid; } }