blob: dde19de7dc4d73c2751a1ca7187ef917bc1a8b10 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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.apache.directory.server.core.jndi;
import static org.apache.directory.server.core.integ.IntegrationUtils.getSystemContext;
import static org.apache.directory.server.core.integ.IntegrationUtils.getUserAddLdif;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.Name;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.SchemaViolationException;
import javax.naming.ldap.LdapContext;
import javax.naming.spi.DirObjectFactory;
import javax.naming.spi.DirStateFactory;
import org.apache.commons.lang.ArrayUtils;
import org.apache.directory.server.core.integ.AbstractLdapTestUnit;
import org.apache.directory.server.core.integ.FrameworkRunner;
import org.apache.directory.shared.ldap.entry.DefaultEntry;
import org.apache.directory.shared.ldap.ldif.LdifEntry;
import org.apache.directory.shared.ldap.util.StringTools;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Tests to make sure that object and state factories work.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev$
*/
@RunWith ( FrameworkRunner.class )
public class ObjStateFactoryIT extends AbstractLdapTestUnit
{
@Test
public void testObjectFactory() throws Exception
{
LdifEntry akarasulu = getUserAddLdif();
service.getAdminSession().add(
new DefaultEntry( service.getSchemaManager(), akarasulu.getEntry() ) );
LdapContext sysRoot = getSystemContext( service );
sysRoot.addToEnvironment( Context.OBJECT_FACTORIES, PersonObjectFactory.class.getName() );
Object obj = sysRoot.lookup( "uid=akarasulu, ou=users" );
Attributes attrs = sysRoot.getAttributes( "uid=akarasulu, ou=users" );
assertEquals( Person.class, obj.getClass() );
Person me = ( Person ) obj;
assertEquals( attrs.get( "sn" ).get(), me.getLastname() );
assertEquals( attrs.get( "cn" ).get(), me.getCn() );
assertTrue( ArrayUtils.isEquals( attrs.get( "userPassword" ).get(), StringTools.getBytesUtf8( "test" ) ) );
assertEquals( attrs.get( "telephonenumber" ).get(), me.getTelephoneNumber() );
assertNull( me.getSeealso() );
assertNull( me.getDescription() );
}
@Test
public void testStateFactory() throws Exception
{
LdapContext sysRoot = getSystemContext( service );
sysRoot.addToEnvironment( Context.STATE_FACTORIES, PersonStateFactory.class.getName() );
Person p = new Person( "Rodriguez", "Mr. Kerberos", "noices", "555-1212", "sn=erodriguez", "committer" );
sysRoot.bind( "sn=Rodriguez, ou=users", p );
Attributes attrs = sysRoot.getAttributes( "sn=Rodriguez, ou=users" );
assertEquals( "Rodriguez", attrs.get( "sn" ).get() );
assertEquals( "Mr. Kerberos", attrs.get( "cn" ).get() );
assertTrue( ArrayUtils.isEquals( attrs.get( "userPassword" ).get(), StringTools.getBytesUtf8( "noices" ) ) );
assertEquals( "555-1212", attrs.get( "telephonenumber" ).get() );
assertEquals( "sn=erodriguez", attrs.get( "seealso" ).get() );
assertEquals( "committer", attrs.get( "description" ).get() );
}
public static class PersonStateFactory implements DirStateFactory
{
public Result getStateToBind( Object obj, Name name, Context nameCtx, Hashtable environment, Attributes inAttrs )
throws NamingException
{
// Only interested in Person objects
if ( obj instanceof Person )
{
Attributes outAttrs;
if ( inAttrs == null )
{
outAttrs = new BasicAttributes( true );
}
else
{
outAttrs = ( Attributes ) inAttrs.clone();
}
// Set up object class
if ( outAttrs.get( "objectclass" ) == null )
{
Attribute oc = new BasicAttribute( "objectclass", "person" );
oc.add( "top" );
outAttrs.put( oc );
}
Person per = ( Person ) obj;
// mandatory attributes
if ( per.getLastname() != null )
{
outAttrs.put( "sn", per.getLastname() );
}
else
{
throw new SchemaViolationException( "Person must have surname" );
}
if ( per.getCn() != null )
{
outAttrs.put( "cn", per.getCn() );
}
else
{
throw new SchemaViolationException( "Person must have common name" );
}
// optional attributes
if ( per.getPassword() != null )
{
outAttrs.put( "userPassword", per.getPassword() );
}
if ( per.getTelephoneNumber() != null )
{
outAttrs.put( "telephoneNumber", per.getTelephoneNumber() );
}
if ( per.getSeealso() != null )
{
outAttrs.put( "seeAlso", per.getSeealso() );
}
if ( per.getDescription() != null )
{
outAttrs.put( "description", per.getDescription() );
}
return new DirStateFactory.Result( null, outAttrs );
}
return null;
}
public Object getStateToBind( Object obj, Name name, Context nameCtx, Hashtable environment )
throws NamingException
{
throw new UnsupportedOperationException( "Please use directory support overload with Attributes argument." );
}
}
public static class PersonObjectFactory implements DirObjectFactory
{
public Object getObjectInstance( Object obj, Name name, Context nameCtx, Hashtable environment, Attributes attrs )
throws Exception
{
// Only interested in Attributes with "person" objectclass
Attribute oc = ( attrs != null ? attrs.get( "objectclass" ) : null );
if ( oc != null && oc.contains( "person" ) )
{
Attribute attr;
String passwd = null;
// Extract the password
attr = attrs.get( "userPassword" );
if ( attr != null )
{
Object pw = attr.get();
if ( pw instanceof String )
passwd = ( String ) pw;
else
passwd = new String( ( byte[] ) pw );
}
return new Person( ( String ) attrs.get( "sn" ).get(), ( String ) attrs.get( "cn" ).get(), passwd,
( attr = attrs.get( "telephoneNumber" ) ) != null ? ( String ) attr.get() : null, ( attr = attrs
.get( "seealso" ) ) != null ? ( String ) attr.get() : null,
( attr = attrs.get( "description" ) ) != null ? ( String ) attr.get() : null );
}
return null;
}
public Object getObjectInstance( Object obj, Name name, Context nameCtx, Hashtable environment )
throws Exception
{
throw new UnsupportedOperationException( "Please use directory support overload with Attributes argument." );
}
}
public static class Person
{
private String sn, cn, pwd, tele, seealso, desc;
public Person(String sn, String cn, String pwd, String tele, String seealso, String desc)
{
this.sn = sn;
this.cn = cn;
this.pwd = pwd;
this.tele = tele;
this.seealso = seealso;
this.desc = desc;
}
public String getLastname()
{
return sn;
}
public String getCn()
{
return cn;
}
public String getPassword()
{
return pwd;
}
public String getTelephoneNumber()
{
return tele;
}
public String getSeealso()
{
return seealso;
}
public String getDescription()
{
return desc;
}
}
}