Auto update Calendar component asynchronously

master
Markus Kreth 7 years ago
parent 9636234dce
commit fc9661714e
  1. 5
      pom.xml
  2. 27
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/EventBusiness.java
  3. 4
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/ClubEvent.java
  4. 14
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/MainUi.java
  5. 1
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/CalendarComponent.java

@ -50,6 +50,10 @@
<groupId>com.vaadin</groupId> <groupId>com.vaadin</groupId>
<artifactId>vaadin-spring-boot-starter</artifactId> <artifactId>vaadin-spring-boot-starter</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-push</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.hibernate</groupId> <groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId> <artifactId>hibernate-core</artifactId>
@ -112,7 +116,6 @@
<dependency> <dependency>
<groupId>com.h2database</groupId> <groupId>com.h2database</groupId>
<artifactId>h2</artifactId> <artifactId>h2</artifactId>
<version>1.4.197</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
</dependencies> </dependencies>

@ -11,16 +11,21 @@ import java.util.List;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.vaadin.server.VaadinRequest; import com.vaadin.server.VaadinRequest;
import de.kreth.clubhelperbackend.google.calendar.CalendarAdapter; import de.kreth.clubhelperbackend.google.calendar.CalendarAdapter;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubEvent; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubEvent;
@Component
public class EventBusiness { public class EventBusiness {
private final Logger log = LoggerFactory.getLogger(getClass()); private final Logger log = LoggerFactory.getLogger(getClass());
private final List<ClubEvent> cache = new ArrayList<>();
@Autowired
ClubEventDao dao;
public List<ClubEvent> loadEvents(VaadinRequest request) { public List<ClubEvent> loadEvents(VaadinRequest request) {
return loadEvents(request, false); return loadEvents(request, false);
@ -28,17 +33,21 @@ public class EventBusiness {
public synchronized List<ClubEvent> loadEvents(VaadinRequest request, public synchronized List<ClubEvent> loadEvents(VaadinRequest request,
boolean forceRefresh) { boolean forceRefresh) {
if (cache.isEmpty() == false && forceRefresh == false) {
log.trace("Returning cached events: {}", cache); if (forceRefresh == false) {
return Collections.unmodifiableList(cache); List<ClubEvent> list = dao.list();
log.trace("Returning events from database: {}");
return list;
} }
log.debug( log.debug(
"Loading events from Google Calendar, cache size was: {}, forceRefresh={}", "Loading events from Google Calendar, forceRefresh={}",
cache.size(), forceRefresh); forceRefresh);
cache.clear();
BufferedWriter out = null; BufferedWriter out = null;
List<ClubEvent> list = new ArrayList<>();
try { try {
if (forceRefresh) { if (forceRefresh) {
File f = new File("google_events.json"); File f = new File("google_events.json");
@ -58,7 +67,7 @@ public class EventBusiness {
} }
if ("cancelled".equals(ev.getStatus()) == false) { if ("cancelled".equals(ev.getStatus()) == false) {
cache.add(ClubEvent.parse(ev)); list.add(ClubEvent.parse(ev));
} else { } else {
log.debug("Cancelled: {}", ev.getSummary()); log.debug("Cancelled: {}", ev.getSummary());
} }
@ -75,6 +84,6 @@ public class EventBusiness {
log.error("Error writing File", e); log.error("Error writing File", e);
} }
} }
return Collections.unmodifiableList(cache); return Collections.unmodifiableList(list);
} }
} }

@ -91,9 +91,9 @@ public class ClubEvent extends BasicItem {
@Override @Override
public String toString() { public String toString() {
return "ClubEvent [id=" + id + ", iCalUID=" + iCalUID + ", location=" return "ClubEvent [id=" + id + ", getCaption()=" + getCaption() + ", iCalUID=" + iCalUID + ", location="
+ location + ", organizerDisplayName=" + organizerDisplayName + location + ", organizerDisplayName=" + organizerDisplayName
+ ", getCaption()=" + getCaption() + ", getDescription()=" + ", getDescription()="
+ getDescription() + ", getEnd()=" + getEnd() + ", getStart()=" + getDescription() + ", getEnd()=" + getEnd() + ", getStart()="
+ getStart() + ", isAllDay()=" + isAllDay() + "]"; + getStart() + ", isAllDay()=" + isAllDay() + "]";
} }

@ -9,8 +9,10 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.vaadin.addon.calendar.ui.CalendarComponentEvents; import org.vaadin.addon.calendar.ui.CalendarComponentEvents;
import com.vaadin.annotations.Push;
import com.vaadin.annotations.Theme; import com.vaadin.annotations.Theme;
import com.vaadin.server.VaadinRequest; import com.vaadin.server.VaadinRequest;
import com.vaadin.shared.communication.PushMode;
import com.vaadin.spring.annotation.SpringUI; import com.vaadin.spring.annotation.SpringUI;
import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.UI; import com.vaadin.ui.UI;
@ -25,6 +27,7 @@ import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components.PersonGrid;
@Theme("vaadin-clubhelpertheme") @Theme("vaadin-clubhelpertheme")
@SpringUI @SpringUI
@Push(value=PushMode.MANUAL)
public class MainUi extends UI { public class MainUi extends UI {
private static final long serialVersionUID = 7581634188909841919L; private static final long serialVersionUID = 7581634188909841919L;
@ -36,6 +39,9 @@ public class MainUi extends UI {
@Autowired @Autowired
GroupDao groupDao; GroupDao groupDao;
@Autowired
EventBusiness eventBusiness;
private PersonGrid personGrid; private PersonGrid personGrid;
private CalendarComponent calendar; private CalendarComponent calendar;
@ -67,10 +73,14 @@ public class MainUi extends UI {
ExecutorService exec = Executors.newSingleThreadExecutor(); ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(() -> { exec.execute(() -> {
EventBusiness business = new EventBusiness(); final List<ClubEvent> events = eventBusiness.loadEvents(request);
List<ClubEvent> events = business.loadEvents(request);
LOGGER.info("Loaded events: {}", events); LOGGER.info("Loaded events: {}", events);
final UI ui = calendar.getUI();
ui.access(() -> {
calendar.setItems(events); calendar.setItems(events);
ui.push();
});
}); });
exec.shutdown(); exec.shutdown();
} }

@ -83,6 +83,7 @@ public class CalendarComponent extends CustomComponent {
public void setItems(Collection<ClubEvent> items) { public void setItems(Collection<ClubEvent> items) {
dataProvider.setItems(items); dataProvider.setItems(items);
calendar.markAsDirty();
} }
class ClubEventProvider extends BasicItemProvider<ClubEvent> { class ClubEventProvider extends BasicItemProvider<ClubEvent> {

Loading…
Cancel
Save