/*******************************************************************************
* Copyright (c) 2010-2014 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.skalli.core.group;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.skalli.model.Group;
import org.eclipse.skalli.services.configuration.ConfigurationService;
import org.eclipse.skalli.services.configuration.EventConfigUpdate;
import org.eclipse.skalli.services.event.EventListener;
import org.eclipse.skalli.services.event.EventService;
import org.eclipse.skalli.services.group.GroupService;
import org.eclipse.skalli.services.permit.PermitService;
import org.osgi.service.component.ComponentConstants;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Implementation of {@link GroupService} using {@link Group} instances.
* The service expects to find XML files named
* <tt><groupId>.xml</tt> in the <tt>$workdir/storage/Group</tt>
* directory.
*/
public class LocalGroupComponent implements GroupService, EventListener<EventConfigUpdate> {
private static final Logger LOG = LoggerFactory.getLogger(LocalGroupComponent.class);
private ComponentContext context;
private ConfigurationService configService;
protected void activate(ComponentContext context) {
this.context = context;
invalidatePermits();
LOG.info(MessageFormat.format("[GroupService][local] {0} : activated",
(String) context.getProperties().get(ComponentConstants.COMPONENT_NAME)));
}
protected void deactivate(ComponentContext context) {
invalidatePermits();
this.context = null;
LOG.info(MessageFormat.format("[GroupService][local] {0} : deactivated",
(String) context.getProperties().get(ComponentConstants.COMPONENT_NAME)));
}
protected void bindConfigurationService(ConfigurationService configService) {
LOG.info(MessageFormat.format("bindConfigurationService({0})", configService)); //$NON-NLS-1$
this.configService = configService;
invalidatePermits();
}
protected void unbindConfigurationService(ConfigurationService configService) {
LOG.info(MessageFormat.format("unbindConfigurationService({0})", configService)); //$NON-NLS-1$
this.configService = null;
invalidatePermits();
}
protected void bindEventService(EventService eventService) {
LOG.info(MessageFormat.format("bindEventService({0})", eventService)); //$NON-NLS-1$
eventService.registerListener(EventConfigUpdate.class, this);
}
protected void unbindEventService(EventService eventService) {
LOG.info(MessageFormat.format("unbindEventService({0})", eventService)); //$NON-NLS-1$
}
private PermitService getPermitService() {
if (context != null) {
return (PermitService)context.locateService("PermitService"); //$NON-NLS-1$
}
return null;
}
@Override
public boolean isAdministrator(String userId) {
return isMemberOfGroup(userId, ADMIN_GROUP);
}
@Override
public boolean isMemberOfGroup(final String userId, final String groupId) {
Group group = getGroup(groupId);
//special case for AdminGroup: if no admin group is defined or the group is empty, all users are admin.
if (ADMIN_GROUP.equals(groupId)) {
if (group == null || group.getGroupMembers().size() == 0) {
return true;
}
}
return group != null ? group.hasGroupMember(userId) : false;
}
@Override
public List<Group> getGroups() {
if (configService == null) {
return Collections.emptyList();
}
GroupsConfig groupsConfig = configService.readConfiguration(GroupsConfig.class);
if (groupsConfig == null) {
return Collections.emptyList();
}
return groupsConfig.getModelGroups();
}
@Override
public Group getGroup(final String groupId) {
List<Group> groups = getGroups();
for (Group group : groups) {
if (group.getGroupId().equals(groupId)) {
return group;
}
}
return null;
}
@Override
public List<Group> getGroups(String userId) {
List<Group> groups = new ArrayList<Group>();
for (Group group : getGroups()) {
if (group.hasGroupMember(userId)) {
groups.add(group);
}
}
return groups;
}
@Override
public void onEvent(EventConfigUpdate event) {
if (GroupsConfig.class.equals(event.getConfigClass())) {
invalidatePermits();
}
}
private void invalidatePermits() {
PermitService permitService = getPermitService();
if (permitService != null) {
permitService.logoutAll();
}
}
}