summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryvesf <yvesf-git@xapek.org>2011-02-28 21:06:09 +0100
committeryvesf <yvesf-git@xapek.org>2011-02-28 21:06:09 +0100
commit70a30b84d932119c010693486c36a22860859697 (patch)
treedf2c36767ddbe7f08bf7d1374ce3fb16c3de66d5
parent81c863c5bebaabb5ce70674b6b1a49e6bab4bda1 (diff)
downloaddhbw-calendar-70a30b84d932119c010693486c36a22860859697.tar.gz
dhbw-calendar-70a30b84d932119c010693486c36a22860859697.zip
Korrigiere Fehler bei der Behandlung von Zeitzonen (closes gh-1)
-rw-r--r--src/main/java/de/dhbw/horb/calendar/dualis/DualisConnection.java44
-rw-r--r--src/main/java/de/dhbw/horb/calendar/ics/AbstractICSType.java12
-rw-r--r--src/main/java/de/dhbw/horb/calendar/ics/VEvent.java36
3 files changed, 52 insertions, 40 deletions
diff --git a/src/main/java/de/dhbw/horb/calendar/dualis/DualisConnection.java b/src/main/java/de/dhbw/horb/calendar/dualis/DualisConnection.java
index f7bf369..7d13c47 100644
--- a/src/main/java/de/dhbw/horb/calendar/dualis/DualisConnection.java
+++ b/src/main/java/de/dhbw/horb/calendar/dualis/DualisConnection.java
@@ -4,8 +4,9 @@ import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
-import java.util.Date;
+import java.util.Calendar;
import java.util.List;
+import java.util.TimeZone;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
@@ -32,7 +33,7 @@ public class DualisConnection {
/**
* Baut eine Verbindung mit Dualis auf und führt einen Login durch
- *
+ *
* @param username
* Dualis Benutzername
* @param password
@@ -47,7 +48,6 @@ public class DualisConnection {
this.password = password;
}
- @SuppressWarnings("deprecation")
public List<VEvent> getEvents() throws FailingHttpStatusCodeException,
IOException, DualisScrapingException, DualisAuthenticationException {
HtmlPage page, loginPage;
@@ -107,16 +107,22 @@ public class DualisConnection {
}
page = anchorMonat.click();
+ getEventsFromPage(page, events);
+
+ return events;
+ }
+
+ private void getEventsFromPage(HtmlPage page, final List<VEvent> events) {
for (HtmlElement elem : page.getElementsByTagName("div")) {
if (!elem.getAttribute("class").equals("tbMonthDay"))
continue;
- final Date day;
+ final Calendar cday = Calendar.getInstance();
Object dayTitle = elem
.getFirstByXPath("div[@class='tbsubhead']/a/@title");
if (dayTitle instanceof DomAttr) {
String value = ((DomAttr) dayTitle).getValue();
try {
- day = dateFormat.parse(value);
+ cday.setTime(dateFormat.parse(value));
} catch (ParseException e) {
e.printStackTrace();
continue;
@@ -136,35 +142,35 @@ public class DualisConnection {
String timeEnd = matcher.group(2);
String room = matcher.group(3);
String title = matcher.group(4);
- System.out.println(timeStart + "-" + timeEnd + "-" + room
- + "-" + title + "-" + day);
int hStart = Integer.parseInt(timeStart.split(":")[0]);
int mStart = Integer.parseInt(timeStart.split(":")[1]);
int hEnd = Integer.parseInt(timeEnd.split(":")[0]);
int mEnd = Integer.parseInt(timeEnd.split(":")[1]);
- Date start = (Date) day.clone();
- start.setHours(hStart);
- start.setMinutes(mStart);
- Date end = (Date) day.clone();
- end.setHours(hEnd);
- end.setMinutes(mEnd);
- VEvent event = new VEvent.Builder().dtstart(start)
- .dtstamp(start).dtend(end).summary(title).description(title)
+ Calendar cstart = (Calendar) cday.clone();
+ cstart.set(Calendar.HOUR_OF_DAY, hStart);
+ cstart.set(Calendar.MINUTE, mStart);
+
+ Calendar cend = (Calendar) cday.clone();
+ cend.set(Calendar.HOUR_OF_DAY, hEnd);
+ cend.set(Calendar.MINUTE, mEnd);
+
+ cstart.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
+ cend.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
+ VEvent event = new VEvent.Builder().dtstart(cstart)
+ .dtstamp(cstart).dtend(cend).summary(title).description(title)
.location(room).status("CONFIRMED").build();
events.add(event);
} else {
- System.err.println("Skip: " + desc + " at day " + day);
+ System.err.println("Skip: " + desc + " at day " + cday.getTime());
}
}
}
-
- return events;
}
// Parse Dates
private static final SimpleDateFormat dateFormat = new SimpleDateFormat(
"dd.MM.yyyy");
-
+
// Appointment Link Title
// example: 08:15 - 10:45 / HOR-121 / Open Source Systeme
private static final Pattern appLinkPattern = Pattern
diff --git a/src/main/java/de/dhbw/horb/calendar/ics/AbstractICSType.java b/src/main/java/de/dhbw/horb/calendar/ics/AbstractICSType.java
index 3b6019d..a03de64 100644
--- a/src/main/java/de/dhbw/horb/calendar/ics/AbstractICSType.java
+++ b/src/main/java/de/dhbw/horb/calendar/ics/AbstractICSType.java
@@ -8,7 +8,7 @@ public abstract class AbstractICSType {
/**
* Serialisierert dieses Calenderteil. Dem Ergebnis Fehlt noch der vCalendar
* Header und Footer
- *
+ *
*/
public abstract String serialize();
@@ -16,24 +16,24 @@ public abstract class AbstractICSType {
* <b>RFC says:</b>
* <pre>
* FORM #2: DATE WITH UTC TIME
- *
+ *
* The date with UTC time, or absolute time, is identified by a LATIN
* CAPITAL LETTER Z suffix character, the UTC designator, appended to
* the time value. For example, the following represents January 19,
* 1998, at 0700 UTC:
- *
+ *
* 19980119T070000Z
- *
+ *
* The "TZID" property parameter MUST NOT be applied to DATE-TIME
* properties whose time values are specified in UTC.
* </pre>
*/
public static SimpleDateFormat dateTimeFormat = new SimpleDateFormat(
"yyyyMMdd'T'HHmmss'Z'");
-
+
/**
* described in <b>RFC section 3.3.11</b>
- *
+ *
* @param text
* @return
*/
diff --git a/src/main/java/de/dhbw/horb/calendar/ics/VEvent.java b/src/main/java/de/dhbw/horb/calendar/ics/VEvent.java
index 74f00ba..dea4a17 100644
--- a/src/main/java/de/dhbw/horb/calendar/ics/VEvent.java
+++ b/src/main/java/de/dhbw/horb/calendar/ics/VEvent.java
@@ -1,11 +1,12 @@
package de.dhbw.horb.calendar.ics;
-import java.util.Date;
+import java.util.Calendar;
+import java.util.TimeZone;
public class VEvent extends AbstractICSType {
- public Date dtstamp = new Date();
- public Date dtstart = new Date();
- public Date dtend = new Date();
+ public Calendar dtstamp = Calendar.getInstance();
+ public Calendar dtstart = Calendar.getInstance();
+ public Calendar dtend = Calendar.getInstance();
public String status = "";
public String summary = "";
public String description = "";
@@ -19,12 +20,17 @@ public class VEvent extends AbstractICSType {
@Override
public String serialize() {
final StringBuffer sb = new StringBuffer();
+ dateTimeFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
+
sb.append("BEGIN:VEVENT\n");
- sb.append("DTSTART:" + dateTimeFormat.format(dtstart) + "\n");
- sb.append("DTEND:" + dateTimeFormat.format(dtend) + "\n");
- sb.append("DTSTAMP:" + dateTimeFormat.format(dtstamp) + "\n");
- sb.append("UID:vevent_" + dateTimeFormat.format(dtstamp) + "@dhbw.de\n");
- sb.append("CREATED:" + dateTimeFormat.format(new Date()) + "\n");
+ sb.append("DTSTART:" + dateTimeFormat.format(dtstart.getTime()) + "\n");
+ sb.append("DTEND:" + dateTimeFormat.format(dtend.getTime()) + "\n");
+ sb.append("DTSTAMP:" + dateTimeFormat.format(dtstamp.getTime()) + "\n");
+ sb.append("UID:vevent_" + dateTimeFormat.format(dtstamp.getTime())
+ + "@dhbw.de\n");
+ sb.append("CREATED:"
+ + dateTimeFormat.format(Calendar.getInstance(TimeZone
+ .getTimeZone("UTC")).getTime()) + "\n");
sb.append("STATUS:" + escapeText(status) + "\n");
sb.append("SUMMARY:" + escapeText(summary) + "\n");
sb.append("DESCRIPTION:" + escapeText(description) + "\n");
@@ -37,18 +43,18 @@ public class VEvent extends AbstractICSType {
public static class Builder {
VEvent event = new VEvent();
- public Builder dtstamp(Date dtstamp) {
- event.dtstamp = dtstamp;
+ public Builder dtstamp(Calendar cstart) {
+ event.dtstamp = cstart;
return this;
}
- public Builder dtstart(Date dtstart) {
- event.dtstart = dtstart;
+ public Builder dtstart(Calendar cstart) {
+ event.dtstart = cstart;
return this;
}
- public Builder dtend(Date dtend) {
- event.dtend = dtend;
+ public Builder dtend(Calendar cend) {
+ event.dtend = cend;
return this;
}