1   /*
2    *   Copyright 2004 The Apache Software Foundation
3    *
4    *   Licensed under the Apache License, Version 2.0 (the "License");
5    *   you may not use this file except in compliance with the License.
6    *   You may obtain a copy of the License at
7    *
8    *       http://www.apache.org/licenses/LICENSE-2.0
9    *
10   *   Unless required by applicable law or agreed to in writing, software
11   *   distributed under the License is distributed on an "AS IS" BASIS,
12   *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *   See the License for the specific language governing permissions and
14   *   limitations under the License.
15   *
16   */
17  package org.apache.ldap.server.jndi;
18  
19  
20  import org.apache.ldap.server.AbstractCoreTest;
21  
22  import javax.naming.Context;
23  import javax.naming.Name;
24  import javax.naming.NamingException;
25  import javax.naming.directory.*;
26  import javax.naming.spi.DirObjectFactory;
27  import javax.naming.spi.DirStateFactory;
28  import java.util.Hashtable;
29  
30  
31  /***
32   * Tests to make sure that object and state factories work.
33   *
34   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
35   * @version $Rev$
36   */
37  public class ObjStateFactoryTest extends AbstractCoreTest
38  {
39      public void testObjectFactory() throws NamingException
40      {
41          super.sysRoot.addToEnvironment( Context.OBJECT_FACTORIES, PersonObjectFactory.class.getName() );
42  
43          Object obj = super.sysRoot.lookup( "uid=akarasulu, ou=users" );
44  
45          Attributes attrs = super.sysRoot.getAttributes( "uid=akarasulu, ou=users" );
46  
47          assertEquals( Person.class, obj.getClass() );
48  
49          Person me = ( Person ) obj;
50  
51          assertEquals( attrs.get( "sn" ).get(), me.getLastname() );
52  
53          assertEquals( attrs.get( "cn" ).get(), me.getCn() );
54  
55          assertEquals( attrs.get( "userPassword" ).get(), me.getPassword() );
56  
57          assertEquals( attrs.get( "telephonenumber" ).get(), me.getTelephoneNumber() );
58  
59          assertNull( me.getSeealso() );
60  
61          assertNull( me.getDescription() );
62      }
63  
64  
65      public void testStateFactory() throws NamingException
66      {
67          super.sysRoot.addToEnvironment( Context.STATE_FACTORIES, PersonStateFactory.class.getName() );
68  
69          Person p = new Person( "Rodriguez", "Mr. Kerberos", "noices", "555-1212", "erodriguez", "committer" );
70  
71          super.sysRoot.bind( "uid=erodriguez, ou=users", p );
72  
73          Attributes attrs = super.sysRoot.getAttributes( "uid=erodriguez, ou=users" );
74  
75          assertEquals( "Rodriguez", attrs.get( "sn" ).get() );
76  
77          assertEquals( "Mr. Kerberos", attrs.get( "cn" ).get() );
78  
79          assertEquals( "noices", attrs.get( "userPassword" ).get() );
80  
81          assertEquals( "555-1212", attrs.get( "telephonenumber" ).get() );
82  
83          assertEquals( "erodriguez", attrs.get( "seealso" ).get() );
84  
85          assertEquals( "committer", attrs.get( "description" ).get() );
86  
87      }
88  
89  
90      public static class PersonStateFactory implements DirStateFactory
91      {
92          public Result getStateToBind( Object obj, Name name, Context nameCtx, Hashtable environment, Attributes inAttrs ) throws NamingException
93          {
94              // Only interested in Person objects
95              if ( obj instanceof Person )
96              {
97  
98                  Attributes outAttrs;
99  
100                 if ( inAttrs == null )
101                 {
102                     outAttrs = new BasicAttributes(true);
103                 }
104                 else
105                 {
106                     outAttrs = ( Attributes ) inAttrs.clone();
107                 }
108 
109                 // Set up object class
110                 if ( outAttrs.get( "objectclass" ) == null )
111                 {
112                     BasicAttribute oc = new BasicAttribute( "objectclass", "person" );
113 
114                     oc.add( "top" );
115 
116                     outAttrs.put( oc );
117                 }
118 
119                 Person per = ( Person ) obj;
120 
121                 // mandatory attributes
122                 if ( per.getLastname() != null )
123                 {
124                     outAttrs.put( "sn", per.getLastname() );
125                 }
126                 else
127                 {
128                     throw new SchemaViolationException( "Person must have surname" );
129                 }
130 
131                 if ( per.getCn() != null )
132                 {
133                     outAttrs.put( "cn", per.getCn() );
134                 }
135                 else
136                 {
137                     throw new SchemaViolationException( "Person must have common name" );
138                 }
139 
140                 // optional attributes
141                 if ( per.getPassword() != null )
142                 {
143                     outAttrs.put( "userPassword", per.getPassword() );
144                 }
145                 if ( per.getTelephoneNumber() != null )
146                 {
147                     outAttrs.put( "telephoneNumber", per.getTelephoneNumber() );
148                 }
149                 if ( per.getSeealso() != null )
150                 {
151                     outAttrs.put( "seeAlso", per.getSeealso() );
152                 }
153                 if ( per.getDescription() != null )
154                 {
155                     outAttrs.put( "description", per.getDescription() );
156                 }
157 
158                 return new DirStateFactory.Result( null, outAttrs );
159             }
160 
161             return null;
162         }
163 
164 
165         public Object getStateToBind( Object obj, Name name, Context nameCtx, Hashtable environment ) throws NamingException
166         {
167             throw new UnsupportedOperationException( "Please use directory support overload with Attributes argument." );
168         }
169     }
170 
171     public static class PersonObjectFactory implements DirObjectFactory
172     {
173         public Object getObjectInstance( Object obj, Name name, Context nameCtx, Hashtable environment, Attributes attrs ) throws Exception
174         {
175             // Only interested in Attributes with "person" objectclass
176             // System.out.println("object factory: " + attrs);
177             Attribute oc = (attrs != null ? attrs.get("objectclass") : null);
178             if (oc != null && oc.contains("person")) {
179                 Attribute attr;
180             String passwd = null;
181 
182             // Extract the password
183             attr = attrs.get("userPassword");
184             if (attr != null) {
185                 Object pw = attr.get();
186 
187                 if ( pw instanceof String )
188                     passwd = ( String ) pw;
189                 else
190                     passwd = new String((byte[]) pw);
191             }
192                 Person per = new Person(
193                   (String)attrs.get("sn").get(),
194                   (String)attrs.get("cn").get(),
195               passwd,
196                   (attr=attrs.get("telephoneNumber")) != null ? (String)attr.get() : null,
197                   (attr=attrs.get("seealso")) != null ? (String)attr.get() : null,
198                   (attr=attrs.get("description")) != null ? (String)attr.get() : null);
199                 return per;
200             }
201             return null;
202         }
203 
204 
205         public Object getObjectInstance( Object obj, Name name, Context nameCtx, Hashtable environment ) throws Exception
206         {
207             throw new UnsupportedOperationException( "Please use directory support overload with Attributes argument." );
208         }
209     }
210 
211 
212     public static class Person
213     {
214         private String sn, cn, pwd, tele, seealso, desc;
215 
216         public Person( String sn, String cn, String pwd, String tele, String seealso, String desc )
217         {
218             this.sn = sn;
219             this.cn = cn;
220             this.pwd = pwd;
221             this.tele = tele;
222             this.seealso = seealso;
223             this.desc = desc;
224         }
225 
226 
227         public String getLastname()
228         {
229             return sn;
230         }
231 
232 
233         public String getCn()
234         {
235             return cn;
236         }
237 
238 
239         public String getPassword()
240         {
241             return pwd;
242         }
243 
244 
245         public String getTelephoneNumber()
246         {
247             return tele;
248         }
249 
250 
251         public String getSeealso()
252         {
253             return seealso;
254         }
255 
256 
257         public String getDescription()
258         {
259             return desc;
260         }
261     }
262 }