[Bedework-commit] timezones r11 - trunk/tzutil/src/org/bedework/timezones/tzutil

svnadmin at bedework.org svnadmin at bedework.org
Wed Jan 16 15:46:31 EST 2008


Author: douglm
Date: 2008-01-16 15:46:30 -0500 (Wed, 16 Jan 2008)
New Revision: 11

Modified:
   trunk/tzutil/src/org/bedework/timezones/tzutil/Reader.java
Log:
Timezones reader changes

Modified: trunk/tzutil/src/org/bedework/timezones/tzutil/Reader.java
===================================================================
--- trunk/tzutil/src/org/bedework/timezones/tzutil/Reader.java	2008-01-16 03:51:18 UTC (rev 10)
+++ trunk/tzutil/src/org/bedework/timezones/tzutil/Reader.java	2008-01-16 20:46:30 UTC (rev 11)
@@ -91,6 +91,14 @@
 
   private static final QName rrule = new QName(icalNamespace, "rrule");
 
+  private static final QName freq = new QName(null, "freq");
+
+  private static final QName bymonth = new QName(null, "bymonth");
+
+  private static final QName bymonthday = new QName(null, "bymonthday");
+
+  private static final QName byday = new QName(null, "byday");
+
   private static final String observanceDaylight = "daylight";
 
   private static final String observanceStandard = "standard";
@@ -199,41 +207,38 @@
     nextStart();
 
     while (atStart()) {
-      QName endTag;
+      QName tag = rdr.getName();
 
-      if (observanceName.equals(rdr.getName())) {
+      if (observanceName.equals(tag)) {
         rdr.next();
         onameProp = rdr.getText();
-        endTag = observanceName;
-      } else if (tzname.equals(rdr.getName())) {
+      } else if (tzname.equals(tag)) {
         rdr.next();
         tznameProp = new TzName(rdr.getText());
-        endTag = tzname;
-      } else if (dtstart.equals(rdr.getName())) {
+      } else if (dtstart.equals(tag)) {
         rdr.next();
         dtstartProp = new DateTime(rdr.getText());
-        endTag = dtstart;
-      } else if (tzoffsetto.equals(rdr.getName())) {
+      } else if (tzoffsetto.equals(tag)) {
         rdr.next();
         toProp = new TzOffsetTo(new UtcOffset(rdr.getText()));
-        endTag = tzoffsetto;
-      } else if (tzoffsetfrom.equals(rdr.getName())) {
+      } else if (tzoffsetfrom.equals(tag)) {
         rdr.next();
         fromProp = new TzOffsetFrom(new UtcOffset(rdr.getText()));
-        endTag = tzoffsetfrom;
-      } else if (rrule.equals(rdr.getName())) {
-        rdr.next();
-        rruleProp = new RRule(new Recur(rdr.getText()));
-        endTag = rrule;
+      } else if (rrule.equals(tag)) {
+        rruleProp = parseRrule();
       } else {
-        error("Unexpected element " + rdr.getName());
+        error("Unexpected element " + tag);
         return null;
       }
 
-      if (!nextEnd(endTag) || !nextEndStart()) {
+      if ((tag != null) && !nextEnd(tag)) {
         return null;
       }
 
+      if (!nextEndStart()) {
+        return null;
+      }
+
       if (atEnd(observance)) {
         break;
       }
@@ -297,11 +302,68 @@
     return ob;
   }
 
+  private RRule parseRrule() throws Throwable {
+    String freqVal = null;
+    String bymonthVal = null;
+    String bymonthdayVal = null;
+    String bydayVal = null;
+
+    for (int i = 0; i < rdr.getAttributeCount(); i++) {
+      QName attName = rdr.getAttributeName(i);
+      if (debug) {
+        debugMsg("attr: " + attName);
+      }
+
+      if (freq.equals(attName)) {
+        freqVal = rdr.getAttributeValue(i);
+      } else if (bymonth.equals(attName)) {
+        bymonthVal = rdr.getAttributeValue(i);
+      } else if (bymonthday.equals(attName)) {
+        bymonthdayVal = rdr.getAttributeValue(i);
+      } else if (byday.equals(attName)) {
+        bydayVal = rdr.getAttributeValue(i);
+      } else {
+        error("Illegal rrule attribute " + attName);
+        return null;
+      }
+    }
+
+    StringBuilder sb = new StringBuilder();
+
+    if (freqVal == null) {
+      error("Require rrule freq attribute");
+      return null;
+    }
+
+    sb.append("FREQ=");
+    sb.append(freqVal);
+
+    if (bymonthVal != null) {
+      sb.append(";BYMONTH=");
+      sb.append(bymonthVal);
+    }
+
+    if (bymonthdayVal != null) {
+      sb.append(";BYMONTHDAY=");
+      sb.append(bymonthdayVal);
+    }
+
+    if (bydayVal != null) {
+      sb.append(";BYDAY=");
+      sb.append(bydayVal);
+    }
+
+    if (debug) {
+      debugMsg("rrule=" + sb.toString());
+    }
+    return new RRule(new Recur(sb.toString()));
+  }
+
   private void traceState(String id) {
     StringBuilder sb = new StringBuilder();
 
     sb.append(id);
-   sb.append(" - Event -type: ");
+    sb.append(" - Event -type: ");
 
     switch (rdr.getEventType()) {
     case XMLEvent.START_ELEMENT:



More information about the Bedework-commit mailing list