package org.jboss.seam.example.seamspace;
import static org.jboss.seam.ScopeType.CONVERSATION;
import java.util.Date;
import javax.ejb.Remove;
import javax.persistence.EntityManager;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.Destroy;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Observer;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.security.Identity;
import org.jboss.seam.security.RunAsOperation;
import org.jboss.seam.security.management.IdentityManager;
import org.jboss.seam.security.management.JpaIdentityStore;
@Scope(CONVERSATION)
@Name("register")
public class RegisterAction
{
private Member member;
@In
private EntityManager entityManager;
@In
private Identity identity;
@In
private IdentityManager identityManager;
private MemberAccount newAccount;
private String username;
/**
* Password confirmation
*/
private String password;
private String confirm;
private String gender;
private byte[] picture;
private String pictureContentType;
private boolean verified;
@Begin
public void start()
{
member = new Member();
}
public void next()
{
member.setGender(Member.Gender.valueOf(gender.toLowerCase()));
verified = (confirm != null && confirm.equals(password));
if (!verified)
{
FacesMessages.instance().addToControl("confirmPassword", "Passwords do not match");
}
}
@Observer(JpaIdentityStore.EVENT_USER_CREATED)
public void accountCreated(MemberAccount account)
{
// The user *may* have been created from the user manager screen. In that
// case, create a dummy Member record just for the purpose of demonstrating the
// identity management API
if (member == null)
{
member = new Member();
member.setMemberName(account.getUsername());
member.setGender(Member.Gender.male);
member.setFirstName("John");
member.setLastName("Doe");
member.setEmail(account.getUsername() + "@nowhere.com");
member.setDob(new Date());
member.setMemberSince(new Date());
entityManager.persist(member);
}
account.setMember(member);
this.newAccount = account;
}
@End
public void uploadPicture()
{
member.setMemberSince(new Date());
entityManager.persist(member);
new RunAsOperation() {
public void execute() {
identityManager.createUser(username, password);
identityManager.grantRole(username, "user");
}
}.addRole("admin")
.run();
newAccount.setMember(member);
newAccount = entityManager.merge(newAccount);
if (picture != null && picture.length > 0)
{
MemberImage img = new MemberImage();
img.setData(picture);
img.setMember(member);
img.setContentType(pictureContentType);
entityManager.persist(img);
member.setPicture(img);
member = entityManager.merge(member);
}
// Login the user
identity.getCredentials().setUsername(username);
identity.getCredentials().setPassword(password);
identity.login();
}
public Member getMember()
{
return member;
}
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public String getConfirm()
{
return confirm;
}
public void setConfirm(String confirm)
{
this.confirm = confirm;
}
public String getGender()
{
return gender;
}
public void setGender(String gender)
{
this.gender = gender;
}
public void setPicture(byte[] picture)
{
this.picture = picture;
}
public byte[] getPicture()
{
return picture;
}
public String getPictureContentType()
{
return pictureContentType;
}
public void setPictureContentType(String contentType)
{
this.pictureContentType = contentType;
}
public boolean isVerified()
{
return verified;
}
@Destroy @Remove
public void destroy() {}
}