%@ page import="java.io.*" %>
<%@ page import="java.text.*" %>
<%@ page import="java.util.*" %>
<%@ page import="javax.xml.parsers.*" %>
<%@ page import="org.w3c.dom.*" %>
<%! private static final String TITLE_PREFIX = "Paul and Sarah's Crazy Road Trip Adventure - "; %>
<%! private static final String FILE_DATE_FORMAT = "MMMMM dd, yyyy"; %>
<%! private static final SimpleDateFormat fileDateFormatter = new SimpleDateFormat(FILE_DATE_FORMAT, Locale.US); %>
<%! private static final String TITLE_DATE_FORMAT = "MMM dd"; %>
<%! private static final SimpleDateFormat titleDateFormatter = new SimpleDateFormat(TITLE_DATE_FORMAT, Locale.US); %>
<%! private static final String HEADER_DATE_FORMAT = "EEEEE, MMMMM dd, yyyy"; %>
<%! private static final SimpleDateFormat headerDateFormatter = new SimpleDateFormat(HEADER_DATE_FORMAT, Locale.US); %>
<%! private static final String MONTH_DATE_FORMAT = "MMMMM"; %>
<%! private static final SimpleDateFormat monthDateFormatter = new SimpleDateFormat(MONTH_DATE_FORMAT, Locale.US); %>
<%! private static final String TAB = " "; %>
<%! private static final String SECTION_SPACER = "
"; %>
<%! private static final String TIME_FORMAT = "hh:mm a"; %>
<%! private static final SimpleDateFormat timeFormatter = new SimpleDateFormat(TIME_FORMAT, Locale.US); %>
<%
try {
%>
<%
final class EntryDetail implements Comparable {
private int sortOrder;
private String detailContent;
public EntryDetail (int sortOrder, String detailContent) {
this.sortOrder = sortOrder;
this.detailContent = detailContent;
}
public int compareTo (Object o) {
EntryDetail compareToEntryDetail = (EntryDetail)o;
if (sortOrder < compareToEntryDetail.getSortOrder()) return -1;
else if (sortOrder == compareToEntryDetail.getSortOrder()) return 0;
return 1;
}
public int getSortOrder() {
return sortOrder;
}
public String getDetailContent() {
return detailContent;
}
public boolean equals (Object o) {
return sortOrder == ((EntryDetail)o).getSortOrder();
}
public int hashCode () {
return sortOrder;
}
}
final class DayEntry implements Comparable {
private int sortOrder;
private String timeString;
private Set detailSet;
public DayEntry (int sortOrder, String timeString) {
this.sortOrder = sortOrder;
this.timeString = timeString;
detailSet = new TreeSet();
}
public int compareTo (Object o) {
DayEntry compareToDayEntry = (DayEntry)o;
if (sortOrder < compareToDayEntry.getSortOrder()) return -1;
else if (sortOrder == compareToDayEntry.getSortOrder()) return 0;
return 1;
}
public int getSortOrder() {
return sortOrder;
}
public String getTime() {
return timeString;
}
public void addDetail (EntryDetail entryDetail) {
detailSet.add(entryDetail);
}
public Set getDetail () {
return detailSet;
}
}
%>
<%
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
String requestURL = HttpUtils.getRequestURL(request).toString();
String urlFileNoExtension = requestURL.substring(0, requestURL.length() - 3);
Document document = builder.parse( urlFileNoExtension + "xml" );
Element docElem = document.getDocumentElement();
String destinationName = docElem.getAttribute("name");
// arrival date
NodeList arrivalNodes = docElem.getElementsByTagName("arrival");
Node arrivalNode = arrivalNodes.item(0).getFirstChild();
String arrivalNodeValue = arrivalNode.getNodeValue();
Date arrivalDate = fileDateFormatter.parse(arrivalNodeValue);
Calendar arrivalCal = Calendar.getInstance();
arrivalCal.setTime(arrivalDate);
arrivalCal.set(Calendar.HOUR_OF_DAY, 00);
// departure date
NodeList departureNodes = docElem.getElementsByTagName("departure");
Node departureNode = departureNodes.item(0).getFirstChild();
String departureNodeValue = departureNode.getNodeValue();
Date departureDate = fileDateFormatter.parse(departureNodeValue);
Calendar departureCal = Calendar.getInstance();
departureCal.setTime(departureDate);
departureCal.set(Calendar.HOUR_OF_DAY, 23);
// weather
Element weatherNode = (Element)docElem.getElementsByTagName("weather").item(0);
String low = weatherNode.getAttribute("low");
String high = weatherNode.getAttribute("high");
// schedule list
Element scheduleNode = (Element)docElem.getElementsByTagName("schedule").item(0);
NodeList dayNodes = scheduleNode.getElementsByTagName("day");
Map dayToEntriesMap = new HashMap();
for (int i = 0; i < dayNodes.getLength(); i++) {
Element dayNode = (Element)dayNodes.item(i);
String day = dayNode.getAttribute("date");
NodeList entryNodes = dayNode.getElementsByTagName("entry");
for (int j = 0; j < entryNodes.getLength(); j++) {
Element entryNode = (Element)entryNodes.item(j);
if (entryNode != null) {
String sortOrder = entryNode.getAttribute("sort");
String timeString = entryNode.getAttribute("time");
Set entries = (Set)dayToEntriesMap.get(day);
if (entries == null) {
entries = new TreeSet();
}
DayEntry dayEntry = new DayEntry(Integer.parseInt(sortOrder), timeString);
NodeList detailNodes = entryNode.getElementsByTagName("detail");
for (int k = 0; k < detailNodes.getLength(); k++) {
Element detailNode = (Element)detailNodes.item(k);
EntryDetail ed = new EntryDetail(Integer.parseInt(detailNode.getAttribute("sort")),
detailNode.getFirstChild().getNodeValue());
dayEntry.addDetail(ed);
}
entries.add(dayEntry);
dayToEntriesMap.put(day, entries);
}
}
}
// activities list
Element activitiesNode = (Element)docElem.getElementsByTagName("activities").item(0);
NodeList activitiesNodes = activitiesNode.getElementsByTagName("activity");
%>
<%= TITLE_PREFIX %><%= titleDateFormatter.format(arrivalDate) %> thru <%= titleDateFormatter.format(departureDate) %>
<%= SECTION_SPACER %>
Low: <%= low %> F
High:<%= high %> F
<%= SECTION_SPACER %>
<%
while (arrivalCal.before(departureCal)) {
%>
<%
if (dayToEntriesMap.containsKey(fileDateFormatter.format(arrivalCal.getTime()))) {
Set entries = (Set)dayToEntriesMap.get(fileDateFormatter.format(arrivalCal.getTime()));
Iterator iter = entries.iterator();
while (iter.hasNext()) {
DayEntry entry = (DayEntry)iter.next();
Set detailSet = entry.getDetail();
%>
<%= entry.getTime() %>
<%
Iterator detailIter = detailSet.iterator();
while (detailIter.hasNext()) {
EntryDetail entryDetail = (EntryDetail)detailIter.next();
%>
<%= TAB %>
<%= entryDetail.getDetailContent() %>
<%
}
}
}
%>
<%
arrivalCal.add(Calendar.DAY_OF_YEAR, 1);
}
%>
<%= SECTION_SPACER %>
<%
for (int i = 0; i < activitiesNodes.getLength(); i++) {
Node activity = activitiesNodes.item(i);
%>
<%= activity.getFirstChild().getNodeValue() %>
<%
}
%>
<%
} catch (Exception e) {
}
%>