diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index bdb8c1a..9ca28c1 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -4,7 +4,9 @@ org.eclipse.jdt.core.compiler.codegen.methodParameters=generate org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 org.eclipse.jdt.core.compiler.compliance=11 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore org.eclipse.jdt.core.compiler.release=enabled org.eclipse.jdt.core.compiler.source=11 diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/AbstractDaoImpl.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/AbstractDaoImpl.java index 2b210c2..534f33e 100644 --- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/AbstractDaoImpl.java +++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/AbstractDaoImpl.java @@ -9,6 +9,7 @@ import javax.persistence.TypedQuery; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; import org.springframework.transaction.annotation.Transactional; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.EntityAccessor; @@ -34,12 +35,19 @@ public abstract class AbstractDaoImpl implements IDao< public void save(T obj) { Date now = new Date(); obj.setChanged(now); - if (entityManager.contains(obj) || obj.hasValidId()) { - entityManager.merge(obj); + + try { + if (entityManager.contains(obj) || obj.hasValidId()) { + entityManager.merge(obj); + } + else { + obj.setCreated(now); + entityManager.persist(obj); + } } - else { - obj.setCreated(now); - entityManager.persist(obj); + catch (DataAccessException e) { + entityManager.refresh(obj); + throw e; } } diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/GroupDef.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/GroupDef.java index eab4e09..5ae6447 100644 --- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/GroupDef.java +++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/GroupDef.java @@ -1,13 +1,10 @@ package de.kreth.vaadin.clubhelper.vaadinclubhelper.data; import java.io.Serializable; -import java.util.List; import javax.persistence.Entity; -import javax.persistence.FetchType; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; -import javax.persistence.ManyToMany; import javax.persistence.NamedQuery; import javax.persistence.Table; @@ -25,13 +22,6 @@ public class GroupDef extends BaseEntity implements Serializable { private String name; - @ManyToMany(fetch = FetchType.LAZY, mappedBy = "groups") - private List persongroups; - - public void addPersongroup(Person persongroup) { - persongroups.add(persongroup); - } - public String getName() { return name; } @@ -40,18 +30,6 @@ public class GroupDef extends BaseEntity implements Serializable { this.name = name; } - public List getPersongroups() { - return persongroups; - } - - public void setPersongroups(List persongroups) { - this.persongroups = persongroups; - } - - public void removePersongroup(Person persongroup) { - getPersongroups().remove(persongroup); - } - @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Person.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Person.java index b8f27f0..e829042 100644 --- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Person.java +++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Person.java @@ -68,7 +68,7 @@ public class Person extends BaseEntity implements Serializable { private List contacts; // bi-directional many-to-many association to Persongroup - @ManyToMany(fetch = FetchType.EAGER) + @ManyToMany(targetEntity = GroupDef.class, fetch = FetchType.EAGER) @JoinTable(name = "persongroup", joinColumns = { @JoinColumn(name = "person_id") }, inverseJoinColumns = { @JoinColumn(name = "group_id") }) private Set groups; @@ -104,7 +104,6 @@ public class Person extends BaseEntity implements Serializable { if (this.groups == null) { this.groups = new HashSet<>(); } - group.addPersongroup(this); this.groups.add(group); } diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/commands/ClubCommand.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/commands/ClubCommand.java index 601655d..16d5e63 100644 --- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/commands/ClubCommand.java +++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/commands/ClubCommand.java @@ -1,8 +1,10 @@ package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.commands; +import java.io.Serializable; + import com.vaadin.server.Resource; -public interface ClubCommand { +public interface ClubCommand extends Serializable { String getLabel(); diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonEditDetails.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonEditDetails.java index 61eb169..99d45c4 100644 --- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonEditDetails.java +++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonEditDetails.java @@ -1,7 +1,6 @@ package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components; import java.util.List; -import java.util.Set; import java.util.function.Consumer; import org.slf4j.Logger; @@ -9,11 +8,12 @@ import org.slf4j.LoggerFactory; import org.vaadin.teemu.switchui.Switch; import com.vaadin.data.Binder; -import com.vaadin.data.Binder.BindingBuilder; import com.vaadin.data.BinderValidationStatus; import com.vaadin.data.HasValue.ValueChangeEvent; import com.vaadin.data.HasValue.ValueChangeListener; import com.vaadin.data.ValidationResult; +import com.vaadin.data.ValueProvider; +import com.vaadin.server.Setter; import com.vaadin.ui.Button; import com.vaadin.ui.ComboBox; import com.vaadin.ui.Component; @@ -44,8 +44,6 @@ public class PersonEditDetails extends HorizontalLayout { private final Binder binder; - private final Binder> binderGroups; - private Consumer personChangeHandler; private Button okButton; @@ -130,7 +128,6 @@ public class PersonEditDetails extends HorizontalLayout { VerticalLayout layout = new VerticalLayout(textPrename, textSureName, birthday, genderBox, textStartPass, close, okButton); - binderGroups = new Binder>(); Component groupLayout = createGroupPanel(groups); contactLayout = new ContactGrid(); contactLayout.setDeleteConsumer(c -> { @@ -178,6 +175,21 @@ public class PersonEditDetails extends HorizontalLayout { iterator().forEachRemaining(comp -> comp.setEnabled(false)); } + static boolean containsGroup(Person p, GroupDef g) { + return p != null + && p.getGroups() != null + && p.getGroups().contains(g); + } + + static void changeGroupContent(Person p, GroupDef g, boolean schouldBeContained) { + if (schouldBeContained) { + p.getGroups().add(g); + } + else { + p.getGroups().remove(g); + } + } + public Component createGroupPanel(List groups) { VerticalLayout layout = new VerticalLayout(); @@ -186,17 +198,11 @@ public class PersonEditDetails extends HorizontalLayout { Switch sw = new Switch(g.getName()); sw.setId("Group_" + g.getName()); sw.setData(g); - layout.addComponent(sw); - BindingBuilder, Boolean> forField = binderGroups.forField(sw); - forField.bind(p -> p.contains(g), (bean, fieldvalue) -> { - if (fieldvalue) { - bean.add(g); - } - else { - bean.remove(g); - } - }); + ValueProvider getter = p -> containsGroup(p, g); + Setter setter = (p, b) -> changeGroupContent(p, g, b); + binder.forField(sw).bind(getter, setter); + layout.addComponent(sw); } binder.addValueChangeListener(new ValueChangeListener() { @@ -211,19 +217,6 @@ public class PersonEditDetails extends HorizontalLayout { newGroups, binder.hasChanges()); } }); - binderGroups.addValueChangeListener(new ValueChangeListener() { - - transient Logger log = LoggerFactory.getLogger(PersonEditDetails.this.getClass()); - - @Override - public void valueChange(ValueChangeEvent event) { - Component comp = event.getComponent(); - Object oldGroups = event.getOldValue(); - Object newGroups = event.getValue(); - log.warn("Changed value in {}, old size={}, new size={}, hasChanges={}", comp.getId(), oldGroups, - newGroups, binderGroups.hasChanges()); - } - }); return layout; } @@ -234,12 +227,6 @@ public class PersonEditDetails extends HorizontalLayout { public void setBean(Person person) { closeWithoutSave(); binder.setBean(person); - if (person != null) { - binderGroups.setBean(person.getGroups()); - } - else { - binderGroups.setBean(null); - } contactLayout.setPerson(person); relationshipLayout.setPerson(person); adressLayout.setPerson(person); @@ -277,7 +264,6 @@ public class PersonEditDetails extends HorizontalLayout { public boolean hasChanges() { return binder.getBean() != null && (binder.hasChanges() - || binderGroups.hasChanges() || contactLayout.hasChanges() || relationshipLayout.hasChanges() || adressLayout.hasChanges()); diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/menu/LoggedOffState.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/menu/LoggedOffState.java index 355a7df..a32c8c5 100644 --- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/menu/LoggedOffState.java +++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/menu/LoggedOffState.java @@ -51,20 +51,23 @@ class LoggedOffState implements MenuItemState { } MenuItem fileMenu = menuBar.getFileMenuItem(); fileMenu.setVisible(true); - LoginCommand loginCommand = new LoginCommand(navigator); - fileMenu.addItem(loginCommand.getLabel(), new CommandWrapper(loginCommand)); - MenuItem editMenu = menuBar.getEditMenuItem(); - editMenu.setVisible(true); CommandWrapper exportCalendarMonthCommand = new CommandWrapper( new ExportCalendarMonthCommand(startProvider, endProvider, dataProvider, printConsumer)); - editMenu.addItem(exportCalendarMonthCommand.getLabel(), exportCalendarMonthCommand); + fileMenu.addItem(exportCalendarMonthCommand.getLabel(), exportCalendarMonthCommand); ClubCommand exportCalendarYearCommand = new ExportCalendarYearCommand(startProvider, endProvider, dataProvider, printConsumer); - editMenu.addItem(exportCalendarYearCommand.getLabel(), new CommandWrapper(exportCalendarYearCommand)); + fileMenu.addItem(exportCalendarYearCommand.getLabel(), new CommandWrapper(exportCalendarYearCommand)); ClubCommand exportCsvCommand = new ExportCsvCommand(menuBar, context); - editMenu.addItem(exportCsvCommand.getLabel(), ev -> exportCsvCommand.execute()); + fileMenu.addItem(exportCsvCommand.getLabel(), ev -> exportCsvCommand.execute()); + + fileMenu.addSeparator(); + ClubCommand loginCommand = loginOutCommand(); + fileMenu.addItem(loginCommand.getLabel(), new CommandWrapper(loginCommand)); } + protected ClubCommand loginOutCommand() { + return new LoginCommand(navigator); + } } diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/menu/LoggedinMenuitemState.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/menu/LoggedinMenuitemState.java index 0271275..46782ab 100644 --- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/menu/LoggedinMenuitemState.java +++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/menu/LoggedinMenuitemState.java @@ -26,19 +26,15 @@ import de.kreth.vaadin.clubhelper.vaadinclubhelper.security.SecurityVerifier; import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.commands.ClubCommand; import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.commands.CreateMeldungCommand; import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.commands.DeleteEventCommand; -import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.commands.ExportCalendarMonthCommand; -import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.commands.ExportCalendarYearCommand; -import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.commands.ExportCsvCommand; import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.commands.LogoutCommand; import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.commands.SwitchViewCommand; -import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components.ClubEventProvider; import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components.ConfirmDialog; import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.navigation.ClubhelperNavigation; import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.navigation.ClubhelperNavigation.ClubNavigator; import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.navigation.ClubhelperViews; import net.sf.jasperreports.engine.JasperPrint; -class LoggedinMenuitemState implements MenuItemState { +class LoggedinMenuitemState extends LoggedOffState { private ClubNavigator navigator2; @@ -48,14 +44,6 @@ class LoggedinMenuitemState implements MenuItemState { private ApplicationContext context; - private ClubEventProvider dataProvider; - - private Supplier startProvider; - - private Supplier endProvider; - - private BiConsumer printConsumer; - private MenuItem openPersonMenuItem; private MenuItem calendarMenuItem; @@ -72,14 +60,10 @@ class LoggedinMenuitemState implements MenuItemState { public LoggedinMenuitemState(ApplicationContext context, UI ui, Supplier startProvider, Supplier endProvider, BiConsumer printConsumer) { - super(); + super(context, startProvider, endProvider, printConsumer); this.ui = ui; this.context = context; - this.startProvider = startProvider; - this.endProvider = endProvider; - this.printConsumer = printConsumer; this.navigator = context.getBean(ClubhelperNavigation.class); - this.dataProvider = context.getBean(ClubEventProvider.class); this.eventBusiness = context.getBean(EventBusiness.class); navigator.add(ev -> setSelectedMenuItem(ev.getNewView())); @@ -91,13 +75,7 @@ class LoggedinMenuitemState implements MenuItemState { @Override public void applyMenuStates(ClubhelperMenuBar menuBar) { - - menuBar.getAllMainMenus().forEach(m -> m.setVisible(false)); - - MenuItem fileMenuItem = menuBar.getFileMenuItem(); - fileMenuItem.setVisible(true); - CommandWrapper logout = new CommandWrapper(new LogoutCommand(navigator2, securityVerifier)); - fileMenuItem.addItem(logout.getLabel(), logout); + super.applyMenuStates(menuBar); prepareEditMenu(menuBar); @@ -110,6 +88,11 @@ class LoggedinMenuitemState implements MenuItemState { setSelectedMenuItem(view); } + @Override + protected ClubCommand loginOutCommand() { + return new LogoutCommand(navigator2, securityVerifier); + } + private void prepareViewMenu(ClubhelperMenuBar menuBar) { MenuItem viewMenu = menuBar.getViewMenuItem(); viewMenu.setVisible(true); @@ -134,15 +117,6 @@ class LoggedinMenuitemState implements MenuItemState { MenuItem editMenu = menuBar.getEditMenuItem(); editMenu.setVisible(true); - CommandWrapper exportCalendarMonthCommand = new CommandWrapper( - new ExportCalendarMonthCommand(startProvider, endProvider, dataProvider, printConsumer)); - editMenu.addItem(exportCalendarMonthCommand.getLabel(), exportCalendarMonthCommand); - ClubCommand exportCalendarYearCommand = new ExportCalendarYearCommand(startProvider, endProvider, dataProvider, - printConsumer); - editMenu.addItem(exportCalendarYearCommand.getLabel(), new CommandWrapper(exportCalendarYearCommand)); - ClubCommand exportCsvCommand = new ExportCsvCommand(menuBar, context); - editMenu.addItem(exportCsvCommand.getLabel(), ev -> exportCsvCommand.execute()); - CreateMeldungCommand createMeldungCommand = new CreateMeldungCommand(context, this::show); createMeldungMenuItem = editMenu.addItem(createMeldungCommand.getLabel(), new CommandWrapper(createMeldungCommand)); diff --git a/src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonFilterTest.java b/src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonFilterTest.java index 3727add..041874d 100644 --- a/src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonFilterTest.java +++ b/src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonFilterTest.java @@ -5,7 +5,6 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.when; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; @@ -52,22 +51,18 @@ class PersonFilterTest { GroupDef adminGroup = new GroupDef(); adminGroup.setId(1); adminGroup.setName("ADMIN"); - adminGroup.setPersongroups(new ArrayList<>()); GroupDef competitorGroup = new GroupDef(); competitorGroup.setName("Wettkämpfer"); competitorGroup.setId(2); - competitorGroup.setPersongroups(new ArrayList<>()); GroupDef participantGroup = new GroupDef(); participantGroup.setName("ACTIVE"); participantGroup.setId(3); - participantGroup.setPersongroups(new ArrayList<>()); GroupDef judgesGroup = new GroupDef(); judgesGroup.setName("Kampfrichter"); judgesGroup.setId(4); - judgesGroup.setPersongroups(new ArrayList<>()); return Collections.unmodifiableList(Arrays.asList(adminGroup, competitorGroup, participantGroup, judgesGroup)); diff --git a/src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonGroupValidatorTest.java b/src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonGroupValidatorTest.java index 9790c49..5948273 100644 --- a/src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonGroupValidatorTest.java +++ b/src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonGroupValidatorTest.java @@ -3,8 +3,6 @@ package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components; import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.assertFalse; -import java.util.ArrayList; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -34,7 +32,6 @@ class PersonGroupValidatorTest { @Test void testOk() { GroupDef group = new GroupDef(); - group.setPersongroups(new ArrayList<>()); person.add(group); ValidationResult result = validator.apply(person, null); assertFalse(result.isError());