KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > directory > ldapstudio > browser > core > jobs > DeleteEntriesJob


1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements. See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership. The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing,
13  * software distributed under the License is distributed on an
14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15  * KIND, either express or implied. See the License for the
16  * specific language governing permissions and limitations
17  * under the License.
18  *
19  */

20
21 package org.apache.directory.ldapstudio.browser.core.jobs;
22
23
24 import java.util.ArrayList JavaDoc;
25 import java.util.Arrays JavaDoc;
26 import java.util.HashSet JavaDoc;
27 import java.util.Iterator JavaDoc;
28 import java.util.List JavaDoc;
29 import java.util.Set JavaDoc;
30
31 import org.apache.directory.ldapstudio.browser.core.BrowserCoreMessages;
32 import org.apache.directory.ldapstudio.browser.core.events.ChildrenInitializedEvent;
33 import org.apache.directory.ldapstudio.browser.core.events.EntryDeletedEvent;
34 import org.apache.directory.ldapstudio.browser.core.events.EventRegistry;
35 import org.apache.directory.ldapstudio.browser.core.events.SearchUpdateEvent;
36 import org.apache.directory.ldapstudio.browser.core.internal.model.Search;
37 import org.apache.directory.ldapstudio.browser.core.model.IAttribute;
38 import org.apache.directory.ldapstudio.browser.core.model.IConnection;
39 import org.apache.directory.ldapstudio.browser.core.model.IEntry;
40 import org.apache.directory.ldapstudio.browser.core.model.ISearch;
41 import org.apache.directory.ldapstudio.browser.core.model.ISearchResult;
42 import org.apache.directory.ldapstudio.browser.core.model.SearchParameter;
43
44
45 public class DeleteEntriesJob extends AbstractAsyncBulkJob
46 {
47
48     private IEntry[] entriesToDelete;
49
50     private Set JavaDoc deletedEntriesSet = new HashSet JavaDoc();
51
52     private Set JavaDoc entriesToUpdateSet = new HashSet JavaDoc();
53
54     private Set JavaDoc searchesToUpdateSet = new HashSet JavaDoc();
55
56
57     public DeleteEntriesJob( final IEntry[] entriesToDelete )
58     {
59         this.entriesToDelete = entriesToDelete;
60         setName( entriesToDelete.length == 1 ? BrowserCoreMessages.jobs__delete_entries_name_1
61             : BrowserCoreMessages.jobs__delete_entries_name_n );
62     }
63
64
65     protected IConnection[] getConnections()
66     {
67         IConnection[] connections = new IConnection[entriesToDelete.length];
68         for ( int i = 0; i < connections.length; i++ )
69         {
70             connections[i] = entriesToDelete[i].getConnection();
71         }
72         return connections;
73     }
74
75
76     protected Object JavaDoc[] getLockedObjects()
77     {
78         List JavaDoc l = new ArrayList JavaDoc();
79         l.addAll( Arrays.asList( entriesToDelete ) );
80         return l.toArray();
81     }
82
83
84     protected void executeBulkJob( ExtendedProgressMonitor monitor )
85     {
86
87         monitor.beginTask( entriesToDelete.length == 1 ? BrowserCoreMessages.bind(
88             BrowserCoreMessages.jobs__delete_entries_task_1, new String JavaDoc[]
89                 { entriesToDelete[0].getDn().toString() } ) : BrowserCoreMessages.bind(
90             BrowserCoreMessages.jobs__delete_entries_task_n, new String JavaDoc[]
91                 { Integer.toString( entriesToDelete.length ) } ), 2 + entriesToDelete.length );
92         monitor.reportProgress( " " ); //$NON-NLS-1$
93
monitor.worked( 1 );
94
95         int num = 0;
96         for ( int i = 0; !monitor.isCanceled() && !monitor.errorsReported() && i < entriesToDelete.length; i++ )
97         {
98
99             IEntry entryToDelete = entriesToDelete[i];
100             IConnection connection = entryToDelete.getConnection();
101
102             // delete from directory
103
// TODO: use TreeDelete Control, if available
104
int errorStatusSize1 = monitor.getErrorStatus( "" ).getChildren().length; //$NON-NLS-1$
105
num = deleteEntryRecursive( entryToDelete, false, num, monitor );
106             int errorStatusSize2 = monitor.getErrorStatus( "" ).getChildren().length; //$NON-NLS-1$
107
deletedEntriesSet.add( entryToDelete );
108
109             if ( errorStatusSize1 == errorStatusSize2 )
110             {
111                 // delete from parent
112
entryToDelete.getParententry().deleteChild( entryToDelete );
113                 entriesToUpdateSet.add( entryToDelete.getParententry() );
114
115                 // delete from searches
116
ISearch[] searches = connection.getSearchManager().getSearches();
117                 for ( int j = 0; j < searches.length; j++ )
118                 {
119                     ISearch search = searches[j];
120                     if ( search.getSearchResults() != null )
121                     {
122                         ISearchResult[] searchResults = search.getSearchResults();
123                         for ( int k = 0; k < searchResults.length; k++ )
124                         {
125                             ISearchResult result = searchResults[k];
126                             if ( entryToDelete.equals( result.getEntry() ) )
127                             {
128                                 ISearchResult[] newsrs = new ISearchResult[searchResults.length - 1];
129                                 System.arraycopy( searchResults, 0, newsrs, 0, k );
130                                 System.arraycopy( searchResults, k + 1, newsrs, k, searchResults.length - k - 1 );
131                                 search.setSearchResults( newsrs );
132                                 searchResults = newsrs;
133                                 k--;
134                                 searchesToUpdateSet.add( search );
135                             }
136                         }
137                     }
138                 }
139             }
140
141             monitor.worked( 1 );
142         }
143     }
144
145
146     private int deleteEntryRecursive( IEntry entry, boolean refInitialized, int numberOfDeletedEntries,
147         ExtendedProgressMonitor monitor )
148     {
149         try
150         {
151
152             int numberInBatch;
153             do
154             {
155                 numberInBatch = 0;
156
157                 SearchParameter subParam = new SearchParameter();
158                 subParam.setSearchBase( entry.getDn() );
159                 subParam.setFilter( ISearch.FILTER_TRUE );
160                 subParam.setScope( ISearch.SCOPE_ONELEVEL );
161                 subParam.setAliasesDereferencingMethod( IConnection.DEREFERENCE_ALIASES_NEVER );
162                 subParam.setReferralsHandlingMethod( IConnection.HANDLE_REFERRALS_IGNORE );
163                 subParam.setReturningAttributes( new String JavaDoc[]
164                     { IAttribute.OBJECTCLASS_ATTRIBUTE, IAttribute.REFERRAL_ATTRIBUTE } );
165                 subParam.setCountLimit( 100 );
166                 ISearch search = new Search( entry.getConnection(), subParam );
167                 entry.getConnection().search( search, monitor );
168
169                 ISearchResult[] srs = search.getSearchResults();
170                 for ( int i = 0; !monitor.isCanceled() && srs != null && i < srs.length; i++ )
171                 {
172                     IEntry childEntry = srs[i].getEntry();
173                     numberOfDeletedEntries = this.deleteEntryRecursive( childEntry, true, numberOfDeletedEntries,
174                         monitor );
175                     numberInBatch++;
176                 }
177             }
178             while ( numberInBatch > 0 && !monitor.isCanceled() && !monitor.errorsReported() );
179
180             if ( !monitor.isCanceled() && !monitor.errorsReported() )
181             {
182
183                 // check for referrals
184
if ( !refInitialized )
185                 {
186                     SearchParameter param = new SearchParameter();
187                     param.setSearchBase( entry.getDn() );
188                     param.setFilter( ISearch.FILTER_TRUE );
189                     param.setScope( ISearch.SCOPE_OBJECT );
190                     param.setAliasesDereferencingMethod( IConnection.DEREFERENCE_ALIASES_NEVER );
191                     param.setReferralsHandlingMethod( IConnection.HANDLE_REFERRALS_IGNORE );
192                     param.setReturningAttributes( new String JavaDoc[]
193                         { IAttribute.OBJECTCLASS_ATTRIBUTE, IAttribute.REFERRAL_ATTRIBUTE } );
194                     ISearch search = new Search( entry.getConnection(), param );
195                     entry.getConnection().search( search, monitor );
196
197                     ISearchResult[] srs = search.getSearchResults();
198                     if ( !monitor.isCanceled() && srs != null && srs.length == 1 )
199                     {
200                         entry = srs[0].getEntry();
201                     }
202                 }
203
204                 entry.getConnection().delete( entry, monitor );
205
206                 numberOfDeletedEntries++;
207                 monitor.reportProgress( BrowserCoreMessages.bind( BrowserCoreMessages.model__deleted_n_entries,
208                     new String JavaDoc[]
209                         { "" + numberOfDeletedEntries } ) ); //$NON-NLS-1$
210
}
211
212         }
213         catch ( Exception JavaDoc e )
214         {
215             monitor.reportError( e );
216         }
217
218         return numberOfDeletedEntries;
219     }
220
221
222     protected void runNotification()
223     {
224         for ( Iterator JavaDoc it = deletedEntriesSet.iterator(); it.hasNext(); )
225         {
226             IEntry entry = ( IEntry ) it.next();
227             EventRegistry.fireEntryUpdated( new EntryDeletedEvent( entry.getConnection(), entry ), this );
228         }
229         for ( Iterator JavaDoc it = entriesToUpdateSet.iterator(); it.hasNext(); )
230         {
231             IEntry parent = ( IEntry ) it.next();
232             EventRegistry.fireEntryUpdated( new ChildrenInitializedEvent( parent ), this );
233         }
234         for ( Iterator JavaDoc it = searchesToUpdateSet.iterator(); it.hasNext(); )
235         {
236             ISearch search = ( ISearch ) it.next();
237             EventRegistry.fireSearchUpdated( new SearchUpdateEvent( search, SearchUpdateEvent.EventDetail.SEARCH_PERFORMED ), this );
238         }
239     }
240
241
242     protected String JavaDoc getErrorMessage()
243     {
244         return entriesToDelete.length == 1 ? BrowserCoreMessages.jobs__delete_entries_error_1
245             : BrowserCoreMessages.jobs__delete_entries_error_n;
246     }
247
248 }
249
Popular Tags