From 1fe3a579a93034171a6eb1e87eefbe6cac9a5fbf Mon Sep 17 00:00:00 2001
From: Nils Christian Ehmke <nie@informatik.uni-kiel.de>
Date: Fri, 26 Oct 2012 15:10:40 +0200
Subject: [PATCH] Continued with the user management

---
 .../beans/view/CurrentUserManagementBean.java | 17 ++--------
 .../main/java/kieker/webgui/common/User.java  |  9 +++++-
 .../common/impl/UserManagerFacadeImpl.java    |  6 ++--
 .../lang/UserManagementPage_de.properties     | 19 ++++++++++++
 .../lang/UserManagementPage_en.properties     | 19 ++++++++++++
 .../src/main/webapp/WEB-INF/faces-config.xml  |  2 +-
 .../src/main/webapp/WEB-INF/pretty-config.xml |  2 +-
 Kieker.WebGUI/src/main/webapp/css/Icons.css   |  7 +++++
 .../dialogs/ProjectOverviewPageDialogs.xhtml  |  8 -----
 .../dialogs/UserManagementDialogs.xhtml       |  9 +++---
 ...agement.xhtml => UserManagementPage.xhtml} | 31 +++++++++++++------
 11 files changed, 87 insertions(+), 42 deletions(-)
 create mode 100644 Kieker.WebGUI/src/main/resources/lang/UserManagementPage_de.properties
 create mode 100644 Kieker.WebGUI/src/main/resources/lang/UserManagementPage_en.properties
 rename Kieker.WebGUI/src/main/webapp/pages/admin/{UserManagement.xhtml => UserManagementPage.xhtml} (50%)

diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentUserManagementBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentUserManagementBean.java
index debcf589..fa2beaf1 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentUserManagementBean.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentUserManagementBean.java
@@ -24,21 +24,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import kieker.webgui.common.IUserManagerFacade;
 import kieker.webgui.common.Role;
 import kieker.webgui.common.User;
-/***************************************************************************
- * Copyright 2012 Kieker Project (http://kieker-monitoring.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ***************************************************************************/
 
 /**
  * @author Nils Christian Ehmke
@@ -65,6 +50,8 @@ public final class CurrentUserManagementBean {
 
 	public void addUser(final String username, final String password, final List<Role> roles) {
 		this.userManagerFacade.addUser(username, password, roles);
+		// TODO Check that the op was successful before adding the user to our list
+		this.users.add(new User(username, roles, true));
 	}
 
 	public void removeUser(final String username) {
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/common/User.java b/Kieker.WebGUI/src/main/java/kieker/webgui/common/User.java
index 0b98752e..784eaf26 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/User.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/common/User.java
@@ -22,10 +22,12 @@ public class User {
 
 	private final String name;
 	private final List<Role> roles;
+	private final boolean enabled;
 
-	public User(final String name, final List<Role> roles) {
+	public User(final String name, final List<Role> roles, final boolean enabled) {
 		this.name = name;
 		this.roles = roles;
+		this.enabled = enabled;
 	}
 
 	public String getName() {
@@ -36,4 +38,9 @@ public class User {
 		return this.roles;
 	}
 
+	public boolean isEnabled() {
+		return enabled;
+	}
+
+	
 }
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/common/impl/UserManagerFacadeImpl.java b/Kieker.WebGUI/src/main/java/kieker/webgui/common/impl/UserManagerFacadeImpl.java
index 34c3d71e..7e744a22 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/impl/UserManagerFacadeImpl.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/common/impl/UserManagerFacadeImpl.java
@@ -103,6 +103,7 @@ public class UserManagerFacadeImpl implements IUserManagerFacade {
 	@Override
 	@PreAuthorize("hasRole('ROLE_ADMIN')")
 	public List<User> getUsers() {
+		// FIXME Users without roles
 		final List<User> result = new ArrayList<User>();
 		ResultSet queryResult = null;
 
@@ -110,7 +111,7 @@ public class UserManagerFacadeImpl implements IUserManagerFacade {
 			final Map<String, User> tempMap = new TreeMap<String, User>();
 
 			final PreparedStatement getQuery = this.connection
-					.prepareStatement("select u.name, ur.role from KIEKERUser u, Userroles ur where u.name=ur.name");
+					.prepareStatement("select u.name, ur.role, u.enabled from KIEKERUser u, Userroles ur where u.name=ur.name");
 
 			// Run through all results
 			queryResult = getQuery.executeQuery();
@@ -119,6 +120,7 @@ public class UserManagerFacadeImpl implements IUserManagerFacade {
 				final String username = queryResult.getString(1);
 				final int roleID = queryResult.getInt(2);
 				final Role role = Role.fromID(roleID);
+				final boolean enabled = queryResult.getBoolean(3);
 
 				// If the user doesn't exist in our map yet, add him.
 				// In each case we add the role to the user
@@ -127,7 +129,7 @@ public class UserManagerFacadeImpl implements IUserManagerFacade {
 				} else {
 					final List<Role> roles = new ArrayList<Role>();
 					roles.add(role);
-					tempMap.put(username, new User(username, roles));
+					tempMap.put(username, new User(username, roles, enabled));
 				}
 			}
 
diff --git a/Kieker.WebGUI/src/main/resources/lang/UserManagementPage_de.properties b/Kieker.WebGUI/src/main/resources/lang/UserManagementPage_de.properties
new file mode 100644
index 00000000..f5aadf0c
--- /dev/null
+++ b/Kieker.WebGUI/src/main/resources/lang/UserManagementPage_de.properties
@@ -0,0 +1,19 @@
+#------------------------------------------------------------------------------
+#
+# Diese Datei beinhaltet sämtliche Nachrichten, Buttonbeschriftungen etc., 
+# welche innerhalb der Benutzerverwaltungsseite benutzt werden.
+#
+#------------------------------------------------------------------------------
+
+newUser = Neuer Benutzer
+
+updateUserList = Benutzerliste Aktualisieren
+
+editUser = Benutzer Bearbeiten
+disableUser = Benutzer Deaktivieren
+enableUser = Benutzer Aktivieren
+deleteUser = Benutzer Löschen
+
+username = Benutzername
+userroles = Benutzerrollen
+enabled = Aktiviert
\ No newline at end of file
diff --git a/Kieker.WebGUI/src/main/resources/lang/UserManagementPage_en.properties b/Kieker.WebGUI/src/main/resources/lang/UserManagementPage_en.properties
new file mode 100644
index 00000000..fcca366a
--- /dev/null
+++ b/Kieker.WebGUI/src/main/resources/lang/UserManagementPage_en.properties
@@ -0,0 +1,19 @@
+#------------------------------------------------------------------------------
+#
+# This file contains all messages, button captions etc. which are used within
+# the user management page.
+#
+#------------------------------------------------------------------------------
+
+newUser = New User
+
+updateUserList = Update Userlist
+
+editUser = Edit User
+disableUser = Disable User
+enableUser = Enable User
+deleteUser = Delete User
+
+username = Username
+userroles = Userroles
+enabled = Enabled
\ No newline at end of file
diff --git a/Kieker.WebGUI/src/main/webapp/WEB-INF/faces-config.xml b/Kieker.WebGUI/src/main/webapp/WEB-INF/faces-config.xml
index 66f1e72d..5807c106 100644
--- a/Kieker.WebGUI/src/main/webapp/WEB-INF/faces-config.xml
+++ b/Kieker.WebGUI/src/main/webapp/WEB-INF/faces-config.xml
@@ -72,7 +72,7 @@
     <navigation-rule>
         <navigation-case>
             <from-outcome>userManagement</from-outcome>
-            <to-view-id>/pages/admin/UserManagement.xhtml</to-view-id>
+            <to-view-id>/pages/admin/UserManagementPage.xhtml</to-view-id>
         </navigation-case>
     </navigation-rule>
 </faces-config>
\ No newline at end of file
diff --git a/Kieker.WebGUI/src/main/webapp/WEB-INF/pretty-config.xml b/Kieker.WebGUI/src/main/webapp/WEB-INF/pretty-config.xml
index 1e63db8a..1301bdbd 100644
--- a/Kieker.WebGUI/src/main/webapp/WEB-INF/pretty-config.xml
+++ b/Kieker.WebGUI/src/main/webapp/WEB-INF/pretty-config.xml
@@ -51,6 +51,6 @@
 	
     <url-mapping id="userManagement"> 
         <pattern value="/pages/admin/userManagement" /> 
-        <view-id value="/faces/pages/admin/UserManagement.xhtml" />
+        <view-id value="/faces/pages/admin/UserManagementPage.xhtml" />
     </url-mapping>
 </pretty-config>
\ No newline at end of file
diff --git a/Kieker.WebGUI/src/main/webapp/css/Icons.css b/Kieker.WebGUI/src/main/webapp/css/Icons.css
index b0df1ce0..88818fe7 100644
--- a/Kieker.WebGUI/src/main/webapp/css/Icons.css
+++ b/Kieker.WebGUI/src/main/webapp/css/Icons.css
@@ -42,6 +42,13 @@
     width:32px;
 }
 
+.ui-icon-userEnableDisable {
+    background: url('../img/icons/SnapEnabledSmall.png') no-repeat !important;
+    height:16px;
+    width:16px;
+}
+
+
 .ui-icon-snapDisabled {
     background: url('../img/icons/SnapDisabled.png') no-repeat !important;
     height:32px;
diff --git a/Kieker.WebGUI/src/main/webapp/dialogs/ProjectOverviewPageDialogs.xhtml b/Kieker.WebGUI/src/main/webapp/dialogs/ProjectOverviewPageDialogs.xhtml
index 374fbde0..3970abaa 100644
--- a/Kieker.WebGUI/src/main/webapp/dialogs/ProjectOverviewPageDialogs.xhtml
+++ b/Kieker.WebGUI/src/main/webapp/dialogs/ProjectOverviewPageDialogs.xhtml
@@ -19,8 +19,6 @@
             <hr/>
             <div style="text-align: right">
                 <p:commandButton value="#{localizedMessages.ok}" action="#{projectsBean.addProject(stringBean.string, currentProjectOverviewBean)}" update=":projectsListForm :messages" oncomplete="newProjectDialog.hide()" />
-                <p:spacer width="10px" height="10" />
-                <p:commandButton value="#{localizedMessages.cancel}" onclick="newProjectDialog.hide()" />
             </div>
         </h:form>  
     </p:dialog>
@@ -39,8 +37,6 @@
             <hr/>
             <div style="text-align: right">
                 <p:commandButton value="#{localizedMessages.ok}" action="#{projectsBean.renameProject(currentProjectOverviewBean.projectName, stringBean.string)}" update=":projectsListForm :messages" oncomplete="renameProjectDialog.hide()" />
-                <p:spacer width="10px" height="10" />
-                <p:commandButton value="#{localizedMessages.cancel}" onclick="renameProjectDialog.hide()" />
             </div>
         </h:form>  
     </p:dialog>
@@ -55,8 +51,6 @@
             <hr/>
             <div style="text-align: right">
                 <p:commandButton value="#{localizedMessages.ok}" action="#{projectsBean.deleteProject(currentProjectOverviewBean.projectName)}" update=":projectsListForm :messages" oncomplete="deleteProjectDialog.hide()" />
-                <p:spacer width="10px" height="10" />
-                <p:commandButton value="#{localizedMessages.cancel}" onclick="deleteProjectDialog.hide()" />
             </div>
         </h:form>  
     </p:dialog>
@@ -74,8 +68,6 @@
             <hr/>
             <div style="text-align: right">
                 <p:commandButton value="#{localizedMessages.ok}" action="#{projectsBean.copyProject(currentProjectOverviewBean.projectName, stringBean.string, currentProjectOverviewBean)}" update=":projectsListForm :messages" oncomplete="copyProjectDialog.hide()" />
-                <p:spacer width="10px" height="10" />
-                <p:commandButton value="#{localizedMessages.cancel}" onclick="copyProjectDialog.hide()" />
             </div>
         </h:form>  
     </p:dialog>
diff --git a/Kieker.WebGUI/src/main/webapp/dialogs/UserManagementDialogs.xhtml b/Kieker.WebGUI/src/main/webapp/dialogs/UserManagementDialogs.xhtml
index 364bedb1..2106604a 100644
--- a/Kieker.WebGUI/src/main/webapp/dialogs/UserManagementDialogs.xhtml
+++ b/Kieker.WebGUI/src/main/webapp/dialogs/UserManagementDialogs.xhtml
@@ -6,8 +6,9 @@
     xmlns:p="http://primefaces.org/ui">     
 
     <p:dialog id="newUserDialog" header="Neuer Benutzer" resizable="false" modal="true" widgetVar="newUserDlg">
-        <h:form>
-
+        <!-- Make sure that closing of the dialog also clears the input field. -->
+        <p:ajax event="close" update=":newUserDialogForm" />
+        <h:form id="newUserDialogForm">
             <h:panelGrid columnClasses="col1 , col2" columns="2" cellpadding="5">
                 <h:outputText value="Benutzername: " /> 
                 <p:inputText value="#{newUserBean.username}" style="width: 100%" />
@@ -15,7 +16,7 @@
                 <h:outputText value="Passwort: " /> 
                 <p:inputText value="#{newUserBean.password}" style="width: 100%" />
 
-                
+
                 <h:outputText value="Benutzerrollen: " /> 
                 <p:selectManyCheckbox value="#{newUserBean.roles}" layout="pageDirection" converter="roleStringConverter">  
                     <f:selectItem itemLabel="Benutzer" itemValue="#{ROLE_USER}" />  
@@ -25,7 +26,7 @@
 
             <hr/>
             <div style="text-align: right">
-                <p:commandButton value="#{localizedMessages.ok}" action="#{currentUserManagementBean.addUser(newUserBean.username, newUserBean.password, rolesBean.roles)}" oncomplete="newUserDlg.hide()"/>
+                <p:commandButton value="#{localizedMessages.ok}" action="#{currentUserManagementBean.addUser(newUserBean.username, newUserBean.password, newUserBean.roles)}" oncomplete="newUserDlg.hide()" update=":usersListForm"/>
             </div>
         </h:form>
     </p:dialog>
diff --git a/Kieker.WebGUI/src/main/webapp/pages/admin/UserManagement.xhtml b/Kieker.WebGUI/src/main/webapp/pages/admin/UserManagementPage.xhtml
similarity index 50%
rename from Kieker.WebGUI/src/main/webapp/pages/admin/UserManagement.xhtml
rename to Kieker.WebGUI/src/main/webapp/pages/admin/UserManagementPage.xhtml
index 495714c4..1ed4f911 100644
--- a/Kieker.WebGUI/src/main/webapp/pages/admin/UserManagement.xhtml
+++ b/Kieker.WebGUI/src/main/webapp/pages/admin/UserManagementPage.xhtml
@@ -16,40 +16,51 @@
             <ui:param name="showProjectName" value="false"/>
 
             <ui:define name="bundleIncludes">
-               
+                <f:loadBundle var="localizedUserManagementMessages" basename="lang.UserManagementPage"/>
             </ui:define>
 
             <ui:define name="cssIncludes">
-                 <link rel="stylesheet" type="text/css" href="/css/UserManagement.css"  />
+                <link rel="stylesheet" type="text/css" href="/css/UserManagement.css"  />
             </ui:define>
 
             <!-- Those are the menu bar entries left from the help-submenu. -->
             <ui:define name="furtherMenuBarEntries">
                 <p:submenu label="#{localizedMessages.file}">
-                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-newProject" value="  Neuer Benutzer" onclick="newUserDlg.show()" ajax="true"/>
+                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-newProject" value="  #{localizedUserManagementMessages.newUser}" onclick="newUserDlg.show()" ajax="true"/>
                     <p:separator/>
-                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-reload" value="  Benutzerliste Aktualisieren" update=":usersListForm" action="#{currentUserManagementBean.updateList()}" ajax="true"/>
+                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-reload" value="  #{localizedUserManagementMessages.updateUserList}" update=":usersListForm" action="#{currentUserManagementBean.updateList()}" ajax="true"/>
                     <p:separator/>
-                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-settings" value="  Einstellungen" onclick="settingsDlg.show()" ajax="true"/>
+                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-settings" value="  #{localizedMessages.settings}" onclick="settingsDlg.show()" ajax="true"/>
                 </p:submenu>
             </ui:define>   
 
             <ui:define name="centerContent">
                 <h:form id="usersListForm"> 
                     <p:dataTable value="#{currentUserManagementBean.users}" var="user" emptyMessage="#{localizedMessages.noRecordsFound}" rows="15" paginator="true" paginatorPosition="both" rowsPerPageTemplate="5,10,15,25,50"  paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}">  
-                        <p:column headerText="Benutzername">
-                            #{user.name}
+                        <p:column headerText="#{localizedUserManagementMessages.username}" sortBy="#{user.name}">
+                            <p:commandLink id="dynaButton" value="#{user.name}"/>
+
+                            <p:menu overlay="true" trigger="dynaButton" my="left top" at="left bottom" style="width:210px">
+                                <p:menuitem icon="ui-icon-edit" styleClass="element-with-whitespace" value="  #{localizedUserManagementMessages.editUser}"/>
+                                <p:menuitem icon="ui-icon-userEnableDisable" styleClass="element-with-whitespace" value="  #{user.enabled ? localizedUserManagementMessages.disableUser : localizedUserManagementMessages.enableUser}"/>
+                                <p:separator/>
+                                <p:menuitem icon="ui-icon-delete" styleClass="element-with-whitespace" value="  #{localizedUserManagementMessages.deleteUser}"/>
+                            </p:menu>
                         </p:column>
-                        
-                        <p:column headerText="Benutzerrollen">
+
+                        <p:column headerText="#{localizedUserManagementMessages.userroles}" sortBy="#{user.roles}">
                             #{user.roles}
                         </p:column>
+
+                        <p:column headerText="#{localizedUserManagementMessages.enabled}" sortBy="#{user.enabled}" style="text-align: center">
+                            #{user.enabled ? localizedMessages.yes : localizedMessages.no}
+                        </p:column>
                     </p:dataTable>  
                 </h:form>
             </ui:define>
 
             <ui:define name="furtherDialogIncludes">
-                 <ui:include src="../../dialogs/UserManagementDialogs.xhtml" />
+                <ui:include src="../../dialogs/UserManagementDialogs.xhtml" />
             </ui:define>
 
         </ui:composition>
-- 
GitLab