/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/providers/trunk/jldap/src/java/edu/amc/sakai/user/EntryContainerRdnToUserTypeMapper.java $
* $Id: EntryContainerRdnToUserTypeMapper.java 105079 2012-02-24 23:08:11Z ottenhoff@longsight.com $
***********************************************************************************
*
* Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 The Sakai Foundation
*
* Licensed under the Educational Community 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.opensource.org/licenses/ECL-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 edu.amc.sakai.user;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;
import java.util.Iterator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.novell.ldap.LDAPEntry;
import com.novell.ldap.util.DN;
import com.novell.ldap.util.RDN;
/**
* Maps from a user entry's container's most-local RDN to a Sakai user type.
*
* @author Dan McCallum, Unicon Inc
*
*/
public class EntryContainerRdnToUserTypeMapper implements UserTypeMapper {
/** Class-specific logger */
private static Log M_log = LogFactory.getLog(EntryContainerRdnToUserTypeMapper.class);
/** map of container RDN values to Sakai user types */
private Map<String,String> rdnToSakaiUserTypeMap = new HashMap<String,String>();
/** if <code>true</code>, will echo the container's
* most local RDN as its Sakai type if no mapping is
* found. otherwise will return <code>null</code>
*/
private boolean returnLiteralRdnValueIfNoMapping;
/** if <code>true</code>, will recurse through all
* RDN values to find a valid match.
* otherwise will return <code>null</code>
*/
private boolean recurseRdnIfNoMapping;
/**
* Returns the user type associated with a matching
* RDN encountered when iterating through the specified
* <code>LDAPEntry</code>'s containing <code>DN</code>'s
* <code>RDN<code>s. If recurseRdnIfNoMapping is false,
* the most local RDN will be used for matching.
* {@link #mapRdn(String, String))} implements the actual
* value mapping.
*
* @param ldapEntry the user's <code>LDAPEntry</code>
* @param mapper a source of mapping configuration
* @return the entry's mapped RDN
*/
public String mapLdapEntryToSakaiUserType(LDAPEntry ldapEntry,
LdapAttributeMapper mapper) {
if ( M_log.isDebugEnabled() ) {
M_log.debug("mapLdapEntryToSakaiUserType(): [entry DN = " +
ldapEntry.getDN() + "]");
}
String dnString = ldapEntry.getDN();
DN dn = new DN(dnString);
DN containerDN = dn.getParent();
Vector<RDN> containerRDNs = containerDN.getRDNs();
Iterator<RDN> containerRDNsIterator = containerRDNs.iterator();
RDN rdn = containerRDNsIterator.next();
String mappedValue = mapRdn(rdn.getType(),rdn.getValue());
if(mappedValue == null && recurseRdnIfNoMapping) {
while ( containerRDNsIterator.hasNext() ) {
rdn = containerRDNsIterator.next();
mappedValue = mapRdn(rdn.getType(),rdn.getValue());
if ( mappedValue != null) {
return mappedValue;
}
}
}
return mappedValue;
}
/**
* Applies the current mapping configuration to the
* recieved RDN value. If no mapping exists, will
* return null unless the
* <code>returnLiteralRdnValueIfNoMapping</code> flag
* is raised, in which case the RDN value itself
* will be returned.
*
* @param rdnType the RDN's type, primarily for debugging
* purposes
* @param rdnValue the RDN value to map
* @return the mapped rdnValue
*/
protected String mapRdn(String rdnType, String rdnValue) {
if ( M_log.isDebugEnabled() ) {
M_log.debug("mapRdn(): mapping [rdn type = " +
rdnType + "][rdn value = " +
rdnValue + "]");
}
if ( rdnToSakaiUserTypeMap == null || rdnToSakaiUserTypeMap.isEmpty() ) {
String mappedValue = returnLiteralRdnValueIfNoMapping ? rdnValue : null;
if ( M_log.isDebugEnabled() ) {
M_log.debug("mapRdn(): no mappings assigned [rdn type = " +
rdnType + "][rdn value = " + rdnValue +
"][returning = " + mappedValue + "]");
}
return mappedValue;
}
String mappedValue = rdnToSakaiUserTypeMap.get(rdnValue);
if ( mappedValue == null ) {
mappedValue = returnLiteralRdnValueIfNoMapping ? rdnValue : null;
if ( M_log.isDebugEnabled() ) {
M_log.debug("mapRdn(): no valid mapping [rdn type = " +
rdnType + "][rdn value = " + rdnValue +
"][returning = " + mappedValue + "]");
}
}
return mappedValue;
}
/**
* {@see #mapRdn(String,String)}
*
* @return the current RDN-to-Sakai user type map
*/
public Map<String, String> getRdnToSakaiUserTypeMap() {
return rdnToSakaiUserTypeMap;
}
/**
* {@see mapRdn(String,String)}
*
* @param rdnToSakaiUserTypeMap the RDN-to-Sakai
* user type map
*/
public void setRdnToSakaiUserTypeMap(Map<String, String> rdnToSakaiUserTypeMap) {
this.rdnToSakaiUserTypeMap = rdnToSakaiUserTypeMap;
}
/**
* {@see mapRdn(String,String)}
*/
public boolean isReturnLiteralRdnValueIfNoMapping() {
return returnLiteralRdnValueIfNoMapping;
}
/**
* {@see mapRdn(String,String)}
*/
public void setReturnLiteralRdnIfNoMapping(boolean returnLiteralRdnValueIfNoMapping) {
this.returnLiteralRdnValueIfNoMapping = returnLiteralRdnValueIfNoMapping;
}
/**
* {@see mapRdn(String,String)}
*/
public boolean isRecurseRdnIfNoMapping() {
return recurseRdnIfNoMapping;
}
/**
* {@see mapRdn(String,String)}
*/
public void setRecurseRdnIfNoMapping(boolean recurseRdnIfNoMapping) {
this.recurseRdnIfNoMapping = recurseRdnIfNoMapping;
}
}