GlassFish 上使用 ical4j 的订阅服务

Subscrition Service with ical4j on GlassFish

这是我的第一个问题,我希望能找到人来回答。

现在情况:

目标:

我的想法是制作一个 RESTful 资源,在调用时生成上述日历。那行得通吗?或者我是否必须走艰难的道路并设置一个可以提供以 webcal:// 开头的 URI 的服务器?

没有人回答我的问题,但我在 SO 上的其他帖子的帮助下解决了我的问题。

我曾尝试设置一个 CalDAV 服务器(在本例中为 DAViCal)。服务器正常工作,我还可以订阅创建的日历。但另一个问题仍然存在:在我的门户中有用户通过 portlet 显示“实际”日历。当时只有一个日历,但 (!) 用户可以过滤此日历以获取他感兴趣的事件子集。应保存此日历并自动与主日历同步。

创建这个子集很容易,但我无法将生成的日历与 CalDAV 服务器同步,因为我没有找到创建用户的方法!我搜索了各种 RFC (WebDAV RFC3744, it's extensions [RFC4791] and also CalDav RFC2446)。

所以我试着只查找 CalDAV 服务器生成的输出。在提到的 RFC 的帮助下,它很容易理解。所以我设置了一个 REST-Class 并且为了测试目的只是构建一个日历并将其作为“text/calendar”(使用 ical4j 构建)返回。然后我打开 iCalendar 并订阅了我的 REST-Class 并且一切正常。事件是按照我的意愿导入的。

这是我用来测试的假人 class。它正在创建一个以 2015-12-23 作为“圣诞节前一天”的日历。

import java.net.SocketException;
import java.net.URISyntaxException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import net.fortuna.ical4j.model.Calendar;
import net.fortuna.ical4j.model.Date;
import net.fortuna.ical4j.model.component.VEvent;
import net.fortuna.ical4j.model.property.CalScale;
import net.fortuna.ical4j.model.property.Name;
import net.fortuna.ical4j.model.property.Organizer;
import net.fortuna.ical4j.model.property.ProdId;
import net.fortuna.ical4j.model.property.Version;
import net.fortuna.ical4j.util.UidGenerator;

@Path("calendar")
public class CalendarRest {

    @GET
    @Path("test")
    @Produces("text/calendar")
    public Response getCalendarTest() {
        try {
            java.util.Calendar javaCalendar = java.util.Calendar.getInstance();
            javaCalendar.set(java.util.Calendar.MONTH, java.util.Calendar.DECEMBER);
            javaCalendar.set(java.util.Calendar.DAY_OF_MONTH, 23);

            Calendar calendar = new Calendar();
            calendar.getProperties().add(new ProdId("-//Ben Fortuna//iCal4j 1.0//EN"));
            calendar.getProperties().add(Version.VERSION_2_0);
            calendar.getProperties().add(CalScale.GREGORIAN);
            calendar.getProperties().add(new Name("Eventcalendar"));

            // VEVENT
            VEvent christmas = new VEvent(new Date(javaCalendar.getTime()), "Pre Christmas Day");
            christmas.getProperties().add(new Organizer("TestOrganizer"));
            // initialise as an all-day event..
            UidGenerator ug = new UidGenerator("1");
            christmas.getProperties().add(ug.generateUid());
            
            calendar.getComponents().add(christmas);

            return Response
                    .ok(calendar.toString())
                    .build();
        } catch (SocketException ex) {
            Logger.getLogger(CalendarRest.class.getName()).log(Level.SEVERE, null, ex);
        } catch (URISyntaxException ex) {
            Logger.getLogger(CalendarRest.class.getName()).log(Level.SEVERE, null, ex);
        }
        return Response.serverError().build();
    }
}

这个 calss 是我的第一次尝试,立即解决了我的问题!它仅用于演示目的,并不完整(请参阅捕获的异常)。

要使一切正常工作,您必须遵守 RFC2446!

使用的依赖(maven):

<dependency>
  <groupId>org.mnode.ical4j</groupId>
  <artifactId>ical4j</artifactId>
  <version>1.0.7</version>
</dependency>

希望能帮到有同样问题的人。有什么问题尽管问,我会尽快回复。