/** * Return {@code true} if the specified dn is contained in the parent set, or in the specified DN * cache. This would indicate that the parent has already been processed. It returns {@code false} * otherwise. * * <p>It will optionally check the dn2id database for the dn if the specified cleared backend * boolean is {@code true}. * * @param dn The DN to check for. * @param dnCache The importer DN cache. * @param clearedBackend Set to {@code true} if the import process cleared the backend before * processing. * @return {@code true} if the dn is contained in the parent ID, or {@code false} otherwise. * @throws DatabaseException If an error occurred searching the DN cache, or dn2id database. * @throws InterruptedException If an error occurred processing the pending map. */ public boolean isParentProcessed(DN dn, DNCache dnCache, boolean clearedBackend) throws DatabaseException, InterruptedException { synchronized (synchObject) { if (parentSet.contains(dn)) { return true; } } // The DN was not in the parent set. Make sure it isn't pending. try { assureNotPending(dn); } catch (InterruptedException e) { logger.error(ERR_IMPORT_LDIF_PENDING_ERR, e.getMessage()); throw e; } // Either parent is in the DN cache, // or else check the dn2id database for the DN (only if backend wasn't cleared) final boolean parentThere = dnCache.contains(dn) || (!clearedBackend && getDN2ID().get(null, dn, LockMode.DEFAULT) != null); // Add the DN to the parent set if needed. if (parentThere) { synchronized (synchObject) { if (parentSet.size() >= PARENT_ID_SET_SIZE) { Iterator<DN> iterator = parentSet.iterator(); iterator.next(); iterator.remove(); } parentSet.add(dn); } } return parentThere; }