1 20 21 package org.apache.directory.ldapstudio.browser.core.jobs; 22 23 24 import java.util.ArrayList ; 25 import java.util.Arrays ; 26 import java.util.HashSet ; 27 import java.util.Iterator ; 28 import java.util.List ; 29 import java.util.Set ; 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 deletedEntriesSet = new HashSet (); 51 52 private Set entriesToUpdateSet = new HashSet (); 53 54 private Set searchesToUpdateSet = new HashSet (); 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 [] getLockedObjects() 77 { 78 List l = new ArrayList (); 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 [] 89 { entriesToDelete[0].getDn().toString() } ) : BrowserCoreMessages.bind( 90 BrowserCoreMessages.jobs__delete_entries_task_n, new String [] 91 { Integer.toString( entriesToDelete.length ) } ), 2 + entriesToDelete.length ); 92 monitor.reportProgress( " " ); 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 int errorStatusSize1 = monitor.getErrorStatus( "" ).getChildren().length; num = deleteEntryRecursive( entryToDelete, false, num, monitor ); 106 int errorStatusSize2 = monitor.getErrorStatus( "" ).getChildren().length; deletedEntriesSet.add( entryToDelete ); 108 109 if ( errorStatusSize1 == errorStatusSize2 ) 110 { 111 entryToDelete.getParententry().deleteChild( entryToDelete ); 113 entriesToUpdateSet.add( entryToDelete.getParententry() ); 114 115 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 [] 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 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 [] 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 [] 209 { "" + numberOfDeletedEntries } ) ); } 211 212 } 213 catch ( Exception e ) 214 { 215 monitor.reportError( e ); 216 } 217 218 return numberOfDeletedEntries; 219 } 220 221 222 protected void runNotification() 223 { 224 for ( Iterator 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 it = entriesToUpdateSet.iterator(); it.hasNext(); ) 230 { 231 IEntry parent = ( IEntry ) it.next(); 232 EventRegistry.fireEntryUpdated( new ChildrenInitializedEvent( parent ), this ); 233 } 234 for ( Iterator 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 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 |