/* (non-Javadoc)
   * @see de.uka.ipd.idaho.goldenGateScf.uaa.webClient.AuthenticatedWebClientModul#handleRequest(de.uka.ipd.idaho.goldenGateScf.uaa.client.AuthenticatedClient, javax.servlet.http.HttpServletRequest)
   */
  public String[] handleRequest(AuthenticatedClient authClient, HttpServletRequest request)
      throws IOException {
    GoldenGateUpsClient upsc = this.getUpsClient(authClient);
    StringVector messageCollector = new StringVector();

    String command = request.getParameter(COMMAND_PARAMETER);

    //	create role
    if (CREATE_ROLE.equals(command)) {

      //	get parameters
      String roleName = request.getParameter(ROLE_NAME_PARAMETER);

      //	create role
      upsc.createRole(roleName);
      messageCollector.addElement("Role '" + roleName + "' created successfully.");
    }

    //	delete role
    else if (DELETE_ROLE.equals(command)) {

      //	get parameters
      String roleName = request.getParameter(ROLE_NAME_PARAMETER);

      //	delete role
      upsc.deleteRole(roleName);
      messageCollector.addElement("Role '" + roleName + "' deleted successfully.");
    }

    //	edit a user's roles and permissions
    else if (EDIT_USER.equals(command)) {

      //	get parameters
      String userName = request.getParameter(USER_NAME_PARAMETER);
      String[] roles = request.getParameterValues(ROLE_PARAMETER);

      //	set roles
      upsc.setUserRoles(userName, roles);
      messageCollector.addElement("Roles of user '" + userName + "' changed successfully.");
    }

    //	edit a role's roles and permissions
    else if (EDIT_ROLE.equals(command)) {

      //	get parameters
      String roleName = request.getParameter(ROLE_NAME_PARAMETER);
      String[] roles = request.getParameterValues(ROLE_PARAMETER);
      String[] permissions = request.getParameterValues(PERMISSION_PARAMETER);

      //	set roles
      upsc.setRoleRoles(roleName, roles);
      messageCollector.addElement(
          "Inherited roles of role '" + roleName + "' changed successfully.");

      //	set permissions
      upsc.setRolePermissions(roleName, permissions);
      messageCollector.addElement("Permissions of role '" + roleName + "' changed successfully.");
    }

    return messageCollector.toStringArray();
  }
  /* (non-Javadoc)
   * @see de.uka.ipd.idaho.goldenGateServer.uaa.webClient.AuthenticatedWebClientModul#writePageContent(de.uka.ipd.idaho.goldenGateServer.uaa.client.AuthenticatedClient, de.uka.ipd.idaho.htmlXmlUtil.accessories.HtmlPageBuilder)
   */
  public void writePageContent(AuthenticatedClient authClient, HtmlPageBuilder pageBuilder)
      throws IOException {
    //		// TODO Auto-generated method stub
    //
    //	}
    //
    //	/* (non-Javadoc)
    //	 * @see
    // de.uka.ipd.idaho.goldenGateServer.uaa.webClient.AuthenticatedWebClientModul#writePageContent(de.uka.ipd.idaho.goldenGateServer.uaa.client.AuthenticatedClient, javax.servlet.http.HttpServletRequest, java.lang.String, de.uka.ipd.idaho.htmlXmlUtil.accessories.HtmlPageBuilder)
    //	 */
    //	public void writePageContent(AuthenticatedClient authClient, HttpServletRequest request,
    // String serverLink, HtmlPageBuilder pageBuilder) throws IOException {
    GoldenGateUpsClient upsc = this.getUpsClient(authClient);
    String mode = pageBuilder.request.getParameter(MODE_PARAMETER);

    //	edit a user's roles and permissions
    if (EDIT_USER.equals(mode)) {
      String userName = pageBuilder.request.getParameter(USER_NAME_PARAMETER);

      String[] roles = upsc.getRoles();
      String[] userRoles = upsc.getUserRoles(userName);
      Set userRoleSet = new HashSet(Arrays.asList(userRoles));

      //	open form and add command
      pageBuilder.writeLine(
          "<form method=\"POST\" action=\""
              + pageBuilder.request.getContextPath()
              + pageBuilder.request.getServletPath()
              + "/"
              + this.getClass().getName()
              + "\">");
      pageBuilder.writeLine(
          "<input type=\"hidden\" name=\"" + COMMAND_PARAMETER + "\" value=\"" + EDIT_USER + "\">");
      pageBuilder.writeLine(
          "<input type=\"hidden\" name=\""
              + USER_NAME_PARAMETER
              + "\" value=\""
              + userName
              + "\">");

      //	build label row
      pageBuilder.writeLine("<table class=\"mainTable\">");
      pageBuilder.writeLine("<tr>");
      pageBuilder.writeLine("<td width=\"100%\" class=\"mainTableHeader\">");
      pageBuilder.writeLine("Manage the roles and permissions of user '" + userName + "'");
      pageBuilder.writeLine("</td>");
      pageBuilder.writeLine("</tr>");

      //	open user table
      pageBuilder.writeLine("<tr>");
      pageBuilder.writeLine("<td width=\"100%\" class=\"mainTableBody\">");
      pageBuilder.writeLine("<table width=\"100%\" class=\"dataTable\">");

      //	build label row
      pageBuilder.writeLine("<tr>");

      pageBuilder.writeLine("<td class=\"dataTableHeader\">");
      pageBuilder.writeLine("Roles");
      pageBuilder.writeLine("</td>");

      pageBuilder.writeLine("</tr>");

      //	add actual user data
      for (int r = 0; r < roles.length; r++) {
        String role = ((r < roles.length) ? roles[r] : null);

        //	open table row
        pageBuilder.writeLine("<tr>");

        pageBuilder.writeLine("<td class=\"dataTableBody\">");
        pageBuilder.writeLine(
            "<input type=\"checkbox\" name=\""
                + ROLE_PARAMETER
                + "\" value=\""
                + role
                + "\""
                + (userRoleSet.contains(role) ? " checked" : "")
                + ">");
        pageBuilder.writeLine("&nbsp;");
        pageBuilder.writeLine(role);
        pageBuilder.writeLine("</td>");
        pageBuilder.writeLine("</tr>");
      }

      //	add button row
      pageBuilder.writeLine("<tr>");
      pageBuilder.writeLine("<td colspan=\"2\" class=\"formTableBody\">");
      pageBuilder.writeLine("<input type=\"submit\" value=\"Edit User\" class=\"submitButton\">");
      pageBuilder.writeLine("</td>");
      pageBuilder.writeLine("</tr>");

      //	close user table
      pageBuilder.writeLine("</table>");
      pageBuilder.writeLine("</td>");
      pageBuilder.writeLine("</tr>");

      //	close master table and form
      pageBuilder.writeLine("</table>");
      pageBuilder.writeLine("</form>");
    }

    //	edit a role's roles and permissions
    else if (EDIT_ROLE.equals(mode)) {
      String roleName = pageBuilder.request.getParameter(ROLE_NAME_PARAMETER);

      String[] roles = upsc.getRoles();
      String[] roleRoles = upsc.getRoleRoles(roleName);
      Set roleRoleSet = new HashSet(Arrays.asList(roleRoles));

      String[] permissions = upsc.getPermissions();
      String[] rolePermissions = upsc.getRolePermissions(roleName);
      Set rolePermissionSet = new HashSet(Arrays.asList(rolePermissions));

      //	open form and add command
      pageBuilder.writeLine(
          "<form method=\"POST\" action=\""
              + pageBuilder.request.getContextPath()
              + pageBuilder.request.getServletPath()
              + "/"
              + this.getClass().getName()
              + "\">");
      pageBuilder.writeLine(
          "<input type=\"hidden\" name=\"" + COMMAND_PARAMETER + "\" value=\"" + EDIT_ROLE + "\">");
      pageBuilder.writeLine(
          "<input type=\"hidden\" name=\""
              + ROLE_NAME_PARAMETER
              + "\" value=\""
              + roleName
              + "\">");

      //	build label row
      pageBuilder.writeLine("<table class=\"mainTable\">");
      pageBuilder.writeLine("<tr>");
      pageBuilder.writeLine("<td width=\"100%\" class=\"mainTableHeader\">");
      pageBuilder.writeLine("Manage the roles and permissions of role '" + roleName + "'");
      pageBuilder.writeLine("</td>");
      pageBuilder.writeLine("</tr>");

      //	open user table
      pageBuilder.writeLine("<tr>");
      pageBuilder.writeLine("<td width=\"100%\" class=\"mainTableBody\">");
      pageBuilder.writeLine("<table width=\"100%\" class=\"dataTable\">");

      //	build label row
      pageBuilder.writeLine("<tr>");

      pageBuilder.writeLine("<td class=\"dataTableHeader\">");
      pageBuilder.writeLine("Roles");
      pageBuilder.writeLine("</td>");

      pageBuilder.writeLine("<td class=\"dataTableHeader\">");
      pageBuilder.writeLine("Permissions");
      pageBuilder.writeLine("</td>");

      pageBuilder.writeLine("</tr>");

      //	add actual user data
      for (int rp = 0; rp < Math.max(roles.length, permissions.length); rp++) {
        String role = ((rp < roles.length) ? roles[rp] : null);
        String permission = ((rp < permissions.length) ? permissions[rp] : null);

        //	open table row
        pageBuilder.writeLine("<tr>");

        pageBuilder.writeLine("<td class=\"dataTableBody\">");
        if (role == null) pageBuilder.writeLine("&nbsp;");
        else {
          pageBuilder.writeLine(
              "<input type=\"checkbox\" name=\""
                  + ROLE_PARAMETER
                  + "\" value=\""
                  + role
                  + "\""
                  + (roleRoleSet.contains(role) ? " checked" : "")
                  + ">");
          pageBuilder.writeLine("&nbsp;");
          pageBuilder.writeLine(role);
        }
        pageBuilder.writeLine("</td>");

        pageBuilder.writeLine("<td class=\"dataTableBody\">");
        if (permission == null) pageBuilder.writeLine("&nbsp;");
        else {
          pageBuilder.writeLine(
              "<input type=\"checkbox\" name=\""
                  + PERMISSION_PARAMETER
                  + "\" value=\""
                  + permission
                  + "\""
                  + (rolePermissionSet.contains(permission) ? " checked" : "")
                  + ">");
          pageBuilder.writeLine("&nbsp;");
          pageBuilder.writeLine(permission);
        }
        pageBuilder.writeLine("</td>");

        pageBuilder.writeLine("</tr>");
      }

      //	add button row
      pageBuilder.writeLine("<tr>");
      pageBuilder.writeLine("<td colspan=\"2\" class=\"formTableBody\">");
      pageBuilder.writeLine("<input type=\"submit\" value=\"Edit Role\" class=\"submitButton\">");
      pageBuilder.writeLine("</td>");
      pageBuilder.writeLine("</tr>");

      //	close user table
      pageBuilder.writeLine("</table>");
      pageBuilder.writeLine("</td>");
      pageBuilder.writeLine("</tr>");

      //	close master table and form
      pageBuilder.writeLine("</table>");
      pageBuilder.writeLine("</form>");
    }

    //	show master list
    else {
      String[] users = upsc.getUsers();
      String[] roles = upsc.getRoles();

      //	build label row
      pageBuilder.writeLine("<table class=\"mainTable\">");
      pageBuilder.writeLine("<tr>");
      pageBuilder.writeLine("<td width=\"100%\" class=\"mainTableHeader\">");
      pageBuilder.writeLine("Manage the roles and permissions of users and roles");
      pageBuilder.writeLine("</td>");
      pageBuilder.writeLine("</tr>");

      //	open user table
      pageBuilder.writeLine("<tr>");
      pageBuilder.writeLine("<td width=\"100%\" class=\"mainTableBody\">");
      pageBuilder.writeLine("<table width=\"100%\" class=\"dataTable\">");

      //	build label row
      pageBuilder.writeLine("<tr>");

      pageBuilder.writeLine("<td class=\"dataTableHeader\">");
      pageBuilder.writeLine("Users");
      pageBuilder.writeLine("</td>");

      pageBuilder.writeLine("<td class=\"dataTableHeader\">");
      pageBuilder.writeLine("Roles");
      pageBuilder.writeLine("</td>");

      pageBuilder.writeLine("</tr>");

      //	add row with form for creating role
      pageBuilder.writeLine("<tr>");

      pageBuilder.writeLine("<td width=\"30%\" class=\"dataTableBody\">");
      pageBuilder.writeLine("&nbsp;");
      pageBuilder.writeLine("</td>");

      pageBuilder.writeLine("<td width=\"70%\" class=\"dataTableBody\">");
      pageBuilder.writeLine(
          "<form method=\"POST\" action=\""
              + pageBuilder.request.getContextPath()
              + pageBuilder.request.getServletPath()
              + "/"
              + this.getClass().getName()
              + "\">");
      pageBuilder.writeLine(
          "<input type=\"hidden\" name=\""
              + COMMAND_PARAMETER
              + "\" value=\""
              + CREATE_ROLE
              + "\">");
      pageBuilder.writeLine("Role Name&nbsp;");
      pageBuilder.writeLine("<input type=\"text\" name=\"" + ROLE_NAME_PARAMETER + "\">");
      pageBuilder.writeLine("&nbsp;");
      pageBuilder.writeLine("<input type=\"submit\" value=\"Create Role\" class=\"submitButton\">");
      pageBuilder.writeLine("</form>");
      pageBuilder.writeLine("</td>");

      pageBuilder.writeLine("</tr>");

      //	add actual user/role data
      for (int ur = 0; ur < Math.max(users.length, roles.length); ur++) {
        String user = ((ur < users.length) ? users[ur] : null);
        String role = ((ur < roles.length) ? roles[ur] : null);

        //	open table row
        pageBuilder.writeLine("<tr>");

        pageBuilder.writeLine("<td class=\"dataTableBody\">");
        if (user == null) pageBuilder.writeLine("&nbsp;");
        else {
          pageBuilder.writeLine(
              ("<a"
                  + " title=\""
                  + ("Edit roles and permissions of user '" + user + "'")
                  + "\""
                  + " href=\""
                  + pageBuilder.request.getContextPath()
                  + pageBuilder.request.getServletPath()
                  + "/"
                  + this.getClass().getName()
                  + "?"
                  + MODE_PARAMETER
                  + "="
                  + EDIT_USER
                  + "&"
                  + USER_NAME_PARAMETER
                  + "="
                  + user
                  + "\">"));
          pageBuilder.writeLine(user);
          pageBuilder.writeLine("</a>");
        }
        pageBuilder.writeLine("</td>");

        pageBuilder.writeLine("<td class=\"dataTableBody\">");
        if (role == null) pageBuilder.writeLine("&nbsp;");
        else {
          pageBuilder.writeLine(
              "<form method=\"POST\" action=\""
                  + pageBuilder.request.getContextPath()
                  + pageBuilder.request.getServletPath()
                  + "/"
                  + this.getClass().getName()
                  + "\">");
          pageBuilder.writeLine(
              "<input type=\"hidden\" name=\""
                  + COMMAND_PARAMETER
                  + "\" value=\""
                  + DELETE_ROLE
                  + "\">");
          pageBuilder.writeLine(
              "<input type=\"hidden\" name=\""
                  + ROLE_NAME_PARAMETER
                  + "\" value=\""
                  + role
                  + "\">");
          pageBuilder.writeLine(
              ("<a"
                  + " title=\""
                  + ("Edit roles and permissions of role '" + role + "'")
                  + "\""
                  + " href=\""
                  + pageBuilder.request.getContextPath()
                  + pageBuilder.request.getServletPath()
                  + "/"
                  + this.getClass().getName()
                  + "?"
                  + MODE_PARAMETER
                  + "="
                  + EDIT_ROLE
                  + "&"
                  + ROLE_NAME_PARAMETER
                  + "="
                  + role
                  + "\">"));
          pageBuilder.writeLine(role);
          pageBuilder.writeLine("</a>");
          pageBuilder.writeLine("&nbsp;");
          pageBuilder.writeLine(
              "<input type=\"submit\" value=\"Delete Role\" class=\"submitButton\">");
          pageBuilder.writeLine("</form>");
        }
        pageBuilder.writeLine("</td>");

        pageBuilder.writeLine("</tr>");
      }

      //	close user table
      pageBuilder.writeLine("</table>");
      pageBuilder.writeLine("</td>");
      pageBuilder.writeLine("</tr>");

      //	close master table and form
      pageBuilder.writeLine("</table>");
    }
  }