From 88404130405184e5befc80296c2e1f7fc5f6b0b9 Mon Sep 17 00:00:00 2001 From: Arnout Engelen Date: Sun, 2 Jan 2011 18:30:38 +0100 Subject: [PATCH] various updates, opensocial support --- pom.xml | 2 +- .../java/net/bzzt/ical/aggregator/model/Event.java | 8 ++- .../java/net/bzzt/ical/aggregator/model/Feed.java | 4 +- .../java/net/bzzt/ical/aggregator/model/User.java | 4 +- .../ical/aggregator/service/impl/EventFilter.java | 2 +- .../aggregator/service/impl/FeedServiceImpl.java | 10 ++- .../bzzt/ical/aggregator/web/EventListPanel.java | 23 ++++++- .../bzzt/ical/aggregator/web/FeedSelection.java | 4 +- .../ical/aggregator/web/WicketApplication.java | 71 ++++++++++++++-------- .../bzzt/ical/aggregator/web/admin/EditPage.java | 6 +- .../web/ical/EventToVEventTransformer.java | 7 +++ .../bzzt/ical/aggregator/web/ical/IcalPage.java | 4 +- .../web/ical/UpcomingEventsIcalPage.java | 30 ++++++--- .../aggregator/web/model/AbstractEntityModel.java | 1 - .../aggregator/web/opensocial/OpenSocialPage.java | 5 +- src/main/resources/META-INF/persistence.xml | 2 +- src/main/resources/log4j.properties | 2 +- 17 files changed, 125 insertions(+), 60 deletions(-) diff --git a/pom.xml b/pom.xml index 8071e77..f07fc30 100644 --- a/pom.xml +++ b/pom.xml @@ -271,6 +271,6 @@ 1.4.6 - 6.1.4 + 6.1.24 diff --git a/src/main/java/net/bzzt/ical/aggregator/model/Event.java b/src/main/java/net/bzzt/ical/aggregator/model/Event.java index 94ffe0b..0e30093 100644 --- a/src/main/java/net/bzzt/ical/aggregator/model/Event.java +++ b/src/main/java/net/bzzt/ical/aggregator/model/Event.java @@ -11,13 +11,13 @@ import javax.persistence.Id; import javax.persistence.Lob; import javax.persistence.ManyToOne; +import net.bzzt.ical.aggregator.web.model.Identifiable; +import net.fortuna.ical4j.model.Iso8601; + import org.apache.wicket.util.time.Time; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; -import net.bzzt.ical.aggregator.web.model.Identifiable; -import net.fortuna.ical4j.model.Iso8601; - @Entity @Cache(usage=CacheConcurrencyStrategy.READ_WRITE) public class Event implements Serializable, Identifiable, Cloneable, Comparable { @@ -56,6 +56,8 @@ public class Event implements Serializable, Identifiable, Cloneable, Compa public String rawEvent; public URL url; + + public String location; /** This event was added manually */ @Column(nullable=false) diff --git a/src/main/java/net/bzzt/ical/aggregator/model/Feed.java b/src/main/java/net/bzzt/ical/aggregator/model/Feed.java index ca46f3b..1e230ae 100644 --- a/src/main/java/net/bzzt/ical/aggregator/model/Feed.java +++ b/src/main/java/net/bzzt/ical/aggregator/model/Feed.java @@ -9,11 +9,11 @@ import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import net.bzzt.ical.aggregator.web.model.Identifiable; + import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; -import net.bzzt.ical.aggregator.web.model.Identifiable; - @Entity @Cache(usage=CacheConcurrencyStrategy.READ_WRITE) public class Feed implements Serializable, Identifiable, Comparable { diff --git a/src/main/java/net/bzzt/ical/aggregator/model/User.java b/src/main/java/net/bzzt/ical/aggregator/model/User.java index 501ea7d..c76879c 100644 --- a/src/main/java/net/bzzt/ical/aggregator/model/User.java +++ b/src/main/java/net/bzzt/ical/aggregator/model/User.java @@ -8,11 +8,11 @@ import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import net.bzzt.ical.aggregator.web.model.Identifiable; + import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; -import net.bzzt.ical.aggregator.web.model.Identifiable; - /** 'user' is not a valid database name in postgresql */ @Entity(name="Users") @Cache(usage=CacheConcurrencyStrategy.READ_WRITE) diff --git a/src/main/java/net/bzzt/ical/aggregator/service/impl/EventFilter.java b/src/main/java/net/bzzt/ical/aggregator/service/impl/EventFilter.java index 8d49b64..bb2bcb6 100644 --- a/src/main/java/net/bzzt/ical/aggregator/service/impl/EventFilter.java +++ b/src/main/java/net/bzzt/ical/aggregator/service/impl/EventFilter.java @@ -20,7 +20,7 @@ public class EventFilter implements Serializable public Integer maxRecurrence; - public EventFilter(Date date, int maxRecurrence) + public EventFilter(Date date, Integer maxRecurrence) { this.maxRecurrence = maxRecurrence; this.fromDate = date; diff --git a/src/main/java/net/bzzt/ical/aggregator/service/impl/FeedServiceImpl.java b/src/main/java/net/bzzt/ical/aggregator/service/impl/FeedServiceImpl.java index 95cf9f4..0dc4e9b 100644 --- a/src/main/java/net/bzzt/ical/aggregator/service/impl/FeedServiceImpl.java +++ b/src/main/java/net/bzzt/ical/aggregator/service/impl/FeedServiceImpl.java @@ -69,7 +69,7 @@ public class FeedServiceImpl implements FeedService { public List getFeeds() { Query query = em.createQuery("select f from Feed f"); - query.setHint("org.hibernate.cacheable", true); +// query.setHint("org.hibernate.cacheable", true); @SuppressWarnings("unchecked") List resultList = query.getResultList(); return resultList; @@ -163,6 +163,10 @@ public class FeedServiceImpl implements FeedService { event.rawEvent = vevent.toString(); event.uid = vevent.getUid().getValue(); event.summary = vevent.getSummary().getValue(); + if (vevent.getLocation() != null) + { + event.location = vevent.getLocation().getValue(); + } event.setHidden(event.getHidden()); event.setManual(event.getManual()); Description description = vevent.getDescription(); @@ -354,7 +358,7 @@ public class FeedServiceImpl implements FeedService { } Query query = em.createQuery(queryString); - query.setHint("org.hibernate.cacheable", true); + //query.setHint("org.hibernate.cacheable", true); query.setParameter("feed", feed); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); @@ -532,7 +536,7 @@ public class FeedServiceImpl implements FeedService { private void getAlternativesRecursive(Event parent, List results) { Query query = em.createQuery("select e from Event e where duplicate_of = :event"); - query.setHint("org.hibernate.cacheable", true); +// query.setHint("org.hibernate.cacheable", true); query.setParameter("event", parent); List resultList = getResults(query); diff --git a/src/main/java/net/bzzt/ical/aggregator/web/EventListPanel.java b/src/main/java/net/bzzt/ical/aggregator/web/EventListPanel.java index dcc83a4..a0e4adb 100644 --- a/src/main/java/net/bzzt/ical/aggregator/web/EventListPanel.java +++ b/src/main/java/net/bzzt/ical/aggregator/web/EventListPanel.java @@ -5,6 +5,8 @@ import java.util.Collections; import java.util.Date; import java.util.List; +import javax.annotation.Nullable; + import net.bzzt.ical.aggregator.model.Event; import net.bzzt.ical.aggregator.model.Feed; import net.bzzt.ical.aggregator.service.FeedService; @@ -43,10 +45,27 @@ public class EventListPanel extends Panel { @SpringBean private FeedService feedService; - public EventListPanel(String id) { + public EventListPanel(String id) + { + this(id, null); + } + + public EventListPanel(String id, @Nullable Date date) + { super(id); - List eventsSorted = feedService.getEvents(((AggregatorSession)getSession()).getSelectedFeeds(), AggregatorSession.get().getMaxRecurrence()); + List eventsSorted; + List selectedFeeds = ((AggregatorSession)getSession()).getSelectedFeeds(); + Integer maxRecurrence = AggregatorSession.get().getMaxRecurrence(); + if (date == null) + { + eventsSorted = feedService.getEvents(selectedFeeds, maxRecurrence); + } + else + { + eventsSorted = feedService.getEventsForDay(selectedFeeds, date, maxRecurrence); + Collections.sort(eventsSorted); + } final MultiMap eventsPerDate = CategoryHelper.categorize(eventsSorted, new EventsCategorizer()); List dates = new ArrayList(eventsPerDate.keySet()); diff --git a/src/main/java/net/bzzt/ical/aggregator/web/FeedSelection.java b/src/main/java/net/bzzt/ical/aggregator/web/FeedSelection.java index 53d1b41..524c6c3 100644 --- a/src/main/java/net/bzzt/ical/aggregator/web/FeedSelection.java +++ b/src/main/java/net/bzzt/ical/aggregator/web/FeedSelection.java @@ -72,7 +72,7 @@ public class FeedSelection extends Panel IModel> collectionModel = (IModel) model; - final CheckGroup feeds = new CheckGroup("feed", collectionModel); + final CheckGroup feeds = new CheckGroup("feed", collectionModel); add(feeds); feeds.add(new PropertyListView("feeds", feedService.getFeeds()) @@ -87,7 +87,7 @@ public class FeedSelection extends Panel protected void populateItem(ListItem item) { Feed modelObject = item.getModelObject(); - Check check = new Check("check", new Model(modelObject)); + Check check = new Check("check", new Model(modelObject)); check.setOutputMarkupId(true); item.add(check); diff --git a/src/main/java/net/bzzt/ical/aggregator/web/WicketApplication.java b/src/main/java/net/bzzt/ical/aggregator/web/WicketApplication.java index f4a88e8..b1a041c 100644 --- a/src/main/java/net/bzzt/ical/aggregator/web/WicketApplication.java +++ b/src/main/java/net/bzzt/ical/aggregator/web/WicketApplication.java @@ -12,6 +12,7 @@ import net.bzzt.ical.aggregator.web.ical.UpcomingEventsIcalPage; import net.bzzt.ical.aggregator.web.opensocial.OpenSocialPage; import net.bzzt.ical.aggregator.web.opml.OpmlPage; import net.bzzt.ical.aggregator.web.rss.UpcomingEventsFeedPage; +import net.bzzt.ical.aggregator.web.util.MultiFormatDateConverter; import org.apache.commons.lang.StringUtils; import org.apache.wicket.IConverterLocator; @@ -26,19 +27,22 @@ import org.apache.wicket.spring.injection.annot.SpringComponentInjector; import org.apache.wicket.util.convert.ConversionException; import org.apache.wicket.util.convert.ConverterLocator; import org.apache.wicket.util.convert.IConverter; +import org.apache.wicket.util.convert.converters.DateConverter; import org.apache.wicket.util.time.Time; /** - * Application object for your web application. If you want to run this - * application without deploying, run the Start class. + * Application object for your web application. If you want to run this application without deploying, run the Start + * class. * * @see net.bzzt.ical.aggregator.Start#main(String[]) */ -public class WicketApplication extends WebApplication { +public class WicketApplication extends WebApplication +{ /** * Constructor */ - public WicketApplication() { + public WicketApplication() + { } /* @@ -47,11 +51,14 @@ public class WicketApplication extends WebApplication { * @see org.apache.wicket.protocol.http.WebApplication#init() */ @Override - protected void init() { + protected void init() + { addComponentInstantiationListener(new SpringComponentInjector(this)); - + + getRequestLoggerSettings().setRequestLoggerEnabled(true); + getMarkupSettings().setStripWicketTags(true); - + mount(new MixedParamUrlCodingStrategy("/day", DayView.class, new String[0])); mount(new MixedParamUrlCodingStrategy("/login", LoginPage.class, new String[0])); mount(new MixedParamUrlCodingStrategy("/edit", EditPage.class, new String[0])); @@ -60,12 +67,13 @@ public class WicketApplication extends WebApplication { mount(new MixedParamUrlCodingStrategy("/feeds/upcoming/ical", UpcomingEventsIcalPage.class, new String[0])); mount(new MixedParamUrlCodingStrategy("/feeds/opml", OpmlPage.class, new String[0])); mount(new MixedParamUrlCodingStrategy("/opensocial/week.xml", OpenSocialPage.class, new String[0])); - + super.init(); } @Override - public Session newSession(Request request, Response response) { + public Session newSession(Request request, Response response) + { return new AggregatorSession(request); } @@ -75,34 +83,42 @@ public class WicketApplication extends WebApplication { * @see org.apache.wicket.Application#newConverterLocator() */ @Override - protected IConverterLocator newConverterLocator() { + public IConverterLocator newConverterLocator() + { ConverterLocator locator = new ConverterLocator(); - locator.set(URL.class, new IConverter() { + locator.set(URL.class, new IConverter() + { /** * */ private static final long serialVersionUID = 1L; - public Object convertToObject(String value, Locale locale) { - if (StringUtils.isBlank(value)) { + public Object convertToObject(String value, Locale locale) + { + if (StringUtils.isBlank(value)) + { return null; } - try { + try + { return new URL(value); - } catch (Exception e) { + } + catch (Exception e) + { throw new ConversionException(e); } } - public String convertToString(Object value, Locale locale) { + public String convertToString(Object value, Locale locale) + { return ((URL) value).toExternalForm(); } }); - - locator.set(Time.class, new IConverter() { + locator.set(Time.class, new IConverter() + { /** * @@ -110,25 +126,30 @@ public class WicketApplication extends WebApplication { private static final long serialVersionUID = 1L; @Override - public Object convertToObject(String value, Locale locale) { + public Object convertToObject(String value, Locale locale) + { return null; } @Override - public String convertToString(Object value, Locale locale) { + public String convertToString(Object value, Locale locale) + { SimpleDateFormat format = new SimpleDateFormat("HH:mm"); - return format - .format(new Date(((Time) value).getMilliseconds())); + return format.format(new Date(((Time) value).getMilliseconds())); } }); + DateConverter converter = new MultiFormatDateConverter("dd/MM/yyyy", "yyyy/MM/dd"); + locator.set(Date.class, converter); + return locator; } /** * @see org.apache.wicket.Application#getHomePage() */ - public Class getHomePage() { + public Class getHomePage() + { return HomePage.class; } @@ -144,7 +165,7 @@ public class WicketApplication extends WebApplication { public static String getLink() { - HttpServletRequest httpServletRequest = ((WebRequest)RequestCycle.get().getRequest()).getHttpServletRequest(); + HttpServletRequest httpServletRequest = ((WebRequest) RequestCycle.get().getRequest()).getHttpServletRequest(); int serverPort = httpServletRequest.getServerPort(); String scheme = httpServletRequest.getScheme(); String portExtension = ""; @@ -154,7 +175,7 @@ public class WicketApplication extends WebApplication { portExtension = ":" + serverPort; } String url = scheme + "://" + httpServletRequest.getServerName() + portExtension; -// + httpServletRequest.getContextPath(); + // + httpServletRequest.getContextPath(); return url; } diff --git a/src/main/java/net/bzzt/ical/aggregator/web/admin/EditPage.java b/src/main/java/net/bzzt/ical/aggregator/web/admin/EditPage.java index 5860282..714cbbb 100644 --- a/src/main/java/net/bzzt/ical/aggregator/web/admin/EditPage.java +++ b/src/main/java/net/bzzt/ical/aggregator/web/admin/EditPage.java @@ -1,14 +1,14 @@ package net.bzzt.ical.aggregator.web.admin; -import org.apache.wicket.markup.html.link.BookmarkablePageLink; -import org.apache.wicket.spring.injection.annot.SpringBean; - import net.bzzt.ical.aggregator.model.Right; import net.bzzt.ical.aggregator.service.UserService; import net.bzzt.ical.aggregator.web.AggregatorLayoutPage; import net.bzzt.ical.aggregator.web.AggregatorSession; import net.bzzt.ical.aggregator.web.EventVerificationPage; +import org.apache.wicket.markup.html.link.BookmarkablePageLink; +import org.apache.wicket.spring.injection.annot.SpringBean; + public class EditPage extends AggregatorLayoutPage { @SpringBean diff --git a/src/main/java/net/bzzt/ical/aggregator/web/ical/EventToVEventTransformer.java b/src/main/java/net/bzzt/ical/aggregator/web/ical/EventToVEventTransformer.java index 2ad2112..9c43ede 100644 --- a/src/main/java/net/bzzt/ical/aggregator/web/ical/EventToVEventTransformer.java +++ b/src/main/java/net/bzzt/ical/aggregator/web/ical/EventToVEventTransformer.java @@ -6,10 +6,12 @@ import net.bzzt.ical.aggregator.model.Event; import net.fortuna.ical4j.model.Date; import net.fortuna.ical4j.model.component.VEvent; import net.fortuna.ical4j.model.property.Description; +import net.fortuna.ical4j.model.property.Location; import net.fortuna.ical4j.model.property.Uid; import net.fortuna.ical4j.model.property.Url; import org.apache.commons.collections.Transformer; +import org.apache.commons.lang.StringUtils; public class EventToVEventTransformer implements Transformer { @@ -25,6 +27,11 @@ public class EventToVEventTransformer implements Transformer VEvent event = new VEvent(new Date(input.getStart()), new Date(input.getEnding()), input.summary); event.getProperties().add(new Description(input.description)); event.getProperties().add(new Uid(input.getId().toString())); + String location = input.location; + if (StringUtils.isNotBlank(location)) + { + event.getProperties().add(new Location(location)); + } if (input.url != null) { try diff --git a/src/main/java/net/bzzt/ical/aggregator/web/ical/IcalPage.java b/src/main/java/net/bzzt/ical/aggregator/web/ical/IcalPage.java index 1438b03..c6a5747 100644 --- a/src/main/java/net/bzzt/ical/aggregator/web/ical/IcalPage.java +++ b/src/main/java/net/bzzt/ical/aggregator/web/ical/IcalPage.java @@ -30,7 +30,9 @@ public abstract class IcalPage extends WebPage response.setContentType("text/calendar; charset=UTF-8"); - CalendarOutputter outputter = new CalendarOutputter(true); + // validating is nice, but the validator disallows calendars with 0 + // events - and what else are we going to do? + CalendarOutputter outputter = new CalendarOutputter(false); try { diff --git a/src/main/java/net/bzzt/ical/aggregator/web/ical/UpcomingEventsIcalPage.java b/src/main/java/net/bzzt/ical/aggregator/web/ical/UpcomingEventsIcalPage.java index 9bcfee0..52dca6e 100644 --- a/src/main/java/net/bzzt/ical/aggregator/web/ical/UpcomingEventsIcalPage.java +++ b/src/main/java/net/bzzt/ical/aggregator/web/ical/UpcomingEventsIcalPage.java @@ -1,9 +1,8 @@ package net.bzzt.ical.aggregator.web.ical; -import java.net.URI; -import java.net.URISyntaxException; import java.util.Arrays; import java.util.Collections; +import java.util.Date; import java.util.List; import javax.annotation.Nonnull; @@ -14,15 +13,16 @@ import net.bzzt.ical.aggregator.service.FeedService; import net.bzzt.ical.aggregator.web.WicketApplication; import net.fortuna.ical4j.model.Calendar; import net.fortuna.ical4j.model.property.ProdId; -import net.fortuna.ical4j.model.property.Url; import net.fortuna.ical4j.model.property.Version; import net.fortuna.ical4j.model.property.XProperty; import org.apache.commons.collections.Transformer; +import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.wicket.PageParameters; import org.apache.wicket.spring.injection.annot.SpringBean; +import org.apache.wicket.util.time.Time; public class UpcomingEventsIcalPage extends IcalPage @@ -39,6 +39,8 @@ public class UpcomingEventsIcalPage extends IcalPage private Integer maxRecurrence; + private Date date; + public UpcomingEventsIcalPage(PageParameters parameters) { String[] sn = parameters.getStringArray("sn"); @@ -51,6 +53,11 @@ public class UpcomingEventsIcalPage extends IcalPage shortNames = Arrays.asList(sn); } maxRecurrence = parameters.getAsInteger("maxRecurrence"); + String date = parameters.getString("date"); + if (StringUtils.isNotBlank(date)) + { + this.date = (Date) WicketApplication.get().getConverterLocator().getConverter(Date.class).convertToObject(date, null); + } } @Override @@ -60,18 +67,21 @@ public class UpcomingEventsIcalPage extends IcalPage calendar.getProperties().add(new ProdId("aggregator")); calendar.getProperties().add(Version.VERSION_2_0); calendar.getProperties().add(new XProperty("X-WR-CALNAME", WicketApplication.getTitle())); - try + calendar.getProperties().add(new XProperty("X-URL", WicketApplication.getLink())); + + List selectedFeeds = feedService.getSelectedFeeds(shortNames); + + List events; + if (date == null) { - calendar.getProperties().add(new Url(new URI(WicketApplication.getLink()))); + events = feedService.getEvents(selectedFeeds, maxRecurrence); } - catch (URISyntaxException e) + else { - LOG.warn(e.getMessage(), e); + events = feedService.getEventsForDay(selectedFeeds, date, maxRecurrence); } - List selectedFeeds = feedService.getSelectedFeeds(shortNames); - - for (Event event : feedService.getEvents(selectedFeeds, maxRecurrence)) + for (Event event : events) { calendar.getComponents().add(eventToVeventTransformer.transform(event)); } diff --git a/src/main/java/net/bzzt/ical/aggregator/web/model/AbstractEntityModel.java b/src/main/java/net/bzzt/ical/aggregator/web/model/AbstractEntityModel.java index dc1be8e..484fbe2 100644 --- a/src/main/java/net/bzzt/ical/aggregator/web/model/AbstractEntityModel.java +++ b/src/main/java/net/bzzt/ical/aggregator/web/model/AbstractEntityModel.java @@ -4,7 +4,6 @@ import java.io.Serializable; import javax.persistence.EntityNotFoundException; - import org.apache.wicket.model.IModel; public abstract class AbstractEntityModel> implements IModel diff --git a/src/main/java/net/bzzt/ical/aggregator/web/opensocial/OpenSocialPage.java b/src/main/java/net/bzzt/ical/aggregator/web/opensocial/OpenSocialPage.java index db94739..2f50276 100644 --- a/src/main/java/net/bzzt/ical/aggregator/web/opensocial/OpenSocialPage.java +++ b/src/main/java/net/bzzt/ical/aggregator/web/opensocial/OpenSocialPage.java @@ -1,7 +1,8 @@ package net.bzzt.ical.aggregator.web.opensocial; +import java.util.Date; + import net.bzzt.ical.aggregator.web.EventListPanel; -import net.bzzt.ical.aggregator.web.WeekView; import net.bzzt.ical.aggregator.web.WicketApplication; import org.apache.wicket.AttributeModifier; @@ -27,7 +28,7 @@ public class OpenSocialPage extends WebPage add(new Label("contentPrefix", "").setEscapeModelStrings(false)); diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml index 4c36c35..a9711eb 100644 --- a/src/main/resources/META-INF/persistence.xml +++ b/src/main/resources/META-INF/persistence.xml @@ -17,7 +17,7 @@ - + diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties index 1f9db03..e865ffa 100644 --- a/src/main/resources/log4j.properties +++ b/src/main/resources/log4j.properties @@ -8,6 +8,6 @@ log4j.logger.org.apache.wicket=INFO log4j.logger.org.apache.wicket.protocol.http.HttpSessionStore=INFO log4j.logger.org.apache.wicket.version=INFO log4j.logger.org.apache.wicket.RequestCycle=INFO -log4j.logger.org.hibernate.SQL=DEBUG +log4j.logger.org.hibernate.SQL=INFO -- 2.11.4.GIT