All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.eurodyn.qlack2.webdesktop.impl.DesktopGroupServiceImpl Maven / Gradle / Ivy

package com.eurodyn.qlack2.webdesktop.impl;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;

import javax.inject.Inject;
import javax.inject.Singleton;
import javax.transaction.Transactional;

import org.ops4j.pax.cdi.api.OsgiService;
import org.ops4j.pax.cdi.api.OsgiServiceProvider;

import com.eurodyn.qlack2.fuse.aaa.api.ResourceService;
import com.eurodyn.qlack2.fuse.aaa.api.UserGroupService;
import com.eurodyn.qlack2.fuse.aaa.api.dto.GroupDTO;
import com.eurodyn.qlack2.fuse.aaa.api.dto.ResourceDTO;
import com.eurodyn.qlack2.fuse.idm.api.signing.SignedTicket;
import com.eurodyn.qlack2.webdesktop.api.DesktopGroupService;
import com.eurodyn.qlack2.webdesktop.api.dto.UserGroupDTO;
import com.eurodyn.qlack2.webdesktop.api.request.EmptySignedRequest;
import com.eurodyn.qlack2.webdesktop.api.request.group.CreateGroupRequest;
import com.eurodyn.qlack2.webdesktop.api.request.group.DeleteGroupRequest;
import com.eurodyn.qlack2.webdesktop.api.request.group.GetGroupRequest;
import com.eurodyn.qlack2.webdesktop.api.request.group.MoveGroupRequest;
import com.eurodyn.qlack2.webdesktop.api.request.group.UpdateGroupRequest;
import com.eurodyn.qlack2.webdesktop.impl.util.ConverterUtil;
import com.eurodyn.qlack2.webdesktop.impl.util.DomainUtil;

@Singleton
@OsgiServiceProvider(classes = { DesktopGroupService.class })
@Transactional
public class DesktopGroupServiceImpl implements DesktopGroupService {
	@OsgiService @Inject
	private UserGroupService groupService;
	@Inject
	private DomainUtil domainUtil;
	@OsgiService @Inject
	private ResourceService resourceService;

	@Override
	public List getDomainsAsTree(EmptySignedRequest sreq) {
		List aaaDomains = groupService.listGroupsAsTree();
		List domains = ConverterUtil.groupDTOToUserGroupDTOList(aaaDomains);

		SignedTicket ticket = sreq.getSignedTicket();
		return domainUtil.filterGroups(ticket, domains);
	}

	@Override
	public List getDomains(EmptySignedRequest sreq) {
		List aaaDomains = groupService.getGroupChildren(null);
		List domains = ConverterUtil.groupDTOToUserGroupDTOList(aaaDomains);

		SignedTicket ticket = sreq.getSignedTicket();
		return domainUtil.filterGroups(ticket, domains);
	}

	@Override
	public UserGroupDTO getGroup(GetGroupRequest sreq) {
		domainUtil.checkCanViewGroup(sreq.getSignedTicket(), sreq.getGroupId());

		GroupDTO aaaGroup = groupService.getGroupByID(sreq.getGroupId(), !sreq.isIncludeRelatives());
		UserGroupDTO group = ConverterUtil.groupDTOToUserGroupDTO(aaaGroup);
		if (sreq.isIncludeUsers()) {
			List groupUsers = new ArrayList<>();
			Set groupUserIds = groupService.getGroupUsersIds(sreq.getGroupId(), false);
			groupUsers.addAll(groupUserIds);
			group.setUsers(groupUsers);
		}
		return group;
	}

	// --

	@Override
	public String createGroup(CreateGroupRequest sreq) {
		domainUtil.validateCreateGroupRequest(sreq);

		GroupDTO group = new GroupDTO();
		group.setName(sreq.getName());
		group.setDescription(sreq.getDescription());
		if (sreq.getParentGroupId() != null) {
			group.setParent(new GroupDTO());
			group.getParent().setId(sreq.getParentGroupId());
		}
		String groupId = groupService.createGroup(group);

		// Create a secure resource for the group in order to allow other apps
		// to use it for permissions / default operation templates
		ResourceDTO resource = new ResourceDTO();
		resource.setName(sreq.getName());
		if (sreq.getParentGroupId() != null) {
			resource.setDescription("User group");
		} else {
			resource.setDescription("User domain");
		}
		resource.setObjectID(groupId);
		resourceService.createResource(resource);

		return groupId;
	}

	@Override
	public void updateGroup(UpdateGroupRequest sreq) {
		domainUtil.validateUpdateGroupRequest(sreq);

		GroupDTO group = new GroupDTO();
		group.setId(sreq.getId());
		group.setName(sreq.getName());
		group.setDescription(sreq.getDescription());
		groupService.updateGroup(group);

		// Update group users
		updateGroupUsers(sreq.getId(), sreq.getUserIds());

		// Update the name of the relevant security resource
		ResourceDTO resource = resourceService.getResourceByObjectId(sreq.getId());
		resource.setName(sreq.getName());
		resourceService.updateResource(resource);
	}

	private void updateGroupUsers(String groupId, List userIds) {
		Set aaaUserIds = groupService.getGroupUsersIds(groupId, false);

		List oldUserIds = new ArrayList(aaaUserIds);
		List newUserIds = userIds;
		Collections.sort(oldUserIds);
		Collections.sort(newUserIds);
		int oldIndex = 0;
		int newIndex = 0;
		while ((oldIndex < oldUserIds.size()) && (newIndex < newUserIds.size())) {
			String oldId = oldUserIds.get(oldIndex);
			String newId = newUserIds.get(newIndex);
			if (oldId.compareTo(newId) < 0) {
				groupService.removeUser(oldId, groupId);
				oldIndex++;
			} else if (oldId.compareTo(newId) > 0) {
				groupService.addUser(newId, groupId);
				newIndex++;
			} else {
				oldIndex++;
				newIndex++;
			}
		}
		for (int i = oldIndex; i < oldUserIds.size(); i++) {
			groupService.removeUser(oldUserIds.get(i), groupId);
		}
		for (int i = newIndex; i < newUserIds.size(); i++) {
			groupService.addUser(newUserIds.get(i), groupId);
		}
	}

	@Override
	public void deleteGroup(DeleteGroupRequest sreq) {
		domainUtil.validateDeleteGroupRequest(sreq);

		groupService.deleteGroup(sreq.getId());

		// Delete the relevant security resource
		resourceService.deleteResourceByObjectId(sreq.getId());
	}

	@Override
	public void moveGroup(MoveGroupRequest sreq) {
		domainUtil.validateMoveGroupRequest(sreq);

		groupService.moveGroup(sreq.getId(), sreq.getNewParentId());
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy