/** * 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.felix.useradmin.impl; import java.util.List; import org.osgi.framework.Bundle; import org.osgi.framework.FrameworkUtil; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceFactory; import org.osgi.framework.ServiceReference; import org.osgi.framework.ServiceRegistration; import org.osgi.service.useradmin.Authorization; import org.osgi.service.useradmin.Role; import org.osgi.service.useradmin.User; import org.osgi.service.useradmin.UserAdmin; import org.osgi.service.useradmin.UserAdminEvent; /** * Provides the implementation for {@link UserAdmin}. */ public class UserAdminImpl implements ServiceFactory, UserAdmin, RoleChangeListener { private final RoleRepository m_roleRepository; private final EventDispatcher m_eventDispatcher; private volatile ServiceReference m_serviceRef; /** * Creates a new {@link UserAdminImpl} implementation. * * @param roleRepository the repository with roles to use for this service; * @param eventDispatcher the event dispatcher to use for this service. * * @throws IllegalArgumentException in case one of the given parameters was <code>null</code>. */ public UserAdminImpl(RoleRepository roleRepository, EventDispatcher eventDispatcher) { if (roleRepository == null) { throw new IllegalArgumentException("RoleRepository cannot be null!"); } if (eventDispatcher == null) { throw new IllegalArgumentException("EventDispatcher cannot be null!"); } m_roleRepository = roleRepository; m_eventDispatcher = eventDispatcher; m_roleRepository.addRoleChangeListener(this); } /** * {@inheritDoc} */ public Role createRole(String name, int type) { return m_roleRepository.addRole(name, type); } /** * {@inheritDoc} */ public Authorization getAuthorization(User user) { return new AuthorizationImpl(user, m_roleRepository); } /** * {@inheritDoc} */ public Role getRole(String name) { return m_roleRepository.getRoleByName(name); } /** * {@inheritDoc} */ public Role[] getRoles(String filter) throws InvalidSyntaxException { // Do a sanity check on the given filter... if (filter != null && !"".equals(filter.trim())) { FrameworkUtil.createFilter(filter); } List roles = m_roleRepository.getRoles(filter); if (roles.isEmpty()) { return null; } return (Role[]) roles.toArray(new Role[roles.size()]); } /** * {@inheritDoc} * * <p>Overridden in order to get hold of our service reference.</p> */ public Object getService(Bundle bundle, ServiceRegistration registration) { m_serviceRef = registration.getReference(); return this; } /** * {@inheritDoc} */ public User getUser(String key, String value) { User result = null; List roles = m_roleRepository.getRoles(key, value); if (roles.size() == 1) { Role foundRole = (Role) roles.get(0); if (foundRole.getType() == Role.USER) { result = (User) foundRole; } } return result; } /** * {@inheritDoc} */ public void propertyAdded(Role role, Object key, Object value) { m_eventDispatcher.dispatch(createUserAdminEvent(UserAdminEvent.ROLE_CHANGED, role)); } /** * {@inheritDoc} */ public void propertyChanged(Role role, Object key, Object oldValue, Object newValue) { m_eventDispatcher.dispatch(createUserAdminEvent(UserAdminEvent.ROLE_CHANGED, role)); } /** * {@inheritDoc} */ public void propertyRemoved(Role role, Object key) { m_eventDispatcher.dispatch(createUserAdminEvent(UserAdminEvent.ROLE_CHANGED, role)); } /** * {@inheritDoc} */ public boolean removeRole(String name) { return m_roleRepository.removeRole(name); } /** * {@inheritDoc} */ public void roleAdded(Role role) { m_eventDispatcher.dispatch(createUserAdminEvent(UserAdminEvent.ROLE_CREATED, role)); } /** * {@inheritDoc} */ public void roleRemoved(Role role) { m_eventDispatcher.dispatch(createUserAdminEvent(UserAdminEvent.ROLE_REMOVED, role)); } /** * {@inheritDoc} */ public void ungetService(Bundle bundle, ServiceRegistration registration, Object service) { // Nop; we leave the service as-is... } /** * Creates a new {@link UserAdminEvent} instance for the given type and role. * * @param type the type of event to create; * @param role the role to create the event for. * @return a new {@link UserAdminEvent} instance, never <code>null</code>. */ private UserAdminEvent createUserAdminEvent(int type, Role role) { return new UserAdminEvent(m_serviceRef, type, role); } }