From c297d94e0a93379803f170acaddcb45f39bb8053 Mon Sep 17 00:00:00 2001 From: Christian Corsano Date: Thu, 31 Jan 2008 21:03:52 +0000 Subject: [PATCH] Core : Ajout du systeme d'invitation. Creation de l'entite InvitationToken et implementation des methodes d'acces dans les Managers. Prise en compte des invitations lors de l'ajout d'utilisateur --- .../core/article/ArticleManagerBean.java | 2 +- .../conferences/ConferenceManagerBean.java | 53 +++++++++++++ .../core/conferences/IConferenceManager.java | 16 +++- .../ConferenceDoesntExistException.java | 16 +++- .../yacos/core/system/InvitationToken.java | 76 +++++++++++++++++++ .../yacos/core/system/InvitationTokenPK.java | 58 ++++++++++++++ .../org/yacos/core/users/IUserManager.java | 11 ++- .../ejbModule/org/yacos/core/users/User.java | 3 - .../org/yacos/core/users/UserManagerBean.java | 32 ++++++++ 9 files changed, 257 insertions(+), 10 deletions(-) create mode 100644 YACOSCore/ejbModule/org/yacos/core/system/InvitationToken.java create mode 100644 YACOSCore/ejbModule/org/yacos/core/system/InvitationTokenPK.java diff --git a/YACOSCore/ejbModule/org/yacos/core/article/ArticleManagerBean.java b/YACOSCore/ejbModule/org/yacos/core/article/ArticleManagerBean.java index 6520be0..00d7065 100644 --- a/YACOSCore/ejbModule/org/yacos/core/article/ArticleManagerBean.java +++ b/YACOSCore/ejbModule/org/yacos/core/article/ArticleManagerBean.java @@ -66,7 +66,7 @@ public class ArticleManagerBean implements IArticleManager, Serializable { public List
getArticles(Integer confId) throws ConferenceDoesntExistException { Conference conf = em.find(Conference.class, confId); if(conf == null){ - throw new ConferenceDoesntExistException(); + throw new ConferenceDoesntExistException(confId); } Query query = em.createQuery("from Article a WHERE a.conference = ? ORDER BY a.title"); diff --git a/YACOSCore/ejbModule/org/yacos/core/conferences/ConferenceManagerBean.java b/YACOSCore/ejbModule/org/yacos/core/conferences/ConferenceManagerBean.java index 3cff72f..d4bf374 100644 --- a/YACOSCore/ejbModule/org/yacos/core/conferences/ConferenceManagerBean.java +++ b/YACOSCore/ejbModule/org/yacos/core/conferences/ConferenceManagerBean.java @@ -9,8 +9,12 @@ import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; +import org.yacos.core.exceptions.ConferenceDoesntExistException; +import org.yacos.core.system.InvitationToken; +import org.yacos.core.system.InvitationTokenPK; import org.yacos.core.users.Role; import org.yacos.core.users.User; +import org.yacos.core.users.Role.RoleType; @Stateless @@ -111,4 +115,53 @@ public class ConferenceManagerBean implements IConferenceManager { return (this.getConference(conferenceId)!=null); } + /* ================================================ */ + /* = Invitation management methods implementation = */ + /* ================================================ */ + + public InvitationToken addInvitationToken(String email, RoleType role, + Integer conferenceId) throws ConferenceDoesntExistException { + Conference conf = getConference(conferenceId); + + if(conf == null){ + throw new ConferenceDoesntExistException(conferenceId); + } + + + InvitationTokenPK tokenPK = new InvitationTokenPK(); + tokenPK.email = email; + tokenPK.role = role; + tokenPK.conference = conf; + + InvitationToken newToken = em.find(InvitationToken.class, tokenPK); + + if(newToken == null){ + newToken = new InvitationToken(); + newToken.setEmail(email); + newToken.setRole(role); + newToken.setConference(conf); + + em.persist(newToken); + } + + return newToken; + } + + public void removeInvitationToken(InvitationToken token) { + token = em.find(InvitationToken.class, token.getId()); + em.remove(token); + } + + public InvitationToken getInvitationToken(InvitationTokenPK tokenId) { + return em.find(InvitationToken.class, tokenId); + } + + @SuppressWarnings("unchecked") + public List getInvitationTokensForConference(Integer conferenceId) { + Conference conf = em.find(Conference.class, conferenceId); + Query query = em.createQuery("from InvitationToken where conference=?"); + query.setParameter(1, conf); + return query.getResultList(); + } + } diff --git a/YACOSCore/ejbModule/org/yacos/core/conferences/IConferenceManager.java b/YACOSCore/ejbModule/org/yacos/core/conferences/IConferenceManager.java index 7278ed5..d332d16 100644 --- a/YACOSCore/ejbModule/org/yacos/core/conferences/IConferenceManager.java +++ b/YACOSCore/ejbModule/org/yacos/core/conferences/IConferenceManager.java @@ -5,13 +5,17 @@ import java.util.List; import javax.ejb.Remote; +import org.yacos.core.exceptions.ConferenceDoesntExistException; +import org.yacos.core.system.InvitationToken; +import org.yacos.core.system.InvitationTokenPK; import org.yacos.core.users.Role; import org.yacos.core.users.User; +import org.yacos.core.users.Role.RoleType; @Remote public interface IConferenceManager { - //CRUD methodes + // CRUD methods public Conference addConference(String titre, String descirption, String infoComplementray, Date dataAbstract, Date dateArticle, Date dateEvaluation, Date dateStart, Date dateEnd); public Conference getConference(Integer id); @@ -24,16 +28,22 @@ public interface IConferenceManager { //public void addArticle(User user); //public Collection
getArticles(Integer id); - //list methodes + // Listing methods public List getConferences(); public List getConferences(User user); - //role et user methode + // Role and User management methods public Role addRole(Role.RoleType roleType, String login, Integer confId); public void removeRole(Role role); public List getRoles(Conference conf); public List getRoles(String userLogin, Integer confId); public void updateRole(Role role); public boolean exists(Integer conferenceId); + + // Invitation management methods + public InvitationToken getInvitationToken(InvitationTokenPK tokenId); + public List getInvitationTokensForConference(Integer conferenceId); + public InvitationToken addInvitationToken(String email, RoleType role, Integer conferenceId) throws ConferenceDoesntExistException; + public void removeInvitationToken(InvitationToken tokenId); } diff --git a/YACOSCore/ejbModule/org/yacos/core/exceptions/ConferenceDoesntExistException.java b/YACOSCore/ejbModule/org/yacos/core/exceptions/ConferenceDoesntExistException.java index 54a3a9c..aa85ed5 100644 --- a/YACOSCore/ejbModule/org/yacos/core/exceptions/ConferenceDoesntExistException.java +++ b/YACOSCore/ejbModule/org/yacos/core/exceptions/ConferenceDoesntExistException.java @@ -1,7 +1,21 @@ package org.yacos.core.exceptions; -public class ConferenceDoesntExistException extends Exception { +import java.io.Serializable; +public class ConferenceDoesntExistException extends Exception implements Serializable { private static final long serialVersionUID = 1L; + private Integer conferenceId; + + public ConferenceDoesntExistException(Integer conferenceId) { + this.conferenceId = conferenceId; + } + + public Integer getConferenceId() { + return conferenceId; + } + + public void setConferenceId(Integer conferenceId) { + this.conferenceId = conferenceId; + } } diff --git a/YACOSCore/ejbModule/org/yacos/core/system/InvitationToken.java b/YACOSCore/ejbModule/org/yacos/core/system/InvitationToken.java new file mode 100644 index 0000000..5aa0d3b --- /dev/null +++ b/YACOSCore/ejbModule/org/yacos/core/system/InvitationToken.java @@ -0,0 +1,76 @@ +/** + * + */ +package org.yacos.core.system; + +import java.io.Serializable; + +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.Id; +import javax.persistence.IdClass; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import org.yacos.core.conferences.Conference; +import org.yacos.core.users.Role.RoleType; + +/** + * Token for an invitation. + * Gives the ability for a user to gain role for a conference at registration time. + * Allow a chairman or a PC member to gives a PC Member or Referee role to a person not yet registered. + * @author christiancorsano + * + */ +@Entity +@IdClass(InvitationTokenPK.class) +public class InvitationToken implements Serializable { + private static final long serialVersionUID = -7383377207105284233L; + + @Id + private String email; + + @Id + @Enumerated(EnumType.ORDINAL) + private RoleType role; + + @Id + @ManyToOne(targetEntity=Conference.class,optional=false) + @JoinColumn(name="conference_id",nullable=false) + private Conference conference; + + + public String getEmail(){ + return email; + } + + public void setEmail(String email){ + this.email = email; + } + + @Enumerated(EnumType.ORDINAL) + public RoleType getRole(){ + return role; + } + + @Enumerated(EnumType.ORDINAL) + public void setRole(RoleType role){ + this.role = role; + } + + @ManyToOne(targetEntity=Conference.class,optional=false) + @JoinColumn(name="conference_id",nullable=false) + public Conference getConference(){ + return conference; + } + + @ManyToOne(targetEntity=Conference.class,optional=false) + @JoinColumn(name="conference_id",nullable=false) + public void setConference(Conference conf){ + this.conference = conf; + } + + public InvitationTokenPK getId(){ + return new InvitationTokenPK(email,role,conference); + } +} diff --git a/YACOSCore/ejbModule/org/yacos/core/system/InvitationTokenPK.java b/YACOSCore/ejbModule/org/yacos/core/system/InvitationTokenPK.java new file mode 100644 index 0000000..0676851 --- /dev/null +++ b/YACOSCore/ejbModule/org/yacos/core/system/InvitationTokenPK.java @@ -0,0 +1,58 @@ +package org.yacos.core.system; + +import java.io.Serializable; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import org.yacos.core.conferences.Conference; +import org.yacos.core.users.Role.RoleType; + +/** + * Primary key class for the {@link InvitationToken} entity + * @author christiancorsano + * + */ +public class InvitationTokenPK implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * PK attribute : email + */ + public String email; + /** + * PK attribute : role + */ + public RoleType role; + /** + * PK attribute : conference + */ + @ManyToOne(targetEntity=Conference.class,optional=false) + @JoinColumn(name="conference_id",nullable=false) + public Conference conference; + + public InvitationTokenPK(String email2, RoleType role2, + Conference conference2) { + this.email = email2; + this.role = role2; + this.conference = conference2; + } + + public InvitationTokenPK() { + } + + @Override + public boolean equals(Object obj) { + if(obj instanceof InvitationTokenPK){ + InvitationTokenPK objPK = (InvitationTokenPK) obj; + return this.email.equals(objPK.email) + && this.role.equals(objPK.role) + && this.conference.getId().equals(objPK.conference.getId()); + } else { + return false; + } + } + + @Override + public int hashCode() { + return this.email.hashCode() ^ this.role.hashCode() ^ conference.getId().hashCode(); + } +} diff --git a/YACOSCore/ejbModule/org/yacos/core/users/IUserManager.java b/YACOSCore/ejbModule/org/yacos/core/users/IUserManager.java index c41fd60..0ac251a 100644 --- a/YACOSCore/ejbModule/org/yacos/core/users/IUserManager.java +++ b/YACOSCore/ejbModule/org/yacos/core/users/IUserManager.java @@ -6,6 +6,8 @@ import javax.ejb.Remote; import org.yacos.core.conferences.Conference; import org.yacos.core.exceptions.PKAlreadyUsedException; +import org.yacos.core.system.InvitationToken; +import org.yacos.core.system.InvitationTokenPK; import org.yacos.core.users.Role.RoleType; /** @@ -15,7 +17,7 @@ import org.yacos.core.users.Role.RoleType; @Remote public interface IUserManager { - //crud methode + // crud methods public User addUser(String login, String password, String firstName, String lastName, String organization, String email) throws PKAlreadyUsedException; public void removeUser(String login); @@ -23,7 +25,7 @@ public interface IUserManager { public void UpdateUser(User user); public Boolean exists(String login); - // methodes lister + // Lists methods public List getUsers(); public List getUsers(Conference conf); public List getUsers(int conf_id,Role.RoleType type); @@ -41,4 +43,9 @@ public interface IUserManager { * @param conferenceId The id of the conference for which the Role is to be removed */ public void removeRole(String userLogin, RoleType roleType, int conferenceId); + public boolean hasRoleForConference(String userLogin, RoleType roleType, Integer conferenceId); + + // InvitationToken handling methods + public List getInvitationTokensForEmail(String email); + public void useInvitationTokenOnUser(String userLogin, InvitationTokenPK tokenId); } diff --git a/YACOSCore/ejbModule/org/yacos/core/users/User.java b/YACOSCore/ejbModule/org/yacos/core/users/User.java index 1d1f2b5..78d9f3b 100644 --- a/YACOSCore/ejbModule/org/yacos/core/users/User.java +++ b/YACOSCore/ejbModule/org/yacos/core/users/User.java @@ -3,14 +3,11 @@ package org.yacos.core.users; import java.io.Serializable; import java.util.ArrayList; import java.util.List; - -import javax.persistence.CascadeType; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.OneToMany; - import org.yacos.core.article.Article; import org.yacos.core.conferences.Conference; diff --git a/YACOSCore/ejbModule/org/yacos/core/users/UserManagerBean.java b/YACOSCore/ejbModule/org/yacos/core/users/UserManagerBean.java index 7ab08dc..1c2f867 100644 --- a/YACOSCore/ejbModule/org/yacos/core/users/UserManagerBean.java +++ b/YACOSCore/ejbModule/org/yacos/core/users/UserManagerBean.java @@ -13,6 +13,8 @@ import javax.persistence.Query; import org.yacos.core.conferences.Conference; import org.yacos.core.exceptions.PKAlreadyUsedException; +import org.yacos.core.system.InvitationToken; +import org.yacos.core.system.InvitationTokenPK; import org.yacos.core.users.Role.RoleType; /** @@ -42,6 +44,13 @@ public class UserManagerBean implements IUserManager{ User user = new User(login, password, firstName, lastName, organization, email); em.persist(user); em.flush(); + + // Existing InvitationToken handling + List tokens = getInvitationTokensForEmail(user.getEmail()); + for(InvitationToken token : tokens){ + useInvitationTokenOnUser(login, token.getId()); + } + return user; } else{ throw new PKAlreadyUsedException(); } @@ -108,4 +117,27 @@ public class UserManagerBean implements IUserManager{ em.remove(role); } + @SuppressWarnings("unchecked") + public List getInvitationTokensForEmail(String email) { + Query query = em.createQuery("from InvitationToken where email=?"); + query.setParameter(1, email); + return query.getResultList(); + } + + public void useInvitationTokenOnUser(String userLogin, + InvitationTokenPK tokenId) { + InvitationToken token = em.find(InvitationToken.class,tokenId); + addRoleForConference(userLogin, token.getRole(), token.getConference().getId()); + em.remove(token); + } + + public boolean hasRoleForConference(String userLogin, RoleType roleType, + Integer conferenceId) { + User user = getUser(userLogin); + Conference conf = em.find(Conference.class, conferenceId); + RolePK pk = new RolePK(user,roleType,conf); + Role role = em.find(Role.class, pk); + return role != null; + } + }