nl.surfnet.coin.api.service.PersonServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for nl.surfnet.coin.api.service.PersonServiceImpl.java

Source

/*
 * Copyright 2012 SURFnet bv, The Netherlands
 *
 * Licensed 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 nl.surfnet.coin.api.service;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.annotation.Resource;

import nl.surfnet.coin.api.client.domain.GroupMembersEntry;
import nl.surfnet.coin.api.client.domain.Person;
import nl.surfnet.coin.api.client.domain.PersonEntry;
import nl.surfnet.coin.janus.domain.ARP;
import nl.surfnet.coin.ldap.LdapClient;
import nl.surfnet.coin.teams.service.impl.ApiGrouperDao;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Transformer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component(value = "ldapService")
public class PersonServiceImpl implements PersonService {

    private static final Logger LOG = LoggerFactory.getLogger(PersonServiceImpl.class);

    @Autowired
    private LdapClient ldapClient;

    @Resource(name = "apiGrouperDao")
    private ApiGrouperDao apiGrouperDao;

    @Resource(name = "janusClientDetailsService")
    private OpenConextClientDetailsService clientDetailsService;

    private PersonARPEnforcer arpEnforcer = new PersonARPEnforcer();

    @Override
    public PersonEntry getPerson(String userId, String onBehalfOf, String spEntityId) {
        Person person = ldapClient.findPerson(userId);

        ARP arp = clientDetailsService.getArp(spEntityId);
        LOG.debug("ARP for SP {} is: {}", spEntityId, arp);
        person = arpEnforcer.enforceARP(person, arp);
        LOG.debug("Person info after enforcing arp, for userId {}, on behalf of {}: {}", userId, onBehalfOf,
                person);
        return new PersonEntry(person, 1, 0, null, 1);
    }

    @SuppressWarnings("unchecked")
    @Override
    public GroupMembersEntry getGroupMembers(String groupId, String onBehalfOf, String spEntityId, Integer count,
            Integer startIndex, String sortBy) {

        /*
         * first get all members from grouper. Note that we don't support sortBy but
         * we do support count and startIndex. See
         * https://jira.surfconext.nl/jira/browse/BACKLOG-438
         */
        GroupMembersEntry entry = apiGrouperDao.findAllMembers(groupId, startIndex, count);
        List<Person> persons = entry.getEntry();
        if (!CollectionUtils.isEmpty(persons)) {
            Collection<String> identifiers = CollectionUtils.collect(persons, new Transformer() {
                @Override
                public Object transform(Object input) {
                    return ((Person) input).getId();
                }
            });
            // Now enrich the information
            List<Person> enrichedPersons = ldapClient.findPersons(identifiers);

            for (Person person : enrichedPersons) {
                person.setVoot_membership_role(getVootMembersShip(person.getId(), persons));
            }

            // Apply ARP
            ARP arp = clientDetailsService.getArp(spEntityId);
            LOG.debug("ARP for SP {} is: {}", spEntityId, arp);
            List<Person> arpEnforcedPersons = enforceArp(spEntityId, enrichedPersons);

            entry.setEntry(arpEnforcedPersons);
        }
        return entry;
    }

    private String getVootMembersShip(String id, List<Person> persons) {
        for (Person person : persons) {
            if (person.getId().equals(id)) {
                return person.getVoot_membership_role();
            }
        }
        throw new RuntimeException("No person found with identifier ('" + id + "')");
    }

    @Override
    public List<Person> enforceArp(String spEntityId, List<Person> persons) {
        ARP arp = clientDetailsService.getArp(spEntityId);
        List<Person> arpEnforcedPersons = new ArrayList<Person>(persons.size());
        for (Person person : persons) {
            Person arpedPerson = arpEnforcer.enforceARP(person, arp);
            LOG.debug("Person info after enforcing arp: {}", arpedPerson);
            arpEnforcedPersons.add(arpedPerson);
        }
        return arpEnforcedPersons;
    }
}