Benki: Clean up the data model mapping some more.

 - Replaces user attribute table mappings with element collections and
   join table mappings.
 - Adds an explicit schema specifier to all join table specifiers.

Change-Id: I0e251e1939faa895155cbe868220d98be2c1e70c
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/accesscontrol/Role.java b/src/main/java/eu/mulk/mulkcms2/benki/accesscontrol/Role.java
index 73648dc..200997e 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/accesscontrol/Role.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/accesscontrol/Role.java
@@ -37,6 +37,7 @@
   @ManyToMany(fetch = FetchType.LAZY)
   @JoinTable(
       name = "role_subroles",
+      schema = "benki",
       joinColumns = @JoinColumn(name = "superrole"),
       inverseJoinColumns = @JoinColumn(name = "subrole"))
   public Set<Role> directSubroles;
@@ -47,6 +48,7 @@
   @ManyToMany(fetch = FetchType.LAZY)
   @JoinTable(
       name = "effective_role_subroles",
+      schema = "benki",
       joinColumns = @JoinColumn(name = "superrole"),
       inverseJoinColumns = @JoinColumn(name = "subrole"))
   public Set<Role> effectiveSubroles;
@@ -67,7 +69,7 @@
   public Collection<User> effectiveUsers;
 
   @ElementCollection(fetch = FetchType.LAZY)
-  @CollectionTable(name = "role_tags", joinColumns = @JoinColumn(name = "role"))
+  @CollectionTable(name = "role_tags", schema = "benki", joinColumns = @JoinColumn(name = "role"))
   @Column(name = "tag")
   public Set<String> tags;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/generic/Post.java b/src/main/java/eu/mulk/mulkcms2/benki/generic/Post.java
index a9a5ebd..309fb67 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/generic/Post.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/generic/Post.java
@@ -35,6 +35,7 @@
   @ManyToMany(fetch = FetchType.LAZY)
   @JoinTable(
       name = "user_visible_posts",
+      schema = "benki",
       joinColumns = @JoinColumn(name = "message"),
       inverseJoinColumns = @JoinColumn(name = "user"))
   public Set<User> visibleTo;
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/users/OpenId.java b/src/main/java/eu/mulk/mulkcms2/benki/users/OpenId.java
deleted file mode 100644
index bb41dda..0000000
--- a/src/main/java/eu/mulk/mulkcms2/benki/users/OpenId.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package eu.mulk.mulkcms2.benki.users;
-
-import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-
-@Entity(name = "BenkiOpenId")
-@Table(name = "openids", schema = "benki")
-public class OpenId extends PanacheEntityBase {
-
-  @Id
-  @Column(name = "openid", nullable = false, length = -1)
-  public String openid;
-
-  @ManyToOne(fetch = FetchType.LAZY)
-  @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
-  public User user;
-}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/users/RsaKey.java b/src/main/java/eu/mulk/mulkcms2/benki/users/RsaKey.java
index 9dd7931..d03597b 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/users/RsaKey.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/users/RsaKey.java
@@ -2,13 +2,14 @@
 
 import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import java.math.BigInteger;
-import java.util.Collection;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.Id;
 import javax.persistence.IdClass;
-import javax.persistence.OneToMany;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 
 @Entity
@@ -24,6 +25,11 @@
   @Column(name = "exponent", nullable = false, precision = 0)
   public BigInteger exponent;
 
-  @OneToMany(mappedBy = "rsaKey", fetch = FetchType.LAZY)
-  public Collection<UserRsaKey> users;
+  @ManyToOne(fetch = FetchType.LAZY)
+  @JoinTable(
+      name = "user_rsa_keys",
+      schema = "benki",
+      joinColumns = {@JoinColumn(name = "modulus"), @JoinColumn(name = "exponent")},
+      inverseJoinColumns = @JoinColumn(name = "user"))
+  public User user;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/users/User.java b/src/main/java/eu/mulk/mulkcms2/benki/users/User.java
index e16a111..40e5364 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/users/User.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/users/User.java
@@ -9,11 +9,14 @@
 import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import java.util.Collection;
 import java.util.Set;
+import javax.persistence.CollectionTable;
 import javax.persistence.Column;
+import javax.persistence.ElementCollection;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
 import javax.persistence.JoinTable;
 import javax.persistence.ManyToMany;
 import javax.persistence.OneToMany;
@@ -52,8 +55,10 @@
   @OneToMany(mappedBy = "owner", fetch = FetchType.LAZY)
   public Collection<LazychatMessage> lazychatMessages;
 
-  @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
-  public Collection<OpenId> openids;
+  @ElementCollection(fetch = FetchType.LAZY)
+  @CollectionTable(name = "openids", schema = "benki", joinColumns = @JoinColumn(name = "user"))
+  @Column(name = "openid")
+  public Collection<String> openids;
 
   @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
   public Collection<PageKey> pageKeys;
@@ -64,27 +69,41 @@
   @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
   public Collection<UserDefaultTarget> defaultTargets;
 
-  @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
-  public Collection<UserEmailAddress> emailAddresses;
+  @ElementCollection(fetch = FetchType.LAZY)
+  @CollectionTable(
+      name = "user_email_addresses",
+      schema = "benki",
+      joinColumns = @JoinColumn(name = "user"))
+  @Column(name = "email")
+  public Collection<String> emailAddresses;
 
-  @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
-  public Collection<UserJid> jids;
+  @ElementCollection(fetch = FetchType.LAZY)
+  @CollectionTable(name = "user_jids", schema = "benki", joinColumns = @JoinColumn(name = "user"))
+  @Column(name = "jid")
+  public Collection<String> jids;
 
-  @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
-  public Collection<UserNickname> nicknames;
+  @ElementCollection(fetch = FetchType.LAZY)
+  @CollectionTable(
+      name = "user_nicknames",
+      schema = "benki",
+      joinColumns = @JoinColumn(name = "user"))
+  @Column(name = "nickname")
+  public Collection<String> nicknames;
 
   @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
   public Collection<UserRole> directRoles;
 
   @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
-  public Collection<UserRsaKey> rsaKeys;
+  public Collection<RsaKey> rsaKeys;
 
   @OneToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "role", referencedColumnName = "id", nullable = false)
   public Role ownedRole;
 
-  @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
-  public Collection<WebId> webids;
+  @ElementCollection(fetch = FetchType.LAZY)
+  @CollectionTable(name = "webids", schema = "benki", joinColumns = @JoinColumn(name = "user"))
+  @Column(name = "webid")
+  public Collection<String> webids;
 
   @OneToMany(mappedBy = "author", fetch = FetchType.LAZY)
   public Collection<WikiPageRevision> wikiPageRevisions;
@@ -95,6 +114,7 @@
   @ManyToMany(fetch = FetchType.LAZY)
   @JoinTable(
       name = "effective_user_roles",
+      schema = "benki",
       joinColumns = @JoinColumn(name = "user"),
       inverseJoinColumns = @JoinColumn(name = "role"))
   public Set<Role> effectiveRoles;
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/users/UserEmailAddress.java b/src/main/java/eu/mulk/mulkcms2/benki/users/UserEmailAddress.java
deleted file mode 100644
index 383c382..0000000
--- a/src/main/java/eu/mulk/mulkcms2/benki/users/UserEmailAddress.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package eu.mulk.mulkcms2.benki.users;
-
-import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-
-@Entity
-@Table(name = "user_email_addresses", schema = "benki")
-public class UserEmailAddress extends PanacheEntityBase {
-
-  @Id
-  @Column(name = "email", nullable = false, length = -1)
-  public String email;
-
-  @ManyToOne(fetch = FetchType.LAZY)
-  @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
-  public User user;
-}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/users/UserJid.java b/src/main/java/eu/mulk/mulkcms2/benki/users/UserJid.java
deleted file mode 100644
index 867583c..0000000
--- a/src/main/java/eu/mulk/mulkcms2/benki/users/UserJid.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package eu.mulk.mulkcms2.benki.users;
-
-import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.Id;
-import javax.persistence.IdClass;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-
-@Entity
-@Table(name = "user_jids", schema = "benki")
-@IdClass(UserJidPK.class)
-public class UserJid extends PanacheEntityBase {
-
-  @Id
-  @Column(name = "user", nullable = false)
-  public int userId;
-
-  @Id
-  @Column(name = "jid", nullable = false, length = -1)
-  public String jid;
-
-  @ManyToOne(fetch = FetchType.LAZY)
-  @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
-  public User user;
-}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/users/UserJidPK.java b/src/main/java/eu/mulk/mulkcms2/benki/users/UserJidPK.java
deleted file mode 100644
index 19eeaeb..0000000
--- a/src/main/java/eu/mulk/mulkcms2/benki/users/UserJidPK.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package eu.mulk.mulkcms2.benki.users;
-
-import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Id;
-
-public class UserJidPK implements Serializable {
-
-  private int userId;
-  private String jid;
-
-  @Column(name = "user", nullable = false)
-  @Id
-  public int getUserId() {
-    return userId;
-  }
-
-  public void setUserId(int userId) {
-    this.userId = userId;
-  }
-
-  @Column(name = "jid", nullable = false, length = -1)
-  @Id
-  public String getJid() {
-    return jid;
-  }
-
-  public void setJid(String jid) {
-    this.jid = jid;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    UserJidPK userJidPK = (UserJidPK) o;
-
-    if (userId != userJidPK.userId) {
-      return false;
-    }
-    if (jid != null ? !jid.equals(userJidPK.jid) : userJidPK.jid != null) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = userId;
-    result = 31 * result + (jid != null ? jid.hashCode() : 0);
-    return result;
-  }
-}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/users/UserNickname.java b/src/main/java/eu/mulk/mulkcms2/benki/users/UserNickname.java
deleted file mode 100644
index 05a8004..0000000
--- a/src/main/java/eu/mulk/mulkcms2/benki/users/UserNickname.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package eu.mulk.mulkcms2.benki.users;
-
-import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-
-@Entity
-@Table(name = "user_nicknames", schema = "benki")
-public class UserNickname extends PanacheEntityBase {
-
-  @Id
-  @Column(name = "nickname", nullable = false, length = -1)
-  public String nickname;
-
-  @ManyToOne(fetch = FetchType.LAZY)
-  @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
-  public User user;
-}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/users/WebId.java b/src/main/java/eu/mulk/mulkcms2/benki/users/WebId.java
deleted file mode 100644
index 9a8728c..0000000
--- a/src/main/java/eu/mulk/mulkcms2/benki/users/WebId.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package eu.mulk.mulkcms2.benki.users;
-
-import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-
-@Entity
-@Table(name = "webids", schema = "benki")
-public class WebId extends PanacheEntityBase {
-
-  @Id
-  @Column(name = "webid", nullable = false, length = -1)
-  public String webid;
-
-  @ManyToOne(fetch = FetchType.LAZY)
-  @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
-  public User user;
-}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/wiki/WikiResource.java b/src/main/java/eu/mulk/mulkcms2/benki/wiki/WikiResource.java
index 10112db..b5ece7e 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/wiki/WikiResource.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/wiki/WikiResource.java
@@ -24,7 +24,6 @@
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import org.jboss.logging.Logger;
-import org.jboss.resteasy.spi.NotImplementedYetException;
 
 @Path("/wiki")
 public class WikiResource {