GlassFish 上使用 ical4j 的订阅服务
Subscrition Service with ical4j on GlassFish
这是我的第一个问题,我希望能找到人来回答。
现在情况:
- GlassFish 4 服务器
- 用于 ICS 生成的 ical4j
- 手动下载 .ics 的方法(可变时间跨度)
- 只有一个日历
- 不允许对日历进行更改(仅通过前端)
目标:
- 提供 link 订阅日历
我的想法是制作一个 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>
希望能帮到有同样问题的人。有什么问题尽管问,我会尽快回复。
这是我的第一个问题,我希望能找到人来回答。
现在情况:
- GlassFish 4 服务器
- 用于 ICS 生成的 ical4j
- 手动下载 .ics 的方法(可变时间跨度)
- 只有一个日历
- 不允许对日历进行更改(仅通过前端)
目标:
- 提供 link 订阅日历
我的想法是制作一个 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>
希望能帮到有同样问题的人。有什么问题尽管问,我会尽快回复。