org.jasig.schedassist.web.security.CalendarAccountUserDetailsServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.jasig.schedassist.web.security.CalendarAccountUserDetailsServiceImpl.java

Source

/**
 * Licensed to Jasig under one or more contributor license
 * agreements. See the NOTICE file distributed with this work
 * for additional information regarding copyright ownership.
 * Jasig 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.jasig.schedassist.web.security;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jasig.schedassist.ICalendarAccountDao;
import org.jasig.schedassist.impl.owner.OwnerDao;
import org.jasig.schedassist.impl.visitor.NotAVisitorException;
import org.jasig.schedassist.impl.visitor.VisitorDao;
import org.jasig.schedassist.model.ICalendarAccount;
import org.jasig.schedassist.model.IScheduleOwner;
import org.jasig.schedassist.model.IScheduleVisitor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.dao.DataAccessException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

/**
 * {@link UserDetailsService} for person {@link ICalendarAccount}s.
 *  
 * @author Nicholas Blair, nblair@doit.wisc.edu
 * @version $Id: CalendarAccountUserDetailsServiceImpl.java 2979 2011-01-25 19:24:44Z npblair $
 */
@Service("userDetailsService")
public class CalendarAccountUserDetailsServiceImpl implements UserDetailsService {

    private static final String NONE_PROVIDED = "NONE_PROVIDED";
    private ICalendarAccountDao calendarAccountDao;
    private VisitorDao visitorDao;
    private OwnerDao ownerDao;
    private List<String> administrators = new ArrayList<String>();
    private String identifyingAttributeName = "uid";
    private String activeDisplayNameAttribute = "uid";
    protected final Log LOG = LogFactory.getLog(this.getClass());

    /**
     * @param calendarAccountDao the calendarAccountDao to set
     */
    @Autowired
    public void setCalendarAccountDao(ICalendarAccountDao calendarAccountDao) {
        this.calendarAccountDao = calendarAccountDao;
    }

    /**
     * @param visitorDao the visitorDao to set
     */
    @Autowired
    public void setVisitorDao(VisitorDao visitorDao) {
        this.visitorDao = visitorDao;
    }

    /**
     * @param ownerDao the ownerDao to set
     */
    @Autowired
    public void setOwnerDao(OwnerDao ownerDao) {
        this.ownerDao = ownerDao;
    }

    /**
     * @param administrators the administrators to set
     */
    public void setAdministratorListProperty(String propertyValue) {
        String[] admins = StringUtils.commaDelimitedListToStringArray(propertyValue);
        this.administrators = Arrays.asList(admins);
    }

    /**
     * 
     * @param identifyingAttributeName
     */
    @Value("${users.visibleIdentifierAttributeName:uid}")
    public void setIdentifyingAttributeName(String identifyingAttributeName) {
        this.identifyingAttributeName = identifyingAttributeName;
    }

    /**
     * 
     * @return
     */
    public String getActiveDisplayNameAttribute() {
        return activeDisplayNameAttribute;
    }

    /**
     * 
     * @param activeDisplayNameAttribute
     */
    public void setActiveDisplayNameAttribute(String activeDisplayNameAttribute) {
        this.activeDisplayNameAttribute = activeDisplayNameAttribute;
    }

    /**
     * 
     * @return the attribute used to commonly uniquely identify an account
     */
    public String getIdentifyingAttributeName() {
        return identifyingAttributeName;
    }

    /**
     * @return the calendarAccountDao
     */
    public ICalendarAccountDao getCalendarAccountDao() {
        return calendarAccountDao;
    }

    /**
     * @return the visitorDao
     */
    public VisitorDao getVisitorDao() {
        return visitorDao;
    }

    /**
     * @return the ownerDao
     */
    public OwnerDao getOwnerDao() {
        return ownerDao;
    }

    /* (non-Javadoc)
     * @see org.springframework.security.userdetails.UserDetailsService#loadUserByUsername(java.lang.String)
     */
    public final UserDetails loadUserByUsername(final String username)
            throws UsernameNotFoundException, DataAccessException {
        if (NONE_PROVIDED.equals(username)) {
            LOG.debug("caught NONE_PROVIDED being passed into loadUserByUsername");
            throw new UsernameNotFoundException(NONE_PROVIDED);
        }
        ICalendarAccount calendarAccount = calendarAccountDao.getCalendarAccount(this.identifyingAttributeName,
                username);
        if (null == calendarAccount) {
            throw new UsernameNotFoundException("no calendar account found for " + username);
        }
        CalendarAccountUserDetailsImpl result = new CalendarAccountUserDetailsImpl(calendarAccount);
        result.setActiveDisplayNameAttribute(this.activeDisplayNameAttribute);
        checkForVisitorAndOwner(result);

        final String id = calendarAccount.getAttributeValue(this.activeDisplayNameAttribute);
        if (this.administrators.contains(id)) {
            result.setAdministrator(true);
        }
        return result;
    }

    /**
     * Mutate the {@link CalendarAccountUserDetailsImpl} argument, calling
     * {@link CalendarAccountUserDetailsImpl#setScheduleOwner(IScheduleOwner)} and 
     * {@link CalendarAccountUserDetailsImpl#setScheduleVisitor(IScheduleVisitor)} where appropriate.
     * 
     * @param accountUserDetails the instance to mutate
     */
    protected void checkForVisitorAndOwner(CalendarAccountUserDetailsImpl accountUserDetails) {
        try {
            IScheduleVisitor scheduleVisitor = visitorDao.toVisitor(accountUserDetails.getCalendarAccount());
            accountUserDetails.setScheduleVisitor(scheduleVisitor);
        } catch (NotAVisitorException e) {
            LOG.debug(accountUserDetails.getUsername() + " is not a visitor");
        }

        IScheduleOwner scheduleOwner = ownerDao.locateOwner(accountUserDetails.getCalendarAccount());
        accountUserDetails.setScheduleOwner(scheduleOwner);
    }
}