diff --git a/.classpath b/.classpath
index a2da06e..b2e2b14 100644
--- a/.classpath
+++ b/.classpath
@@ -18,18 +18,13 @@
-
-
-
-
-
-
+
@@ -42,5 +37,10 @@
+
+
+
+
+
diff --git a/.project b/.project
index 227202e..153af15 100644
--- a/.project
+++ b/.project
@@ -31,12 +31,12 @@
- org.eclipse.m2e.core.maven2Builder
+ org.fusesource.ide.project.RiderProjectBuilder
- org.fusesource.ide.project.RiderProjectBuilder
+ org.eclipse.m2e.core.maven2Builder
diff --git a/.settings/com.vaadin.integration.eclipse.prefs b/.settings/com.vaadin.integration.eclipse.prefs
index ef6d26e..9834749 100644
--- a/.settings/com.vaadin.integration.eclipse.prefs
+++ b/.settings/com.vaadin.integration.eclipse.prefs
@@ -1,2 +1,2 @@
-com.vaadin.integration.eclipse.mavenLatestVersionsUpgrade=["8.4.5","8.5.1"]
+com.vaadin.integration.eclipse.mavenLatestVersionsUpgrade=["8.4.5","8.5.2"]
eclipse.preferences.version=1
diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs
index 29abf99..19a8b35 100644
--- a/.settings/org.eclipse.core.resources.prefs
+++ b/.settings/org.eclipse.core.resources.prefs
@@ -3,4 +3,5 @@ encoding//src/main/java=UTF-8
encoding//src/main/resources=UTF-8
encoding//src/test/java=UTF-8
encoding//src/test/resources=UTF-8
+encoding//target/generated-resources/gwt=UTF-8
encoding/=UTF-8
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
index 9c81ef9..f6255c7 100644
--- a/.settings/org.eclipse.jdt.core.prefs
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,10 @@
eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.release=disabled
org.eclipse.jdt.core.compiler.source=1.8
diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml
index f1ff4b5..170b658 100644
--- a/.settings/org.eclipse.wst.common.project.facet.core.xml
+++ b/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -1,8 +1,8 @@
-
+
diff --git a/.settings/org.sonarlint.eclipse.core.prefs b/.settings/org.sonarlint.eclipse.core.prefs
new file mode 100644
index 0000000..b6331ad
--- /dev/null
+++ b/.settings/org.sonarlint.eclipse.core.prefs
@@ -0,0 +1,8 @@
+autoEnabled=true
+eclipse.preferences.version=1
+extraProperties=
+fileExclusions=
+idePrefixKey=
+projectKey=de.kreth.vaadin.clubhelper\:vaadin-clubhelper
+serverId=kreth-development.de
+sqPrefixKey=
diff --git a/pom.xml b/pom.xml
index e581422..beb01a3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,12 +10,12 @@
war
vaadin-clubhelper
- Demo project for Spring Boot
+ Vaadin Administation Frontend for Clubhelper.
org.springframework.boot
spring-boot-starter-parent
- 2.0.3.RELEASE
+ 2.0.6.RELEASE
@@ -23,16 +23,19 @@
UTF-8
UTF-8
1.8
+ ${java.version}
+ ${java.version}
8.4.4
1.23.0
v4-rev488-1.23.0
v3-rev271-1.23.0
+
7af449877bbf41d707e8ae7d322b1d6e9b15a89d
target/surefire-reports
jacoco
reuseReports
- ${project.basedir}/../target/jacoco.exec
-
+ ${project.basedir}/target/jacoco.exec
+
@@ -70,7 +73,7 @@
calendar-component
2.0-BETA4
-
+
org.hibernate
hibernate-core
@@ -79,7 +82,7 @@
mysql
mysql-connector-java
-
+
com.google.apis
google-api-services-calendar
@@ -105,14 +108,23 @@
google-oauth-client-jetty
${google-api-version}
+
+ commons-io
+ commons-io
+ 2.6
+
org.slf4j
slf4j-api
- ch.qos.logback
- logback-classic
+ org.slf4j
+ slf4j-simple
+
+
+
+
org.springframework.boot
@@ -125,14 +137,19 @@
test
- com.h2database
- h2
+ org.junit.jupiter
+ junit-jupiter-engine
test
- commons-io
- commons-io
- 2.6
+ org.junit.vintage
+ junit-vintage-engine
+ test
+
+
+ com.h2database
+ h2
+ test
org.hibernate
@@ -145,8 +162,28 @@
test
- org.slf4j
- slf4j-simple
+ javax.xml.bind
+ jaxb-api
+
+
+ com.sun.xml.bind
+ jaxb-core
+ 2.3.0
+
+
+ com.sun.xml.bind
+ jaxb-impl
+ 2.3.0
+
+
+ javax.activation
+ activation
+ 1.1.1
+
+
+ org.glassfish.jaxb
+ jaxb-runtime
+ 2.4.0-b180830.0438
@@ -168,7 +205,18 @@
org.springframework.boot
spring-boot-maven-plugin
-
+
+
+
+
+
+
+
+
+
+
+
+
com.vaadin
vaadin-maven-plugin
@@ -188,7 +236,25 @@
true
-
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ -javaagent:${sonar.jacoco.jar}=destfile=${sonar.jacoco.reportPath}
+
+
+
+
+
+
+ org.junit.platform
+ junit-platform-surefire-provider
+ 1.3.1
+
+
+
org.jacoco
jacoco-maven-plugin
@@ -223,6 +289,11 @@
vaadin-addons
http://maven.vaadin.com/vaadin-addons
+
+ jvnet-nexus-staging
+ http://maven.java.net/content/repositories/staging/
+ default
+
diff --git a/src/main/java/de/kreth/clubhelperbackend/google/GoogleBaseAdapter.java b/src/main/java/de/kreth/clubhelperbackend/google/GoogleBaseAdapter.java
index c46c4d2..2b3f459 100644
--- a/src/main/java/de/kreth/clubhelperbackend/google/GoogleBaseAdapter.java
+++ b/src/main/java/de/kreth/clubhelperbackend/google/GoogleBaseAdapter.java
@@ -60,11 +60,12 @@ public abstract class GoogleBaseAdapter {
}
protected void checkRefreshToken(String serverName) throws IOException {
-
- if (credential == null) {
- credential = authorize(serverName);
+ synchronized (SCOPES) {
+ if (credential == null) {
+ credential = authorize(serverName);
+ }
}
-
+
if ((credential.getExpiresInSeconds() != null
&& credential.getExpiresInSeconds() < 3600)) {
@@ -87,7 +88,7 @@ public abstract class GoogleBaseAdapter {
* @return an authorized Credential object.
* @throws IOException
*/
- private synchronized Credential authorize(String serverName)
+ private Credential authorize(String serverName)
throws IOException {
if (credential != null && (credential.getExpiresInSeconds() != null
&& credential.getExpiresInSeconds() < 3600)) {
diff --git a/src/main/java/de/kreth/clubhelperbackend/google/calendar/CalendarAdapter.java b/src/main/java/de/kreth/clubhelperbackend/google/calendar/CalendarAdapter.java
index 2102c08..0841f3d 100644
--- a/src/main/java/de/kreth/clubhelperbackend/google/calendar/CalendarAdapter.java
+++ b/src/main/java/de/kreth/clubhelperbackend/google/calendar/CalendarAdapter.java
@@ -74,8 +74,8 @@ public class CalendarAdapter extends GoogleBaseAdapter {
throw new IllegalStateException(
"Calendar " + calendarSummary + " not found!");
}
- Calendar cal = service.calendars().get(calendarId).execute();
- return cal;
+
+ return service.calendars().get(calendarId).execute();
}
public List getAllEvents(String serverName)
@@ -110,8 +110,8 @@ public class CalendarAdapter extends GoogleBaseAdapter {
oldestCal.add(java.util.Calendar.MONTH, -1);
oldestCal.add(java.util.Calendar.YEAR, -1);
oldestCal.add(java.util.Calendar.HOUR_OF_DAY, -1);
- final long oldest = oldestCal.getTimeInMillis();
- return oldest;
+
+ return oldestCal.getTimeInMillis();
}
List getCalendarList(String serverName)
@@ -154,18 +154,17 @@ public class CalendarAdapter extends GoogleBaseAdapter {
public void run() {
try {
- log.debug("Fetching events of calendar \"" + summary + "\"");
+ log.debug("Fetching events of calendar \"{}\"", summary);
Calendar calendar = getCalendarBySummaryName(items, summary);
DateTime timeMin = new DateTime(oldest);
- List items = service.events().list(calendar.getId())
+ List eventItems = service.events().list(calendar.getId())
.setTimeMin(timeMin).execute().getItems();
- items.forEach(item -> item.set("colorClass", colorClass));
- events.addAll(items);
- log.debug("Added " + items.size() + " Events for \"" + summary
- + "\"");
+ eventItems.forEach(item -> item.set("colorClass", colorClass));
+ events.addAll(eventItems);
+ log.debug("Added {} Events for \"{}\"", eventItems.size(), summary);
} catch (IOException e) {
- log.error("Unable to fetch Events from " + summary, e);
+ log.error("Unable to fetch Events from {}", summary, e);
}
}
}
diff --git a/src/main/java/de/kreth/clubhelperbackend/google/calendar/CalendarResource.java b/src/main/java/de/kreth/clubhelperbackend/google/calendar/CalendarResource.java
index 5789257..b504955 100644
--- a/src/main/java/de/kreth/clubhelperbackend/google/calendar/CalendarResource.java
+++ b/src/main/java/de/kreth/clubhelperbackend/google/calendar/CalendarResource.java
@@ -60,7 +60,7 @@ public class CalendarResource {
return new ArrayList<>(configs.values());
}
- public class CalendarKonfig {
+ public static class CalendarKonfig {
private String name;
private String color;
diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/business/CalendarTaskRefresher.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/business/CalendarTaskRefresher.java
index 4e83f4d..417f26d 100644
--- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/business/CalendarTaskRefresher.java
+++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/business/CalendarTaskRefresher.java
@@ -17,7 +17,7 @@ import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubEvent;
@Component
public class CalendarTaskRefresher {
- private static final long RATE = 1000 * 60 * 10;
+ private static final long RATE = 1000L * 60 * 10;
private final Logger log = LoggerFactory.getLogger(getClass());
@Autowired
diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/business/EventBusiness.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/business/EventBusiness.java
index 34f8950..ecd8565 100644
--- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/business/EventBusiness.java
+++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/business/EventBusiness.java
@@ -4,6 +4,7 @@ import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
+import java.nio.file.Files;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.Collections;
@@ -41,7 +42,7 @@ public class EventBusiness {
if (forceRefresh == false) {
List list = dao.listAll();
- log.trace("Returning events from database: {}");
+ log.trace("Returning events from database: {}", list);
return list;
}
@@ -54,12 +55,11 @@ public class EventBusiness {
List list = new ArrayList<>();
try {
- if (forceRefresh) {
- File f = new File("google_events.json");
- f.delete();
- out = new BufferedWriter(new FileWriter(f));
- }
+ File f = new File("google_events.json");
+ Files.delete(f.toPath());
+ out = new BufferedWriter(new FileWriter(f));
+
String remoteHost = "localhost";
CalendarAdapter adapter = new CalendarAdapter();
List events = adapter
@@ -71,24 +71,25 @@ public class EventBusiness {
out.newLine();
}
- if ("cancelled".equals(ev.getStatus()) == false) {
- list.add(ClubEvent.parse(ev));
- } else {
+ if ("cancelled".equals(ev.getStatus())) {
log.debug("Cancelled: {}", ev.getSummary());
+ } else {
+ list.add(ClubEvent.parse(ev));
}
}
} catch (GeneralSecurityException | IOException
| InterruptedException e) {
log.error("Error loading events from google.", e);
- }
-
- if (out != null) {
- try {
- out.close();
- } catch (IOException e) {
- log.error("Error writing File", e);
+ } finally {
+ if (out != null) {
+ try {
+ out.close();
+ } catch (IOException e) {
+ log.error("Error writing File", e);
+ }
}
}
+
return Collections.unmodifiableList(list);
}
diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Adress.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Adress.java
index c77d0ba..2885e3b 100644
--- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Adress.java
+++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Adress.java
@@ -40,9 +40,6 @@ public class Adress implements Serializable {
@ManyToOne
private Person person;
- public Adress() {
- }
-
public int getId() {
return this.id;
}
diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Attendance.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Attendance.java
index e1afba2..0497e5b 100644
--- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Attendance.java
+++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Attendance.java
@@ -36,9 +36,6 @@ public class Attendance implements Serializable {
@ManyToOne
private Person person;
- public Attendance() {
- }
-
public int getId() {
return this.id;
}
diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/CalendarComponent.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/CalendarComponent.java
index e6542c5..5f56436 100644
--- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/CalendarComponent.java
+++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/CalendarComponent.java
@@ -24,7 +24,7 @@ public class CalendarComponent extends CustomComponent {
private static final long serialVersionUID = -9152173211931554059L;
- private DateTimeFormatter dfMonth = DateTimeFormatter.ofPattern("MMMM uu");
+ private transient DateTimeFormatter dfMonth = DateTimeFormatter.ofPattern("MMMM uu");
private Label monthName;
@@ -41,8 +41,6 @@ public class CalendarComponent extends CustomComponent {
.withMonth(Month.from(LocalDateTime.now()));
calendar.setCaption("Events");
calendar.setSizeFull();
- // calendar.setHandler(this::onNextMonth);
- // calendar.setHandler(this::onPrevMonth);
updateMonthText(calendar.getStartDate());
@@ -76,7 +74,7 @@ public class CalendarComponent extends CustomComponent {
calendar.markAsDirty();
}
- class ClubEventProvider extends BasicItemProvider {
+ static class ClubEventProvider extends BasicItemProvider {
private static final long serialVersionUID = -5415397258827236704L;
diff --git a/src/main/resources/simplelogger.properties b/src/main/resources/simplelogger.properties
index 4f66717..26c0aa0 100644
--- a/src/main/resources/simplelogger.properties
+++ b/src/main/resources/simplelogger.properties
@@ -1,2 +1,3 @@
-org.slf4j.simpleLogger.defaultLogLevel = trace
-log4j.logger.org.hibernate.type=trace
\ No newline at end of file
+org.slf4j.simpleLogger.defaultLogLevel = warn
+log4j.logger.org.hibernate.type=info
+log4j.logger.org.jboss.logging=warn
\ No newline at end of file
diff --git a/src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/ClubEventDaoTest.java b/src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/ClubEventDaoTest.java
index 94caf42..cffc3be 100644
--- a/src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/ClubEventDaoTest.java
+++ b/src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/ClubEventDaoTest.java
@@ -7,8 +7,8 @@ import java.time.ZonedDateTime;
import java.util.List;
import org.hibernate.query.Query;
-import org.junit.Ignore;
import org.junit.Test;
+import org.junit.Ignore;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
diff --git a/src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/ClubEventDataTest.java b/src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/ClubEventDataTest.java
index 54c6eb8..68b8dae 100644
--- a/src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/ClubEventDataTest.java
+++ b/src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/ClubEventDataTest.java
@@ -42,6 +42,27 @@ public class ClubEventDataTest extends AbstractDatabaseTest {
return p;
}
+ public List insertPersons(int count) {
+
+ List inserted = new ArrayList<>();
+
+ Transaction tx = session.beginTransaction();
+ for (int i=0; i0);
+ }
+ return inserted;
+ }
+
@Test
public void testInsertEvent() {
ClubEvent ev = creteEvent();
@@ -155,6 +176,41 @@ public class ClubEventDataTest extends AbstractDatabaseTest {
assertEquals(2, entries.size());
}
+ @Test
+ public void testChangeEventParticipantsRapidly() {
+
+ ClubEvent ev = creteEvent();
+ ev.setPersons(new HashSet<>());
+ Transaction tx = session.beginTransaction();
+ session.save(ev);
+ tx.commit();
+
+ ev = session.byId(ClubEvent.class).load(ev.getId());
+ List persons = insertPersons(6);
+ for (Person p: persons) {
+ ev.getPersons().add(p);
+ tx = session.beginTransaction();
+ session.merge(ev);
+ tx.commit();
+ }
+ ev.getPersons().remove(persons.get(2));
+ tx = session.beginTransaction();
+ session.merge(ev);
+ tx.commit();
+ ev.getPersons().remove(persons.get(4));
+ tx = session.beginTransaction();
+ session.merge(ev);
+ tx.commit();
+
+ ev.getPersons().add(persons.get(2));
+ ev.getPersons().add(persons.get(4));
+ tx = session.beginTransaction();
+ session.merge(ev);
+ tx.commit();
+ List result = loadEventPersons();
+ assertEquals(6, result.size());
+ }
+
private ClubEvent creteEvent() {
ClubEvent ev = ClubEventBuilder.builder().withId("id").withAllDay(true)
.withCaption("caption").withDescription("description")
diff --git a/transaction.log b/transaction.log
new file mode 100644
index 0000000..e69de29