| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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. |
| */ |
| package org.apache.ace.useradmin.ui.vaadin; |
| |
| import java.util.List; |
| |
| import org.apache.ace.useradmin.ui.editor.GroupNotFoundException; |
| import org.apache.ace.useradmin.ui.editor.UserAlreadyExistsException; |
| import org.apache.ace.useradmin.ui.editor.UserDTO; |
| import org.apache.ace.useradmin.ui.editor.UserEditor; |
| import org.apache.ace.useradmin.ui.editor.UserNotFoundException; |
| import org.osgi.service.useradmin.Group; |
| import org.osgi.service.useradmin.User; |
| |
| import com.vaadin.data.Property.ValueChangeEvent; |
| import com.vaadin.data.Property.ValueChangeListener; |
| import com.vaadin.ui.Button; |
| import com.vaadin.ui.Button.ClickEvent; |
| import com.vaadin.ui.Button.ClickListener; |
| import com.vaadin.ui.FormLayout; |
| import com.vaadin.ui.HorizontalLayout; |
| import com.vaadin.ui.PasswordField; |
| import com.vaadin.ui.Select; |
| import com.vaadin.ui.Table; |
| import com.vaadin.ui.TextField; |
| import com.vaadin.ui.VerticalLayout; |
| import com.vaadin.ui.Window; |
| import com.vaadin.ui.themes.Reindeer; |
| |
| /** |
| * Provides a more advanced CRUD-functionality for adding, removing or updating users in ACE. |
| */ |
| public class UserAdminWindow extends Window { |
| private final Table m_userTable; |
| private final Select m_groupSelect; |
| private final TextField m_usernameTextField; |
| private final PasswordField m_passwordTextField; |
| private final Button m_applyButton; |
| private final Button m_cancelButton; |
| private final Button m_removeUserButton; |
| |
| private volatile UserEditor m_userUtil; |
| |
| /** |
| * Creates a new {@link UserAdminWindow} instance. |
| */ |
| public UserAdminWindow() { |
| setCaption("Manage users"); |
| setWidth("30%"); |
| |
| m_userTable = new Table(); |
| m_userTable.setSizeFull(); |
| m_userTable.setImmediate(true); |
| m_userTable.setSelectable(true); |
| m_userTable.setSortDisabled(false); |
| m_userTable.addContainerProperty("User", UserDTO.class, null); |
| m_userTable.addListener(new ValueChangeListener() { |
| @Override |
| public void valueChange(ValueChangeEvent event) { |
| selectUser((UserDTO) m_userTable.getValue()); |
| } |
| }); |
| |
| VerticalLayout usersList = new VerticalLayout(); |
| usersList.setSizeFull(); |
| usersList.addComponent(m_userTable); |
| |
| Button addUserButton = new Button("+"); |
| addUserButton.setStyleName(Reindeer.BUTTON_SMALL); |
| addUserButton.addListener(new ClickListener() { |
| @Override |
| public void buttonClick(ClickEvent event) { |
| prepareForNewUser(); |
| } |
| }); |
| |
| m_removeUserButton = new Button(); |
| m_removeUserButton.setStyleName(Reindeer.BUTTON_SMALL); |
| m_removeUserButton.setCaption("-"); |
| m_removeUserButton.addListener(new ClickListener() { |
| @Override |
| public void buttonClick(ClickEvent event) { |
| removeSelectedUser((UserDTO) m_userTable.getValue()); |
| } |
| }); |
| |
| HorizontalLayout addRemoveUserButtons = new HorizontalLayout(); |
| addRemoveUserButtons.setMargin(true, false, false, false); |
| addRemoveUserButtons.setSpacing(true); |
| addRemoveUserButtons.addComponent(addUserButton); |
| addRemoveUserButtons.addComponent(m_removeUserButton); |
| usersList.addComponent(addRemoveUserButtons); |
| |
| usersList.setExpandRatio(m_userTable, 1.0f); |
| usersList.setExpandRatio(addRemoveUserButtons, 0.0f); |
| |
| ValueChangeListener changeListener = new ValueChangeListener() { |
| @Override |
| public void valueChange(ValueChangeEvent event) { |
| m_applyButton.setEnabled(isCurrentFormValid()); |
| m_cancelButton.setEnabled(true); |
| } |
| }; |
| |
| m_usernameTextField = new TextField(); |
| m_usernameTextField.setCaption("Username"); |
| m_usernameTextField.setImmediate(true); |
| m_usernameTextField.setRequired(true); |
| m_usernameTextField.addListener(changeListener); |
| |
| m_passwordTextField = new PasswordField(); |
| m_passwordTextField.setCaption("Password"); |
| m_passwordTextField.setImmediate(true); |
| m_passwordTextField.setRequired(true); |
| m_passwordTextField.addListener(changeListener); |
| |
| m_groupSelect = new Select(); |
| m_groupSelect.setCaption("Role"); |
| m_groupSelect.setImmediate(true); |
| m_groupSelect.setNullSelectionAllowed(false); |
| m_groupSelect.setRequired(true); |
| m_groupSelect.addListener(changeListener); |
| |
| FormLayout formLayout = new FormLayout(); |
| formLayout.addComponent(m_usernameTextField); |
| formLayout.addComponent(m_passwordTextField); |
| formLayout.addComponent(m_groupSelect); |
| |
| m_applyButton = new Button(); |
| m_applyButton.setCaption("Apply changes"); |
| m_applyButton.addListener(new ClickListener() { |
| @Override |
| public void buttonClick(ClickEvent event) { |
| storeUserInfo(); |
| } |
| }); |
| |
| m_cancelButton = new Button(); |
| m_cancelButton.setEnabled(false); |
| m_cancelButton.setCaption("Cancel"); |
| m_cancelButton.addListener(new ClickListener() { |
| @Override |
| public void buttonClick(ClickEvent event) { |
| selectUser((UserDTO) m_userTable.getValue()); |
| } |
| }); |
| |
| HorizontalLayout addUserButtons = new HorizontalLayout(); |
| addUserButtons.setMargin(true, false, false, false); |
| addUserButtons.setSpacing(true); |
| addUserButtons.addComponent(m_applyButton); |
| addUserButtons.addComponent(m_cancelButton); |
| |
| formLayout.addComponent(addUserButtons); |
| |
| HorizontalLayout horizontalLayout = new HorizontalLayout(); |
| horizontalLayout.setSizeFull(); |
| horizontalLayout.setSpacing(true); |
| horizontalLayout.addComponent(usersList); |
| horizontalLayout.addComponent(formLayout); |
| |
| horizontalLayout.setExpandRatio(usersList, 0.35f); |
| horizontalLayout.setExpandRatio(formLayout, 0.65f); |
| |
| addComponent(horizontalLayout); |
| |
| updateState(null, false /* editAllowed */); |
| } |
| |
| @Override |
| public void attach() { |
| try { |
| populateUserTable(); |
| populateSelect(); |
| } |
| finally { |
| super.attach(); |
| } |
| } |
| |
| public void open(Window parent) { |
| parent.removeWindow(this); |
| parent.addWindow(this); |
| center(); |
| } |
| |
| /** |
| * @return <code>true</code> if the current form is valid, <code>false</code> otherwise. |
| */ |
| protected boolean isCurrentFormValid() { |
| String username = (String) m_usernameTextField.getValue(); |
| if (username == null || "".equals(username.trim())) { |
| return false; |
| } |
| String password = (String) m_passwordTextField.getValue(); |
| if (password == null || "".equals(password.trim())) { |
| return false; |
| } |
| String groupName = (String) m_groupSelect.getValue(); |
| if (groupName == null || "".equals(groupName.trim())) { |
| return false; |
| } |
| return true; |
| } |
| |
| /** |
| * Prepares everything for adding a new user. |
| */ |
| protected void prepareForNewUser() { |
| m_userTable.setValue(null); |
| m_usernameTextField.focus(); |
| |
| updateState(null, true /* editAllowed */); |
| } |
| |
| /** |
| * Removes the given user. |
| */ |
| protected void removeSelectedUser(UserDTO user) { |
| if (user == null) { |
| return; |
| } |
| |
| try { |
| if (m_userTable.removeItem(user)) { |
| m_userUtil.removeUser(user); |
| |
| showNotification(String.format("User '%s' removed!", user.getUsername()), Notification.TYPE_TRAY_NOTIFICATION); |
| } |
| } |
| catch (UserNotFoundException e) { |
| showNotification("Cannot store changes!", "<br>User not found, please refresh.", Notification.TYPE_ERROR_MESSAGE); |
| } |
| |
| updateState(null, false /* editAllowed */); |
| } |
| |
| /** |
| * Called when the selected user is changed. |
| * |
| * @param user |
| * the selected user, can be <code>null</code> in case no user is selected. |
| */ |
| protected void selectUser(UserDTO user) { |
| if (user != null) { |
| m_usernameTextField.setValue(user.getUsername()); |
| m_passwordTextField.setValue(user.getPassword()); |
| m_groupSelect.setValue(user.getGroupname()); |
| } |
| else { |
| m_usernameTextField.setValue(""); |
| m_passwordTextField.setValue(""); |
| m_groupSelect.setValue(null); |
| } |
| |
| updateState(user, user != null /* editAllowed */); |
| |
| m_cancelButton.setEnabled(false); |
| } |
| |
| /** |
| * Will be called by Felix DM when all dependencies become available. |
| */ |
| protected void start(org.apache.felix.dm.Component component) { |
| close(); |
| } |
| |
| /** |
| * Will be called by Felix DM when a dependency isn't available. |
| */ |
| protected void stop(org.apache.felix.dm.Component component) { |
| close(); |
| } |
| |
| /** |
| * |
| */ |
| protected void storeUserInfo() { |
| try { |
| String username = (String) m_usernameTextField.getValue(); |
| String password = (String) m_passwordTextField.getValue(); |
| String groupName = (String) m_groupSelect.getValue(); |
| |
| String notification; |
| Object itemID; |
| |
| UserDTO user = (UserDTO) m_userTable.getValue(); |
| if (user == null) { |
| user = new UserDTO(username, password, groupName); |
| |
| m_userUtil.addUser(user); |
| |
| notification = String.format("User '%s' created!", user.getUsername()); |
| |
| itemID = m_userTable.addItem(new Object[] { user }, user); |
| } |
| else { |
| if (!groupName.equals(user.getGroupname())) { |
| user.setGroupname(groupName); |
| } |
| if (!username.equals(user.getUsername())) { |
| user.setUsername(username); |
| } |
| if (!password.equals(user.getPassword())) { |
| user.setPassword(password); |
| } |
| |
| m_userUtil.updateUser(user); |
| |
| notification = String.format("User '%s' changed!", user.getUsername()); |
| |
| itemID = user; |
| } |
| |
| m_userTable.sort(new Object[] { "User" }, new boolean[] { true }); |
| m_userTable.setValue(itemID); |
| |
| showNotification(notification, Notification.TYPE_TRAY_NOTIFICATION); |
| |
| updateState(user, true /* editAllowed */); |
| } |
| catch (UserNotFoundException e) { |
| showNotification("Cannot store changes!", "<br>User not found, please refresh.", Notification.TYPE_ERROR_MESSAGE); |
| m_usernameTextField.focus(); |
| } |
| catch (GroupNotFoundException e) { |
| showNotification("Cannot store changes!", "<br>Group was not found.", Notification.TYPE_ERROR_MESSAGE); |
| m_groupSelect.focus(); |
| } |
| catch (UserAlreadyExistsException e) { |
| showNotification("Cannot store changes!", "<br>Username already in use.", Notification.TYPE_ERROR_MESSAGE); |
| m_usernameTextField.focus(); |
| } |
| } |
| |
| private boolean isCurrentUser(UserDTO user) { |
| if (user == null) { |
| return false; |
| } |
| User currentUser = (User) getApplication().getUser(); |
| return currentUser.getProperties().get("username").equals(user.getUsername()); |
| } |
| |
| private void populateSelect() { |
| List<Group> grouplist = m_userUtil.getGroups(); |
| for (Group g : grouplist) { |
| m_groupSelect.addItem(g.getName()); |
| } |
| m_userTable.sort(new Object[] { "User" }, new boolean[] { true }); |
| } |
| |
| /** |
| * Inserts inital user data into the user table |
| */ |
| private void populateUserTable() { |
| m_userTable.removeAllItems(); |
| List<UserDTO> data = m_userUtil.getData(); |
| for (UserDTO userDTO : data) { |
| m_userTable.addItem(new Object[] { userDTO }, userDTO); |
| } |
| } |
| |
| /** |
| * @param user |
| */ |
| private void updateState(UserDTO user, boolean editAllowed) { |
| boolean userSelected = (user != null); |
| m_applyButton.setEnabled(false); |
| m_cancelButton.setEnabled(!userSelected && editAllowed); |
| |
| boolean currentUser = isCurrentUser(user); |
| m_removeUserButton.setEnabled(userSelected && !currentUser); |
| m_usernameTextField.setEnabled(editAllowed && !currentUser); |
| m_passwordTextField.setEnabled(editAllowed); |
| m_groupSelect.setEnabled(editAllowed && !currentUser); |
| } |
| } |