/* * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * Copyright 2008 - 2009 Pentaho Corporation. All rights reserved. */ package org.pentaho.pac.client; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.pentaho.platform.engine.security.userroledao.ws.ProxyPentahoRole; import org.pentaho.platform.engine.security.userroledao.ws.ProxyPentahoUser; import org.pentaho.platform.engine.security.userroledao.ws.UserRoleSecurityInfo; import org.pentaho.platform.engine.security.userroledao.ws.UserToRoleAssignment; import com.google.gwt.user.client.rpc.AsyncCallback; public class UserAndRoleMgmtService { UserRoleSecurityInfo userRoleSecurityInfo; static UserAndRoleMgmtService userAndRoleMgmtService = new UserAndRoleMgmtService(); private UserAndRoleMgmtService() { } public static UserAndRoleMgmtService instance() { return userAndRoleMgmtService; } public void refreshSecurityInfo(final AsyncCallback<Object> callback) { AsyncCallback<UserRoleSecurityInfo> innerCallback = new AsyncCallback<UserRoleSecurityInfo>() { public void onSuccess(UserRoleSecurityInfo result) { userRoleSecurityInfo = result; callback.onSuccess(null); } public void onFailure(Throwable caught) { userRoleSecurityInfo = null; callback.onFailure(caught); } }; PacServiceFactory.getPacService().getUserRoleSecurityInfo(innerCallback); } public ProxyPentahoRole[] getRoles() { ProxyPentahoRole[] roles = new ProxyPentahoRole[0]; if (userRoleSecurityInfo != null) { roles = new ProxyPentahoRole[userRoleSecurityInfo.getRoles().size()]; for (int i = 0; i < roles.length; i++) { roles[i] = (ProxyPentahoRole) (userRoleSecurityInfo.getRoles().get(i)).clone(); } } return roles; } public ProxyPentahoUser[] getUsers() { ProxyPentahoUser[] users = new ProxyPentahoUser[0]; if (userRoleSecurityInfo != null) { users = new ProxyPentahoUser[userRoleSecurityInfo.getUsers().size()]; for (int i = 0; i < users.length; i++) { users[i] = (ProxyPentahoUser) (userRoleSecurityInfo.getUsers().get(i)).clone(); } } return users; } public ProxyPentahoRole[] getRoles(ProxyPentahoUser user) { ProxyPentahoRole[] roles = new ProxyPentahoRole[0]; if (userRoleSecurityInfo != null) { List<String> roleNames = new ArrayList<String>(); List<ProxyPentahoRole> assignedRoles = new ArrayList<ProxyPentahoRole>(); for( UserToRoleAssignment userToRoleAssignment : userRoleSecurityInfo.getAssignments() ) { if (userToRoleAssignment.getUserId().equals(user.getName())) { roleNames.add(userToRoleAssignment.getRoleId()); } } for ( String roleName : roleNames ) { for( ProxyPentahoRole role : userRoleSecurityInfo.getRoles() ) { if (role.getName().equals(roleName)) { assignedRoles.add(role); break; } } } roles = new ProxyPentahoRole[assignedRoles.size()]; for (int i = 0; i < roles.length; i++) { roles[i] = (ProxyPentahoRole) (assignedRoles.get(i)).clone(); } // FF3 bug requires roles array to have duplicates removed // Beware this must be compiled by GWT List<ProxyPentahoRole> finalRoles = new ArrayList<ProxyPentahoRole>(); outer: for(ProxyPentahoRole role : roles){ for(ProxyPentahoRole uniqueRole : finalRoles){ if(role.getName().equals(uniqueRole.getName())){ continue outer; } } finalRoles.add(role); } roles = new ProxyPentahoRole[finalRoles.size()]; for(int i = 0; i < finalRoles.size(); i++){ roles[i] = finalRoles.get(i); } } return roles; } public ProxyPentahoUser[] getUsers(ProxyPentahoRole role) { ProxyPentahoUser[] users = new ProxyPentahoUser[0]; if (userRoleSecurityInfo != null) { List<String> userNames = new ArrayList<String>(); List<ProxyPentahoUser> assignedUsers = new ArrayList<ProxyPentahoUser>(); for ( UserToRoleAssignment userToRoleAssignment : userRoleSecurityInfo.getAssignments() ) { if (userToRoleAssignment.getRoleId().equals(role.getName())) { userNames.add(userToRoleAssignment.getUserId()); } } for ( String userName : userNames ) { for ( ProxyPentahoUser user : userRoleSecurityInfo.getUsers() ) { if (user.getName().equals(userName)) { assignedUsers.add(user); break; } } } users = new ProxyPentahoUser[assignedUsers.size()]; for (int i = 0; i < users.length; i++) { users[i] = (ProxyPentahoUser) (assignedUsers.get(i)).clone(); } // FF3 bug requires users array to have duplicates removed // Beware this must be compiled by GWT List<ProxyPentahoUser> finalUsers = new ArrayList<ProxyPentahoUser>(); outer: for(ProxyPentahoUser user : users){ for(ProxyPentahoUser uniqueUser : finalUsers){ if(user.getName().equals(uniqueUser.getName())){ continue outer; } } finalUsers.add(user); } users = new ProxyPentahoUser[finalUsers.size()]; for(int i = 0; i < finalUsers.size(); i++){ users[i] = finalUsers.get(i); } } return users; } public void createUser(final ProxyPentahoUser user, final AsyncCallback<Object> callback) { AsyncCallback<Boolean> innerCallback = new AsyncCallback<Boolean>() { public void onSuccess(Boolean result) { userRoleSecurityInfo.getUsers().add((ProxyPentahoUser)user.clone()); callback.onSuccess(null); } public void onFailure(Throwable caught) { callback.onFailure(caught); } }; PacServiceFactory.getPacService().createUser(user, innerCallback); } public void updateUser(final ProxyPentahoUser user, final AsyncCallback<Boolean> callback) { AsyncCallback<Boolean> innerCallback = new AsyncCallback<Boolean>() { public void onSuccess(Boolean result) { int index = userRoleSecurityInfo.getUsers().indexOf(user); if (index >= 0) { userRoleSecurityInfo.getUsers().set(index, (ProxyPentahoUser)user.clone()); } else { userRoleSecurityInfo.getUsers().add((ProxyPentahoUser)user.clone()); } callback.onSuccess(null); } public void onFailure(Throwable caught) { callback.onFailure(caught); } }; PacServiceFactory.getPacService().updateUser(user, innerCallback); } public void deleteUsers(final ProxyPentahoUser[] users, final AsyncCallback<Boolean> callback) { AsyncCallback<Boolean> innerCallback = new AsyncCallback<Boolean>() { public void onSuccess(Boolean result) { userRoleSecurityInfo.getUsers().removeAll(Arrays.asList(users)); List<UserToRoleAssignment> assignmentsToRemove = new ArrayList<UserToRoleAssignment>(); for (int i = 0; i < users.length; i++) { for ( UserToRoleAssignment userToRoleAssignment : userRoleSecurityInfo.getAssignments() ) { if (userToRoleAssignment.getUserId().equals(users[i].getName())) { assignmentsToRemove.add(userToRoleAssignment); } } } userRoleSecurityInfo.getAssignments().removeAll(assignmentsToRemove); callback.onSuccess(null); } public void onFailure(Throwable caught) { callback.onFailure(caught); } }; PacServiceFactory.getPacService().deleteUsers(users, innerCallback); } public void createRole(final ProxyPentahoRole role, final AsyncCallback<Boolean> callback) { AsyncCallback<Boolean> innerCallback = new AsyncCallback<Boolean>() { public void onSuccess(Boolean result) { userRoleSecurityInfo.getRoles().add((ProxyPentahoRole)role.clone()); callback.onSuccess(null); } public void onFailure(Throwable caught) { callback.onFailure(caught); } }; PacServiceFactory.getPacService().createRole(role, innerCallback); } public void updateRole(final ProxyPentahoRole role, final AsyncCallback<Boolean> callback) { AsyncCallback<Boolean> innerCallback = new AsyncCallback<Boolean>() { public void onSuccess(Boolean result) { int index = userRoleSecurityInfo.getRoles().indexOf(role); if (index >= 0) { userRoleSecurityInfo.getRoles().set(index, (ProxyPentahoRole)role.clone()); } else { userRoleSecurityInfo.getRoles().add((ProxyPentahoRole)role.clone()); } callback.onSuccess(null); } public void onFailure(Throwable caught) { callback.onFailure(caught); } }; PacServiceFactory.getPacService().updateRole(role, innerCallback); } public void deleteRoles(final ProxyPentahoRole[] roles, final AsyncCallback<Boolean> callback) { AsyncCallback<Boolean> innerCallback = new AsyncCallback<Boolean>() { public void onSuccess(Boolean result) { userRoleSecurityInfo.getRoles().removeAll(Arrays.asList(roles)); List<UserToRoleAssignment> assignmentsToRemove = new ArrayList<UserToRoleAssignment>(); for (int i = 0; i < roles.length; i++) { for ( UserToRoleAssignment userToRoleAssignment : userRoleSecurityInfo.getAssignments() ) { if (userToRoleAssignment.getRoleId().equals(roles[i].getName())) { assignmentsToRemove.add(userToRoleAssignment); } } } userRoleSecurityInfo.getAssignments().removeAll(assignmentsToRemove); callback.onSuccess(null); } public void onFailure(Throwable caught) { callback.onFailure(caught); } }; PacServiceFactory.getPacService().deleteRoles(roles, innerCallback); } public void setUsers(final ProxyPentahoRole role, final ProxyPentahoUser[] assignedUsers, final AsyncCallback<Object> callback) { AsyncCallback<Object> innerCallback = new AsyncCallback<Object>() { public void onSuccess(Object result) { if (userRoleSecurityInfo != null) { List<UserToRoleAssignment> currentMappings = new ArrayList<UserToRoleAssignment>(); List<UserToRoleAssignment> mappingsToAdd = new ArrayList<UserToRoleAssignment>(); List<UserToRoleAssignment> mappingsToRemove = new ArrayList<UserToRoleAssignment>(); for (int i = 0; i < assignedUsers.length; i++) { currentMappings.add(new UserToRoleAssignment(assignedUsers[i].getName(), role.getName())); } for ( UserToRoleAssignment userToRoleAssignment : userRoleSecurityInfo.getAssignments() ) { if (userToRoleAssignment.getRoleId().equals(role.getName()) && !currentMappings.contains(userToRoleAssignment)) { mappingsToRemove.add(userToRoleAssignment); } } for ( UserToRoleAssignment userToRoleAssignment : currentMappings ) { if (!userRoleSecurityInfo.getAssignments().contains(userToRoleAssignment)) { mappingsToAdd.add(userToRoleAssignment); } } userRoleSecurityInfo.getAssignments().removeAll(mappingsToRemove); userRoleSecurityInfo.getAssignments().addAll(mappingsToAdd); } callback.onSuccess(null); } public void onFailure(Throwable caught) { callback.onFailure(caught); } }; PacServiceFactory.getPacService().setUsers(role, assignedUsers, innerCallback); } public void setRoles(final ProxyPentahoUser user, final ProxyPentahoRole[] assignedRoles, final AsyncCallback<Object> callback) { AsyncCallback<Object> innerCallback = new AsyncCallback<Object>() { public void onSuccess(Object result) { if (userRoleSecurityInfo != null) { List<UserToRoleAssignment> currentMappings = new ArrayList<UserToRoleAssignment>(); List<UserToRoleAssignment> mappingsToAdd = new ArrayList<UserToRoleAssignment>(); List<UserToRoleAssignment> mappingsToRemove = new ArrayList<UserToRoleAssignment>(); for (int i = 0; i < assignedRoles.length; i++) { currentMappings.add(new UserToRoleAssignment(user.getName(), assignedRoles[i].getName())); } for ( UserToRoleAssignment userToRoleAssignment : userRoleSecurityInfo.getAssignments() ) { if (userToRoleAssignment.getUserId().equals(user.getName()) && !currentMappings.contains(userToRoleAssignment)) { mappingsToRemove.add(userToRoleAssignment); } } for ( UserToRoleAssignment userToRoleAssignment : currentMappings ) { if (!userRoleSecurityInfo.getAssignments().contains(userToRoleAssignment)) { mappingsToAdd.add(userToRoleAssignment); } } userRoleSecurityInfo.getAssignments().removeAll(mappingsToRemove); userRoleSecurityInfo.getAssignments().addAll(mappingsToAdd); } callback.onSuccess(null); } public void onFailure(Throwable caught) { callback.onFailure(caught); } }; PacServiceFactory.getPacService().setRoles(user, assignedRoles, innerCallback); } public ProxyPentahoRole[] getDefaultRoles() { ProxyPentahoRole[] roles = new ProxyPentahoRole[0]; if (userRoleSecurityInfo != null) { return userRoleSecurityInfo.getDefaultRoles().toArray(new ProxyPentahoRole[0]); } return roles; } }