package com.tddinaction.ejb3.util;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import javax.annotation.Resource;
import javax.naming.InitialContext;
import javax.persistence.EntityManager;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tddinaction.ejb3.entitybeans.ejb3.User;
import com.tddinaction.ejb3.entitybeans.ejb3.UserManager;
public class UserEditor extends HttpServlet {
@Resource(type = EntityManager.class, mappedName = "java:/EntityManager")
private EntityManager em;
private UserManager getUserManager() {
try {
InitialContext ctx = new InitialContext();
return (UserManager) ctx
.lookup("calculator/UserManagerBean/local");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
System.out.println("UserEditor servlet has entity manager: "
+ em);
String action = request.getParameter("action");
String username = request.getParameter("username");
String password = request.getParameter("password");
request.setAttribute("message", dispatch(action, username,
password));
request.setAttribute("results", new ArrayList());
request.setAttribute("previousSQL", "");
render(request, response);
}
public String create(String username, String password) {
getUserManager().create(username, password);
return "user " + username + " created";
}
public String remove(String username, String password) {
User user = getUserManager().findByUsername(username);
if (user == null) {
return "no such user: " + username;
}
if (user.matchesPassword(password)) {
getUserManager().remove(user);
return "user " + username + " removed";
} else {
return "wrong password";
}
}
public String changePassword(String username, String password) {
User user = getUserManager().findByUsername(username);
if (user == null) {
return "no such user: " + username;
}
user.setPassword(password);
getUserManager().update(user);
return "password changed for " + username;
}
private String dispatch(String action, String username,
String password) {
if (action != null) {
try {
Method actionMethod = getClass().getMethod(action,
new Class[] { String.class, String.class });
return (String) actionMethod.invoke(this,
new Object[] { username, password });
} catch (NoSuchMethodException e) {
return "No such action: " + action;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return "No action provided";
}
private void render(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
request.getRequestDispatcher("/sql.jsp").forward(request,
response);
}
}