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