[Bedework-commit] bwtzsvr r50 - in trunk:
common/src/org/bedework/timezones/common
server/src/org/bedework/timezones/server
svnadmin at bedework.org
svnadmin at bedework.org
Sun Feb 6 01:24:08 EST 2011
Author: douglm
Date: 2011-02-06 01:24:06 -0500 (Sun, 06 Feb 2011)
New Revision: 50
Modified:
trunk/common/src/org/bedework/timezones/common/TzServerUtil.java
trunk/server/src/org/bedework/timezones/server/GetMethod.java
Log:
Do expand and list
Modified: trunk/common/src/org/bedework/timezones/common/TzServerUtil.java
===================================================================
--- trunk/common/src/org/bedework/timezones/common/TzServerUtil.java 2011-02-05 05:35:51 UTC (rev 49)
+++ trunk/common/src/org/bedework/timezones/common/TzServerUtil.java 2011-02-06 06:24:06 UTC (rev 50)
@@ -28,8 +28,16 @@
import net.fortuna.ical4j.data.CalendarBuilder;
import net.fortuna.ical4j.data.UnfoldingReader;
import net.fortuna.ical4j.model.Component;
+import net.fortuna.ical4j.model.ComponentList;
+import net.fortuna.ical4j.model.DateTime;
+import net.fortuna.ical4j.model.Dur;
+import net.fortuna.ical4j.model.Period;
+import net.fortuna.ical4j.model.PeriodList;
import net.fortuna.ical4j.model.TimeZone;
+import net.fortuna.ical4j.model.component.Observance;
import net.fortuna.ical4j.model.component.VTimeZone;
+import net.fortuna.ical4j.model.property.DtStamp;
+import net.fortuna.ical4j.model.property.LastModified;
import net.fortuna.ical4j.util.TimeZones;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
@@ -42,6 +50,12 @@
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.log4j.Logger;
+import ietf.params.xml.ns.timezone_service.AliasType;
+import ietf.params.xml.ns.timezone_service.ObservanceType;
+import ietf.params.xml.ns.timezone_service.SummaryType;
+import ietf.params.xml.ns.timezone_service.Timezones;
+import ietf.params.xml.ns.timezone_service.TzdataType;
+
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
@@ -105,6 +119,8 @@
static String etagValue;
+ static String dtstamp;
+
/* ======================= TimeZone objects ======================= */
private Map<String, TimeZone> tzs = new HashMap<String, TimeZone>();
@@ -234,6 +250,37 @@
}
/**
+ * @return the data dtsamp
+ * @throws ServletException
+ */
+ public String getDtstamp() throws ServletException {
+ if (dtstamp == null) {
+ Collection<String> info = tzinfo;
+
+ if (info == null) {
+ info = getInfo();
+ }
+
+ if (info != null) {
+ for (String s: info) {
+ if (s.startsWith("buildTime=")) {
+ dtstamp = s.substring("buildTime=".length());
+ break;
+ }
+ }
+ }
+
+ if (dtstamp == null) {
+ DtStamp dt = new DtStamp(new DateTime(lastDataFetch));
+
+ dtstamp = dt.getValue();
+ }
+ }
+
+ return dtstamp;
+ }
+
+ /**
* @return config
*/
public TzsvrConfig getConfig() {
@@ -458,7 +505,61 @@
}
}
+ private static class AliasMaps {
+ Map<String, List<String>> byTzid;
+ Map<String, String> byAlias;
+ }
+
+ private static AliasMaps aliasMaps;
+
+ private void buildAliasMaps(AliasMaps maps) throws ServletException {
+ try {
+ maps.byTzid = new HashMap<String, List<String>>();
+ maps.byAlias = new HashMap<String, String>();
+ Properties p = new Properties();
+
+ StringReader sr = new StringReader(getAliases());
+
+ p.load(sr);
+
+ for (String a: p.stringPropertyNames()) {
+ String id = p.getProperty(a);
+
+ maps.byAlias.put(a, id);
+
+ List<String> as = maps.byTzid.get(id);
+
+ if (as == null) {
+ as = new ArrayList<String>();
+ maps.byTzid.put(id, as);
+ }
+
+ as.add(a);
+ }
+ } catch (Throwable t) {
+ throw new ServletException(t);
+ }
+ }
+
/**
+ * @param tzid
+ * @return list of aliases or null
+ * @throws ServletException
+ */
+ public List<String> findAliases(String tzid) throws ServletException {
+ AliasMaps amaps = aliasMaps;
+
+ if (amaps == null) {
+ amaps = new AliasMaps();
+
+ buildAliasMaps(amaps);
+ aliasMaps = amaps;
+ }
+
+ return amaps.byTzid.get(tzid);
+ }
+
+ /**
* @return info
* @throws ServletException
*/
@@ -589,6 +690,159 @@
return cdt;
}
+ private static List<SummaryType> summaries;
+
+ /**
+ * @return list of summary info
+ * @throws Throwable
+ */
+ public List<SummaryType> getSummaries() throws Throwable {
+ if (summaries != null) {
+ return summaries;
+ }
+
+ List<SummaryType> sts = new ArrayList<SummaryType>();
+ SortedSet<String> names = getNames();
+
+ for (String nm: names) {
+ TimeZone tz = fetchTimeZone(nm);
+
+ SummaryType st = new SummaryType();
+
+ st.setTzid(nm);
+
+ VTimeZone vtz = tz.getVTimeZone();
+ LastModified lm = (LastModified)vtz.getProperty(LastModified.LAST_MODIFIED);
+ if (lm!= null) {
+ st.setLastModified(lm.getValue());
+ }
+
+ List<String> aliases = findAliases(nm);
+
+ // XXX Need to have list of local names per timezone
+ //String ln = vtz.
+ if (aliases != null) {
+ for (String a: aliases) {
+ AliasType at = new AliasType();
+
+ // XXX Need locale as well as name
+ at.setValue(a);
+ st.getAlias().add(at);
+ }
+ }
+
+ sts.add(st);
+ }
+
+ summaries = sts;
+ return sts;
+ }
+
+ private static class ObservanceWrapper implements Comparable<ObservanceWrapper> {
+ ObservanceType ot;
+
+ ObservanceWrapper(ObservanceType ot) {
+ this.ot = ot;
+ }
+
+ @Override
+ public int compareTo(ObservanceWrapper o) {
+ return ot.getOnset().compareTo(o.ot.getOnset());
+ }
+ }
+
+ /**
+ * @param tzid
+ * @param start
+ * @param end
+ * @return expansion or null
+ * @throws Throwable
+ */
+ public Timezones getExpanded(String tzid,
+ String start,
+ String end) throws Throwable {
+ TimeZone tz = fetchTimeZone(tzid);
+ if (tz == null) {
+ return null;
+ }
+
+ VTimeZone vtz = tz.getVTimeZone();
+
+ DateTime dtstart;
+ DateTime dtend;
+
+ if (start == null) {
+ String date = new net.fortuna.ical4j.model.Date().toString();
+
+ dtstart = new DateTime(date + "T000000Z");
+ } else {
+ dtstart = new DateTime(start);
+ }
+
+ if (end == null) {
+ Dur dur = new Dur("P520W");
+
+ String date = new net.fortuna.ical4j.model.Date(dur.getTime(new Date())).toString();
+ dtend = new DateTime(date + "T000000Z");
+ } else {
+ dtend = new DateTime(end);
+ }
+
+ dtstart.setTimeZone(tz);
+ dtend.setTimeZone(tz);
+
+ Period p = new Period(dtstart, dtend);
+
+ ComponentList cl = vtz.getObservances();
+
+ TreeSet<ObservanceWrapper> obws = new TreeSet<ObservanceWrapper>();
+
+ for (Object o: cl) {
+ Observance ob = (Observance)o;
+
+ PeriodList pl = ob.calculateRecurrenceSet(p);
+
+ for (Object po: pl) {
+ Period onsetPer = (Period)po;
+
+ ObservanceType ot = new ObservanceType();
+
+ ot.setName(ob.getName());
+ ot.setOnset(onsetPer.getStart().toString());
+
+ String offset = ob.getOffsetFrom().getOffset().toString();
+
+ if (offset.length() > 5) {
+ offset = offset.substring(0, offset.length() - 2);
+ }
+ ot.setUtcOffsetFrom(offset);
+
+ offset = ob.getOffsetTo().getOffset().toString();
+
+ if (offset.length() > 5) {
+ offset = offset.substring(0, offset.length() - 2);
+ }
+ ot.setUtcOffsetTo(offset);
+
+ obws.add(new ObservanceWrapper(ot));
+ }
+ }
+
+ TzdataType tzd = new TzdataType();
+
+ tzd.setTzid(tzid);
+ for (ObservanceWrapper ow: obws) {
+ tzd.getObservances().add(ow.ot);
+ }
+
+ Timezones tzs = new Timezones();
+
+ tzs.setDtstamp(getDtstamp());
+ tzs.getTzdatas().add(tzd);
+
+ return tzs;
+ }
+
/** Get a timezone object from the server given the id.
*
* @param tzid
Modified: trunk/server/src/org/bedework/timezones/server/GetMethod.java
===================================================================
--- trunk/server/src/org/bedework/timezones/server/GetMethod.java 2011-02-05 05:35:51 UTC (rev 49)
+++ trunk/server/src/org/bedework/timezones/server/GetMethod.java 2011-02-06 06:24:06 UTC (rev 50)
@@ -32,6 +32,8 @@
import ietf.params.xml.ns.timezone_service.Capabilities;
import ietf.params.xml.ns.timezone_service.CapabilitiesAcceptParameterType;
import ietf.params.xml.ns.timezone_service.CapabilitiesOperationType;
+import ietf.params.xml.ns.timezone_service.TimezoneList;
+import ietf.params.xml.ns.timezone_service.Timezones;
import java.io.Writer;
import java.util.Collection;
@@ -238,8 +240,19 @@
if ("capabilities".equals(action)) {
doCapabilities(resp);
+ return;
}
+ if ("list".equals(action)) {
+ doList(resp);
+ return;
+ }
+
+ if ("expand".equals(action)) {
+ doExpand(req,resp);
+ return;
+ }
+
if (req.getParameter("names") != null) {
if (ifNoneMatchTest(req, resp)) {
return;
@@ -290,6 +303,41 @@
}
}
+ private void doList(final HttpServletResponse resp) throws ServletException {
+ try {
+ TimezoneList tzl = new TimezoneList();
+
+ tzl.setDtstamp(util.getDtstamp());
+ tzl.getSummaries().addAll(util.getSummaries());
+
+ JAXBContext jc = JAXBContext.newInstance("ietf.params.xml.ns.timezone_service");
+
+ Marshaller m = jc.createMarshaller();
+ m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
+ m.marshal(tzl, resp.getOutputStream());
+ } catch (Throwable t) {
+ throw new ServletException(t);
+ }
+ }
+
+ private void doExpand(final HttpServletRequest req,
+ final HttpServletResponse resp) throws ServletException {
+ try {
+ String tzid = req.getParameter("tzid");
+ String start = req.getParameter("start");
+ String end = req.getParameter("end");
+ Timezones tzs = util.getExpanded(tzid, start, end);
+
+ JAXBContext jc = JAXBContext.newInstance("ietf.params.xml.ns.timezone_service");
+
+ Marshaller m = jc.createMarshaller();
+ m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
+ m.marshal(tzs, resp.getOutputStream());
+ } catch (Throwable t) {
+ throw new ServletException(t);
+ }
+ }
+
private void doNames(final HttpServletResponse resp) throws ServletException {
try {
resp.setContentType("text/plain");
More information about the Bedework-commit
mailing list