Funcionalidad al 90%:

-Front-End Completo.
-Falta conectar Roles con Access
-Errores menores
master
Araozu 2018-06-15 19:22:19 -05:00
parent f10fe6b81b
commit 55ef3eb2ef
49 changed files with 21462 additions and 602 deletions

View File

@ -2,6 +2,10 @@
<classpath> <classpath>
<classpathentry kind="src" path="src"/> <classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="com.google.appengine.eclipse.core.GAE_CONTAINER/appengine-java-sdk-1.9.54"/> <classpathentry kind="con" path="com.google.appengine.eclipse.core.GAE_CONTAINER/appengine-java-sdk-1.9.54"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
<attributes>
<attribute name="owner.project.facets" value="java"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="war/WEB-INF/classes"/> <classpathentry kind="output" path="war/WEB-INF/classes"/>
</classpath> </classpath>

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,6 @@
eclipse.preferences.version=1 eclipse.preferences.version=1
filesCopiedToWebInfLib=appengine-api-1.0-sdk-1.9.54.jar|appengine-api-labs.jar|appengine-endpoints-deps.jar|appengine-endpoints.jar|appengine-jsr107cache-1.9.54.jar|asm-5.0.4.jar|datanucleus-api-jdo-3.1.3.jar|datanucleus-api-jpa-3.1.3.jar|datanucleus-appengine-2.1.2.jar|datanucleus-core-3.1.3.jar|geronimo-jpa_2.0_spec-1.0.jar|jdo-api-3.0.1.jar|jsr107cache-1.1.jar|jta-1.1.jar filesCopiedToWebInfLib=appengine-api-1.0-sdk-1.9.54.jar|appengine-api-labs.jar|appengine-endpoints-deps.jar|appengine-endpoints.jar|appengine-jsr107cache-1.9.54.jar|asm-5.0.4.jar|datanucleus-api-jdo-3.1.3.jar|datanucleus-api-jpa-3.1.3.jar|datanucleus-appengine-2.1.2.jar|datanucleus-core-3.1.3.jar|geronimo-jpa_2.0_spec-1.0.jar|jdo-api-3.0.1.jar|jsr107cache-1.1.jar|jta-1.1.jar
gaeDatanucleusVersion=v2 gaeDatanucleusVersion=v2
gaeDeployDialogSettings=
gaeHrdEnabled=true gaeHrdEnabled=true
gaeLaunchAppInBrowser=true

View File

@ -1,7 +1,12 @@
eclipse.preferences.version=1 eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.7
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.8 org.eclipse.jdt.core.compiler.source=1.7

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<faceted-project> <faceted-project>
<installed facet="java" version="1.8"/> <installed facet="java" version="1.7"/>
</faceted-project> </faceted-project>

View File

@ -41,5 +41,6 @@
<orderEntry type="library" name="com.google.appengine.eclipse.core.GAE_CONTAINER/appengine-java-sdk-1.9.54" level="application" /> <orderEntry type="library" name="com.google.appengine.eclipse.core.GAE_CONTAINER/appengine-java-sdk-1.9.54" level="application" />
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="library" name="API AppEngine 1" level="project" /> <orderEntry type="library" name="API AppEngine 1" level="project" />
<orderEntry type="library" name="platform" level="application" />
</component> </component>
</module> </module>

View File

@ -1,18 +1,94 @@
package controller.roles; package controller.roles;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import controller.users.UsersControllerView;
import model.Role;
import javax.jdo.JDOObjectNotFoundException;
import javax.jdo.PersistenceManager;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException; import java.io.IOException;
@SuppressWarnings("serial") @SuppressWarnings("serial")
public class RolesControllerAdd extends HttpServlet { public class RolesControllerAdd extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PersistenceManager pm = controller.PMF.get().getPersistenceManager();
//Accion a realizar
String action = request.getParameter("action");
if (action == null)
action = "";
switch (action){
case "create":
String name = request.getParameter("roleName");
Boolean status = Boolean.parseBoolean(request.getParameter("roleStatus"));
Role role = new Role(name,status);
try{
pm.makePersistent(role);
} finally {
System.out.println("Role creado");
}
break;
case "redirect":
HttpSession sesion= request.getSession();
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/View/Roles/Add.jsp");
request.setAttribute("User",UsersControllerView.getUser(sesion.getAttribute("userID").toString()));
dispatcher.forward(request, response);
break;
case "update":
Key a = KeyFactory.stringToKey(request.getParameter("key"));
Role role1 = pm.getObjectById(Role.class, a);
role1.setName(request.getParameter("roleName"));
role1.setStatus(Boolean.parseBoolean(request.getParameter("roleStatus")));
//role1.setImgUrl(userImg);
break;
case "delete":
a = KeyFactory.stringToKey(request.getParameter("key"));
try{
pm.deletePersistent(pm.getObjectById(Role.class, a));
} catch (JDOObjectNotFoundException e){
e.printStackTrace();
}
break;
}
pm.close();
try{
response.sendRedirect("/roles");
}
//Al redirigr al jsp para crear, se usa RequestDispatcher, y este entra en conflicto con sendRedirect.
catch (IllegalStateException e){
System.err.println("IllegalStateException: There was a double redirect.");
}
} }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
} }
}

View File

@ -1,5 +1,11 @@
package controller.roles; package controller.roles;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import model.Role;
import javax.jdo.JDOObjectNotFoundException;
import javax.jdo.PersistenceManager;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -10,9 +16,26 @@ import java.io.IOException;
public class RolesControllerDelete extends HttpServlet { public class RolesControllerDelete extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PersistenceManager pm = controller.PMF.get().getPersistenceManager();
try {
Key k = KeyFactory.stringToKey(request.getParameter("key"));
try{
pm.deletePersistent(pm.getObjectById(Role.class, k));
} catch (JDOObjectNotFoundException e){
System.err.println("Exception catched -> " + e.getMessage());
}
} catch (NullPointerException e){
System.err.println("Exception captured -> " + e.getMessage());
}
response.sendRedirect("/roles");
} }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
} }
} }

View File

@ -1,18 +1,44 @@
package controller.roles; package controller.roles;
import controller.users.UsersControllerView;
import model.User;
import javax.jdo.PersistenceManager;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException; import java.io.IOException;
@SuppressWarnings("serial") @SuppressWarnings("serial")
public class RolesControllerIndex extends HttpServlet { public class RolesControllerIndex extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Se usa para revisar si hay una sesion activa
HttpSession sesion= request.getSession();
//Intenta hallar una sesion activa
try{
User user = UsersControllerView.getUser(sesion.getAttribute("userID").toString());
if (user == null) throw new NullPointerException("UsersControllerIndex: El usuario recibido es nulo.");
request.setAttribute("User",user);
request.setAttribute("RoleList",RolesControllerView.getAllRoles());
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/View/Roles/index.jsp");
dispatcher.forward(request,response);
}
//Si no la encuentra, redirige a la pagina inicial.
catch (Exception e){
e.printStackTrace();
response.getWriter().println("<html><head><script>window.location.replace(\"../\")</script></head><body></body></html>");
}
} }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
} }
} }

View File

@ -1,18 +1,94 @@
package controller.roles; package controller.roles;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import controller.users.UsersControllerView;
import model.Role;
import javax.jdo.PersistenceManager;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.List;
@SuppressWarnings("serial") @SuppressWarnings("serial")
public class RolesControllerView extends HttpServlet { public class RolesControllerView extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String action = request.getParameter("action");
//Para evitar errores, si no hay ninguna accion, se establece a vacio.
if (action == null)
action = "";
String key = request.getParameter("key");
//Redirige al formulario para editar un Role (role/view)
if (action.equals("editRedirect") && key != null){
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/View/Roles/view.jsp");
request.setAttribute("Role",getRole(key));
request.setAttribute("UserLogged",UsersControllerView.getUser(request.getSession().getAttribute("userID").toString()));
//Ya que se quiere editar, el atributo permitirEdicion es verdadero. Este atributo se comprueba en el JSP.
request.setAttribute("editAllowed",true);
request.setAttribute("action","Edit");
try{
dispatcher.forward(request,response);
} catch (javax.servlet.ServletException e){
System.err.println("Exception captured -> " + e.getMessage());
}
}
//Redirige al formulario para ver un usuario (user/view)
else if (action.equals("viewRedirect") && key != null){
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/View/Roles/view.jsp");
request.setAttribute("Role",getRole(key));
request.setAttribute("UserLogged",UsersControllerView.getUser(request.getSession().getAttribute("userID").toString()));
//Ya que no quiere editar, el atributo permitirEdicion es falso. Este atributo se comprueba en el JSP.
request.setAttribute("editAllowed",false);
request.setAttribute("action","View");
try{
dispatcher.forward(request,response);
} catch (javax.servlet.ServletException e){
System.err.println("Exception captured -> " + e.getMessage());
}
}
//Si no se encontró acción, regresa al inicio
else {
response.getWriter().println("<html><head><script>window.location.replace(\"../\");</script><body></body></html>");
}
} }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
/**
* Metodo Estatico getAllRoles
*
* Devuelve un list con todos los Roles que existen desde cualquier parte del codigo.
*
* @return Un List<Role> con todos los Roles
* */
@SuppressWarnings("unchecked")
public static List<Role> getAllRoles(){
PersistenceManager pm = controller.PMF.get().getPersistenceManager();
List<Role> users = (List<Role>) pm.newQuery("select from " + Role.class.getName()).execute();
pm.close();
return users;
}
static Role getRole(String key){
PersistenceManager pm = controller.PMF.get().getPersistenceManager();
Key k = KeyFactory.stringToKey(key);
Role role = pm.getObjectById(Role.class, k);
pm.close();
return role;
} }
} }

View File

@ -18,9 +18,14 @@ public class UsersControllerAdd extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PersistenceManager pm = controller.PMF.get().getPersistenceManager(); PersistenceManager pm = controller.PMF.get().getPersistenceManager();
//Accion a realizar
String action = request.getParameter("action");
if (action == null)
action = "";
//Email del usuario //Email del usuario
String userEmail = request.getParameter("userEmail"); String userEmail = request.getParameter("userEmail");
@ -40,37 +45,34 @@ public class UsersControllerAdd extends HttpServlet {
String userImg = request.getParameter("userImg"); String userImg = request.getParameter("userImg");
String userRole = request.getParameter("userRole"); String userRole = request.getParameter("userRole");
//Accion a realizar
String action = request.getParameter("action");
if (action == null)
action = "";
switch (action) { switch (action) {
//Si se quiere iniciar sesion y/o registrar un usuario desde el inicio de sesion de Google //Si se quiere iniciar sesion y/o registrar un usuario desde el inicio de sesion de Google
case "logIn": case "logIn":
//Busca si ya existe una sesion iniciada //Busca si ya existe una sesion iniciada
HttpSession misesion = request.getSession(true); HttpSession misesion = request.getSession();
crearUsuario(userID, userEmail, userName, userImg, userRole, pm);
//Si no existe la sesion, la crea usando el ID del usuario //Si no existe la sesion, la crea usando el ID del usuario
if (!sesionExist(misesion)) { if (!sesionExist(misesion)) {
misesion = request.getSession(true); misesion = request.getSession(true);
misesion.setAttribute("userID", userID); misesion.setAttribute("userID", userID);
System.out.println("Sesiones: luego de add -> " + misesion.getAttribute("userID"));
//La sesion perdurara sin actividad durante 6 minutos //La sesion perdurara sin actividad durante 1h.
misesion.setMaxInactiveInterval(360); misesion.setMaxInactiveInterval(3600);
} }
crearUsuario(userID, userEmail, userName, userImg, userRole, pm);
break; break;
//Si lo que se quiere es redirigir al Form para crear usuario //Si lo que se quiere es redirigir al Form para crear usuario
case "redirect": case "redirect":
HttpSession sesion= request.getSession();
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/View/Users/Add.jsp"); RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/View/Users/Add.jsp");
request.setAttribute("User",UsersControllerView.getUser(sesion.getAttribute("userID").toString()));
dispatcher.forward(request, response); dispatcher.forward(request, response);
break; break;
@ -87,23 +89,20 @@ public class UsersControllerAdd extends HttpServlet {
user.setName(userName); user.setName(userName);
user.setEmail(userEmail); user.setEmail(userEmail);
user.setImgUrl(userImg); user.setImgUrl(userImg);
user.setRole(new Role(userRole)); user.setRole(new Role(userRole,true));
break; break;
//Intenta eliminar un usario con el paramaetro userID
case "delete":
try{
pm.deletePersistent(pm.getObjectById(User.class, userID));
} catch (JDOObjectNotFoundException e){
e.printStackTrace();
}
break;
} }
pm.close(); pm.close();
try{
response.sendRedirect("/users"); response.sendRedirect("/users");
}
//Al redirigr al jsp para crear, se usa RequestDispatcher, y este entra en conflicto con sendRedirect.
catch (IllegalStateException e){
System.err.println("IllegalStateException: There was a double redirect.");
}
} }
@ -131,12 +130,13 @@ public class UsersControllerAdd extends HttpServlet {
private boolean sesionExist(HttpSession sesion){ private boolean sesionExist(HttpSession sesion){
try{ try{
//Intenta buscar el atributo userID dentro de la sesion //Intenta buscar el atributo userID dentro de la sesion
boolean a = sesion.getAttribute("userID").toString().isEmpty(); String a = sesion.getAttribute("userID").toString();
System.out.println("Sesion existe -> " + a);
//Si lo encuentra, la sesion si existe //Si lo encuentra, la sesion si existe
System.out.println("Session exists");
return true; return true;
} catch (NullPointerException e){ } catch (NullPointerException e){
//Si no, la sesion no existe //Si no, la sesion no existe
System.out.println("Sesion no existe");
return false; return false;
} }
} }
@ -144,19 +144,16 @@ public class UsersControllerAdd extends HttpServlet {
private void crearUsuario(String userID, String userEmail, String userName, String userImg, String userRole, PersistenceManager pm){ private void crearUsuario(String userID, String userEmail, String userName, String userImg, String userRole, PersistenceManager pm){
//Revisa si el usuario con su ID ya tiene un objeto User Persistente almacenado. //Revisa si el usuario con su ID ya tiene un objeto User Persistente almacenado.
if (userExists(userID, pm)){
System.out.println("User exists!!!!");
}
//Si no existe, crea el objeto de tipo User con los datos que se obtienen del request, y lo hace Persistente. //Si no existe, crea el objeto de tipo User con los datos que se obtienen del request, y lo hace Persistente.
else { if (!userExists(userID, pm)){
//El new Role es provisional, hasta que termine la implementacion del CRUD de Role. //El new Role es provisional, hasta que termine la implementacion del CRUD de Role.
User user = new User(userID, userName, userImg, userEmail, new Role(userRole)); User user = new User(userID, userName, userImg, userEmail, new Role(userRole,true));
try{ try{
pm.makePersistent(user); pm.makePersistent(user);
} finally { } finally {
System.out.println("Usuario creado con exito."); System.out.println("Usuario creado con exito -> " + user);
} }
} }

View File

@ -1,5 +1,9 @@
package controller.users; package controller.users;
import model.User;
import javax.jdo.JDOObjectNotFoundException;
import javax.jdo.PersistenceManager;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -10,9 +14,22 @@ import java.io.IOException;
public class UsersControllerDelete extends HttpServlet { public class UsersControllerDelete extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PersistenceManager pm = controller.PMF.get().getPersistenceManager();
String userID = request.getParameter("userID");
try{
pm.deletePersistent(pm.getObjectById(User.class, userID));
} catch (JDOObjectNotFoundException e){
System.err.println("Exception catched -> " + e.getMessage());
}
response.sendRedirect("/users");
} }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
} }
}

View File

@ -1,7 +1,8 @@
package controller.users; package controller.users;
import model.User;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter;
import javax.jdo.PersistenceManager; import javax.jdo.PersistenceManager;
import javax.servlet.RequestDispatcher; import javax.servlet.RequestDispatcher;
@ -11,28 +12,28 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
import com.google.appengine.api.users.User;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;
@SuppressWarnings("serial") @SuppressWarnings("serial")
public class UsersControllerIndex extends HttpServlet { public class UsersControllerIndex extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
//Se usa para revisar si hay nua sesion activa //Se usa para revisar si hay una sesion activa
HttpSession sesion= request.getSession(); HttpSession sesion= request.getSession();
PersistenceManager pm = controller.PMF.get().getPersistenceManager();
//Intenta hallar una sesion activa //Intenta hallar una sesion activa
try{ try{
request.setAttribute("User",UsersControllerView.getUser(sesion.getAttribute("userID").toString())); User usario = UsersControllerView.getUser(sesion.getAttribute("userID").toString());
if (usario == null) throw new NullPointerException("UsersControllerIndex: El usuario recibido es nulo.");
request.setAttribute("User",usario);
request.setAttribute("UsersList",UsersControllerView.getAllUsers()); request.setAttribute("UsersList",UsersControllerView.getAllUsers());
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/View/Users/index.jsp"); RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/View/Users/index.jsp");
dispatcher.forward(request,response); dispatcher.forward(request,response);
} }
//Si no la encuentra, redirige a la pagina inicial. //Si no la encuentra, redirige a la pagina inicial.
catch (Exception e){ catch (Exception e){
e.printStackTrace(); System.err.println("Error catched. " + e.getMessage());
response.getWriter().println("<html><head><script>window.location.replace(\"../\")</script></head><body></bodyy></html>"); response.getWriter().println("<html><head><script>window.location.replace(\"../\")</script></head><body></bodyy></html>");
} }

View File

@ -1,18 +0,0 @@
package controller.users;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@SuppressWarnings("serial")
public class UsersControllerTest extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}

View File

@ -33,6 +33,8 @@ public class UsersControllerView extends HttpServlet {
else if (action.equals("editRedirect") && userID != null){ else if (action.equals("editRedirect") && userID != null){
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/View/Users/view.jsp"); RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/View/Users/view.jsp");
request.setAttribute("User",getUser(userID)); request.setAttribute("User",getUser(userID));
request.setAttribute("UserLogged",getUser(request.getSession().getAttribute("userID").toString()));
//Ya que se quiere editar, el atributo permitirEdicion es verdadero. Este atributo se comprueba en el JSP. //Ya que se quiere editar, el atributo permitirEdicion es verdadero. Este atributo se comprueba en el JSP.
request.setAttribute("editAllowed",true); request.setAttribute("editAllowed",true);
@ -47,6 +49,7 @@ public class UsersControllerView extends HttpServlet {
else if (action.equals("viewRedirect") && userID != null){ else if (action.equals("viewRedirect") && userID != null){
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/View/Users/view.jsp"); RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/View/Users/view.jsp");
request.setAttribute("User",getUser(userID)); request.setAttribute("User",getUser(userID));
request.setAttribute("UserLogged",getUser(request.getSession().getAttribute("userID").toString()));
//Ya que no quiere editar, el atributo permitirEdicion es falso. Este atributo se comprueba en el JSP. //Ya que no quiere editar, el atributo permitirEdicion es falso. Este atributo se comprueba en el JSP.
request.setAttribute("editAllowed",false); request.setAttribute("editAllowed",false);
@ -79,10 +82,9 @@ public class UsersControllerView extends HttpServlet {
* @see User * @see User
* *
* */ * */
static User getUser(String userID){ public static User getUser(String userID){
PersistenceManager pm = controller.PMF.get().getPersistenceManager(); PersistenceManager pm = controller.PMF.get().getPersistenceManager();
try{ try{
System.out.println("UserID: " + userID);
User user = pm.getObjectById(User.class, userID); User user = pm.getObjectById(User.class, userID);
pm.close(); pm.close();
return user; return user;
@ -113,8 +115,7 @@ public class UsersControllerView extends HttpServlet {
* Metodo closeSession * Metodo closeSession
* *
* Este metodo cierra la sesion actual y la sesion de Google. Primero, obtiene la sesion actual del objeto HttpSession y la elimina, * Este metodo cierra la sesion actual y la sesion de Google. Primero, obtiene la sesion actual del objeto HttpSession y la elimina,
* e imprime la url desde la cual fue llamado. Esta url es la respuesta a la llamada que se hace mediante AJAX. * e imprime un documento HTML basico, que se encarga de cerrar la sesion de Google y redirigir a la pagina de inicio.
* Ver metodo signOut() en users/index.jsp
* *
* *
* @param request Request * @param request Request
@ -125,14 +126,19 @@ public class UsersControllerView extends HttpServlet {
HttpSession sesion = request.getSession(); HttpSession sesion = request.getSession();
sesion.invalidate(); sesion.invalidate();
String urlRef = request.getRequestURL().toString(); String urlRef = request.getRequestURL().toString();
try{
if (urlRef.contains("8/")){ if (urlRef.contains("8/")){
response.getWriter().println(urlRef.substring(0,urlRef.indexOf("8/")+2)); urlRef =(urlRef.substring(0,urlRef.indexOf("8/")+2));
} else { } else {
response.getWriter().println(urlRef.substring(0,urlRef.indexOf("m/")+2)); urlRef = (urlRef.substring(0,urlRef.indexOf("m/")+2));
} }
try {
response.getWriter().println("<html><head><script>window.location.replace(\"https://www.google.com/accounts/" +
"Logout?continue=https://appengine.google.com/_ah/logout?continue=" + urlRef + "\");</script></head></html>");
}catch (IOException e){ }catch (IOException e){
e.printStackTrace(); e.printStackTrace();
} }
} }
} }

View File

@ -1,11 +1,17 @@
package model; package model;
import com.google.appengine.api.datastore.Key; import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent; import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey; import javax.jdo.annotations.PrimaryKey;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
@PersistenceCapable @PersistenceCapable
public class Role { public class Role {
@ -17,12 +23,60 @@ public class Role {
@Persistent @Persistent
private String name; private String name;
public Role(String name){ @Persistent
private String createDate;
@Persistent
private boolean status;
@Persistent
private List<Access> accessesList;
public Role(String name, boolean status) {
this.name = name;
this.status = status;
//this.accessesList = accessesList;
DateFormat df = new SimpleDateFormat("HH:mm:ss dd/MM/yy");
createDate = df.format(Calendar.getInstance().getTime());
}
//Getters y Setters
public String getKey() {
return KeyFactory.keyToString(key);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name; this.name = name;
} }
public boolean getStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
public String getCreateDate() {
return createDate;
}
public void setCreateDate(String createDate) {
this.createDate = createDate;
}
public List<Access> getAccessesList() {
return accessesList;
}
public void setAccessesList(List<Access> accessesList) {
this.accessesList = accessesList;
}
@Override @Override
public String toString() { public String toString() {
return "Role name: " + name +"\n"; return "Role name: " + name +"\n";
} }
} }

View File

@ -1,4 +1,5 @@
<%-- <%@ page import="model.User" %>
<%@ page import="java.util.List" %><%--
Created by IntelliJ IDEA. Created by IntelliJ IDEA.
User: Fernando User: Fernando
Date: 07/06/2018 Date: 07/06/2018
@ -6,11 +7,163 @@
To change this template use File | Settings | File Templates. To change this template use File | Settings | File Templates.
--%> --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html> <% User user = (User) request.getAttribute("User"); %>
<html lang="es">
<head> <head>
<title>Title</title> <title>Add a Role - Hotel Services</title>
<meta name="google-signin-client_id" content="746890482047-c734fgap3p3vb6bdoquufn60bsh2p8l9.apps.googleusercontent.com">
<script src="https://apis.google.com/js/platform.js" async defer></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<link type="text/css" rel="stylesheet" href="../css/Diseno.css">
<link type="text/css" rel="stylesheet" href="../css/materialize.min.css">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
<style>
.postLink{
color: blue;
font-size: large;
cursor: pointer;
transition: color 250ms ease-in;
}
.postLink:hover{
color: green;
font-size: larger;
}
body{
margin: 0;
padding: 0;
background-color: white;
font-family: Roboto, serif;
}
.whiteLink{
color: white;
}
.whiteLink:hover{
color: white;
}
</style>
</head> </head>
<body> <body>
<nav style="background-color: #67c9b3">
<div class="nav-wrapper">
<a class="whiteLink" href="../" style="padding: 0 0 0 20px; font-family: 'Product Sans', Roboto, serif; font-size: xx-large">Hotel Services</a>
<div class="right valign-wrapper" style="padding: 0 0 0 10px; cursor: pointer;" onclick="changeUserOptions()">
<%= user.getName()%>
<img src="<%=user.getImgUrl()%>" alt="" class="circle responsive-img" style="padding: 5px" width="50px">
<i class="material-icons right">arrow_drop_down</i>
<div id="userOptions" style="background-color: white; border:solid 2px #67c9b3; position: absolute; width: auto; display: none;">
<ul style="color: black">
<li style="padding: 0 5px;">
<a style="color: black" onclick="postRedirect('./users/view',{action:'closeSession'})">Cerrar Sesion</a>
</li>
<li id="cerrar" style="padding: 0 5px; cursor: pointer">
<i class="small material-icons">arrow_drop_up</i>
</li>
</ul>
</div>
</div>
<ul id="nav-mobile" class="right">
<li class="active"><a class="whiteLink" href="">Users</a></li>
<li><a class="whiteLink" onclick="postRedirect('./roles')">Roles</a></li>
<li><a class="whiteLink" onclick="postRedirect('./access')">Access</a></li>
<li><a class="whiteLink" onclick="postRedirect('./resources')">Resources</a></li>
</ul>
</div>
</nav>
<div class="container">
<br />
<span style="font-size: xx-large; font-family: 'Product Sans',Roboto,serif">Add a Role</span>
<br />
<br />
<form method="post" action="./add">
<input name="action" value="create" type="hidden">
Name of the Role:<br />
<input name="roleName" placeholder="Name of the Role" required><br />
Status of the Role:<br />
<select name="roleStatus" class="browser-default" required>
<option value="" disabled selected>Choose a status</option>
<option value="true">true</option>
<option value="false">false</option>
</select>
<br />
<button class="btn waves-effect waves-light" type="submit" name="action">Submit
<i class="material-icons right">send</i>
</button>
</form>
<hr />
<br />
<a href="../roles" class="waves-effect waves-light btn whiteLink"><i class="material-icons left">arrow_back</i>Go Back</a>
</div>
<script>
var sourceImg = document.getElementById("sourceImg");
function cambiarImg(input) {
sourceImg.src = input.value;
}
</script>
<script>
var userOptions = document.getElementById("userOptions");
var isUserOptionsEnable = true;
document.getElementById("cerrar").addEventListener("click", changeUserOptions());
function changeUserOptions() {
if (isUserOptionsEnable){
userOptions.style.display = "none";
} else {
userOptions.style.display = "block";
}
isUserOptionsEnable = !isUserOptionsEnable;
}
</script>
<script>
function postRedirect(url, postData){
var postForm = document.createElement("form");
postForm.action = url;
postForm.method = "POST";
postForm.style.display = "none";
for (var key in postData){
if (postData.hasOwnProperty(key)){
var input = document.createElement("input");
input.type = "hidden";
input.name = key;
input.value = postData[key];
postForm.appendChild(input);
}
}
document.body.appendChild(postForm);
postForm.submit();
}
</script>
</body> </body>
</html> </html>

View File

@ -1,4 +1,6 @@
<%-- <%@ page import="model.Role" %>
<%@ page import="model.User" %>
<%@ page import="java.util.List" %><%--
Created by IntelliJ IDEA. Created by IntelliJ IDEA.
User: Fernando User: Fernando
Date: 07/06/2018 Date: 07/06/2018
@ -6,11 +8,182 @@
To change this template use File | Settings | File Templates. To change this template use File | Settings | File Templates.
--%> --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html> <% User usuario = (User) request.getAttribute("User"); %>
<% List<Role> roleList = (List<Role>) request.getAttribute("RoleList");%>
<html lang="es">
<head> <head>
<title>Title</title> <title>Roles - Hotel Services</title>
<meta name="google-signin-client_id" content="746890482047-c734fgap3p3vb6bdoquufn60bsh2p8l9.apps.googleusercontent.com">
<script src="https://apis.google.com/js/platform.js" async defer></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<link type="text/css" rel="stylesheet" href="/css/Diseno.css">
<link type="text/css" rel="stylesheet" href="/css/materialize.min.css">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
<style>
.postLink{
color: blue;
font-size: large;
cursor: pointer;
transition: color 250ms ease-in;
}
.postLink:hover{
color: green;
font-size: larger;
}
body{
margin: 0;
padding: 0;
background-color: white;
font-family: Roboto, serif;
}
.whiteLink{
color: white;
}
.whiteLink:hover{
color: white;
}
</style>
</head> </head>
<body> <body>
<nav style="background-color: #67c9b3">
<div class="nav-wrapper">
<a class="whiteLink hide-on-med-and-down" href="../" style="padding: 0 0 0 20px; font-family: 'Product Sans', Roboto, serif; font-size: xx-large">Hotel Services</a>
<div class="right valign-wrapper" style="padding: 0 0 0 10px; cursor: pointer;" onclick="changeUserOptions()">
<%= usuario.getName()%>
<img src="<%=usuario.getImgUrl()%>" alt="" class="circle responsive-img" style="padding: 5px" width="50px">
<i class="material-icons right">arrow_drop_down</i>
<div id="userOptions" style="background-color: white; border:solid 2px #67c9b3; position: absolute; width: auto; display: none;">
<ul style="color: black">
<li style="padding: 0 5px;">
<a style="color: black" onclick="postRedirect('./users/view',{action:'closeSession'})">Cerrar Sesion</a>
</li>
<li id="cerrar" style="padding: 0 5px; cursor: pointer">
<i class="small material-icons">arrow_drop_up</i>
</li>
</ul>
</div>
</div>
<ul id="nav-mobile" class="right">
<li><a class="whiteLink" onclick="postRedirect('./users')">Users</a></li>
<li class="active"><a class="whiteLink" href="">Roles</a></li>
<li><a class="whiteLink" onclick="postRedirect('./access')">Access</a></li>
<li><a class="whiteLink" onclick="postRedirect('./resources')">Resources</a></li>
</ul>
</div>
</nav>
<div class="container">
<br />
<span style="font-size: xx-large; font-family: 'Product Sans',Roboto,serif">Roles</span>
<br />
<br />
<a class="waves-effect waves-light btn whiteLink" onclick="postRedirect('/roles/add',{action:'redirect'})"><i class="material-icons left">add</i>Create</a>
<br />
<br />
<table class="striped responsive-table">
<thead>
<tr>
<td>Name</td>
<td>Status</td>
<td>Date created</td>
<td>Actions</td>
</tr>
</thead>
<tbody>
<% for (int i = 0; i < roleList.size(); i++) {%>
<% Role role = roleList.get(i); %>
<% String key = role.getKey();
String[] arr = key.split("");
key = "";
for (String a : arr) {
if (a.equals("\"")){
key += "&quot;";
} else{
key += a;
}
}
%>
<tr>
<td><%= role.getName()%></td>
<td><%= role.getStatus()%></td>
<td><%= role.getCreateDate()%></td>
<td>
<a class="postLink" onclick="postRedirect('roles/view',{action:'viewRedirect',key:'<%=key%>'})">View</a>
| <a class="postLink" onclick="postRedirect('roles/view',{action:'editRedirect',key:'<%=key%>'})">Edit</a>
| <a class="postLink" onclick="postRedirect('roles/delete',{key:'<%=key%>'})">Delete</a></td>
</tr>
<% } %>
</tbody>
</table>
</div>
<script>
var userOptions = document.getElementById("userOptions");
var isUserOptionsEnable = true;
document.getElementById("cerrar").addEventListener("click", changeUserOptions());
function changeUserOptions() {
if (isUserOptionsEnable){
userOptions.style.display = "none";
} else {
userOptions.style.display = "block";
}
isUserOptionsEnable = !isUserOptionsEnable;
}
</script>
<script>
function postRedirect(url, postData){
var postForm = document.createElement("form");
postForm.action = url;
postForm.method = "POST";
postForm.style.display = "none";
for (var key in postData){
if (postData.hasOwnProperty(key)){
var input = document.createElement("input");
input.type = "hidden";
input.name = key;
input.value = postData[key];
postForm.appendChild(input);
}
}
document.body.appendChild(postForm);
postForm.submit();
}
</script>
</body> </body>
</html> </html>

View File

@ -1,3 +1,5 @@
<%@ page import="model.User" %>
<%@ page import="model.Role" %>
<%-- <%--
Created by IntelliJ IDEA. Created by IntelliJ IDEA.
User: Fernando User: Fernando
@ -5,12 +7,175 @@
Time: 16:39 Time: 16:39
To change this template use File | Settings | File Templates. To change this template use File | Settings | File Templates.
--%> --%>
<% Role role = (Role) request.getAttribute("Role");
User userLogged = (User) request.getAttribute("UserLogged");
boolean editAllowed = (Boolean) request.getAttribute("editAllowed");
String action = (String) request.getAttribute("action");%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html> <html>
<head> <head>
<title>Title</title> <title><%=action%> a User - Hotel Services</title>
<meta name="google-signin-client_id" content="746890482047-c734fgap3p3vb6bdoquufn60bsh2p8l9.apps.googleusercontent.com">
<script src="https://apis.google.com/js/platform.js" async defer></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<link type="text/css" rel="stylesheet" href="../css/Diseno.css">
<link type="text/css" rel="stylesheet" href="../css/materialize.min.css">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
<style>
.postLink{
color: blue;
font-size: large;
cursor: pointer;
transition: color 250ms ease-in;
}
.postLink:hover{
color: green;
font-size: larger;
}
body{
margin: 0;
padding: 0;
background-color: white;
font-family: Roboto, serif;
}
.whiteLink{
color: white;
}
.whiteLink:hover{
color: white;
}
</style>
</head> </head>
<body> <body>
<nav style="background-color: #67c9b3">
<div class="nav-wrapper">
<a class="whiteLink" href="../" style="padding: 0 0 0 20px; font-family: 'Product Sans', Roboto, serif; font-size: xx-large">Hotel Services</a>
<div class="right valign-wrapper" style="padding: 0 0 0 10px; cursor: pointer;" onclick="changeUserOptions()">
<%= userLogged.getName()%>
<img src="<%=userLogged.getImgUrl()%>" alt="" class="circle responsive-img" style="padding: 5px" width="50px">
<i class="material-icons right">arrow_drop_down</i>
<div id="userOptions" style="background-color: white; border:solid 2px #67c9b3; position: absolute; width: auto; display: none;">
<ul style="color: black">
<li style="padding: 0 5px;">
<a style="color: black" onclick="postRedirect('/users/view',{action:'closeSession'})">Cerrar Sesion</a>
</li>
<li id="cerrar" style="padding: 0 5px; cursor: pointer">
<i class="small material-icons">arrow_drop_up</i>
</li>
</ul>
</div>
</div>
<ul id="nav-mobile" class="right">
<li><a class="whiteLink" onclick="postRedirect('./users')">Users</a></li>
<li class="active"><a class="whiteLink" href="">Roles</a></li>
<li><a class="whiteLink" onclick="postRedirect('./access')">Access</a></li>
<li><a class="whiteLink" onclick="postRedirect('./resources')">Resources</a></li>
</ul>
</div>
</nav>
<div class="container">
<br />
<span style="font-size: xx-large; font-family: 'Product Sans',Roboto,serif"><%=action%> a User</span>
<br />
<br />
<% if (editAllowed) {%>
<form action="./add" method="post">
<input name="key" value="<%=role.getKey()%>" type="hidden">
<input name="action" value="update" type="hidden">
Name:<br />
<input name="roleName" value="<%=role.getName()%>" placeholder="Name" required><br/>
<br/>
Status:<br />
<select name="roleStatus" class="browser-default" required>
<option value="" disabled selected>Choose a status</option>
<option value="true">true</option>
<option value="false">false</option>
</select>
<br />
<button class="btn waves-effect waves-light" type="submit" name="action">Submit
<i class="material-icons right">send</i>
</button>
</form>
<% } else {%>
<div style="font-size: x-large">
Name: <%=role.getName()%><br />
Email: <%=role.getStatus()%><br />
</div>
<% } %>
<hr />
<br />
<a href="../roles" class="waves-effect waves-light btn whiteLink"><i class="material-icons left">arrow_back</i>Go Back</a>
</div>
<script>
var userOptions = document.getElementById("userOptions");
var isUserOptionsEnable = true;
document.getElementById("cerrar").addEventListener("click", changeUserOptions());
function changeUserOptions() {
if (isUserOptionsEnable){
userOptions.style.display = "none";
} else {
userOptions.style.display = "block";
}
isUserOptionsEnable = !isUserOptionsEnable;
}
</script>
<script>
function postRedirect(url, postData){
var postForm = document.createElement("form");
postForm.action = url;
postForm.method = "POST";
postForm.style.display = "none";
for (var key in postData){
if (postData.hasOwnProperty(key)){
var input = document.createElement("input");
input.type = "hidden";
input.name = key;
input.value = postData[key];
postForm.appendChild(input);
}
}
document.body.appendChild(postForm);
postForm.submit();
}
</script>
</body> </body>
</html> </html>

View File

@ -1,4 +1,5 @@
<%-- <%@ page import="model.User" %>
<%@ page import="java.util.List" %><%--
Created by IntelliJ IDEA. Created by IntelliJ IDEA.
User: Fernando User: Fernando
Date: 07/06/2018 Date: 07/06/2018
@ -6,13 +7,172 @@
To change this template use File | Settings | File Templates. To change this template use File | Settings | File Templates.
--%> --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html> <% User user = (User) request.getAttribute("User"); %>
<html lang="es">
<head> <head>
<title>Create a User</title> <title>Add a User - Hotel Services</title>
<meta name="google-signin-client_id" content="746890482047-c734fgap3p3vb6bdoquufn60bsh2p8l9.apps.googleusercontent.com">
<script src="https://apis.google.com/js/platform.js" async defer></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<link type="text/css" rel="stylesheet" href="../css/Diseno.css">
<link type="text/css" rel="stylesheet" href="../css/materialize.min.css">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
<style>
.postLink{
color: blue;
font-size: large;
cursor: pointer;
transition: color 250ms ease-in;
}
.postLink:hover{
color: green;
font-size: larger;
}
body{
margin: 0;
padding: 0;
background-color: white;
font-family: Roboto, serif;
}
.whiteLink{
color: white;
}
.whiteLink:hover{
color: white;
}
</style>
</head> </head>
<body> <body>
Create a User!!! <nav style="background-color: #67c9b3">
<div class="nav-wrapper">
<a class="whiteLink" href="../" style="padding: 0 0 0 20px; font-family: 'Product Sans', Roboto, serif; font-size: xx-large">Hotel Services</a>
<div class="right valign-wrapper" style="padding: 0 0 0 10px; cursor: pointer;" onclick="changeUserOptions()">
<%= user.getName()%>
<img src="<%=user.getImgUrl()%>" alt="" class="circle responsive-img" style="padding: 5px" width="50px">
<i class="material-icons right">arrow_drop_down</i>
<div id="userOptions" style="background-color: white; border:solid 2px #67c9b3; position: absolute; width: auto; display: none;">
<ul style="color: black">
<li style="padding: 0 5px;">
<a style="color: black" onclick="postRedirect('./users/view',{action:'closeSession'})">Cerrar Sesion</a>
</li>
<li id="cerrar" style="padding: 0 5px; cursor: pointer">
<i class="small material-icons">arrow_drop_up</i>
</li>
</ul>
</div>
</div>
<ul id="nav-mobile" class="right">
<li class="active"><a class="whiteLink" href="">Users</a></li>
<li><a class="whiteLink" onclick="postRedirect('./roles')">Roles</a></li>
<li><a class="whiteLink" onclick="postRedirect('./access')">Access</a></li>
<li><a class="whiteLink" onclick="postRedirect('./resources')">Resources</a></li>
</ul>
</div>
</nav>
<div class="container">
<br />
<span style="font-size: xx-large; font-family: 'Product Sans',Roboto,serif">Add a User</span>
<br />
<br />
<form method="post" action="./add">
<input name="action" value="create" type="hidden">
Name of the User:<br />
<input name="userName" placeholder="Name of the User" required><br />
Email of the User:<br />
<input name="userEmail" placeholder="Email" type="email" required>
<div class="row">
<div class="col l10 m10">
Profile Image link<br />
<input name="userImg" value="https://i.stack.imgur.com/34AD2.jpg" placeholder="Link" required oninput="cambiarImg(this)"><br />
<br />
</div>
<div class="col l2 m2">
<img id="sourceImg" src="https://i.stack.imgur.com/34AD2.jpg" alt="" width="70px">
</div>
</div>
Role of the User:<br />
<input name="userRole" placeholder="Role" required>
<button class="btn waves-effect waves-light" type="submit" name="action">Submit
<i class="material-icons right">send</i>
</button>
</form>
<hr />
<br />
<a href="../users" class="waves-effect waves-light btn whiteLink"><i class="material-icons left">arrow_back</i>Go Back</a>
</div>
<script>
var sourceImg = document.getElementById("sourceImg");
function cambiarImg(input) {
sourceImg.src = input.value;
}
</script>
<script>
var userOptions = document.getElementById("userOptions");
var isUserOptionsEnable = true;
document.getElementById("cerrar").addEventListener("click", changeUserOptions());
function changeUserOptions() {
if (isUserOptionsEnable){
userOptions.style.display = "none";
} else {
userOptions.style.display = "block";
}
isUserOptionsEnable = !isUserOptionsEnable;
}
</script>
<script>
function postRedirect(url, postData){
var postForm = document.createElement("form");
postForm.action = url;
postForm.method = "POST";
postForm.style.display = "none";
for (var key in postData){
if (postData.hasOwnProperty(key)){
var input = document.createElement("input");
input.type = "hidden";
input.name = key;
input.value = postData[key];
postForm.appendChild(input);
}
}
document.body.appendChild(postForm);
postForm.submit();
}
</script>
</body> </body>
</html> </html>

View File

@ -9,13 +9,20 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<% User usuario = (User) request.getAttribute("User"); %> <% User usuario = (User) request.getAttribute("User"); %>
<% List<User> userList = (List<User>) request.getAttribute("UsersList");%> <% List<User> userList = (List<User>) request.getAttribute("UsersList");%>
<html> <html lang="es">
<head> <head>
<title>Titulo</title> <title>Users - Hotel Services</title>
<meta name="google-signin-client_id" content="746890482047-c734fgap3p3vb6bdoquufn60bsh2p8l9.apps.googleusercontent.com"> <meta name="google-signin-client_id" content="746890482047-c734fgap3p3vb6bdoquufn60bsh2p8l9.apps.googleusercontent.com">
<script src="https://apis.google.com/js/platform.js" async defer></script> <script src="https://apis.google.com/js/platform.js" async defer></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<link type="text/css" rel="stylesheet" href="/css/Diseno.css">
<link type="text/css" rel="stylesheet" href="/css/materialize.min.css">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
<style> <style>
.postLink{ .postLink{
@ -29,60 +36,116 @@
color: green; color: green;
font-size: larger; font-size: larger;
} }
body{
margin: 0;
padding: 0;
background-color: white;
font-family: Roboto, serif;
}
.whiteLink{
color: white;
}
.whiteLink:hover{
color: white;
}
</style> </style>
</head> </head>
<body> <body>
User: <%= usuario.getName()%><img src="<%=usuario.getImgUrl()%>"><br/> <nav style="background-color: #67c9b3">
You can <div class="nav-wrapper">
<a class="whiteLink hide-on-med-and-down" href="../" style="padding: 0 0 0 20px; font-family: 'Product Sans', Roboto, serif; font-size: xx-large">Hotel Services</a>
<a href="#" onclick="signOut();">Sign out</a> there v:<br /> <div class="right valign-wrapper" style="padding: 0 0 0 10px; cursor: pointer;" onclick="changeUserOptions()">
<%= usuario.getName()%>
<img src="<%=usuario.getImgUrl()%>" alt="" class="circle responsive-img" style="padding: 5px" width="50px">
<i class="material-icons right">arrow_drop_down</i>
<div id="userOptions" style="background-color: white; border:solid 2px #67c9b3; position: absolute; width: auto; display: none;">
<ul style="color: black">
<li style="padding: 0 5px;">
<a style="color: black" onclick="postRedirect('./users/view',{action:'closeSession'})">Cerrar Sesion</a>
</li>
<li id="cerrar" style="padding: 0 5px; cursor: pointer">
<i class="small material-icons">arrow_drop_up</i>
</li>
</ul>
</div>
</div>
<ul id="nav-mobile" class="right">
<li class="active"><a class="whiteLink" href="">Users</a></li>
<li><a class="whiteLink" onclick="postRedirect('./roles')">Roles</a></li>
<li><a class="whiteLink" onclick="postRedirect('./access')">Access</a></li>
<li><a class="whiteLink" onclick="postRedirect('./resources')">Resources</a></li>
</ul>
</div>
</nav>
<div class="container">
<br /> <br />
<span style="font-size: xx-large; font-family: 'Product Sans',Roboto,serif">Users</span>
<br /> <br />
<br /> <br />
<table> <a class="waves-effect waves-light btn whiteLink" onclick="postRedirect('/users/add',{action:'redirect'})"><i class="material-icons left">add</i>Create</a>
<br />
<br />
<table class="striped responsive-table">
<thead>
<tr> <tr>
<td>Name</td> <td>Name</td>
<td>Email</td> <td>Email</td>
<td>Img</td> <td>Img</td>
<td>Actions</td> <td>Actions</td>
</tr> </tr>
</thead>
<tbody>
<% for (int i = 0; i < userList.size(); i++) {%> <% for (int i = 0; i < userList.size(); i++) {%>
<% User user = userList.get(i); %> <% User user = userList.get(i); %>
<tr> <tr>
<td><%= user.getName()%></td> <td><%= user.getName()%></td>
<td><%= user.getEmail()%></td> <td><%= user.getEmail()%></td>
<td><img src="<%= user.getImgUrl()%>"/></td> <td><img src="<%= user.getImgUrl()%>" width="55px"/></td>
<td> <td>
<a class="postLink" onclick="postRedirect('users/view',{action:'viewRedirect',userID:'<%=user.getId()%>'})">View</a> <a class="postLink" onclick="postRedirect('users/view',{action:'viewRedirect',userID:'<%=user.getId()%>'})">View</a>
| <a class="postLink" onclick="postRedirect('users/view',{action:'editRedirect',userID:'<%=user.getId()%>'})">Edit</a> | <a class="postLink" onclick="postRedirect('users/view',{action:'editRedirect',userID:'<%=user.getId()%>'})">Edit</a>
| <a class="postLink" onclick="postRedirect('users/add',{action:'delete',userID:'<%=user.getId()%>'})">Delete</a></td> | <a class="postLink" onclick="postRedirect('users/delete',{userID:'<%=user.getId()%>'})">Delete</a></td>
</tr> </tr>
<% } %> <% } %>
</tbody>
</table> </table>
</div>
<script> <script>
function signOut() { var userOptions = document.getElementById("userOptions");
var req = new XMLHttpRequest(); var isUserOptionsEnable = true;
req.onreadystatechange = function () { document.getElementById("cerrar").addEventListener("click", changeUserOptions());
if (req.readyState === 4 && req.status === 200){
<%-- Hace una solicitud al metodo UsersControllerView, y recibe una url. Luego, cierra la sesion de Google, y luego redirige
a la url recibida.--%>
document.location.href = "https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=" + req.responseText;
}
};
req.open("GET","/users/view?action=closeSession",true);
req.send();
function changeUserOptions() {
if (isUserOptionsEnable){
userOptions.style.display = "none";
} else {
userOptions.style.display = "block";
} }
isUserOptionsEnable = !isUserOptionsEnable;
}
</script>
<script>
function postRedirect(url, postData){ function postRedirect(url, postData){
var postForm = document.createElement("form"); var postForm = document.createElement("form");

View File

@ -8,16 +8,89 @@
To change this template use File | Settings | File Templates. To change this template use File | Settings | File Templates.
--%> --%>
<% User user = (User) request.getAttribute("User"); <% User user = (User) request.getAttribute("User");
User userLogged = (User) request.getAttribute("UserLogged");
boolean editAllowed = (Boolean) request.getAttribute("editAllowed"); boolean editAllowed = (Boolean) request.getAttribute("editAllowed");
String action = (String) request.getAttribute("action");%> String action = (String) request.getAttribute("action");%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html> <html>
<head> <head>
<title><%=action%> a User</title> <title><%=action%> a Role - Hotel Services</title>
<meta name="google-signin-client_id" content="746890482047-c734fgap3p3vb6bdoquufn60bsh2p8l9.apps.googleusercontent.com">
<script src="https://apis.google.com/js/platform.js" async defer></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<link type="text/css" rel="stylesheet" href="../css/Diseno.css">
<link type="text/css" rel="stylesheet" href="../css/materialize.min.css">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
<style>
.postLink{
color: blue;
font-size: large;
cursor: pointer;
transition: color 250ms ease-in;
}
.postLink:hover{
color: green;
font-size: larger;
}
body{
margin: 0;
padding: 0;
background-color: white;
font-family: Roboto, serif;
}
.whiteLink{
color: white;
}
.whiteLink:hover{
color: white;
}
</style>
</head> </head>
<body> <body>
Datos del usuario:<br /> <nav style="background-color: #67c9b3">
<div class="nav-wrapper">
<a class="whiteLink" href="../" style="padding: 0 0 0 20px; font-family: 'Product Sans', Roboto, serif; font-size: xx-large">Hotel Services</a>
<div class="right valign-wrapper" style="padding: 0 0 0 10px; cursor: pointer;" onclick="changeUserOptions()">
<%= userLogged.getName()%>
<img src="<%=userLogged.getImgUrl()%>" alt="" class="circle responsive-img" style="padding: 5px" width="50px">
<i class="material-icons right">arrow_drop_down</i>
<div id="userOptions" style="background-color: white; border:solid 2px #67c9b3; position: absolute; width: auto; display: none;">
<ul style="color: black">
<li style="padding: 0 5px;">
<a style="color: black" onclick="postRedirect('/users/view',{action:'closeSession'})">Cerrar Sesion</a>
</li>
<li id="cerrar" style="padding: 0 5px; cursor: pointer">
<i class="small material-icons">arrow_drop_up</i>
</li>
</ul>
</div>
</div>
<ul id="nav-mobile" class="right">
<li class="active"><a class="whiteLink" href="">Users</a></li>
<li><a class="whiteLink" onclick="postRedirect('./roles')">Roles</a></li>
<li><a class="whiteLink" onclick="postRedirect('./access')">Access</a></li>
<li><a class="whiteLink" onclick="postRedirect('./resources')">Resources</a></li>
</ul>
</div>
</nav>
<div class="container">
<br />
<span style="font-size: xx-large; font-family: 'Product Sans',Roboto,serif"><%=action%> a Role</span>
<br />
<br /> <br />
<% if (editAllowed) {%> <% if (editAllowed) {%>
@ -27,34 +100,105 @@ Datos del usuario:<br />
<input name="userID" value="<%=user.getId()%>" type="hidden"> <input name="userID" value="<%=user.getId()%>" type="hidden">
<input name="action" value="update" type="hidden"> <input name="action" value="update" type="hidden">
Nombre:<br /> Name:<br />
<input name="userName" value="<%=user.getName()%>" placeholder="Nombre" required><br/> <input name="userName" value="<%=user.getName()%>" placeholder="Name" required><br/>
<br/> <br/>
Email:<br /> Email:<br />
<input name="userEmail" value="<%=user.getEmail()%>" placeholder="Email" type="email" required><br /> <input name="userEmail" value="<%=user.getEmail()%>" placeholder="Email" type="email" required><br />
<br /> <br />
Imagen de perfil<br />
<input name="userImg" value="<%=user.getImgUrl()%>" placeholder="Link de la imagen" required><br /> <div class="row">
<div class="col l10 m10">
Profile Image link<br />
<input name="userImg" value="<%=user.getImgUrl()%>" placeholder="Link" required oninput="cambiarImg(this)"><br />
<br /> <br />
</div>
<div class="col l2 m2">
<img id="sourceImg" src="<%=user.getImgUrl()%>" alt="" width="70px">
</div>
</div>
Rol<br /> Rol<br />
<input name="userRole" value="<%=user.getRole()%>" placeholder="Rol" required><br /> <input name="userRole" value="<%=user.getRole()%>" placeholder="Role" required><br />
<br /> <br />
<input type="submit"><br />
<button class="btn waves-effect waves-light" type="submit" name="action">Submit
<i class="material-icons right">send</i>
</button>
</form> </form>
<% } else {%> <% } else {%>
<img src="<%=user.getImgUrl()%>"><br /> <div class="row">
<br /> <div class="col l8 m8" style="font-size: x-large">
Name: <%=user.getName()%><br />
Nombre: <%=user.getName()%><br />
Email: <%=user.getEmail()%><br /> Email: <%=user.getEmail()%><br />
Rol: <%= user.getRole()%><br /> Role: <%= user.getRole()%><br />
</div>
<div class="col l4 m4">
<img src="<%=user.getImgUrl()%>" width="96px"><br />
</div>
</div>
<% } %> <% } %>
Eso es todo :c <hr />
<br />
<a href="../users" class="waves-effect waves-light btn whiteLink"><i class="material-icons left">arrow_back</i>Go Back</a>
</div>
<script>
var sourceImg = document.getElementById("sourceImg");
function cambiarImg(input) {
sourceImg.src = input.value;
}
</script>
<script>
var userOptions = document.getElementById("userOptions");
var isUserOptionsEnable = true;
document.getElementById("cerrar").addEventListener("click", changeUserOptions());
function changeUserOptions() {
if (isUserOptionsEnable){
userOptions.style.display = "none";
} else {
userOptions.style.display = "block";
}
isUserOptionsEnable = !isUserOptionsEnable;
}
</script>
<script>
function postRedirect(url, postData){
var postForm = document.createElement("form");
postForm.action = url;
postForm.method = "POST";
postForm.style.display = "none";
for (var key in postData){
if (postData.hasOwnProperty(key)){
var input = document.createElement("input");
input.type = "hidden";
input.name = key;
input.value = postData[key];
postForm.appendChild(input);
}
}
document.body.appendChild(postForm);
postForm.submit();
}
</script>
</body> </body>
</html> </html>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> <appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>lab08-SU_CUI</application> <application>lab08-20173373</application>
<version>1</version> <version>1</version>
<sessions-enabled>true</sessions-enabled> <sessions-enabled>true</sessions-enabled>

Binary file not shown.

Binary file not shown.

View File

@ -154,19 +154,6 @@
</servlet-mapping> </servlet-mapping>
<servlet>
<servlet-name>UsersControllerTest</servlet-name>
<servlet-class>controller.users.UsersControllerTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UsersControllerTest</servlet-name>
<url-pattern>/users/test</url-pattern>
</servlet-mapping>
<welcome-file-list> <welcome-file-list>
<welcome-file>index.html</welcome-file> <welcome-file>index.html</welcome-file>
</welcome-file-list> </welcome-file-list>

116
war/css/Diseno.css Normal file
View File

@ -0,0 +1,116 @@
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
border: 0;
font-family: inherit;
font-size: 100%;
font-style: inherit;
font-weight: inherit;
margin: 0;
outline: 0;
padding: 0;
vertical-align: baseline;
}
html {
font-size: 62.5%; /* Corrects text resizing oddly in IE6/7 when body font-size is set using em units http://clagnut.com/blog/348/#c790 */
overflow-y: scroll; /* Keeps page centered in all browsers regardless of content height */
-webkit-text-size-adjust: 100%; /* Prevents iOS text size adjust after orientation change, without disabling user zoom */
-ms-text-size-adjust: 100%; /* www.456bereastreet.com/archive/201012/controlling_text_size_in_safari_for_ios_without_disabling_user_zoom/ */
}
*,
*:before,
*:after { /* apply a natural box layout model to all elements; see http://www.paulirish.com/2012/box-sizing-border-box-ftw/ */
-webkit-box-sizing: border-box; /* Not needed for modern webkit but still used by Blackberry Browser 7.0; see http://caniuse.com/#search=box-sizing */
-moz-box-sizing: border-box; /* Still needed for Firefox 28; see http://caniuse.com/#search=box-sizing */
box-sizing: border-box;
}
body {
background: #EEEEEE; /*Por defecto es F0F0F0 */
}
article,
aside,
details,
figcaption,
figure,
footer,
header,
main,
nav,
section {
display: block;
}
ol,
ul {
list-style: none;
}
table { /* tables still need 'cellspacing="0"' in the markup */
border-collapse: separate;
border-spacing: 0;
}
caption,
th,
td {
font-weight: normal;
text-align: left;
}
blockquote:before,
blockquote:after,
q:before,
q:after {
content: "";
}
blockquote,
q {
quotes: "" "";
}
a:focus {
outline: thin dotted;
}
a:hover,
a:active {
outline: 0;
}
a img {
border: 0;
}
/*
-----------------------------------------------------
RESET
-----------------------------------------------------
*/
a {
color: #404040; /* por defecto 404040*/
text-decoration: none;
-o-transition: all .8s ease-in-out;
-moz-transition: all .8s ease-in-out;
-webkit-transition: all .8s ease-in-out;
transition: all .8s ease-in-out;
}
a:hover,
a:focus,
a:active {
color: #23BF87;
-o-transition: all 0s ease-in-out;
-moz-transition: all 0s ease-in-out;
-webkit-transition: all 0s ease-in-out;
transition: all 0s ease-in-out;
}
@font-face {
font-family: "Product Sans";
src: url("../fonts/ProductSansRegular.ttf");
}
@font-face {
font-family: "Product Sans";
font-weight: bold;
src: url("../fonts/ProductSansBold.ttf");
}

9407
war/css/materialize.css vendored Normal file

File diff suppressed because it is too large Load Diff

1
war/css/materialize.min.css vendored Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

View File

@ -1,36 +1,85 @@
<!DOCTYPE HTML> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta charset="UTF-8">
<title>Hotel Services</title> <title>Home - Hotel Service</title>
<link type="text/css" rel="stylesheet" href="./css/Diseno.css">
<link type="text/css" rel="stylesheet" href="./css/materialize.min.css">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="google-signin-client_id" content="746890482047-c734fgap3p3vb6bdoquufn60bsh2p8l9.apps.googleusercontent.com"> <meta name="google-signin-client_id" content="746890482047-c734fgap3p3vb6bdoquufn60bsh2p8l9.apps.googleusercontent.com">
<style>
#mainHeader{
background: url('http://www.hotelimperialeroma.it/data/mobile/hotel-imperiale-roma-camere-01-2.jpg') no-repeat local center;
height: 40%;
text-align: center;
padding: 100px;
background-size: 100%;
overflow: hidden;
transition: opacity 500ms, max-height 250ms,padding 500ms;
}
body{
margin: 0;
padding: 0;
background-color: white;
font-family: Roboto, serif;
}
</style>
<script src="https://apis.google.com/js/platform.js" async defer></script> <script src="https://apis.google.com/js/platform.js" async defer></script>
</head> </head>
<body> <body>
<h1>Hotel Services.</h1> <div id="mainHeader">
<h1 style="font-size: 50px; color: white; display: inline; font-weight: bold; font-family: 'Product Sans',serif">Hotel Services</h1>
</div>
<nav style="background-color: #67c9b3">
<div class="nav-wrapper">
<a href="./" class="brand-logo" style="padding: 0 0 0 20px; font-family: 'Product Sans', Roboto, serif">Hotel Services</a>
</div>
</nav>
Please log in to continue:<br /> <br />
<div class="container">
<div style="font-size: x-large">
<span id="mainText">Welcome! Log In to Start:</span>
<br />
<br /> <br />
<div class="g-signin2" data-onsuccess="onSignIn"></div> <div class="g-signin2" data-onsuccess="onSignIn"></div>
</div>
<br />
<hr />
Developed by:<br />
Fernando Araoz, 2017337<br />
Jose Rodriguez, <br />
Gustavo Turpo, <br />
</div>
You can Sign out here:
<a href="#" onclick="signOut();">Sign out</a>
<script> <script>
"use strict"; "use strict";
function onSignIn(googleUser) { function onSignIn(googleUser) {
var profile = googleUser.getBasicProfile(); var profile = googleUser.getBasicProfile();
console.log('ID: ' + profile.getId()); // Do not send to your backend! Use an ID token instead.
console.log('Name: ' + profile.getName());
console.log('Image URL: ' + profile.getImageUrl());
console.log('Email: ' + profile.getEmail()); // This is null if the 'email' scope is not present.
document.getElementById("mainText").innerText = "Logged In. Redirecting...";
document.getElementById("mainHeader").style.maxHeight = "0";
document.getElementById("mainHeader").style.padding = "0";
setTimeout(function () {
postRedirect("/users/add",{ postRedirect("/users/add",{
userEmail : profile.getEmail(), userEmail : profile.getEmail(),
userName : profile.getName(), userName : profile.getName(),
@ -38,6 +87,7 @@ You can Sign out here:
userRole : "admin", userRole : "admin",
action : "logIn" action : "logIn"
}); });
},500);
} }

10021
war/js/materialize.js vendored Normal file

File diff suppressed because it is too large Load Diff

6
war/js/materialize.min.js vendored Normal file

File diff suppressed because one or more lines are too long