1 16 package org.outerj.daisy.httpconnector.handlers; 17 18 import org.mortbay.http.HttpRequest; 19 import org.mortbay.http.HttpResponse; 20 import org.outerj.daisy.repository.Repository; 21 import org.outerj.daisy.repository.RepositoryException; 22 import org.outerj.daisy.repository.user.UserManager; 23 import org.outerj.daisy.repository.user.User; 24 import org.outerj.daisy.repository.user.Role; 25 import org.outerj.daisy.httpconnector.RequestHandler; 26 import org.outerj.daisy.xmlutil.LocalSAXParserFactory; 27 import org.outerx.daisy.x10.UserDocument; 28 import org.outerx.daisy.x10.RoleDocument; 29 import org.apache.xmlbeans.XmlOptions; 30 31 import java.util.Map ; 32 import java.io.IOException ; 33 34 public class UserHandler implements RequestHandler { 35 public String getPathPattern() { 36 return "/user/*"; 37 } 38 39 public void handleRequest(Map matchMap, HttpRequest request, HttpResponse response, Repository repository) throws Exception { 40 long userId = Long.parseLong((String )matchMap.get("1")); 41 UserManager userMan = repository.getUserManager(); 42 43 if (request.getMethod().equals(HttpRequest.__GET)) { 44 User user = userMan.getUser(userId, true); 45 user.getXml().save(response.getOutputStream()); 46 response.commit(); 47 } else if (request.getMethod().equals(HttpRequest.__POST)) { 48 XmlOptions xmlOptions = new XmlOptions().setLoadUseXMLReader(LocalSAXParserFactory.newXmlReader()); 49 UserDocument userDocument = UserDocument.Factory.parse(request.getInputStream(), xmlOptions); 50 UserDocument.User userXml = userDocument.getUser(); 51 User user = userMan.getUser(userId, true); 52 updateUserFromXml(response, userMan, userXml, user); 53 } else if (request.getMethod().equals(HttpRequest.__DELETE)) { 54 userMan.deleteUser(userId); 55 response.commit(); 56 return; 57 } else { 58 response.sendError(HttpResponse.__405_Method_Not_Allowed); 59 } 60 } 61 62 private void updateUserFromXml(HttpResponse response, UserManager userMan, UserDocument.User userXml, User user) throws RepositoryException, IOException { 63 if (user.getUpdateCount() != userXml.getUpdateCount()) 65 throw new RepositoryException("The role was updated by someone else concurrently."); 66 67 user.setEmail(userXml.getEmail()); 69 user.setFirstName(userXml.getFirstName()); 70 user.setLastName(userXml.getLastName()); 71 if (userXml.getPassword() != null) 72 user.setPassword(userXml.getPassword()); 73 user.setUpdateableByUser(userXml.getUpdateableByUser()); 74 user.setConfirmed(userXml.getConfirmed()); 75 user.setConfirmKey(userXml.getConfirmKey()); 76 user.setLogin(userXml.getLogin()); 77 user.setAuthenticationScheme(userXml.getAuthenticationScheme()); 78 79 RoleDocument.Role[] rolesXml = userXml.getRoles().getRoleArray(); 81 boolean roleChanges = false; 82 Role[] currentRoles = user.getAllRoles().getArray(); 83 if (rolesXml.length != currentRoles.length) { 84 roleChanges = true; 85 } else { 86 rolesXmlLoop: for (int i = 0; i < rolesXml.length; i++) { 87 for (int k = 0; k < currentRoles.length; k++) { 88 if (currentRoles[k].getId() == rolesXml[i].getId()) 89 continue rolesXmlLoop; 90 } 91 roleChanges = true; 93 break; 94 } 95 } 96 97 if (roleChanges) { 99 user.clearRoles(); 100 for (int i = 0; i < rolesXml.length; i++) { 101 RoleDocument.Role role = rolesXml[i]; 102 Role r = userMan.getRole(role.getId(), false); 103 user.addToRole(r); 104 } 105 } 106 107 RoleDocument.Role defaultRoleXml = userXml.getRole(); 108 if (defaultRoleXml != null) { 109 Role defaultRole = userMan.getRole(defaultRoleXml.getId(), false); 110 user.setDefaultRole(defaultRole); 111 } else { 112 user.setDefaultRole(null); 113 } 114 user.save(); 115 116 user.getXml().save(response.getOutputStream()); 117 response.commit(); 118 } 119 } 120 | Popular Tags |