@Nonnull
    @Override
    public Optional<? extends INode> parse(
            @Nullable final String str, @Nonnull DetectionLocation detectionLocation) {
        if (str == null) {
            return Optional.empty();
        }

        for (IMapper mapper : jcaSpecificAlgorithmMappers) {
            Optional<? extends INode> asset = mapper.parse(str, detectionLocation);
            if (asset.isPresent()) {
                return asset;
            }
        }

        return switch (str.toUpperCase().trim()) {
            case "PBE", "PBES2" -> Optional.of(new PasswordBasedEncryption(detectionLocation));
            case "DH", "DIFFIEHELLMAN" -> Optional.of(new DH(detectionLocation));
            case "RSA" -> Optional.of(new RSA(detectionLocation));
            case "EC" ->
                    Optional.of(new Algorithm(str, PublicKeyEncryption.class, detectionLocation));
            default -> {
                final Algorithm algorithm = new Algorithm(str, Unknown.class, detectionLocation);
                algorithm.put(new Unknown(detectionLocation));
                yield Optional.of(algorithm);
            }
        };
    }
@Test
    void keyAgreement() {
        DetectionLocation testDetectionLocation =
                new DetectionLocation("testfile", 1, 1, List.of("test"), () -> "SSL");

        JcaAlgorithmMapper jcaAlgorithmMapper = new JcaAlgorithmMapper();
        Optional<? extends INode> assetOptional =
                jcaAlgorithmMapper.parse("X448", testDetectionLocation);
        assertThat(assetOptional).isPresent();
        assertThat(assetOptional.get().is(KeyAgreement.class)).isTrue();
    }