Search in sources :

Example 1 with FilterFileReader

use of com.unboundid.util.FilterFileReader in project ldapsdk by pingidentity.

the class LDAPModify method doToolProcessing.

/**
 * {@inheritDoc}
 */
@Override()
@NotNull()
public ResultCode doToolProcessing() {
    // Examine the arguments to determine the sets of controls to use for each
    // type of request.
    final ArrayList<Control> addControls = new ArrayList<>(10);
    final ArrayList<Control> deleteControls = new ArrayList<>(10);
    final ArrayList<Control> modifyControls = new ArrayList<>(10);
    final ArrayList<Control> modifyDNControls = new ArrayList<>(10);
    final ArrayList<Control> searchControls = new ArrayList<>(10);
    try {
        createRequestControls(addControls, deleteControls, modifyControls, modifyDNControls, searchControls);
    } catch (final LDAPException le) {
        Debug.debugException(le);
        for (final String line : ResultUtils.formatResult(le, true, 0, WRAP_COLUMN)) {
            err(line);
        }
        return le.getResultCode();
    }
    // If an encryption passphrase file was specified, then read its value.
    String encryptionPassphrase = null;
    if (encryptionPassphraseFile.isPresent()) {
        try {
            encryptionPassphrase = ToolUtils.readEncryptionPassphraseFromFile(encryptionPassphraseFile.getValue());
        } catch (final LDAPException e) {
            Debug.debugException(e);
            wrapErr(0, WRAP_COLUMN, e.getMessage());
            return e.getResultCode();
        }
    }
    LDAPConnectionPool connectionPool = null;
    LDIFReader ldifReader = null;
    LDIFWriter rejectWriter = null;
    try {
        // before performing the bind.
        try {
            final StartAdministrativeSessionPostConnectProcessor p;
            if (useAdministrativeSession.isPresent()) {
                p = new StartAdministrativeSessionPostConnectProcessor(new StartAdministrativeSessionExtendedRequest(getToolName(), true));
            } else {
                p = null;
            }
            if (!dryRun.isPresent()) {
                connectionPool = getConnectionPool(1, 2, 0, p, null, true, new ReportBindResultLDAPConnectionPoolHealthCheck(this, true, verbose.isPresent()));
            }
        } catch (final LDAPException le) {
            Debug.debugException(le);
            // If the failure was something else, then display that failure result.
            if (le.getResultCode() != ResultCode.INVALID_CREDENTIALS) {
                for (final String line : ResultUtils.formatResult(le, true, 0, WRAP_COLUMN)) {
                    err(line);
                }
            }
            return le.getResultCode();
        }
        if (connectionPool != null) {
            connectionPool.setRetryFailedOperationsDueToInvalidConnections((!neverRetry.isPresent()));
        }
        // Report that the connection was successfully established.
        if (connectionPool != null) {
            try {
                final LDAPConnection connection = connectionPool.getConnection();
                final String hostPort = connection.getHostPort();
                connectionPool.releaseConnection(connection);
                commentToOut(INFO_LDAPMODIFY_CONNECTION_ESTABLISHED.get(hostPort));
                out();
            } catch (final LDAPException le) {
                Debug.debugException(le);
            // This should never happen.
            }
        }
        // If we should process the operations in a transaction, then start that
        // now.
        final ASN1OctetString txnID;
        if (useTransaction.isPresent()) {
            final Control[] startTxnControls;
            if (proxyAs.isPresent()) {
                // In a transaction, the proxied authorization control must only be
                // used in the start transaction request and not in any of the
                // subsequent operation requests.
                startTxnControls = new Control[] { new ProxiedAuthorizationV2RequestControl(proxyAs.getValue()) };
            } else if (proxyV1As.isPresent()) {
                // In a transaction, the proxied authorization control must only be
                // used in the start transaction request and not in any of the
                // subsequent operation requests.
                startTxnControls = new Control[] { new ProxiedAuthorizationV1RequestControl(proxyV1As.getValue()) };
            } else {
                startTxnControls = StaticUtils.NO_CONTROLS;
            }
            try {
                final StartTransactionExtendedResult startTxnResult = (StartTransactionExtendedResult) connectionPool.processExtendedOperation(new StartTransactionExtendedRequest(startTxnControls));
                if (startTxnResult.getResultCode() == ResultCode.SUCCESS) {
                    txnID = startTxnResult.getTransactionID();
                    final TransactionSpecificationRequestControl c = new TransactionSpecificationRequestControl(txnID);
                    addControls.add(c);
                    deleteControls.add(c);
                    modifyControls.add(c);
                    modifyDNControls.add(c);
                    final String txnIDString;
                    if (StaticUtils.isPrintableString(txnID.getValue())) {
                        txnIDString = txnID.stringValue();
                    } else {
                        final StringBuilder hexBuffer = new StringBuilder();
                        StaticUtils.toHex(txnID.getValue(), ":", hexBuffer);
                        txnIDString = hexBuffer.toString();
                    }
                    commentToOut(INFO_LDAPMODIFY_STARTED_TXN.get(txnIDString));
                } else {
                    commentToErr(ERR_LDAPMODIFY_CANNOT_START_TXN.get(startTxnResult.getResultString()));
                    return startTxnResult.getResultCode();
                }
            } catch (final LDAPException le) {
                Debug.debugException(le);
                commentToErr(ERR_LDAPMODIFY_CANNOT_START_TXN.get(StaticUtils.getExceptionMessage(le)));
                return le.getResultCode();
            }
        } else {
            txnID = null;
        }
        // Create an LDIF reader that will be used to read the changes to process.
        try {
            final InputStream ldifInputStream;
            if (ldifFile.isPresent()) {
                ldifInputStream = ToolUtils.getInputStreamForLDIFFiles(ldifFile.getValues(), encryptionPassphrase, getOut(), getErr()).getFirst();
            } else {
                ldifInputStream = in;
            }
            ldifReader = new LDIFReader(ldifInputStream, 0, null, null, characterSet.getValue());
        } catch (final Exception e) {
            commentToErr(ERR_LDAPMODIFY_CANNOT_CREATE_LDIF_READER.get(StaticUtils.getExceptionMessage(e)));
            return ResultCode.LOCAL_ERROR;
        }
        if (stripTrailingSpaces.isPresent()) {
            ldifReader.setTrailingSpaceBehavior(TrailingSpaceBehavior.STRIP);
        }
        // If appropriate, create a reject writer.
        if (rejectFile.isPresent()) {
            try {
                rejectWriter = new LDIFWriter(rejectFile.getValue());
                // Set the maximum allowed wrap column.  This is better than setting a
                // wrap column of zero because it will ensure that comments don't get
                // wrapped either.
                rejectWriter.setWrapColumn(Integer.MAX_VALUE);
            } catch (final Exception e) {
                Debug.debugException(e);
                commentToErr(ERR_LDAPMODIFY_CANNOT_CREATE_REJECT_WRITER.get(rejectFile.getValue().getAbsolutePath(), StaticUtils.getExceptionMessage(e)));
                return ResultCode.LOCAL_ERROR;
            }
        }
        // If appropriate, create a rate limiter.
        final FixedRateBarrier rateLimiter;
        if (ratePerSecond.isPresent()) {
            rateLimiter = new FixedRateBarrier(1000L, ratePerSecond.getValue());
        } else {
            rateLimiter = null;
        }
        // Iterate through the set of changes to process.
        boolean commitTransaction = true;
        ResultCode resultCode = null;
        final ArrayList<LDAPRequest> multiUpdateRequests = new ArrayList<>(10);
        final boolean isBulkModify = modifyEntriesMatchingFilter.isPresent() || modifyEntriesMatchingFiltersFromFile.isPresent() || modifyEntryWithDN.isPresent() || modifyEntriesWithDNsFromFile.isPresent();
        readChangeRecordLoop: while (true) {
            // If there is a rate limiter, then use it to sleep if necessary.
            if ((rateLimiter != null) && (!isBulkModify)) {
                rateLimiter.await();
            }
            // Read the next LDIF change record.  If we get an error then handle it
            // and abort if appropriate.
            final LDIFChangeRecord changeRecord;
            try {
                changeRecord = ldifReader.readChangeRecord(defaultAdd.isPresent());
            } catch (final IOException ioe) {
                Debug.debugException(ioe);
                final String message = ERR_LDAPMODIFY_IO_ERROR_READING_CHANGE.get(StaticUtils.getExceptionMessage(ioe));
                commentToErr(message);
                writeRejectedChange(rejectWriter, message, null);
                commitTransaction = false;
                resultCode = ResultCode.LOCAL_ERROR;
                break;
            } catch (final LDIFException le) {
                Debug.debugException(le);
                final StringBuilder buffer = new StringBuilder();
                if (le.mayContinueReading() && (!useTransaction.isPresent())) {
                    buffer.append(ERR_LDAPMODIFY_RECOVERABLE_LDIF_ERROR_READING_CHANGE.get(le.getLineNumber(), StaticUtils.getExceptionMessage(le)));
                } else {
                    buffer.append(ERR_LDAPMODIFY_UNRECOVERABLE_LDIF_ERROR_READING_CHANGE.get(le.getLineNumber(), StaticUtils.getExceptionMessage(le)));
                }
                if ((resultCode == null) || (resultCode == ResultCode.SUCCESS)) {
                    resultCode = ResultCode.LOCAL_ERROR;
                }
                if ((le.getDataLines() != null) && (!le.getDataLines().isEmpty())) {
                    buffer.append(StaticUtils.EOL);
                    buffer.append(StaticUtils.EOL);
                    buffer.append(ERR_LDAPMODIFY_INVALID_LINES.get());
                    buffer.append(StaticUtils.EOL);
                    for (final String s : le.getDataLines()) {
                        buffer.append(s);
                        buffer.append(StaticUtils.EOL);
                    }
                }
                final String message = buffer.toString();
                commentToErr(message);
                writeRejectedChange(rejectWriter, message, null);
                if (le.mayContinueReading() && (!useTransaction.isPresent())) {
                    continue;
                } else {
                    commitTransaction = false;
                    resultCode = ResultCode.LOCAL_ERROR;
                    break;
                }
            }
            // type.
            if (changeRecord == null) {
                break;
            }
            // the change record into a set of modifications.
            if (modifyEntriesMatchingFilter.isPresent()) {
                for (final Filter filter : modifyEntriesMatchingFilter.getValues()) {
                    final ResultCode rc = handleModifyMatchingFilter(connectionPool, changeRecord, modifyEntriesMatchingFilter.getIdentifierString(), filter, searchControls, modifyControls, rateLimiter, rejectWriter);
                    if (rc != ResultCode.SUCCESS) {
                        if ((resultCode == null) || (resultCode == ResultCode.SUCCESS) || (resultCode == ResultCode.NO_OPERATION)) {
                            resultCode = rc;
                        }
                    }
                }
            }
            if (modifyEntriesMatchingFiltersFromFile.isPresent()) {
                for (final File f : modifyEntriesMatchingFiltersFromFile.getValues()) {
                    final FilterFileReader filterReader;
                    try {
                        filterReader = new FilterFileReader(f);
                    } catch (final Exception e) {
                        Debug.debugException(e);
                        commentToErr(ERR_LDAPMODIFY_ERROR_OPENING_FILTER_FILE.get(f.getAbsolutePath(), StaticUtils.getExceptionMessage(e)));
                        return ResultCode.LOCAL_ERROR;
                    }
                    try {
                        while (true) {
                            final Filter filter;
                            try {
                                filter = filterReader.readFilter();
                            } catch (final IOException ioe) {
                                Debug.debugException(ioe);
                                commentToErr(ERR_LDAPMODIFY_IO_ERROR_READING_FILTER_FILE.get(f.getAbsolutePath(), StaticUtils.getExceptionMessage(ioe)));
                                return ResultCode.LOCAL_ERROR;
                            } catch (final LDAPException le) {
                                Debug.debugException(le);
                                commentToErr(le.getMessage());
                                if (continueOnError.isPresent()) {
                                    if ((resultCode == null) || (resultCode == ResultCode.SUCCESS) || (resultCode == ResultCode.NO_OPERATION)) {
                                        resultCode = le.getResultCode();
                                    }
                                    continue;
                                } else {
                                    return le.getResultCode();
                                }
                            }
                            if (filter == null) {
                                break;
                            }
                            final ResultCode rc = handleModifyMatchingFilter(connectionPool, changeRecord, modifyEntriesMatchingFiltersFromFile.getIdentifierString(), filter, searchControls, modifyControls, rateLimiter, rejectWriter);
                            if (rc != ResultCode.SUCCESS) {
                                if ((resultCode == null) || (resultCode == ResultCode.SUCCESS) || (resultCode == ResultCode.NO_OPERATION)) {
                                    resultCode = rc;
                                }
                            }
                        }
                    } finally {
                        try {
                            filterReader.close();
                        } catch (final Exception e) {
                            Debug.debugException(e);
                        }
                    }
                }
            }
            if (modifyEntryWithDN.isPresent()) {
                for (final DN dn : modifyEntryWithDN.getValues()) {
                    final ResultCode rc = handleModifyWithDN(connectionPool, changeRecord, modifyEntryWithDN.getIdentifierString(), dn, modifyControls, rateLimiter, rejectWriter);
                    if (rc != ResultCode.SUCCESS) {
                        if ((resultCode == null) || (resultCode == ResultCode.SUCCESS) || (resultCode == ResultCode.NO_OPERATION)) {
                            resultCode = rc;
                        }
                    }
                }
            }
            if (modifyEntriesWithDNsFromFile.isPresent()) {
                for (final File f : modifyEntriesWithDNsFromFile.getValues()) {
                    final DNFileReader dnReader;
                    try {
                        dnReader = new DNFileReader(f);
                    } catch (final Exception e) {
                        Debug.debugException(e);
                        commentToErr(ERR_LDAPMODIFY_ERROR_OPENING_DN_FILE.get(f.getAbsolutePath(), StaticUtils.getExceptionMessage(e)));
                        return ResultCode.LOCAL_ERROR;
                    }
                    try {
                        while (true) {
                            final DN dn;
                            try {
                                dn = dnReader.readDN();
                            } catch (final IOException ioe) {
                                Debug.debugException(ioe);
                                commentToErr(ERR_LDAPMODIFY_IO_ERROR_READING_DN_FILE.get(f.getAbsolutePath(), StaticUtils.getExceptionMessage(ioe)));
                                return ResultCode.LOCAL_ERROR;
                            } catch (final LDAPException le) {
                                Debug.debugException(le);
                                commentToErr(le.getMessage());
                                if (continueOnError.isPresent()) {
                                    if ((resultCode == null) || (resultCode == ResultCode.SUCCESS) || (resultCode == ResultCode.NO_OPERATION)) {
                                        resultCode = le.getResultCode();
                                    }
                                    continue;
                                } else {
                                    return le.getResultCode();
                                }
                            }
                            if (dn == null) {
                                break;
                            }
                            final ResultCode rc = handleModifyWithDN(connectionPool, changeRecord, modifyEntriesWithDNsFromFile.getIdentifierString(), dn, modifyControls, rateLimiter, rejectWriter);
                            if (rc != ResultCode.SUCCESS) {
                                if ((resultCode == null) || (resultCode == ResultCode.SUCCESS) || (resultCode == ResultCode.NO_OPERATION)) {
                                    resultCode = rc;
                                }
                            }
                        }
                    } finally {
                        try {
                            dnReader.close();
                        } catch (final Exception e) {
                            Debug.debugException(e);
                        }
                    }
                }
            }
            if (isBulkModify) {
                continue;
            }
            try {
                final ResultCode rc;
                if (changeRecord instanceof LDIFAddChangeRecord) {
                    rc = doAdd((LDIFAddChangeRecord) changeRecord, addControls, connectionPool, multiUpdateRequests, rejectWriter);
                } else if (changeRecord instanceof LDIFDeleteChangeRecord) {
                    rc = doDelete((LDIFDeleteChangeRecord) changeRecord, deleteControls, connectionPool, multiUpdateRequests, rejectWriter);
                } else if (changeRecord instanceof LDIFModifyChangeRecord) {
                    rc = doModify((LDIFModifyChangeRecord) changeRecord, modifyControls, connectionPool, multiUpdateRequests, rejectWriter);
                } else if (changeRecord instanceof LDIFModifyDNChangeRecord) {
                    rc = doModifyDN((LDIFModifyDNChangeRecord) changeRecord, modifyDNControls, connectionPool, multiUpdateRequests, rejectWriter);
                } else {
                    // This should never happen.
                    commentToErr(ERR_LDAPMODIFY_UNSUPPORTED_CHANGE_RECORD_HEADER.get());
                    for (final String line : changeRecord.toLDIF()) {
                        err("#      " + line);
                    }
                    throw new LDAPException(ResultCode.PARAM_ERROR, ERR_LDAPMODIFY_UNSUPPORTED_CHANGE_RECORD_HEADER.get() + changeRecord.toString());
                }
                if ((resultCode == null) && (rc != ResultCode.SUCCESS)) {
                    resultCode = rc;
                }
            } catch (final LDAPException le) {
                Debug.debugException(le);
                commitTransaction = false;
                if (continueOnError.isPresent()) {
                    if ((resultCode == null) || (resultCode == ResultCode.SUCCESS) || (resultCode == ResultCode.NO_OPERATION)) {
                        resultCode = le.getResultCode();
                    }
                } else {
                    resultCode = le.getResultCode();
                    break;
                }
            }
        }
        // operation, then process that now.
        if (useTransaction.isPresent()) {
            LDAPResult endTxnResult;
            final EndTransactionExtendedRequest endTxnRequest = new EndTransactionExtendedRequest(txnID, commitTransaction);
            try {
                endTxnResult = connectionPool.processExtendedOperation(endTxnRequest);
            } catch (final LDAPException le) {
                endTxnResult = le.toLDAPResult();
            }
            displayResult(endTxnResult, false);
            if (((resultCode == null) || (resultCode == ResultCode.SUCCESS)) && (endTxnResult.getResultCode() != ResultCode.SUCCESS)) {
                resultCode = endTxnResult.getResultCode();
            }
        } else if (multiUpdateErrorBehavior.isPresent()) {
            final MultiUpdateErrorBehavior errorBehavior;
            if (multiUpdateErrorBehavior.getValue().equalsIgnoreCase("atomic")) {
                errorBehavior = MultiUpdateErrorBehavior.ATOMIC;
            } else if (multiUpdateErrorBehavior.getValue().equalsIgnoreCase("abort-on-error")) {
                errorBehavior = MultiUpdateErrorBehavior.ABORT_ON_ERROR;
            } else {
                errorBehavior = MultiUpdateErrorBehavior.CONTINUE_ON_ERROR;
            }
            final Control[] multiUpdateControls;
            if (proxyAs.isPresent()) {
                multiUpdateControls = new Control[] { new ProxiedAuthorizationV2RequestControl(proxyAs.getValue()) };
            } else if (proxyV1As.isPresent()) {
                multiUpdateControls = new Control[] { new ProxiedAuthorizationV1RequestControl(proxyV1As.getValue()) };
            } else {
                multiUpdateControls = StaticUtils.NO_CONTROLS;
            }
            ExtendedResult multiUpdateResult;
            try {
                commentToOut(INFO_LDAPMODIFY_SENDING_MULTI_UPDATE_REQUEST.get());
                final MultiUpdateExtendedRequest multiUpdateRequest = new MultiUpdateExtendedRequest(errorBehavior, multiUpdateRequests, multiUpdateControls);
                multiUpdateResult = connectionPool.processExtendedOperation(multiUpdateRequest);
            } catch (final LDAPException le) {
                multiUpdateResult = new ExtendedResult(le);
            }
            displayResult(multiUpdateResult, false);
            resultCode = multiUpdateResult.getResultCode();
        }
        if (resultCode == null) {
            return ResultCode.SUCCESS;
        } else {
            return resultCode;
        }
    } finally {
        if (rejectWriter != null) {
            try {
                rejectWriter.close();
            } catch (final Exception e) {
                Debug.debugException(e);
            }
        }
        if (ldifReader != null) {
            try {
                ldifReader.close();
            } catch (final Exception e) {
                Debug.debugException(e);
            }
        }
        if (connectionPool != null) {
            try {
                connectionPool.close();
            } catch (final Exception e) {
                Debug.debugException(e);
            }
        }
    }
}
Also used : ASN1OctetString(com.unboundid.asn1.ASN1OctetString) LDAPRequest(com.unboundid.ldap.sdk.LDAPRequest) ArrayList(java.util.ArrayList) ProxiedAuthorizationV2RequestControl(com.unboundid.ldap.sdk.controls.ProxiedAuthorizationV2RequestControl) EndTransactionExtendedRequest(com.unboundid.ldap.sdk.extensions.EndTransactionExtendedRequest) DN(com.unboundid.ldap.sdk.DN) DNFileReader(com.unboundid.util.DNFileReader) ASN1OctetString(com.unboundid.asn1.ASN1OctetString) LDIFModifyDNChangeRecord(com.unboundid.ldif.LDIFModifyDNChangeRecord) RouteToServerRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.RouteToServerRequestControl) SubtreeDeleteRequestControl(com.unboundid.ldap.sdk.controls.SubtreeDeleteRequestControl) SimplePagedResultsControl(com.unboundid.ldap.sdk.controls.SimplePagedResultsControl) TransactionSpecificationRequestControl(com.unboundid.ldap.sdk.controls.TransactionSpecificationRequestControl) AssuredReplicationRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.AssuredReplicationRequestControl) PostReadRequestControl(com.unboundid.ldap.sdk.controls.PostReadRequestControl) SuppressOperationalAttributeUpdateRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.SuppressOperationalAttributeUpdateRequestControl) NameWithEntryUUIDRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.NameWithEntryUUIDRequestControl) ReplicationRepairRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.ReplicationRepairRequestControl) ProxiedAuthorizationV1RequestControl(com.unboundid.ldap.sdk.controls.ProxiedAuthorizationV1RequestControl) OperationPurposeRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.OperationPurposeRequestControl) PasswordUpdateBehaviorRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.PasswordUpdateBehaviorRequestControl) UndeleteRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.UndeleteRequestControl) GetRecentLoginHistoryRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.GetRecentLoginHistoryRequestControl) PermissiveModifyRequestControl(com.unboundid.ldap.sdk.controls.PermissiveModifyRequestControl) AuthorizationIdentityRequestControl(com.unboundid.ldap.sdk.controls.AuthorizationIdentityRequestControl) Control(com.unboundid.ldap.sdk.Control) GetUserResourceLimitsRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.GetUserResourceLimitsRequestControl) HardDeleteRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.HardDeleteRequestControl) IgnoreNoUserModificationRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.IgnoreNoUserModificationRequestControl) GetBackendSetIDRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.GetBackendSetIDRequestControl) GetAuthorizationEntryRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.GetAuthorizationEntryRequestControl) PurgePasswordRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.PurgePasswordRequestControl) ProxiedAuthorizationV2RequestControl(com.unboundid.ldap.sdk.controls.ProxiedAuthorizationV2RequestControl) SoftDeleteRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.SoftDeleteRequestControl) RetirePasswordRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.RetirePasswordRequestControl) GetServerIDRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.GetServerIDRequestControl) NoOpRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.NoOpRequestControl) PasswordPolicyRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.PasswordPolicyRequestControl) SuppressReferentialIntegrityUpdatesRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.SuppressReferentialIntegrityUpdatesRequestControl) AssertionRequestControl(com.unboundid.ldap.sdk.controls.AssertionRequestControl) RouteToBackendSetRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.RouteToBackendSetRequestControl) ManageDsaITRequestControl(com.unboundid.ldap.sdk.controls.ManageDsaITRequestControl) PasswordValidationDetailsRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.PasswordValidationDetailsRequestControl) UniquenessRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.UniquenessRequestControl) GeneratePasswordRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.GeneratePasswordRequestControl) PreReadRequestControl(com.unboundid.ldap.sdk.controls.PreReadRequestControl) LDIFException(com.unboundid.ldif.LDIFException) TransactionSpecificationRequestControl(com.unboundid.ldap.sdk.controls.TransactionSpecificationRequestControl) StartAdministrativeSessionPostConnectProcessor(com.unboundid.ldap.sdk.unboundidds.extensions.StartAdministrativeSessionPostConnectProcessor) LDAPConnectionPool(com.unboundid.ldap.sdk.LDAPConnectionPool) ByteArrayInputStream(java.io.ByteArrayInputStream) InputStream(java.io.InputStream) LDIFAddChangeRecord(com.unboundid.ldif.LDIFAddChangeRecord) LDAPResult(com.unboundid.ldap.sdk.LDAPResult) MultiUpdateExtendedRequest(com.unboundid.ldap.sdk.unboundidds.extensions.MultiUpdateExtendedRequest) LDAPConnection(com.unboundid.ldap.sdk.LDAPConnection) IOException(java.io.IOException) LDIFModifyChangeRecord(com.unboundid.ldif.LDIFModifyChangeRecord) LDAPSearchException(com.unboundid.ldap.sdk.LDAPSearchException) ArgumentException(com.unboundid.util.args.ArgumentException) LDAPException(com.unboundid.ldap.sdk.LDAPException) IOException(java.io.IOException) LDIFException(com.unboundid.ldif.LDIFException) ProxiedAuthorizationV1RequestControl(com.unboundid.ldap.sdk.controls.ProxiedAuthorizationV1RequestControl) LDIFChangeRecord(com.unboundid.ldif.LDIFChangeRecord) StartAdministrativeSessionExtendedRequest(com.unboundid.ldap.sdk.unboundidds.extensions.StartAdministrativeSessionExtendedRequest) FilterFileReader(com.unboundid.util.FilterFileReader) LDAPException(com.unboundid.ldap.sdk.LDAPException) Filter(com.unboundid.ldap.sdk.Filter) MultiUpdateErrorBehavior(com.unboundid.ldap.sdk.unboundidds.extensions.MultiUpdateErrorBehavior) LDIFReader(com.unboundid.ldif.LDIFReader) StartTransactionExtendedResult(com.unboundid.ldap.sdk.extensions.StartTransactionExtendedResult) StartTransactionExtendedResult(com.unboundid.ldap.sdk.extensions.StartTransactionExtendedResult) ExtendedResult(com.unboundid.ldap.sdk.ExtendedResult) StartTransactionExtendedRequest(com.unboundid.ldap.sdk.extensions.StartTransactionExtendedRequest) LDIFWriter(com.unboundid.ldif.LDIFWriter) FixedRateBarrier(com.unboundid.util.FixedRateBarrier) LDIFDeleteChangeRecord(com.unboundid.ldif.LDIFDeleteChangeRecord) File(java.io.File) ResultCode(com.unboundid.ldap.sdk.ResultCode) NotNull(com.unboundid.util.NotNull)

Example 2 with FilterFileReader

use of com.unboundid.util.FilterFileReader in project ldapsdk by pingidentity.

the class LDAPSearch method searchWithFilterFile.

/**
 * Processes a set of searches using filters read from one or more files.
 *
 * @param  pool            The connection pool to use to communicate with the
 *                         directory server.
 * @param  attributes      The set of attributes to request that the server
 *                         include in matching entries.
 * @param  rateLimiter     An optional fixed-rate barrier that can be used for
 *                         request rate limiting.
 * @param  searchControls  The set of controls to include in search requests.
 *
 * @return  A result code indicating the result of the processing.
 */
@NotNull()
private ResultCode searchWithFilterFile(@NotNull final LDAPConnectionPool pool, @NotNull final String[] attributes, @Nullable final FixedRateBarrier rateLimiter, @NotNull final List<Control> searchControls) {
    ResultCode resultCode = ResultCode.SUCCESS;
    for (final File f : filterFile.getValues()) {
        FilterFileReader reader = null;
        try {
            reader = new FilterFileReader(f);
            while (true) {
                final Filter searchFilter;
                try {
                    searchFilter = reader.readFilter();
                } catch (final LDAPException le) {
                    Debug.debugException(le);
                    commentToErr(ERR_LDAPSEARCH_MALFORMED_FILTER.get(f.getAbsolutePath(), le.getMessage()));
                    if (resultCode == ResultCode.SUCCESS) {
                        resultCode = le.getResultCode();
                    }
                    if (continueOnError.isPresent()) {
                        continue;
                    } else {
                        return resultCode;
                    }
                }
                if (searchFilter == null) {
                    break;
                }
                final ResultCode rc = searchWithFilter(pool, searchFilter, attributes, rateLimiter, searchControls);
                if (rc != ResultCode.SUCCESS) {
                    if (resultCode == ResultCode.SUCCESS) {
                        resultCode = rc;
                    }
                    if (!continueOnError.isPresent()) {
                        return resultCode;
                    }
                }
            }
        } catch (final IOException ioe) {
            Debug.debugException(ioe);
            commentToErr(ERR_LDAPSEARCH_CANNOT_READ_FILTER_FILE.get(f.getAbsolutePath(), StaticUtils.getExceptionMessage(ioe)));
            return ResultCode.LOCAL_ERROR;
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (final Exception e) {
                    Debug.debugException(e);
                }
            }
        }
    }
    return resultCode;
}
Also used : FilterFileReader(com.unboundid.util.FilterFileReader) LDAPException(com.unboundid.ldap.sdk.LDAPException) Filter(com.unboundid.ldap.sdk.Filter) MatchedValuesFilter(com.unboundid.ldap.sdk.controls.MatchedValuesFilter) IOException(java.io.IOException) File(java.io.File) ResultCode(com.unboundid.ldap.sdk.ResultCode) LDAPSearchException(com.unboundid.ldap.sdk.LDAPSearchException) ArgumentException(com.unboundid.util.args.ArgumentException) LDAPException(com.unboundid.ldap.sdk.LDAPException) IOException(java.io.IOException) NotNull(com.unboundid.util.NotNull)

Example 3 with FilterFileReader

use of com.unboundid.util.FilterFileReader in project ldapsdk by pingidentity.

the class ManageAccount method doToolProcessing.

/**
 * {@inheritDoc}
 */
@Override()
@NotNull()
public ResultCode doToolProcessing() {
    // If we should just generate a sample rate data file, then do that now.
    final FileArgument generateSampleRateFile = parser.getFileArgument(ARG_GENERATE_SAMPLE_RATE_FILE);
    if (generateSampleRateFile.isPresent()) {
        try {
            RateAdjustor.writeSampleVariableRateFile(generateSampleRateFile.getValue());
            return ResultCode.SUCCESS;
        } catch (final Exception e) {
            Debug.debugException(e);
            wrapErr(0, WRAP_COLUMN, ERR_MANAGE_ACCT_CANNOT_GENERATE_SAMPLE_RATE_FILE.get(generateSampleRateFile.getValue().getAbsolutePath(), StaticUtils.getExceptionMessage(e)));
            return ResultCode.LOCAL_ERROR;
        }
    }
    // If we need to create a fixed-rate barrier and/or use a variable rate
    // definition, then set that up.
    final IntegerArgument ratePerSecond = parser.getIntegerArgument(ARG_RATE_PER_SECOND);
    final FileArgument variableRateData = parser.getFileArgument(ARG_VARIABLE_RATE_DATA);
    if (ratePerSecond.isPresent() || variableRateData.isPresent()) {
        if (ratePerSecond.isPresent()) {
            rateLimiter = new FixedRateBarrier(1000L, ratePerSecond.getValue());
        } else {
            rateLimiter = new FixedRateBarrier(1000L, Integer.MAX_VALUE);
        }
        if (variableRateData.isPresent()) {
            try {
                rateAdjustor = RateAdjustor.newInstance(rateLimiter, ratePerSecond.getValue(), variableRateData.getValue());
            } catch (final Exception e) {
                Debug.debugException(e);
                wrapErr(0, WRAP_COLUMN, ERR_MANAGE_ACCT_CANNOT_CREATE_RATE_ADJUSTOR.get(variableRateData.getValue().getAbsolutePath(), StaticUtils.getExceptionMessage(e)));
                return ResultCode.PARAM_ERROR;
            }
        }
    }
    // Create the connection pool to use for all processing.
    final LDAPConnectionPool pool;
    final int numSearchThreads = parser.getIntegerArgument(ARG_NUM_SEARCH_THREADS).getValue();
    try {
        final int numOperationThreads = parser.getIntegerArgument(ARG_NUM_THREADS).getValue();
        pool = getConnectionPool(numOperationThreads, (numOperationThreads + numSearchThreads));
        // Explicitly disable automatic retry, since it probably won't work
        // reliably for extended operations anyway.  We'll handle retry manually.
        pool.setRetryFailedOperationsDueToInvalidConnections(false);
        // Set a maximum connection age of 30 minutes.
        pool.setMaxConnectionAgeMillis(1_800_000L);
    } catch (final LDAPException le) {
        Debug.debugException(le);
        wrapErr(0, WRAP_COLUMN, ERR_MANAGE_ACCT_CANNOT_CREATE_CONNECTION_POOL.get(getToolName(), le.getMessage()));
        return le.getResultCode();
    }
    try {
        // Create the output writer.  This should always succeed.
        outputWriter = new LDIFWriter(getOut());
        // Create the reject writer if appropriate.
        final FileArgument rejectFile = parser.getFileArgument(ARG_REJECT_FILE);
        if (rejectFile.isPresent()) {
            final BooleanArgument appendToRejectFile = parser.getBooleanArgument(ARG_APPEND_TO_REJECT_FILE);
            try {
                rejectWriter = new LDIFWriter(new FileOutputStream(rejectFile.getValue(), appendToRejectFile.isPresent()));
            } catch (final Exception e) {
                Debug.debugException(e);
                wrapErr(0, WRAP_COLUMN, ERR_MANAGE_ACCT_CANNOT_CREATE_REJECT_WRITER.get(rejectFile.getValue().getAbsolutePath(), StaticUtils.getExceptionMessage(e)));
                return ResultCode.LOCAL_ERROR;
            }
        }
        // Create the processor that will be used to actually perform the
        // manage-account operation processing for each entry.
        final ManageAccountProcessor processor;
        try {
            processor = new ManageAccountProcessor(this, pool, rateLimiter, outputWriter, rejectWriter);
        } catch (final LDAPException le) {
            Debug.debugException(le);
            wrapErr(0, WRAP_COLUMN, ERR_MANAGE_ACCT_CANNOT_CREATE_PROCESSOR.get(StaticUtils.getExceptionMessage(le)));
            return le.getResultCode();
        }
        // If we should use a rate adjustor, then start it now.
        if (rateAdjustor != null) {
            rateAdjustor.start();
        }
        // If any targetDN values were provided, then process them now.
        final DNArgument targetDN = parser.getDNArgument(ARG_TARGET_DN);
        if (targetDN.isPresent()) {
            for (final DN dn : targetDN.getValues()) {
                if (cancelRequested()) {
                    return ResultCode.USER_CANCELED;
                }
                processor.process(dn.toString());
            }
        }
        // If any DN input files were specified, then process them now.
        final FileArgument dnInputFile = parser.getFileArgument(ARG_DN_INPUT_FILE);
        if (dnInputFile.isPresent()) {
            for (final File f : dnInputFile.getValues()) {
                DNFileReader reader = null;
                try {
                    reader = new DNFileReader(f);
                    while (true) {
                        if (cancelRequested()) {
                            return ResultCode.USER_CANCELED;
                        }
                        final DN dn;
                        try {
                            dn = reader.readDN();
                        } catch (final LDAPException le) {
                            Debug.debugException(le);
                            processor.handleMessage(le.getMessage(), true);
                            continue;
                        }
                        if (dn == null) {
                            break;
                        }
                        processor.process(dn.toString());
                    }
                } catch (final Exception e) {
                    Debug.debugException(e);
                    processor.handleMessage(ERR_MANAGE_ACCT_ERROR_READING_DN_FILE.get(f.getAbsolutePath(), StaticUtils.getExceptionMessage(e)), true);
                } finally {
                    if (reader != null) {
                        try {
                            reader.close();
                        } catch (final Exception e2) {
                            Debug.debugException(e2);
                        }
                    }
                }
            }
        }
        // If any target filters were specified, then process them now.
        final FilterArgument targetFilter = parser.getFilterArgument(ARG_TARGET_FILTER);
        if (targetFilter.isPresent()) {
            searchProcessor = new ManageAccountSearchProcessor(this, processor, pool);
            for (final Filter f : targetFilter.getValues()) {
                searchProcessor.processFilter(f);
            }
        }
        // If any filter input files were specified, then process them now.
        final FileArgument filterInputFile = parser.getFileArgument(ARG_FILTER_INPUT_FILE);
        if (filterInputFile.isPresent()) {
            if (searchProcessor == null) {
                searchProcessor = new ManageAccountSearchProcessor(this, processor, pool);
            }
            for (final File f : filterInputFile.getValues()) {
                FilterFileReader reader = null;
                try {
                    reader = new FilterFileReader(f);
                    while (true) {
                        if (cancelRequested()) {
                            return ResultCode.USER_CANCELED;
                        }
                        final Filter filter;
                        try {
                            filter = reader.readFilter();
                        } catch (final LDAPException le) {
                            Debug.debugException(le);
                            processor.handleMessage(le.getMessage(), true);
                            continue;
                        }
                        if (filter == null) {
                            break;
                        }
                        searchProcessor.processFilter(filter);
                    }
                } catch (final Exception e) {
                    Debug.debugException(e);
                    processor.handleMessage(ERR_MANAGE_ACCT_ERROR_READING_FILTER_FILE.get(f.getAbsolutePath(), StaticUtils.getExceptionMessage(e)), true);
                } finally {
                    if (reader != null) {
                        try {
                            reader.close();
                        } catch (final Exception e2) {
                            Debug.debugException(e2);
                        }
                    }
                }
            }
        }
        // If any target user IDs were specified, then process them now.
        final StringArgument targetUserID = parser.getStringArgument(ARG_TARGET_USER_ID);
        if (targetUserID.isPresent()) {
            if (searchProcessor == null) {
                searchProcessor = new ManageAccountSearchProcessor(this, processor, pool);
            }
            for (final String userID : targetUserID.getValues()) {
                searchProcessor.processUserID(userID);
            }
        }
        // If any user ID input files were specified, then process them now.
        final FileArgument userIDInputFile = parser.getFileArgument(ARG_USER_ID_INPUT_FILE);
        if (userIDInputFile.isPresent()) {
            if (searchProcessor == null) {
                searchProcessor = new ManageAccountSearchProcessor(this, processor, pool);
            }
            for (final File f : userIDInputFile.getValues()) {
                BufferedReader reader = null;
                try {
                    reader = new BufferedReader(new FileReader(f));
                    while (true) {
                        if (cancelRequested()) {
                            return ResultCode.USER_CANCELED;
                        }
                        final String line = reader.readLine();
                        if (line == null) {
                            break;
                        }
                        if ((line.length() == 0) || line.startsWith("#")) {
                            continue;
                        }
                        searchProcessor.processUserID(line.trim());
                    }
                } catch (final Exception e) {
                    Debug.debugException(e);
                    processor.handleMessage(ERR_MANAGE_ACCT_ERROR_READING_USER_ID_FILE.get(f.getAbsolutePath(), StaticUtils.getExceptionMessage(e)), true);
                } finally {
                    if (reader != null) {
                        try {
                            reader.close();
                        } catch (final Exception e2) {
                            Debug.debugException(e2);
                        }
                    }
                }
            }
        }
        allFiltersProvided.set(true);
        if (searchProcessor != null) {
            searchProcessor.waitForCompletion();
        }
        allDNsProvided.set(true);
        processor.waitForCompletion();
    } finally {
        pool.close();
        if (rejectWriter != null) {
            try {
                rejectWriter.close();
            } catch (final Exception e) {
                Debug.debugException(e);
            }
        }
    }
    // if some of the operations failed.
    return ResultCode.SUCCESS;
}
Also used : LDAPConnectionPool(com.unboundid.ldap.sdk.LDAPConnectionPool) BooleanArgument(com.unboundid.util.args.BooleanArgument) DN(com.unboundid.ldap.sdk.DN) DNFileReader(com.unboundid.util.DNFileReader) FileArgument(com.unboundid.util.args.FileArgument) ArgumentException(com.unboundid.util.args.ArgumentException) LDAPException(com.unboundid.ldap.sdk.LDAPException) StringArgument(com.unboundid.util.args.StringArgument) DNArgument(com.unboundid.util.args.DNArgument) FilterFileReader(com.unboundid.util.FilterFileReader) LDAPException(com.unboundid.ldap.sdk.LDAPException) Filter(com.unboundid.ldap.sdk.Filter) FileOutputStream(java.io.FileOutputStream) FilterArgument(com.unboundid.util.args.FilterArgument) IntegerArgument(com.unboundid.util.args.IntegerArgument) BufferedReader(java.io.BufferedReader) FixedRateBarrier(com.unboundid.util.FixedRateBarrier) LDIFWriter(com.unboundid.ldif.LDIFWriter) DNFileReader(com.unboundid.util.DNFileReader) FilterFileReader(com.unboundid.util.FilterFileReader) FileReader(java.io.FileReader) File(java.io.File) NotNull(com.unboundid.util.NotNull)

Aggregations

Filter (com.unboundid.ldap.sdk.Filter)3 LDAPException (com.unboundid.ldap.sdk.LDAPException)3 FilterFileReader (com.unboundid.util.FilterFileReader)3 NotNull (com.unboundid.util.NotNull)3 ArgumentException (com.unboundid.util.args.ArgumentException)3 File (java.io.File)3 DN (com.unboundid.ldap.sdk.DN)2 LDAPConnectionPool (com.unboundid.ldap.sdk.LDAPConnectionPool)2 LDAPSearchException (com.unboundid.ldap.sdk.LDAPSearchException)2 ResultCode (com.unboundid.ldap.sdk.ResultCode)2 LDIFWriter (com.unboundid.ldif.LDIFWriter)2 DNFileReader (com.unboundid.util.DNFileReader)2 FixedRateBarrier (com.unboundid.util.FixedRateBarrier)2 IOException (java.io.IOException)2 ASN1OctetString (com.unboundid.asn1.ASN1OctetString)1 Control (com.unboundid.ldap.sdk.Control)1 ExtendedResult (com.unboundid.ldap.sdk.ExtendedResult)1 LDAPConnection (com.unboundid.ldap.sdk.LDAPConnection)1 LDAPRequest (com.unboundid.ldap.sdk.LDAPRequest)1 LDAPResult (com.unboundid.ldap.sdk.LDAPResult)1