Класс DateTime
Класс DateTime используется для представления даты. Он основан на следующем фрагменте DTD:
<!ENTITY % date_time "(day_of_week?.month?,day_of_month?, year?,(hour,minute,seconds?)?)"> <!ELEMENT day_of_week (#PCDATA)> <!ELEMENT month (#PCDATA)> <!ELEMENT day_of_month (#PCOATA)> <!ELEMENT year (#PCDATA)> <!ELEMENT hour (#PCDATA)> <!ELEMENT minute (#PCDATA)> <!ELEMENT seconds (#PCDATA)>
Параметрическая сущность datejtime используется для представления даты и времени. В DTD каталога эта сущность задействуется только в элементе onsale_date, но, если расширить DTD, ее можно использовать и в других местах. В классе DateTime имеется свое поле для каждого из элементов, определенных в DTD. Также в нем имеются два конструктора, один из которых не имеет аргументов, а другому в качестве аргумента передается элемент, подлежащий анализу. Они показаны в листинге 6.34.
Листинг 6.34. Начало кода класса DateTime (DateTime.java)
package com.XmlEcomBook.Chap06;
import org.w3c.dom.Element; import java.util.StringTokenizer; import java.io.IOException; import java.io.OutputStream;
public class DateTime extends Object {
private String dayOfWeek = null; private Integer month = null; private Integer dayOfMonth = null; private Integer year = null; private Integer hour = null; private Integer minute = null; private Integer seconds = null;
public DateTime() { }
public DateTime(Element dateElement) { dayOfWeek = Util.extractTextFrom( "day_of_week", dateElement ); month = Util.extractIntFrom( "month", dateElement ); dayOfMonth = Util.extractIntFrom ( "day_of_month", dateElement ); year = Util.extractIntFrom( "year", dateElement ); hour = Util.extractIntFrom( "hour", dateElement ); minute = Util.extractIntFrom( "minute", dateElement ); seconds = Util.extractIntFrom( "seconds", dateElement ); }
Класс DateTime анализирует дату и время, полученные из форм HTML. Анализ осуществляется с помощью метода fromString, приведенного в листинге 6.36. Этот метод использует объект StringTokerrizer для разделения строки на фрагменты — лексемы. Каждая лексема, выделенная из строки объектом String- Tokenizer, проходит проверку. Если лексема содержит в себе строку day (день), то это день недели, и соответствующее значение сохраняется в поле dayOfWeek (день недели). Так как часть строки, содержащая дату, разделена символами дефиса (-), то при обнаружении такого символа из строки выделяются лексемы, идентифицирующие месяц, день месяца и год. Если в строке обнаружен символ двоеточия (:), то это указывает, что данная часть строки содержит значение времени суток, поэтому из строки выделяются часы, минуты и секунды.
Листинг 6.35. Метод fromString (DateTime.java)
public void fromString( String newDate ) { StringTokenizer tokenizer = new StringTokenizer( newDate, " " ); while( tokenizer.hasMoreTokens() ) { String next = tokenizer.nextToken(); if( next.indexOf( "day" ) > 0 ) { dayOfWeek = next; } if( next.indexOf( '-' ) > 0 ) { int first = next.indexOf( '-' ); int second = next.indexOf( '-', first + 1 ); month = new Integer( next.substring( 0, first ) ); dayOfMonth = new Integer( next.substring( first + 1, second ) ); year = new Integer( next.substring( second + 1, next.length() ) ); } if( next.indexOf( ':' ) > 0 ) { int first = next.indexOf( ':' ); int second = next.indexOf( ':', first + 1 ); hour = new Integer( next.substring( 0, first ) ); minute = new Integer( next.substring( first + 1, second ) ); seconds = new Integer( next.substring( second + 1, next.length() ) ); } } }
Последний метод этого класса, toXML, показан в листинге 6.36. Он аналогичен другим методам toXML, и записывает по отдельности значение каждого поля, снабжая его соответствующими тегами.
Листинг 6.36. Метод toXML (DateTime.java)
public void toXML( XMLWriter writer ) throws IOException { writer.writeln( "<onsale_date>" ); writer.indent(); if( dayOfWeek != null ) writer.writeln( "<day_of_week>" + dayOfWeek + "</day_of_week>" ); if( month != null ) writer.writeln( "<month>" + month + "</month>" ); if( dayOfMonth != null ) writer.writeln( "<day_of_month>" + dayOfMonth + "</day_of_month>" ); if( year != null ) writer.writeln( "<year>" + year + "</year>" ); if( hour != null ) writer.writeln( "<hour>" + hour + "</hour>" ); if( minute != null ) writer.writeln( "<minute>" + minute + "</minute>" ); if( seconds != null ) writer.writeln( "<seconds>" + seconds + "</seconds>" ); writer.unindent(); writer.writeln( "</onsale_date>" ); } }