/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * 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. */ package org.uberfire.ext.security.management.client.editor.user; import java.util.Collection; import java.util.Map; import java.util.Set; import javax.enterprise.context.Dependent; import javax.inject.Inject; import javax.validation.ConstraintViolation; import org.jboss.errai.security.shared.api.Group; import org.jboss.errai.security.shared.api.Role; import org.jboss.errai.security.shared.api.identity.User; import org.jboss.errai.security.shared.api.identity.UserImpl; import org.uberfire.ext.security.management.api.UserManager; import org.uberfire.ext.security.management.client.ClientUserSystemManager; import org.uberfire.ext.security.management.client.editor.Driver; /** * <p>It links the user editors hierarchy with the instance edited by flushing the editor's values into the User model.</p> * <p>It contains all logic for editing a User instance by using Editors hierarchy instances, so * the editors's concrete widget/component implementation is isolated from the edition logic.</p> * @since 0.8.0 */ @Dependent public class UserEditorDriver implements Driver<User, UserEditor> { ClientUserSystemManager userSystemManager; UserEditor userEditor; User user; boolean isFlushed = false; boolean isEditMode = false; @Inject public UserEditorDriver(final ClientUserSystemManager userSystemManager) { this.userSystemManager = userSystemManager; } public User createNewUser(final String identifier) { User user = userSystemManager.createUser(identifier); final Collection<UserManager.UserAttribute> attrs = userSystemManager.getUserSupportedAttributes(); if (attrs != null) { for (UserManager.UserAttribute attribute : attrs) { final String name = attribute.getName(); final boolean isMandatory = attribute.isMandatory(); final boolean isEditable = attribute.isEditable(); if (isMandatory && isEditable && name != null) { final String defaultValue = attribute.getDefaultValue(); user.setProperty(name, defaultValue); } } } return user; } public void show(final User user, final UserEditor userEditor) { this.isFlushed = false; this.isEditMode = false; this.user = user; this.userEditor = userEditor; // Root viewer.. userEditor.show(user); // Sub-viewers. userEditor.attributesEditor().show(user); userEditor.groupsExplorer().show(user); userEditor.rolesExplorer().show(user); } public void edit(final User user, final UserEditor userEditor) { this.isFlushed = false; this.isEditMode = true; this.user = user; this.userEditor = userEditor; // Root editor edition. userEditor.edit(user); // Sub-editors edition. userEditor.attributesEditor().edit(user); userEditor.groupsExplorer().edit(user); userEditor.rolesExplorer().edit(user); } public boolean flush() { assert this.isEditMode; this.isFlushed = true; // Flush editor and sub-editors. userEditor.flush(); userEditor.attributesEditor().flush(); userEditor.groupsExplorer().flush(); userEditor.rolesExplorer().flush(); // Obtain the editor's values. final String id = userEditor.identifier(); final Map<String, String> properties = userEditor.attributesEditor().getValue(); final Set<Group> groups = userEditor.groupsExplorer().getValue(); final Set<Role> roles = userEditor.rolesExplorer().getValue(); // Create a new resulting instance (as groups & roles are unmodifiable collections in the default UserImpl). user = new UserImpl(id, roles, groups, properties); // Validate the instance and set delegate violations, if any, to the editors hierarchy. Set<ConstraintViolation<User>> violations = userSystemManager.usersValidator().validate(user); userEditor.setViolations(violations); return violations == null || violations.isEmpty(); } @Override public User getValue() { assert this.isFlushed; return user; } }