blob: 4f105eef1075d1c6433b61f2f88ec6bd3da590d4 [file] [log] [blame]
/**
* 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);
}
}