/******************************************************************************* * This file is part of OpenNMS(R). * * Copyright (C) 2006-2011 The OpenNMS Group, Inc. * OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc. * * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. * * OpenNMS(R) is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published * by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * OpenNMS(R) 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenNMS(R). If not, see: * http://www.gnu.org/licenses/ * * For more information contact: * OpenNMS(R) Licensing <license@opennms.org> * http://www.opennms.org/ * http://www.opennms.com/ *******************************************************************************/ package org.opennms.web.admin.roles; import java.io.IOException; import java.util.ArrayList; import java.util.BitSet; import java.util.Collection; import java.util.Date; import java.util.List; import org.exolab.castor.xml.MarshalException; import org.exolab.castor.xml.ValidationException; import org.opennms.netmgt.config.GroupManager; import org.opennms.netmgt.config.UserManager; import org.opennms.netmgt.config.groups.Group; import org.opennms.netmgt.config.groups.Role; import org.opennms.netmgt.config.groups.Schedule; import org.opennms.netmgt.config.groups.Time; import org.opennms.netmgt.config.users.User; /** * <p>Manager class.</p> * * @author ranger * @version $Id: $ * @since 1.8.1 */ public class Manager implements WebRoleManager, WebUserManager, WebGroupManager { private GroupManager m_groupManager; private UserManager m_userManager; private class InvalidUser extends WebUser { public InvalidUser(String name) { super(name); } public String toString() { return "Invalid User ["+getName()+"]"; } } private class InvalidGroup extends WebGroup { public InvalidGroup(String name) { super(name); super.setUsers(new ArrayList<WebUser>()); } public String toString() { return "Invalid Group ["+getName()+"]"; } } private User getBackingUser(String name) { try { return m_userManager.getUser(name); } catch (MarshalException e) { throw new WebRolesException("Error marshalling users.xml config file", e); } catch (ValidationException e) { throw new WebRolesException("Error validating users.xml config file", e); } catch (IOException e) { throw new WebRolesException("Error reading users.xml config file", e); } } private Collection<User> getBackingUsers() { try { return m_userManager.getUsers().values(); } catch (MarshalException e) { throw new WebRolesException("Error marshalling users.xml config file", e); } catch (ValidationException e) { throw new WebRolesException("Error validating users.xml config file", e); } catch (IOException e) { throw new WebRolesException("Error reading users.xml config file", e); } } private Role getBackingRole(String roleName) { return m_groupManager.getRole(roleName); } private Group getBackingGroup(String groupName) { try { return m_groupManager.getGroup(groupName); } catch (MarshalException e) { throw new WebRolesException("Error marshalling groups.xml config file", e); } catch (ValidationException e) { throw new WebRolesException("Error validating groups.xml config file", e); } catch (IOException e) { throw new WebRolesException("Error reading groups.xml config file", e); } } private Collection<Group> getBackingGroups() { try { return m_groupManager.getGroups().values(); } catch (MarshalException e) { throw new WebRolesException("Error marshalling groups.xml config file", e); } catch (ValidationException e) { throw new WebRolesException("Error validating groups.xml config file", e); } catch (IOException e) { throw new WebRolesException("Error reading groups.xml config file", e); } } private Collection<WebUser> getUsersScheduleForRole(WebRole role, Date time) { try { String[] users = m_userManager.getUsersScheduledForRole(role.getName(), new Date()); List<WebUser> webUsers = new ArrayList<WebUser>(users.length); for (String user : users) { webUsers.add(getWebUser(user)); } return webUsers; } catch (MarshalException e) { throw new WebRolesException("Error marshalling users.xml config file", e); } catch (ValidationException e) { throw new WebRolesException("Error validating users.xml config file", e); } catch (IOException e) { throw new WebRolesException("Error reading users.xml config file", e); } } private WebRole getWebRole(Role role) { return new ManagedRole(role); } private WebUser getWebUser(String userName) { User u = getBackingUser(userName); if (u == null) { return new InvalidUser(userName); } else { return new ManagedUser(u); } } private WebUser getWebUser(User user) { if (user == null) { return new InvalidUser("Select A Valid User..."); } else { return new ManagedUser(user); } } private WebGroup getWebGroup(String groupName) { Group g = getBackingGroup(groupName); if (g == null) { return new InvalidGroup(groupName); } else { return new ManagedGroup(g); } } private WebGroup getWebGroup(Group group) { if (group == null) { return new InvalidGroup("Select a valid group..."); } else { return new ManagedGroup(group); } } private ManagedRole getManagedRole(WebRole webRole) { if (webRole instanceof ManagedRole) { return (ManagedRole) webRole; } ManagedRole mgdRole = new ManagedRole(); mgdRole.setName(webRole.getName()); mgdRole.setDescription(webRole.getDescription()); mgdRole.setDefaultUser(webRole.getDefaultUser()); mgdRole.setMembershipGroup(webRole.getMembershipGroup()); return mgdRole; } /** * <p>createRole</p> * * @return a {@link org.opennms.web.admin.roles.WebRole} object. */ public WebRole createRole() { return new ManagedRole(); } class ManagedRole extends WebRole { private static final int DESCR=0; private static final int USER=1; private static final int GROUP=2; private static final int NAME=3; BitSet m_flags = new BitSet(); Role m_role; ManagedRole(String roleName) { this(getBackingRole(roleName)); } ManagedRole(Role role) { super(role.getName()); m_role = role; super.setDescription(role.getDescription()); super.setDefaultUser(getWebUser(role.getSupervisor())); super.setMembershipGroup(getWebGroup(role.getMembershipGroup())); } ManagedRole() { super(); m_role = null; } public void setDescription(String description) { super.setDescription(description); m_flags.set(DESCR); } public void setDefaultUser(WebUser defaultUser) { super.setDefaultUser(defaultUser); m_flags.set(USER); } public void setMembershipGroup(WebGroup memberShipGroup) { super.setMembershipGroup(memberShipGroup); m_flags.set(GROUP); } public void setName(String name) { super.setName(name); m_flags.set(NAME); } public void save() { try { Role role = (m_role == null ? new Role() : m_role); if (m_flags.get(DESCR)) { role.setDescription(super.getDescription()); } if (m_flags.get(USER)) { role.setSupervisor(super.getDefaultUser().getName()); } if (m_flags.get(GROUP)) { role.setMembershipGroup(super.getMembershipGroup().getName()); } if (m_flags.get(NAME)) { role.setName(super.getName()); } Collection<WebSchedEntry> newEntries = getNewEntries(); for (WebSchedEntry entry : newEntries) { entry.update(role); } if (m_role != null) { m_groupManager.saveGroups(); } else { m_groupManager.saveRole(role); m_role = role; } } catch (Throwable e) { throw new WebRolesException("Unable to save role "+getName()+". "+e.getMessage(), e); } } public Collection<WebUser> getCurrentUsers() { if (m_role == null) { return new ArrayList<WebUser>(0); } return getUsersScheduleForRole(this, new Date()); } public WebCalendar getCalendar(Date month) { return new MonthlyCalendar(month, m_role, m_groupManager); } public Schedule getSchedule(int schedIndex) { return m_role.getSchedule(schedIndex); } public Time getTime(int schedIndex, int timeIndex) { return getSchedule(schedIndex).getTime(timeIndex); } public void addEntry(String user, Date startDate, Date endDate) { // TODO Auto-generated method stub } } class ManagedUser extends WebUser { User m_user; ManagedUser(String userId) { this(getBackingUser(userId)); } ManagedUser(User user) { super(user.getUserId()); m_user = user; } } class ManagedGroup extends WebGroup { Group m_group; ManagedGroup(String groupName) { this(getBackingGroup(groupName)); } ManagedGroup(Group group) { super(group.getName()); List<WebUser> users = new ArrayList<WebUser>(); for (String userId : getUsers(group)) { users.add(getWebUser(userId)); } super.setUsers(users); } private List<String> getUsers(Group group) { return group.getUserCollection(); } } /** * <p>Constructor for Manager.</p> * * @param groupManager a {@link org.opennms.netmgt.config.GroupManager} object. * @param userManager a {@link org.opennms.netmgt.config.UserManager} object. */ public Manager(GroupManager groupManager, UserManager userManager) { m_groupManager = groupManager; m_userManager = userManager; } /** * <p>getRoles</p> * * @return a {@link java.util.Collection} object. */ public Collection<WebRole> getRoles() { Collection<Role> roles = m_groupManager.getRoles(); List<WebRole> webRoles = new ArrayList<WebRole>(roles.size()); for (Role role : roles) { webRoles.add(getWebRole(role)); } return webRoles; } /** {@inheritDoc} */ public void deleteRole(String roleName) { try { m_groupManager.deleteRole(roleName); } catch (Throwable e) { throw new WebRolesException("Error deleting role "+roleName+". "+e.getMessage(), e); } } /** {@inheritDoc} */ public WebRole getRole(String roleName) { Role role = getBackingRole(roleName); return (role == null ? null : getWebRole(role)); } /** {@inheritDoc} */ public void saveRole(WebRole webRole) { try { ManagedRole mgdRole = getManagedRole(webRole); mgdRole.save(); } catch (Throwable e) { throw new WebRolesException("Error saving roles. "+e.getMessage(), e); } } /** * <p>getUsers</p> * * @return a {@link java.util.Collection} object. */ public Collection<WebUser> getUsers() { List<WebUser> users = new ArrayList<WebUser>(); for (User u : getBackingUsers()) { users.add(getWebUser(u)); } return users; } /** {@inheritDoc} */ public WebUser getUser(String name) { return getWebUser(name); } /** * <p>getGroups</p> * * @return a {@link java.util.Collection} object. */ public Collection<WebGroup> getGroups() { List<WebGroup> groups = new ArrayList<WebGroup>(); for (Group group : getBackingGroups()) { groups.add(getWebGroup(group)); } return groups; } /** {@inheritDoc} */ public WebGroup getGroup(String groupName) { return getWebGroup(groupName); } }