private ConfiguredAction configureActions()

in ws-security-stax/src/main/java/org/apache/wss4j/stax/setup/OutboundWSSec.java [578:767]


    private ConfiguredAction configureActions(OutputProcessorChainImpl outputProcessorChain) throws XMLSecurityException {
        ConfiguredAction configuredAction = new ConfiguredAction();

        //todo some combinations are not possible atm: eg Action.SIGNATURE and Action.USERNAMETOKEN_SIGNED
        //todo they use the same signature parts

        // Check to see whether we have a derived key signature, but not encryption, using
        // an encrypted key reference (as we only want one encrypted key here...)
        boolean derivedSignatureButNotDerivedEncryption = false;
        if (securityProperties.getDerivedKeyTokenReference() == WSSConstants.DerivedKeyTokenReference.EncryptedKey) {
            for (XMLSecurityConstants.Action action : securityProperties.getActions()) {
                if (WSSConstants.SIGNATURE_WITH_DERIVED_KEY.equals(action)) {
                    derivedSignatureButNotDerivedEncryption = true;
                } else if (WSSConstants.ENCRYPTION_WITH_DERIVED_KEY.equals(action)) {
                    derivedSignatureButNotDerivedEncryption = false;
                    break;
                }
            }
        }

        int actionOrder = -1;
        for (XMLSecurityConstants.Action action : securityProperties.getActions()) {
            if (WSSConstants.TIMESTAMP.equals(action)) {
                final TimestampOutputProcessor timestampOutputProcessor = new TimestampOutputProcessor();
                initializeOutputProcessor(outputProcessorChain, timestampOutputProcessor, action, -1);
            } else if (WSSConstants.SIGNATURE.equals(action)) {
                configuredAction.signatureAction = true;
                final BinarySecurityTokenOutputProcessor binarySecurityTokenOutputProcessor =
                    new BinarySecurityTokenOutputProcessor();
                initializeOutputProcessor(outputProcessorChain, binarySecurityTokenOutputProcessor, action, -1);

                final WSSSignatureOutputProcessor signatureOutputProcessor = new WSSSignatureOutputProcessor();
                initializeOutputProcessor(outputProcessorChain, signatureOutputProcessor, action, ++actionOrder);

            } else if (WSSConstants.ENCRYPTION.equals(action)) {
                configuredAction.encryptionAction = true;
                EncryptedKeyOutputProcessor encryptedKeyOutputProcessor = null;
                ++actionOrder;
                if (securityProperties.isEncryptSymmetricEncryptionKey()) {
                    final BinarySecurityTokenOutputProcessor binarySecurityTokenOutputProcessor =
                        new BinarySecurityTokenOutputProcessor();
                    initializeOutputProcessor(outputProcessorChain, binarySecurityTokenOutputProcessor, action, -1);

                    encryptedKeyOutputProcessor = new EncryptedKeyOutputProcessor();
                    initializeOutputProcessor(outputProcessorChain, encryptedKeyOutputProcessor, action, actionOrder);
                }

                final EncryptOutputProcessor encryptOutputProcessor = new EncryptOutputProcessor();
                initializeOutputProcessor(outputProcessorChain, encryptOutputProcessor, action, actionOrder);

                if (encryptedKeyOutputProcessor == null) {
                    final ReferenceListOutputProcessor referenceListOutputProcessor = new ReferenceListOutputProcessor();
                    referenceListOutputProcessor.addAfterProcessor(EncryptEndingOutputProcessor.class);
                    initializeOutputProcessor(outputProcessorChain, referenceListOutputProcessor, action, actionOrder);
                }

            } else if (WSSConstants.USERNAMETOKEN.equals(action)) {
                final UsernameTokenOutputProcessor usernameTokenOutputProcessor = new UsernameTokenOutputProcessor();
                initializeOutputProcessor(outputProcessorChain, usernameTokenOutputProcessor, action, -1);
            } else if (WSSConstants.USERNAMETOKEN_SIGNED.equals(action)) {
                final UsernameTokenOutputProcessor usernameTokenOutputProcessor = new UsernameTokenOutputProcessor();
                initializeOutputProcessor(outputProcessorChain, usernameTokenOutputProcessor, action, -1);

                final WSSSignatureOutputProcessor signatureOutputProcessor = new WSSSignatureOutputProcessor();
                initializeOutputProcessor(outputProcessorChain, signatureOutputProcessor, action, ++actionOrder);

            } else if (WSSConstants.SIGNATURE_CONFIRMATION.equals(action)) {
                final SignatureConfirmationOutputProcessor signatureConfirmationOutputProcessor =
                        new SignatureConfirmationOutputProcessor();
                initializeOutputProcessor(outputProcessorChain, signatureConfirmationOutputProcessor, action, -1);

            } else if (WSSConstants.SIGNATURE_WITH_DERIVED_KEY.equals(action)) {
                ++actionOrder;
                if (securityProperties.getDerivedKeyTokenReference() == WSSConstants.DerivedKeyTokenReference.EncryptedKey) {
                    if (derivedSignatureButNotDerivedEncryption) {
                        final EncryptedKeyOutputProcessor encryptedKeyOutputProcessor = new EncryptedKeyOutputProcessor();
                        initializeOutputProcessor(outputProcessorChain, encryptedKeyOutputProcessor, action, actionOrder);
                    }
                    configuredAction.encryptionAction = true;
                    configuredAction.derivedEncryption = true;
                } else if (securityProperties.getDerivedKeyTokenReference()
                    == WSSConstants.DerivedKeyTokenReference.SecurityContextToken) {
                    final SecurityContextTokenOutputProcessor securityContextTokenOutputProcessor =
                            new SecurityContextTokenOutputProcessor();
                    initializeOutputProcessor(outputProcessorChain, securityContextTokenOutputProcessor, action, -1);
                    configuredAction.signatureAction = true;
                    configuredAction.derivedSignature = true;
                } else {
                    configuredAction.signatureAction = true;
                    configuredAction.derivedSignature = true;
                }

                final DerivedKeyTokenOutputProcessor derivedKeyTokenOutputProcessor = new DerivedKeyTokenOutputProcessor();
                initializeOutputProcessor(outputProcessorChain, derivedKeyTokenOutputProcessor, action, -1);

                final WSSSignatureOutputProcessor signatureOutputProcessor = new WSSSignatureOutputProcessor();
                initializeOutputProcessor(outputProcessorChain, signatureOutputProcessor, action, actionOrder);

            } else if (WSSConstants.ENCRYPTION_WITH_DERIVED_KEY.equals(action)) {
                configuredAction.encryptionAction = true;
                configuredAction.derivedEncryption = true;

                EncryptedKeyOutputProcessor encryptedKeyOutputProcessor = null;

                ++actionOrder;
                if (securityProperties.getDerivedKeyTokenReference() == WSSConstants.DerivedKeyTokenReference.EncryptedKey) {
                    encryptedKeyOutputProcessor = new EncryptedKeyOutputProcessor();
                    initializeOutputProcessor(outputProcessorChain, encryptedKeyOutputProcessor, action, actionOrder);

                } else if (securityProperties.getDerivedKeyTokenReference()
                    == WSSConstants.DerivedKeyTokenReference.SecurityContextToken) {
                    final SecurityContextTokenOutputProcessor securityContextTokenOutputProcessor =
                            new SecurityContextTokenOutputProcessor();
                    initializeOutputProcessor(outputProcessorChain, securityContextTokenOutputProcessor, action, actionOrder);
                }
                final DerivedKeyTokenOutputProcessor derivedKeyTokenOutputProcessor = new DerivedKeyTokenOutputProcessor();
                initializeOutputProcessor(outputProcessorChain, derivedKeyTokenOutputProcessor, action, actionOrder);

                final EncryptOutputProcessor encryptOutputProcessor = new EncryptOutputProcessor();
                initializeOutputProcessor(outputProcessorChain, encryptOutputProcessor, action, actionOrder);

                if (encryptedKeyOutputProcessor == null) {
                    final ReferenceListOutputProcessor referenceListOutputProcessor = new ReferenceListOutputProcessor();
                    referenceListOutputProcessor.addAfterProcessor(EncryptEndingOutputProcessor.class);
                    initializeOutputProcessor(outputProcessorChain, referenceListOutputProcessor, action, actionOrder);
                }
            } else if (WSSConstants.SAML_TOKEN_SIGNED.equals(action)) {
                configuredAction.signatureAction = true;
                configuredAction.signedSAML = true;
                final BinarySecurityTokenOutputProcessor binarySecurityTokenOutputProcessor =
                    new BinarySecurityTokenOutputProcessor();
                initializeOutputProcessor(outputProcessorChain, binarySecurityTokenOutputProcessor, action, -1);

                final SAMLTokenOutputProcessor samlTokenOutputProcessor = new SAMLTokenOutputProcessor();
                initializeOutputProcessor(outputProcessorChain, samlTokenOutputProcessor, action, -1);

                final WSSSignatureOutputProcessor signatureOutputProcessor = new WSSSignatureOutputProcessor();
                initializeOutputProcessor(outputProcessorChain, signatureOutputProcessor, action, ++actionOrder);

                if (securityProperties.getDocumentCreator() == null) {
                    try {
                        securityProperties.setDocumentCreator(new DocumentCreatorImpl());
                    } catch (ParserConfigurationException e) {
                        throw new XMLSecurityException(e);
                    }
                }

            } else if (WSSConstants.SAML_TOKEN_UNSIGNED.equals(action)) {
                final SAMLTokenOutputProcessor samlTokenOutputProcessor = new SAMLTokenOutputProcessor();
                initializeOutputProcessor(outputProcessorChain, samlTokenOutputProcessor, action, -1);

                if (securityProperties.getDocumentCreator() == null) {
                    try {
                        securityProperties.setDocumentCreator(new DocumentCreatorImpl());
                    } catch (ParserConfigurationException e) {
                        throw new XMLSecurityException(e);
                    }
                }
            } else if (WSSConstants.SIGNATURE_WITH_KERBEROS_TOKEN.equals(action)) {
                configuredAction.kerberos = true;
                configuredAction.signatureKerberos = true;
                final BinarySecurityTokenOutputProcessor kerberosTokenOutputProcessor =
                        new BinarySecurityTokenOutputProcessor();
                initializeOutputProcessor(outputProcessorChain, kerberosTokenOutputProcessor, action, -1);

                final WSSSignatureOutputProcessor signatureOutputProcessor = new WSSSignatureOutputProcessor();
                initializeOutputProcessor(outputProcessorChain, signatureOutputProcessor, action, ++actionOrder);
            } else if (WSSConstants.ENCRYPTION_WITH_KERBEROS_TOKEN.equals(action)) {
                configuredAction.kerberos = true;
                configuredAction.encryptionKerberos = true;
                final BinarySecurityTokenOutputProcessor kerberosTokenOutputProcessor =
                        new BinarySecurityTokenOutputProcessor();
                initializeOutputProcessor(outputProcessorChain, kerberosTokenOutputProcessor, action, -1);

                final EncryptOutputProcessor encryptOutputProcessor = new EncryptOutputProcessor();
                initializeOutputProcessor(outputProcessorChain, encryptOutputProcessor, action, ++actionOrder);
            } else if (WSSConstants.KERBEROS_TOKEN.equals(action)) {
                configuredAction.kerberos = true;
                final BinarySecurityTokenOutputProcessor kerberosTokenOutputProcessor =
                    new BinarySecurityTokenOutputProcessor();
                initializeOutputProcessor(outputProcessorChain, kerberosTokenOutputProcessor, action, -1);
            } else if (WSSConstants.CUSTOM_TOKEN.equals(action)) {
                final CustomTokenOutputProcessor unknownTokenOutputProcessor =
                    new CustomTokenOutputProcessor();
                initializeOutputProcessor(outputProcessorChain, unknownTokenOutputProcessor, action, -1);
            }
        }

        return configuredAction;
    }