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.event;
18  
19  
20  import org.apache.ldap.server.AbstractAdminTestCase;
21  
22  import javax.naming.NamingException;
23  import javax.naming.directory.*;
24  import javax.naming.event.*;
25  import java.util.List;
26  import java.util.ArrayList;
27  import java.util.EventObject;
28  
29  
30  /***
31   * Test cases for the event service.
32   *
33   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
34   * @version $Rev$
35   */
36  public class EventServiceTest extends AbstractAdminTestCase
37  {
38      /***
39       * Test to make sure NamingListener's are no longer registered
40       * after they are removed via the EventContex.removeNamingListener method.
41       */
42      public void testRemoveNamingListener() throws NamingException
43      {
44          TestListener listener = new TestListener();
45          EventDirContext ctx = ( EventDirContext ) super.sysRoot.lookup( "" );
46          ctx.addNamingListener( "", SearchControls.SUBTREE_SCOPE, listener );
47          Attributes testEntry = new BasicAttributes( "ou", "testentry", true );
48          Attribute objectClass = new BasicAttribute( "objectClass", "top" );
49          objectClass.add( "organizationalUnit" );
50          testEntry.put( objectClass );
51          ctx.createSubcontext( "ou=testentry", testEntry );
52  
53          assertEquals( 1, listener.getEventRecords().size() );
54          EventRecord rec = ( EventRecord ) listener.getEventRecords().get( 0 );
55          assertEquals( "objectAdded", rec.method );
56          assertEquals( ctx, rec.event.getSource() );
57  
58          ctx.removeNamingListener( listener );
59          ctx.destroySubcontext( "ou=testentry" );
60  
61          assertEquals( 1, listener.getEventRecords().size() );
62          rec = ( EventRecord ) listener.getEventRecords().get( 0 );
63          assertEquals( "objectAdded", rec.method );
64          assertEquals( ctx, rec.event.getSource() );
65  
66          // readd the entry once again just to make sure
67          ctx.createSubcontext( "ou=testentry", testEntry );
68          assertEquals( 1, listener.getEventRecords().size() );
69          rec = ( EventRecord ) listener.getEventRecords().get( 0 );
70          assertEquals( "objectAdded", rec.method );
71          assertEquals( ctx, rec.event.getSource() );
72      }
73  
74  
75      /***
76       * Test to make sure NamingListener's are no longer registered
77       * after the context used for registration is closed.
78       */
79      public void testContextClose() throws NamingException
80      {
81          TestListener listener = new TestListener();
82          EventDirContext ctx = ( EventDirContext ) super.sysRoot.lookup( "" );
83          ctx.addNamingListener( "", SearchControls.SUBTREE_SCOPE, listener );
84          Attributes testEntry = new BasicAttributes( "ou", "testentry", true );
85          Attribute objectClass = new BasicAttribute( "objectClass", "top" );
86          objectClass.add( "organizationalUnit" );
87          testEntry.put( objectClass );
88          ctx.createSubcontext( "ou=testentry", testEntry );
89  
90          assertEquals( 1, listener.getEventRecords().size() );
91          EventRecord rec = ( EventRecord ) listener.getEventRecords().get( 0 );
92          assertEquals( "objectAdded", rec.method );
93          assertEquals( ctx, rec.event.getSource() );
94  
95          ctx.close();
96          ctx = ( EventDirContext ) super.sysRoot.lookup( "" );
97          ctx.destroySubcontext( "ou=testentry" );
98  
99          assertEquals( 1, listener.getEventRecords().size() );
100         rec = ( EventRecord ) listener.getEventRecords().get( 0 );
101         assertEquals( "objectAdded", rec.method );
102 
103         // readd the entry once again just to make sure
104         ctx.createSubcontext( "ou=testentry", testEntry );
105         assertEquals( 1, listener.getEventRecords().size() );
106         rec = ( EventRecord ) listener.getEventRecords().get( 0 );
107         assertEquals( "objectAdded", rec.method );
108     }
109 
110 
111     public class TestListener implements ObjectChangeListener, NamespaceChangeListener
112     {
113         List events = new ArrayList();
114 
115 
116         public List getEventRecords()
117         {
118             return events;
119         }
120 
121 
122         public void objectChanged( NamingEvent event )
123         {
124             events.add( new EventRecord( "objectChanged", event ) );
125         }
126 
127 
128         public void namingExceptionThrown( NamingExceptionEvent event )
129         {
130             events.add( new EventRecord( "namingExceptionThrown", event ) );
131         }
132 
133 
134         public void objectAdded( NamingEvent event )
135         {
136             events.add( new EventRecord( "objectAdded", event ) );
137         }
138 
139 
140         public void objectRemoved( NamingEvent event )
141         {
142             events.add( new EventRecord( "objectRemoved", event ) );
143         }
144 
145 
146         public void objectRenamed( NamingEvent event )
147         {
148             events.add( new EventRecord( "objectRenamed", event ) );
149         }
150     }
151 
152 
153     public class EventRecord
154     {
155         String method;
156         EventObject event;
157 
158         EventRecord( String method, EventObject event )
159         {
160             this.method = method;
161             this.event = event;
162         }
163     }
164 }