included calendar exporter into menu

master
Markus Kreth 7 years ago
parent 15180e86e6
commit ec9f71a342
  1. 5
      pom.xml
  2. 71
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/CalendarComponent.java
  3. 29
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/CalendarCreator.java
  4. 9
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/MonthlyCalendarCreator.java
  5. 31
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/MonthlyCalendarSource.java
  6. 4
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/YearlyCalendarCreator.java
  7. 6
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/calendar/Year.java
  8. 2
      src/main/resources/simplelogger.properties

@ -61,6 +61,11 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency> <dependency>
<groupId>com.vaadin</groupId> <groupId>com.vaadin</groupId>
<artifactId>vaadin-spring-boot-starter</artifactId> <artifactId>vaadin-spring-boot-starter</artifactId>

@ -3,19 +3,16 @@ package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components;
import java.io.IOException; import java.io.IOException;
import java.io.PipedInputStream; import java.io.PipedInputStream;
import java.io.PipedOutputStream; import java.io.PipedOutputStream;
import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.Month; import java.time.Month;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalUnit;
import java.util.Collection; import java.util.Collection;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
@ -70,8 +67,7 @@ public class CalendarComponent extends CustomComponent {
HorizontalLayout head = new HorizontalLayout(monthName, popupButton); HorizontalLayout head = new HorizontalLayout(monthName, popupButton);
dataProvider = new ClubEventProvider(); dataProvider = new ClubEventProvider();
calendar = new Calendar<>(dataProvider) calendar = new Calendar<>(dataProvider).withMonth(Month.from(LocalDateTime.now()));
.withMonth(Month.from(LocalDateTime.now()));
calendar.setCaption("Events"); calendar.setCaption("Events");
calendar.setSizeFull(); calendar.setSizeFull();
calendar.addListener(ev -> calendarEvent(ev)); calendar.addListener(ev -> calendarEvent(ev));
@ -96,52 +92,67 @@ public class CalendarComponent extends CustomComponent {
private void openPopupMenu(ClickEvent ev) { private void openPopupMenu(ClickEvent ev) {
ContextMenu contextMenu = new ContextMenu(ev.getButton(), true); ContextMenu contextMenu = new ContextMenu(ev.getButton(), true);
contextMenu.addItem("Export", ev1 -> calendarExport(ev1)); contextMenu.addItem("Export Monat", ev1 -> calendarExport(ev1));
contextMenu.addItem("Export Jahr", ev1 -> calendarExport(ev1));
contextMenu.open(210, 40); contextMenu.open(210, 40);
} }
private void calendarExport(MenuItem ev1) { private void calendarExport(MenuItem ev1) {
ZonedDateTime start = calendar.getStartDate(); boolean monthOnly = ev1.getText().contains("Monat");
List<ClubEvent> items;
ZonedDateTime start;
if (monthOnly) {
start = calendar.getStartDate();
ZonedDateTime end = calendar.getEndDate(); ZonedDateTime end = calendar.getEndDate();
log.debug("exporting Calendar from {} to {}", start, end); log.debug("exporting Calendar from {} to {}", start, end);
List<ClubEvent> items = dataProvider.getItems(start, end); items = dataProvider.getItems(start, end);
Map<Integer, StringBuilder> values = new HashMap<>(); } else {
Set<Integer> holidays = new HashSet<>();
start = calendar.getStartDate().withDayOfYear(1);
ZonedDateTime end = start.withMonth(12).withDayOfMonth(31);
log.debug("exporting Calendar from {} to {}", start, end);
items = dataProvider.getItems(start, end);
}
Map<LocalDate, StringBuilder> values = new HashMap<>();
List<LocalDate> holidays = CalendarCreator.filterHolidays(items);
for (ClubEvent ev : items) { for (ClubEvent ev : items) {
String calendarName = ev.getOrganizerDisplayName(); ZonedDateTime evStart = ev.getStart();
if ("Schulferien".equals(calendarName)) { ZonedDateTime evEnd = ev.getEnd();
log.trace("Added to holiday List: {}", ev);
TemporalUnit unit = ChronoUnit.DAYS;
int durationDays = (int) ev.getStart().until(ev.getEnd(), unit) + 1;
for (int dayOfMonth = ev.getStart().getDayOfMonth(), endDay=dayOfMonth + durationDays; dayOfMonth<=endDay; dayOfMonth++) {
holidays.add(dayOfMonth);
}
} else {
log.trace("Added to eventsd: {}", ev); log.trace("Added to eventsd: {}", ev);
StringBuilder content;
int dayOfMonth = ev.getStart().getDayOfMonth(); CalendarCreator.iterateDays(evStart.toLocalDate(), evEnd.toLocalDate(), day -> {
int endDayOfMonth = ev.getEnd().getDayOfMonth();
for (;dayOfMonth<=endDayOfMonth; dayOfMonth++) {
if (values.containsKey(dayOfMonth)) { StringBuilder content;
content = values.get(dayOfMonth); if (values.containsKey(day)) {
content = values.get(day);
content.append("\n"); content.append("\n");
} else { } else {
content = new StringBuilder(); content = new StringBuilder();
values.put(dayOfMonth, content); values.put(day, content);
} }
content.append(ev.getCaption()); content.append(ev.getCaption());
});
} }
}
String calendarMonth;
if (monthOnly) {
calendarMonth = dfMonth.format(start);
} else {
calendarMonth = "Jahr " + start.getYear();
} }
String calendarMonth = dfMonth.format(start);
try { try {
JasperPrint print = CalendarCreator.createCalendar(new Date(start.toInstant().toEpochMilli()), values, holidays); JasperPrint print;
if (monthOnly) {
print = CalendarCreator.createCalendar(new Date(start.toInstant().toEpochMilli()), values, holidays);
} else {
print = CalendarCreator.createYearCalendar(start.getYear(), values, holidays);
}
log.trace("Created Jasper print for {}", calendarMonth); log.trace("Created Jasper print for {}", calendarMonth);
Window window = new Window(); Window window = new Window();
window.setCaption("View PDF"); window.setCaption("View PDF");

@ -13,6 +13,7 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.function.Consumer;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.hibernate.Session; import org.hibernate.Session;
@ -51,14 +52,16 @@ public abstract class CalendarCreator {
.setHolidays(Collections.emptyList()).createCalendar(); .setHolidays(Collections.emptyList()).createCalendar();
} }
public static <T extends CharSequence> JasperPrint createCalendar(Date date, Map<Integer, T> values, public static <T extends CharSequence> JasperPrint createCalendar(Date date, Map<LocalDate, T> values,
Collection<Integer> holidays) throws JRException { Collection<LocalDate> holidays) throws JRException {
return new MonthlyCalendarCreator<T>(date).setValues(values).setHolidays(holidays).createCalendar(); return new MonthlyCalendarCreator<T>(date).setValues(values)
.setHolidays(holidays.stream().map(h -> h.getDayOfMonth()).collect(Collectors.toList()))
.createCalendar();
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static <T extends CharSequence> JasperPrint createCalendar(int year, Map<LocalDate, T> values, public static <T extends CharSequence> JasperPrint createYearCalendar(int year, Map<LocalDate, T> values,
List<LocalDate> holidays) throws JRException { Collection<LocalDate> holidays) throws JRException {
return new YearlyCalendarCreator(year, (Map<LocalDate, CharSequence>) values, holidays).createCalendar(); return new YearlyCalendarCreator(year, (Map<LocalDate, CharSequence>) values, holidays).createCalendar();
} }
@ -91,12 +94,12 @@ public abstract class CalendarCreator {
Map<LocalDate, CharSequence> values = map(allevents, year); Map<LocalDate, CharSequence> values = map(allevents, year);
JasperViewer v1 = new JasperViewer(createCalendar(year, values, holidays)); JasperViewer v1 = new JasperViewer(createYearCalendar(year, values, holidays));
v1.setVisible(true); v1.setVisible(true);
} }
private static List<LocalDate> filterHolidays(List<ClubEvent> allevents) { public static List<LocalDate> filterHolidays(List<ClubEvent> allevents) {
List<LocalDate> holidays = new ArrayList<>(); List<LocalDate> holidays = new ArrayList<>();
Iterator<ClubEvent> iter = allevents.iterator(); Iterator<ClubEvent> iter = allevents.iterator();
while (iter.hasNext()) { while (iter.hasNext()) {
@ -105,16 +108,20 @@ public abstract class CalendarCreator {
iter.remove(); iter.remove();
LocalDate start = item.getStart().toLocalDate(); LocalDate start = item.getStart().toLocalDate();
LocalDate end = item.getEnd().toLocalDate(); LocalDate end = item.getEnd().toLocalDate();
while (end.isAfter(start) || end.isEqual(start)) { iterateDays(start, end, d -> holidays.add(d));
holidays.add(start);
start = start.plusDays(1);
}
} }
} }
return holidays; return holidays;
} }
public static void iterateDays(LocalDate start, LocalDate end, Consumer<LocalDate> consumer) {
while (end.isAfter(start) || end.isEqual(start)) {
consumer.accept(start);
start = start.plusDays(1);
}
}
protected static Map<LocalDate, CharSequence> map(List<ClubEvent> allevents, int year) { protected static Map<LocalDate, CharSequence> map(List<ClubEvent> allevents, int year) {
Map<LocalDate, CharSequence> values = new HashMap<>(); Map<LocalDate, CharSequence> values = new HashMap<>();
allevents.forEach(ev -> { allevents.forEach(ev -> {

@ -2,6 +2,7 @@ package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components;
import java.io.InputStream; import java.io.InputStream;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.YearMonth; import java.time.YearMonth;
import java.time.ZoneId; import java.time.ZoneId;
import java.util.Collection; import java.util.Collection;
@ -13,15 +14,15 @@ import net.sf.jasperreports.engine.JRDataSource;
public class MonthlyCalendarCreator<T extends CharSequence> extends CalendarCreator { public class MonthlyCalendarCreator<T extends CharSequence> extends CalendarCreator {
private final YearMonth yearMonthObject; private final YearMonth yearMonthObject;
private Map<Integer, T> values; private Map<LocalDate, T> values;
private Collection<Integer> holidays; private Collection<Integer> holidays;
public MonthlyCalendarCreator(Date date) { public MonthlyCalendarCreator(Date date) {
this.yearMonthObject = YearMonth.from(date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); this.yearMonthObject = YearMonth.from(date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
} }
public MonthlyCalendarCreator<T> setValues(Map<Integer, T> values) { public MonthlyCalendarCreator<T> setValues(Map<LocalDate, T> values2) {
this.values = values; this.values = values2;
return this; return this;
} }
@ -46,7 +47,7 @@ public class MonthlyCalendarCreator<T extends CharSequence> extends CalendarCrea
@Override @Override
protected JRDataSource getSource() { protected JRDataSource getSource() {
return new MonthlyCalendarSource<>(yearMonthObject, values, holidays); return new MonthlyCalendarSource<>(yearMonthObject, MonthlyCalendarSource.map(values), holidays);
} }
} }

@ -1,5 +1,6 @@
package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components; package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components;
import java.time.LocalDate;
import java.time.YearMonth; import java.time.YearMonth;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -7,6 +8,7 @@ import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import net.sf.jasperreports.engine.JRDataSource; import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRException;
@ -25,19 +27,32 @@ public class MonthlyCalendarSource<T extends CharSequence> implements JRDataSour
days = new ArrayList<>(); days = new ArrayList<>();
this.dayContent = dayContent; this.dayContent = dayContent;
this.holidays = holidays; this.holidays = holidays;
prefix = yearMonthObject.atDay(1).getDayOfWeek().getValue() -1; prefix = yearMonthObject.atDay(1).getDayOfWeek().getValue() - 1;
int daysInMonth = yearMonthObject.lengthOfMonth(); int daysInMonth = yearMonthObject.lengthOfMonth();
for (int i=0, limit = daysInMonth + prefix; i<limit; i++) { for (int i = 0, limit = daysInMonth + prefix; i < limit; i++) {
days.add(i+1); days.add(i + 1);
} }
} }
//
// public MonthlyCalendarSource(YearMonth yearMonthObject, Map<LocalDate, T> dayContent,
// Collection<Integer> holidays) {
// this(yearMonthObject, map(dayContent), holidays);
// }
public static <T extends CharSequence> Map<Integer, T> map(Map<LocalDate, T> dayContent) {
Map<Integer, T> values = new HashMap<>();
for (Entry<LocalDate, T> entry : dayContent.entrySet()) {
values.put(entry.getKey().getDayOfMonth(), entry.getValue());
}
return values;
}
@Override @Override
public boolean next() throws JRException { public boolean next() throws JRException {
if (index+1>=days.size()) { if (index + 1 >= days.size()) {
return false; return false;
} }
index++; index++;
@ -52,7 +67,7 @@ public class MonthlyCalendarSource<T extends CharSequence> implements JRDataSour
case "Field_Value": case "Field_Value":
T content = dayContent.get(index - prefix); T content = dayContent.get(index - prefix);
if (content != null && days.get(index)>0) { if (content != null && days.get(index) > 0) {
return content.toString(); return content.toString();
} else { } else {
return ""; return "";
@ -66,11 +81,11 @@ public class MonthlyCalendarSource<T extends CharSequence> implements JRDataSour
public static MonthlyCalendarSource<String> createTestSource() { public static MonthlyCalendarSource<String> createTestSource() {
Map<Integer, String> values = new HashMap<>(); Map<Integer, String> values = new HashMap<>();
for (int i=1; i<30;i+=3) { for (int i = 1; i < 30; i += 3) {
values.put(i, String.format("Termin am %s.", i)); values.put(i, String.format("Termin am %s.", i));
} }
List<Integer> holi = Arrays.asList(2,3,4,5,6); List<Integer> holi = Arrays.asList(2, 3, 4, 5, 6);
return new MonthlyCalendarSource<>(YearMonth.now(), values, holi ); return new MonthlyCalendarSource<>(YearMonth.now(), values, holi);
} }
} }

@ -3,9 +3,9 @@ package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components;
import java.io.InputStream; import java.io.InputStream;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import java.util.Map; import java.util.Map;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components.calendar.Year; import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components.calendar.Year;
@ -21,7 +21,7 @@ public class YearlyCalendarCreator extends CalendarCreator {
this(year, values, Collections.emptyList()); this(year, values, Collections.emptyList());
} }
public YearlyCalendarCreator(int year, Map<LocalDate, CharSequence> values, List<LocalDate> holidays) { public YearlyCalendarCreator(int year, Map<LocalDate, CharSequence> values, Collection<LocalDate> holidays) {
if (values == null) { if (values == null) {
throw new NullPointerException("Calendar values must not be null!"); throw new NullPointerException("Calendar values must not be null!");
} }

@ -4,10 +4,10 @@ import java.time.DayOfWeek;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.Month; import java.time.Month;
import java.time.format.TextStyle; import java.time.format.TextStyle;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@ -24,11 +24,11 @@ public class Year {
this(year, Collections.emptyMap(), Collections.emptyList(), Locale.getDefault()); this(year, Collections.emptyMap(), Collections.emptyList(), Locale.getDefault());
} }
public Year(int year, Map<LocalDate, CharSequence> values, List<LocalDate> holidays) { public Year(int year, Map<LocalDate, CharSequence> values, Collection<LocalDate> holidays) {
this(year, values, holidays, Locale.getDefault()); this(year, values, holidays, Locale.getDefault());
} }
public Year(int year, Map<LocalDate, CharSequence> values, List<LocalDate> holidays, Locale locale) { public Year(int year, Map<LocalDate, CharSequence> values, Collection<LocalDate> holidays, Locale locale) {
if (year < 1900 || year > 2100) { if (year < 1900 || year > 2100) {
throw new IllegalArgumentException("Year value must be between 1900 and 2100"); throw new IllegalArgumentException("Year value must be between 1900 and 2100");
} }

@ -1,4 +1,4 @@
org.slf4j.simpleLogger.defaultLogLevel = trace org.slf4j.simpleLogger.defaultLogLevel = warn
log4j.logger.de.kreth.vaadin.clubhelper=trace log4j.logger.de.kreth.vaadin.clubhelper=trace
log4j.logger.org.hibernate.type=warn log4j.logger.org.hibernate.type=warn
log4j.logger.org.jboss.logging=warn log4j.logger.org.jboss.logging=warn
Loading…
Cancel
Save