Person Relation is shown.

master
Markus Kreth 7 years ago
parent 4b95244f50
commit eaa2219cb8
  1. 8
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/ClubEventDaoImpl.java
  2. 5
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/PersonDao.java
  3. 31
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/PersonDaoImpl.java
  4. 79
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Relation.java
  5. 17
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Relative.java
  6. 88
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonEditDetails.java
  7. 2
      src/test/java/de/kreth/vaadin/clubhelper/HibernateHolder.java
  8. 2
      src/test/java/de/kreth/vaadin/clubhelper/MysqlLocalConfiguration.java
  9. 2
      src/test/java/de/kreth/vaadin/clubhelper/MysqlTestConfiguration.java
  10. 84
      src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/PersonDaoRelativeTest.java
  11. 4
      src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/tests/TestConfiguration.java

@ -55,6 +55,12 @@ public class ClubEventDaoImpl extends AbstractDaoImpl<ClubEvent> implements Club
} }
} }
executeQueries(event, added, removed);
current.addAll(added);
current.removeAll(removed);
}
public void executeQueries(ClubEvent event, List<Person> added, List<Person> removed) {
if (!added.isEmpty()) { if (!added.isEmpty()) {
Query insertQuery = entityManager.createNativeQuery( Query insertQuery = entityManager.createNativeQuery(
"INSERT INTO clubevent_has_person (clubevent_id, person_id) VALUES (:eventId,:personId)"); "INSERT INTO clubevent_has_person (clubevent_id, person_id) VALUES (:eventId,:personId)");
@ -73,8 +79,6 @@ public class ClubEventDaoImpl extends AbstractDaoImpl<ClubEvent> implements Club
deleteQuery.executeUpdate(); deleteQuery.executeUpdate();
} }
} }
current.addAll(added);
current.removeAll(removed);
} }
@Override @Override

@ -1,8 +1,11 @@
package de.kreth.vaadin.clubhelper.vaadinclubhelper.dao; package de.kreth.vaadin.clubhelper.vaadinclubhelper.dao;
import java.util.List;
import javax.persistence.NoResultException; import javax.persistence.NoResultException;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Relation;
public interface PersonDao extends IDao<Person> { public interface PersonDao extends IDao<Person> {
@ -15,4 +18,6 @@ public interface PersonDao extends IDao<Person> {
* @throws NoResultException if no result is found. * @throws NoResultException if no result is found.
*/ */
Person findLoginUser(String username, String password) throws NoResultException; Person findLoginUser(String username, String password) throws NoResultException;
List<Relation> findRelationsFor(Person p);
} }

@ -1,14 +1,18 @@
package de.kreth.vaadin.clubhelper.vaadinclubhelper.dao; package de.kreth.vaadin.clubhelper.vaadinclubhelper.dao;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.persistence.Query;
import javax.persistence.TypedQuery; import javax.persistence.TypedQuery;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Contact; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Contact;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.EntityAccessor; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.EntityAccessor;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Relation;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Startpass; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Startpass;
@Repository @Repository
@ -37,6 +41,7 @@ public class PersonDaoImpl extends AbstractDaoImpl<Person> implements PersonDao
} }
} }
@Transactional
public void persistIfNew(EntityAccessor c) { public void persistIfNew(EntityAccessor c) {
if (c.hasValidId() == false) { if (c.hasValidId() == false) {
entityManager.persist(c); entityManager.persist(c);
@ -51,4 +56,30 @@ public class PersonDaoImpl extends AbstractDaoImpl<Person> implements PersonDao
return query.getSingleResult(); return query.getSingleResult();
} }
@Override
public List<Relation> findRelationsFor(Person p) {
Query query = entityManager.createNativeQuery(
"SELECT id, person1, person2, TO_PERSON1_RELATION, TO_PERSON2_RELATION, changed, created, deleted FROM relative");
@SuppressWarnings("unchecked")
List<Object[]> result = query.getResultList();
List<Relation> relations = new ArrayList<>();
for (Object[] r : result) {
Relation rel = toRelative(r, p.getId());
if (rel != null) {
relations.add(rel);
}
}
return relations;
}
private Relation toRelative(Object[] r, int ignoring) {
if (r[1].equals(ignoring)) {
return new Relation(entityManager.find(Person.class, r[2]), r[3].toString());
} else if (r[2].equals(ignoring)) {
return new Relation(entityManager.find(Person.class, r[1]), r[4].toString());
}
return null;
}
} }

@ -0,0 +1,79 @@
package de.kreth.vaadin.clubhelper.vaadinclubhelper.data;
public class Relation {
public enum RelationType {
RELATIONSHIP("Partner"), SIBLINGS("Geschwister"), PARENT("Elternteil"), CHILD("Kind");
private final String localized;
private RelationType(String localized) {
this.localized = localized;
}
public String getLocalized() {
return localized;
}
}
private Person person;
private String relation;
public Relation(Person person, String relation) {
super();
this.person = person;
this.relation = relation;
}
public Person getPerson() {
return person;
}
public RelationType getRelation() {
return RelationType.valueOf(relation);
}
@Override
public String toString() {
return "Relation [person=" + person + ", relation=" + relation + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((person == null) ? 0 : person.hashCode());
result = prime * result + ((relation == null) ? 0 : relation.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Relation other = (Relation) obj;
if (person == null) {
if (other.person != null) {
return false;
}
} else if (!person.equals(other.person)) {
return false;
}
if (relation == null) {
if (other.relation != null) {
return false;
}
} else if (!relation.equals(other.relation)) {
return false;
}
return true;
}
}

@ -11,7 +11,6 @@ import javax.persistence.ManyToOne;
import javax.persistence.NamedQuery; import javax.persistence.NamedQuery;
import javax.persistence.Table; import javax.persistence.Table;
/** /**
* The persistent class for the relative database table. * The persistent class for the relative database table.
* *
@ -19,9 +18,10 @@ import javax.persistence.Table;
@Entity @Entity
@Table(name = "relative") @Table(name = "relative")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@NamedQuery(name="Relative.findAll", query="SELECT r FROM Relative r") @NamedQuery(name = Relative.QUERY_FINDALL, query = "SELECT r FROM Relative r")
public class Relative extends BaseEntity implements Serializable { public class Relative extends BaseEntity implements Serializable {
public static final String QUERY_FINDALL = "Relative.findAll";
private static final long serialVersionUID = -1331008393583211773L; private static final long serialVersionUID = -1331008393583211773L;
@Column(name = "TO_PERSON1_RELATION") @Column(name = "TO_PERSON1_RELATION")
@ -75,6 +75,19 @@ public class Relative extends BaseEntity implements Serializable {
this.person2Bean = person2Bean; this.person2Bean = person2Bean;
} }
public Relation getRelationTo(Person person) {
if (person == null) {
return null;
}
if (person.equals(person1Bean)) {
return new Relation(person2Bean, toPerson2Relation);
} else if (person.equals(person2Bean)) {
return new Relation(person1Bean, toPerson1Relation);
} else {
return null;
}
}
@Override @Override
public int hashCode() { public int hashCode() {
final int prime = 31; final int prime = 31;

@ -10,10 +10,11 @@ import com.vaadin.data.BinderValidationStatus;
import com.vaadin.data.ValidationResult; import com.vaadin.data.ValidationResult;
import com.vaadin.ui.Button; import com.vaadin.ui.Button;
import com.vaadin.ui.ComboBox; import com.vaadin.ui.ComboBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.DateField; import com.vaadin.ui.DateField;
import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Notification; import com.vaadin.ui.Notification;
import com.vaadin.ui.Panel; import com.vaadin.ui.TabSheet;
import com.vaadin.ui.TextField; import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.VerticalLayout;
@ -21,6 +22,7 @@ import de.kreth.vaadin.clubhelper.vaadinclubhelper.dao.PersonDao;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Gender; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Gender;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.GroupDef; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.GroupDef;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Relation;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Startpass; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Startpass;
public class PersonEditDetails extends HorizontalLayout { public class PersonEditDetails extends HorizontalLayout {
@ -30,9 +32,13 @@ public class PersonEditDetails extends HorizontalLayout {
private final TextField textSureName; private final TextField textSureName;
private final DateField birthday; private final DateField birthday;
private final PersonDao dao;
private final Binder<Person> binder; private final Binder<Person> binder;
private Consumer<Person> personChangeHandler; private Consumer<Person> personChangeHandler;
private Button okButton; private Button okButton;
private VerticalLayout contactLayout;
private VerticalLayout relationshipLayout;
public PersonEditDetails(List<GroupDef> groups, PersonDao dao) { public PersonEditDetails(List<GroupDef> groups, PersonDao dao) {
this(groups, dao, true); this(groups, dao, true);
@ -40,6 +46,8 @@ public class PersonEditDetails extends HorizontalLayout {
public PersonEditDetails(List<GroupDef> groups, PersonDao dao, boolean showCloseButton) { public PersonEditDetails(List<GroupDef> groups, PersonDao dao, boolean showCloseButton) {
this.dao = dao;
setCaption("Personendetails"); setCaption("Personendetails");
textPrename = new TextField("Vorname"); textPrename = new TextField("Vorname");
@ -64,30 +72,12 @@ public class PersonEditDetails extends HorizontalLayout {
return startpass.getStartpassNr(); return startpass.getStartpassNr();
}, (p, value) -> p.setStartpass(value)); }, (p, value) -> p.setStartpass(value));
Panel groupPanel = new Panel("Gruppen");
VerticalLayout glay = new VerticalLayout();
groupPanel.setContent(glay);
for (GroupDef g : groups) {
Switch sw = new Switch(g.getName());
sw.setData(g);
glay.addComponent(sw);
binder.forField(sw).bind(p -> p.getGroups().contains(g), (bean, fieldvalue) -> {
if (fieldvalue) {
bean.getGroups().add(g);
} else {
bean.getGroups().remove(g);
}
});
}
binder.withValidator(p -> (p.getGroups() != null && p.getGroups().isEmpty() == false), binder.withValidator(p -> (p.getGroups() != null && p.getGroups().isEmpty() == false),
"Mind. eine Gruppe muss gewählt sein!"); "Mind. eine Gruppe muss gewählt sein!");
Button close = new Button("Schließen"); Button close = new Button("Schließen");
if (showCloseButton) { if (showCloseButton) {
close.addClickListener(ev -> closeWithoutSave(dao)); close.addClickListener(ev -> closeWithoutSave());
} else { } else {
close.setVisible(false); close.setVisible(false);
} }
@ -117,8 +107,47 @@ public class PersonEditDetails extends HorizontalLayout {
okButton.setEnabled(false); okButton.setEnabled(false);
VerticalLayout layout = new VerticalLayout(textPrename, textSureName, birthday, genderBox, textStartPass, close, VerticalLayout layout = new VerticalLayout(textPrename, textSureName, birthday, genderBox, textStartPass, close,
okButton); okButton);
addComponents(layout, groupPanel);
Component groupLayout = createGroupPanel(groups);
Component contactLayout = createContactLayout();
Component relationshipLayout = createRelationshipLayout();
TabSheet sheet = new TabSheet();
sheet.addTab(groupLayout, "Gruppen");
sheet.addTab(contactLayout, "Kontakte");
sheet.addTab(relationshipLayout, "Angehörige");
addComponents(layout, sheet);
}
private Component createRelationshipLayout() {
relationshipLayout = new VerticalLayout();
return relationshipLayout;
}
private Component createContactLayout() {
contactLayout = new VerticalLayout();
return contactLayout;
}
public Component createGroupPanel(List<GroupDef> groups) {
VerticalLayout layout = new VerticalLayout();
for (GroupDef g : groups) {
Switch sw = new Switch(g.getName());
sw.setData(g);
layout.addComponent(sw);
binder.forField(sw).bind(p -> p.getGroups().contains(g), (bean, fieldvalue) -> {
if (fieldvalue) {
bean.getGroups().add(g);
} else {
bean.getGroups().remove(g);
}
});
}
return layout;
} }
public void setPersonChangeHandler(Consumer<Person> personChangeHandler) { public void setPersonChangeHandler(Consumer<Person> personChangeHandler) {
@ -130,12 +159,27 @@ public class PersonEditDetails extends HorizontalLayout {
if (person != null) { if (person != null) {
okButton.setEnabled(true); okButton.setEnabled(true);
updateRelationshipBinding();
} else { } else {
okButton.setEnabled(false); okButton.setEnabled(false);
contactLayout.removeAllComponents();
relationshipLayout.removeAllComponents();
}
}
private void updateRelationshipBinding() {
relationshipLayout.removeAllComponents();
Person current = binder.getBean();
List<Relation> related = dao.findRelationsFor(current);
for (Relation relation : related) {
TextField textField = new TextField(relation.getRelation().getLocalized());
textField.setValue(relation.getPerson().getPrename() + " " + relation.getPerson().getSurname());
textField.setEnabled(false);
relationshipLayout.addComponent(textField);
} }
} }
private void closeWithoutSave(PersonDao dao) { private void closeWithoutSave() {
if (binder.hasChanges()) { if (binder.hasChanges()) {
ConfirmDialog dlg = ConfirmDialog.builder().setCaption("Ungespeicherte Änderungen") ConfirmDialog dlg = ConfirmDialog.builder().setCaption("Ungespeicherte Änderungen")

@ -12,7 +12,7 @@ public enum HibernateHolder {
private HibernateHolder() { private HibernateHolder() {
configuration = new Configuration(); configuration = new Configuration();
HibernateConfiguration config = new H2MemoryConfiguration(); HibernateConfiguration config = new MysqlLocalConfiguration();
config.configure(configuration); config.configure(configuration);
} }

@ -22,7 +22,7 @@ public class MysqlLocalConfiguration extends AbstractHibernateConfiguration {
} }
public String getUrl() { public String getUrl() {
return "jdbc:mysql://localhost/test?useUnicode=yes&characterEncoding=utf8"; return "jdbc:mysql://localhost/clubhelper?useUnicode=yes&characterEncoding=utf8&serverTimezone=UTC&useSSL=FALSE";
} }
} }

@ -4,7 +4,7 @@ public class MysqlTestConfiguration extends MysqlLocalConfiguration {
@Override @Override
public String getUrl() { public String getUrl() {
return "jdbc:mysql://localhost/clubhelper?useUnicode=yes&characterEncoding=utf8"; return "jdbc:mysql://localhost/test?useUnicode=yes&characterEncoding=utf8&serverTimezone=UTC&useSSL=FALSE";
} }
@Override @Override

@ -0,0 +1,84 @@
package de.kreth.vaadin.clubhelper.vaadinclubhelper.dao;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.List;
import javax.persistence.EntityManager;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.tests.TestConfiguration;
@SpringBootTest
@ContextConfiguration(classes = TestConfiguration.class)
@Disabled
public class PersonDaoRelativeTest {
@Autowired
private PersonDao personDao;
@Autowired
private EntityManager entityManager;
@Autowired
private TestDatabaseHelper testDatabaseHelper;
@Autowired
private SessionFactory sessionFactory;
private Person person1;
private Person person2;
@BeforeEach
public void setUp() throws Exception {
// testDatabaseHelper.cleanDatabase();
// List<Person> persons = TestPersonGenerator.generatePersonen(2);
// person1 = persons.get(0);
// person2 = persons.get(1);
List<Person> resultList = entityManager.createNamedQuery(Person.QUERY_FINDALL, Person.class).getResultList();
assertFalse(resultList.isEmpty());
}
@AfterEach
public void clearDatabase() throws IOException {
// testDatabaseHelper.cleanDatabase();
}
@Test
void testLoadPersonById() {
person1 = entityManager.find(Person.class, Integer.valueOf(1));
assertNotNull(person1);
assertEquals(1, person1.getId());
}
@Test
void testStorePersonChildRelationship() {
Session session = sessionFactory.openSession();
session.doWork(conn -> {
try (Statement stm = conn.createStatement()) {
ResultSet rs = stm.executeQuery(
"SELECT id, person1, person2, TO_PERSON1_RELATION, TO_PERSON2_RELATION, changed, created, deleted FROM relative where person1=1 OR person2=1 and deleted is null");
while (rs.next()) {
System.out.println("id=" + rs.getInt("id") + ", person1=" + rs.getInt("person1") + ", person2="
+ rs.getInt("person2") + ", TO_PERSON1_RELATION=" + rs.getString("TO_PERSON1_RELATION"));
}
}
});
}
}

@ -31,4 +31,8 @@ public class TestConfiguration {
return sessionFactory.openSession(); return sessionFactory.openSession();
} }
@Bean
public SessionFactory sessionFactory() {
return sessionFactory;
}
} }

Loading…
Cancel
Save