0
votes

I am attempting to implement Julian Buss' terrific method of ical output as a non rendered xpage (http://blog.youatnotes.de/web/youatnotes/blog-jb.nsf/dx/how-to-implement-an-icalendar-feed-with-xpages.htm?opendocument&comments). But I am unable to get the date to show up as a proper ISO date format yyyymmdd

I am getting my date from a notes view. Formatting the columns has no affect. I have tried various methods of formatting the date using javascript and failed.

I am not sure if what I am doing is possible. If I should be looking at making the change to the Notes view. Or should I make the change in javascript?

Also open to alternative methods of producing an ics file from a notes database.

Here is the code from my non rendered xpage

<xp:this.afterRenderResponse><![CDATA[#{javascript:var exCon = facesContext.getExternalContext(); 
var writer = facesContext.getResponseWriter(); 
var response = exCon.getResponse(); 
var nview:NotesView = database.getView("ical"); 
nview.setAutoUpdate(false); 
var vc:NotesViewEntryCollection = nview.getAllEntries(); 
 var ve:NotesViewEntry = vc.getFirstEntry(); 
var values; 
var date; 
var body; 
var period; 
var i = 0; 
response.setContentType("text/calendar"); 
response.setHeader("Cache-Control", "no-cache"); 
writer.write("BEGIN:VCALENDAR\r\n"); 
writer.write("VERSION:2.0\r\n"); 
writer.write("X-LOTUS-CHARSET:UTF-8\r\n"); 
while (ve) { 
        values = ve.getColumnValues(); 
      date = ve.getColumnValues()[1];
    edate = ve.getColumnValues()[2];
    body = values.elementAt(3); 
    period = values.elementAt(2); 
    writer.write("BEGIN:VEVENT\r\n"); 
    writer.write("DTSTART:"+date+"T080000\r\n"); 
    writer.write("DTEND:"+edate+"T080000\r\n"); 
    writer.write("DESCRIPTION:"+body+"\r\n"); 
    writer.write("END:VEVENT\r\n"); 
    ve = vc.getNextEntry(ve); }    writer.write("END:VCALENDAR\r\n"); 
writer.endDocument(); }]]></xp:this.afterRenderResponse>

This is the output from an event

BEGIN:VEVENT
DTSTART:08/12/2004T080000
DTEND:08/13/2004T080000
DESCRIPTION:Patrick Sawyer: Out of Office
END:VEVENT 
2
That iCal format is probably invalid. The date format string is afaik an ISO date time with yyyy-mm-ddThh:mm:ss.MMMM+Timezone - stwissel

2 Answers

4
votes

Patric,

best you write that output in Java. Create a class where you pass the writer and the database as parameter. Inside use the SimpleDateFormat to bend your date object to your will.

... and recycle!

JavaScript:

var exCon = facesContext.getExternalContext(); 
var writer = facesContext.getResponseWriter(); 
var response = exCon.getResponse(); 

response.setContentType("text/calendar"); 
response.setHeader("Cache-Control", "no-cache"); 

var ich = new com.yourdomain.IcalHelper();
ich.renderIcal(database,writer);
writer.endDocument();

Java Class:

import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Vector;

import lotus.domino.Database;
import lotus.domino.DateTime;
import lotus.domino.NotesException;
import lotus.domino.View;
import lotus.domino.ViewEntry;
import lotus.domino.ViewEntryCollection;

public class IcalHelper {

    private static String NL = "\r\n";

    @SuppressWarnings("rawtypes")
    public void renderIcal(Database db, PrintWriter writer) throws NotesException {

    writer.write("BEGIN:VCALENDAR");
    writer.write(NL);
    writer.write("VERSION:2.0"); 
    writer.write(NL);
    writer.write("X-LOTUS-CHARSET:UTF-8");
    writer.write(NL);
    // Adjust the pattern to your needs
    SimpleDateFormat sdf = new SimpleDateFormat("yyyymmdd-T0800000");
    View nview = db.getView("ical");
    ViewEntryCollection vc = nview.getAllEntries();
    ViewEntry ve = vc.getFirstEntry();

    while (ve != null) {
        ViewEntry nextVe = vc.getNextEntry(ve);
        // Here is the writing of the entry
        Vector values = ve.getColumnValues();
        DateTime date = (DateTime) values.get(1);
        DateTime edate = (DateTime) values.get(2);
        writer.write("BEGIN:VEVENT"); 
        writer.write(NL);
        writer.write("DTSTART:");
        writer.write(sdf.format(date.toJavaDate()));
        writer.write(NL);
        writer.write("DTEND:");
        writer.write(sdf.format(edate.toJavaDate()));
        writer.write(NL);
        writer.write("DESCRIPTION:");
        writer.write(values.get(3).toString());
        writer.write(NL);
        writer.write("END:VEVENT\r\n");

        date.recycle();
        edate.recycle();
        ve.recycle();
        ve = nextVe;
    }

    vc.recycle();
    nview.recycle();

    writer.write("END:VCALENDAR\r\n");
}
}

P.S.: In 9.0.1 the calendar API does ICAL

1
votes

try it with NotesDateTime and Date

...
var dt:NotesDateTime; 
var edt:NotesDateTime; 
var jdt:Date;
var jedt:Date;
var ve2:NotesViewEntry
while (ve) { 
    values = ve.getColumnValues(); 
    dt = session.createDateTime(ve.getColumnValues()[1]);
    jdt = dt.toJavaDate;
    edt = session.createDateTime(ve.getColumnValues()[2]);
    jedt = edt.toJavaDate;
    body = values.elementAt(3); 
    period = values.elementAt(2); 
    writer.write("BEGIN:VEVENT\r\n"); 
    writer.write("DTSTART:"+ jdt.getYear + jdt.getMonth + jdt.getDay  +"T080000\r\n"); 
    writer.write("DTEND:"+ jedt.getYear + jedt.getMonth + jedt.getDay  +"T080000\r\n"); 
    writer.write("DESCRIPTION:"+body+"\r\n"); 
    writer.write("END:VEVENT\r\n"); 
    ve2=ve;
    ve.recycle;
    ve=null;
    ve = vc.getNextEntry(ve2); 
    ve2.recycle;
    ve2=null;
    dt.recycle;
    edt.recycle;
    dt=null;
    edt=null;
}