使用GlassFish上的ical4j进行Subscrition服务

时间:2015-10-12 07:33:18

标签: java calendar glassfish icalendar

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

现在的情况:

  • GlassFish 4 Server
  • ical4j用于ICS生成
  • 手动下载.ics的方法(可变时间跨度)
  • 只有一个日历
  • 日历上不允许更改(仅限于前端)

目标:

  • 提供订阅日历的链接

我的想法是创建一个RESTful资源,在调用时生成上面提到的日历。这可行吗?或者我是否必须努力工作并设置一个可以提供以webcal://开头的URI的服务器?

1 个答案:

答案 0 :(得分:1)

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

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

创建此子集很简单,但我无法将这些生成的日历与CalDAV服务器同步,因为我找不到创建用户的方法!我搜索了各种RFC(WebDAV RFC3744,它的扩展[RFC4791]以及CalDav RFC2446)。

所以我试着查找CalDAV服务器生成的输出。在提到的RFC的帮助下,它很容易理解。所以我设置了一个REST-Class,为了测试目的,只需构建一个日历并将其作为“text / calendar”(使用ical4j构建)返回。然后我打开iCalendar并订阅了我的REST-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();
    }
}

这是我的第一次尝试,立刻解决了我的问题!它仅用于演示目的而不是完整的(参见例外情况)。

要使一切正常,您必须符合RFC2446!

使用的依赖关系(maven):

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

我希望我可以帮助那些有同样问题的人。如果有任何问题请问,我会尽快回答。