included calendar exporter into menu

master
Markus Kreth 7 years ago
parent 15180e86e6
commit ec9f71a342
  1. 5
      pom.xml
  2. 131
      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. 41
      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>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.vaadin</groupId>
<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.PipedInputStream;
import java.io.PipedOutputStream;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Month;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalUnit;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@ -50,7 +47,7 @@ import net.sf.jasperreports.engine.JasperPrint;
public class CalendarComponent extends CustomComponent {
private static final long serialVersionUID = -9152173211931554059L;
private transient final Logger log = LoggerFactory.getLogger(getClass());
private transient final Logger log = LoggerFactory.getLogger(getClass());
private transient DateTimeFormatter dfMonth = DateTimeFormatter.ofPattern("MMMM uuuu");
@ -66,12 +63,11 @@ public class CalendarComponent extends CustomComponent {
Button popupButton = new Button("Menu");
popupButton.addClickListener(ev -> openPopupMenu(ev));
HorizontalLayout head = new HorizontalLayout(monthName, popupButton);
dataProvider = new ClubEventProvider();
calendar = new Calendar<>(dataProvider)
.withMonth(Month.from(LocalDateTime.now()));
calendar = new Calendar<>(dataProvider).withMonth(Month.from(LocalDateTime.now()));
calendar.setCaption("Events");
calendar.setSizeFull();
calendar.addListener(ev -> calendarEvent(ev));
@ -96,61 +92,76 @@ public class CalendarComponent extends CustomComponent {
private void openPopupMenu(ClickEvent ev) {
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);
}
private void calendarExport(MenuItem ev1) {
ZonedDateTime start = calendar.getStartDate();
ZonedDateTime end = calendar.getEndDate();
log.debug("exporting Calendar from {} to {}", start, end);
List<ClubEvent> items = dataProvider.getItems(start, end);
Map<Integer, StringBuilder> values = new HashMap<>();
Set<Integer> holidays = new HashSet<>();
boolean monthOnly = ev1.getText().contains("Monat");
List<ClubEvent> items;
ZonedDateTime start;
if (monthOnly) {
start = calendar.getStartDate();
ZonedDateTime end = calendar.getEndDate();
log.debug("exporting Calendar from {} to {}", start, end);
items = dataProvider.getItems(start, end);
} else {
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) {
String calendarName = ev.getOrganizerDisplayName();
if ("Schulferien".equals(calendarName)) {
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);
StringBuilder content;
ZonedDateTime evStart = ev.getStart();
ZonedDateTime evEnd = ev.getEnd();
log.trace("Added to eventsd: {}", ev);
int dayOfMonth = ev.getStart().getDayOfMonth();
int endDayOfMonth = ev.getEnd().getDayOfMonth();
for (;dayOfMonth<=endDayOfMonth; dayOfMonth++) {
if (values.containsKey(dayOfMonth)) {
content = values.get(dayOfMonth);
content.append("\n");
} else {
content = new StringBuilder();
values.put(dayOfMonth, content);
}
content.append(ev.getCaption());
CalendarCreator.iterateDays(evStart.toLocalDate(), evEnd.toLocalDate(), day -> {
StringBuilder content;
if (values.containsKey(day)) {
content = values.get(day);
content.append("\n");
} else {
content = new StringBuilder();
values.put(day, content);
}
}
content.append(ev.getCaption());
});
}
String calendarMonth;
if (monthOnly) {
calendarMonth = dfMonth.format(start);
} else {
calendarMonth = "Jahr " + start.getYear();
}
String calendarMonth = dfMonth.format(start);
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);
Window window = new Window();
window.setCaption("View PDF");
Window window = new Window();
window.setCaption("View PDF");
AbstractComponent e = createEmbedded(calendarMonth, print);
window.setContent(e);
window.setModal(true);
window.setWidth("50%");
window.setHeight("90%");
monthName.getUI().addWindow(window);
window.setContent(e);
window.setModal(true);
window.setWidth("50%");
window.setHeight("90%");
monthName.getUI().addWindow(window);
log.trace("Added pdf window for {}", calendarMonth);
} catch (JRException e) {
log.error("Error Creating Jasper Report for {}", calendarMonth, e);
@ -167,22 +178,22 @@ public class CalendarComponent extends CustomComponent {
final PipedOutputStream out = new PipedOutputStream(in);
final StreamResource resource = new StreamResource(() -> in, title);
resource.setMIMEType("application/pdf");
resource.setMIMEType("application/pdf");
BrowserFrame c = new BrowserFrame("PDF invoice", resource);
c.setSizeFull();
ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(() -> {
try {
c.setSizeFull();
ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(() -> {
try {
JasperExportManager.exportReportToPdfStream(print, out);
} catch (JRException e) {
log.error("Error on Export to Pdf.", e);
throw new RuntimeException(e);
}
});
exec.shutdown();
return c;
});
exec.shutdown();
return c;
}
private void updateMonthText(ZonedDateTime startDate) {

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

@ -2,6 +2,7 @@ package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components;
import java.io.InputStream;
import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.YearMonth;
import java.time.ZoneId;
import java.util.Collection;
@ -13,15 +14,15 @@ import net.sf.jasperreports.engine.JRDataSource;
public class MonthlyCalendarCreator<T extends CharSequence> extends CalendarCreator {
private final YearMonth yearMonthObject;
private Map<Integer, T> values;
private Map<LocalDate, T> values;
private Collection<Integer> holidays;
public MonthlyCalendarCreator(Date date) {
this.yearMonthObject = YearMonth.from(date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
}
public MonthlyCalendarCreator<T> setValues(Map<Integer, T> values) {
this.values = values;
public MonthlyCalendarCreator<T> setValues(Map<LocalDate, T> values2) {
this.values = values2;
return this;
}
@ -46,7 +47,7 @@ public class MonthlyCalendarCreator<T extends CharSequence> extends CalendarCrea
@Override
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;
import java.time.LocalDate;
import java.time.YearMonth;
import java.util.ArrayList;
import java.util.Arrays;
@ -7,6 +8,7 @@ import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
@ -19,25 +21,38 @@ public class MonthlyCalendarSource<T extends CharSequence> implements JRDataSour
private int index = -1;
private int prefix;
private final Collection<Integer> holidays;
public MonthlyCalendarSource(YearMonth yearMonthObject, Map<Integer, T> dayContent, Collection<Integer> holidays) {
days = new ArrayList<>();
this.dayContent = dayContent;
this.holidays = holidays;
prefix = yearMonthObject.atDay(1).getDayOfWeek().getValue() -1;
prefix = yearMonthObject.atDay(1).getDayOfWeek().getValue() - 1;
int daysInMonth = yearMonthObject.lengthOfMonth();
for (int i=0, limit = daysInMonth + prefix; i<limit; i++) {
days.add(i+1);
for (int i = 0, limit = daysInMonth + prefix; i < limit; i++) {
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
public boolean next() throws JRException {
if (index+1>=days.size()) {
if (index + 1 >= days.size()) {
return false;
}
index++;
@ -52,7 +67,7 @@ public class MonthlyCalendarSource<T extends CharSequence> implements JRDataSour
case "Field_Value":
T content = dayContent.get(index - prefix);
if (content != null && days.get(index)>0) {
if (content != null && days.get(index) > 0) {
return content.toString();
} else {
return "";
@ -63,14 +78,14 @@ public class MonthlyCalendarSource<T extends CharSequence> implements JRDataSour
return "";
}
}
public static MonthlyCalendarSource<String> createTestSource() {
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));
}
List<Integer> holi = Arrays.asList(2,3,4,5,6);
return new MonthlyCalendarSource<>(YearMonth.now(), values, holi );
List<Integer> holi = Arrays.asList(2, 3, 4, 5, 6);
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.time.LocalDate;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components.calendar.Year;
@ -21,7 +21,7 @@ public class YearlyCalendarCreator extends CalendarCreator {
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) {
throw new NullPointerException("Calendar values must not be null!");
}

@ -4,10 +4,10 @@ import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.format.TextStyle;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
@ -24,11 +24,11 @@ public class Year {
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());
}
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) {
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.org.hibernate.type=warn
log4j.logger.org.jboss.logging=warn
Loading…
Cancel
Save