org.digidoc4j.Configuration - java examples

Here are the examples of the java api org.digidoc4j.Configuration taken from open source projects. By voting up you can indicate which examples are most useful and appropriate.

67 Examples 7

19 View Complete Implementation : XadesSignatureValidatorFactory.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
public void setConfiguration(Configuration configuration) {
    this.configuration = configuration;
}

19 View Complete Implementation : CustomContainer.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * This clreplaced is used in unit tests for testing custom container creation.
 */
public clreplaced CustomContainer implements Container {

    private Configuration configuration;

    private String openedFromFile;

    private InputStream openedFromStream;

    public static String type = "TEST-FORMAT";

    public CustomContainer() {
    }

    public CustomContainer(Configuration configuration) {
        this.configuration = configuration;
    }

    public CustomContainer(String filePath) {
        this.openedFromFile = filePath;
    }

    public CustomContainer(String filePath, Configuration configuration) {
        this.openedFromFile = filePath;
        this.configuration = configuration;
    }

    public CustomContainer(InputStream openedFromStream) {
        this.openedFromStream = openedFromStream;
    }

    public CustomContainer(InputStream openedFromStream, Configuration configuration) {
        this.openedFromStream = openedFromStream;
        this.configuration = configuration;
    }

    @Override
    public String getType() {
        return type;
    }

    public static void resetType() {
        type = "TEST-FORMAT";
    }

    public Configuration getConfiguration() {
        return configuration;
    }

    public String getOpenedFromFile() {
        return openedFromFile;
    }

    public InputStream getOpenedFromStream() {
        return openedFromStream;
    }

    @Override
    public DataFile addDataFile(String path, String mimeType) {
        return null;
    }

    @Override
    public DataFile addDataFile(InputStream is, String fileName, String mimeType) {
        return null;
    }

    @Override
    public DataFile addDataFile(File file, String mimeType) {
        return null;
    }

    @Override
    public void addDataFile(DataFile dataFile) {
    }

    @Override
    public void addSignature(Signature signature) {
    }

    @Override
    public List<DataFile> getDataFiles() {
        return null;
    }

    @Override
    public List<Signature> getSignatures() {
        return null;
    }

    @Override
    public void removeDataFile(DataFile file) {
    }

    @Override
    public void removeSignature(Signature signature) {
    }

    @Override
    public void extendSignatureProfile(SignatureProfile profile) {
    }

    @Override
    public File saveAsFile(String filePath) {
        return null;
    }

    @Override
    public InputStream savereplacedtream() {
        return null;
    }

    @Override
    public ContainerValidationResult validate() {
        return null;
    }

    @Override
    public void setTimeStampToken(DataFile timeStampToken) {
        throw new NotYetImplementedException();
    }

    @Override
    public DataFile getTimeStampToken() {
        throw new NotYetImplementedException();
    }

    @Override
    public SignedInfo prepareSigning(X509Certificate signerCert) {
        return null;
    }

    @Override
    public String getSignatureProfile() {
        return null;
    }

    @Override
    public void setSignatureParameters(SignatureParameters signatureParameters) {
    }

    @Override
    public DigestAlgorithm getDigestAlgorithm() {
        return null;
    }

    @Override
    public void addRawSignature(byte[] signature) {
    }

    @Override
    public void addRawSignature(InputStream signatureStream) {
    }

    @Override
    public DataFile getDataFile(int index) {
        return null;
    }

    @Override
    public int countDataFiles() {
        return 0;
    }

    @Override
    public void removeDataFile(String fileName) {
    }

    @Override
    public void removeSignature(int signatureId) {
    }

    @Override
    public void save(String path) {
    }

    @Override
    public void save(OutputStream out) {
    }

    @Override
    public Signature sign(SignatureToken signatureToken) {
        return null;
    }

    @Override
    public Signature signRaw(byte[] rawSignature) {
        return null;
    }

    @Override
    public Signature getSignature(int index) {
        return null;
    }

    @Override
    public int countSignatures() {
        return 0;
    }

    @Override
    public DoreplacedentType getDoreplacedentType() {
        return null;
    }

    @Override
    public String getVersion() {
        return null;
    }

    @Override
    public void extendTo(SignatureProfile profile) {
    }

    @Override
    public void setSignatureProfile(SignatureProfile profile) {
    }
}

19 View Complete Implementation : ValidationTests.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
public clreplaced ValidationTests extends AbstractTest {

    public static final Configuration PROD_CONFIGURATION = new Configuration(Configuration.Mode.PROD);

    public static final Configuration PROD_CONFIGURATION_WITH_TEST_POLICY = new Configuration(Configuration.Mode.PROD);

    @BeforeClreplaced
    public static void setUpOnce() throws Exception {
        PROD_CONFIGURATION_WITH_TEST_POLICY.setValidationPolicy("conf/test_constraint.xml");
    }

    @Test
    public void validateProdBDocContainer_isValid() {
        Container container = ContainerBuilder.aContainer().fromExistingFile("src/test/resources/prodFiles/valid-containers/Baltic MoU digital signing_EST_LT_LV.bdoc").withConfiguration(Configuration.of(Configuration.Mode.PROD)).build();
        Testreplacedert.replacedertContainerIsValid(container);
    }

    @Test
    public void testUnknownOcspContainer() {
        Container container = this.openContainerBy(Paths.get("src/test/resources/testFiles/invalid-containers/unknown_ocsp.asice"));
        Testreplacedert.replacedertContainerIsInvalid(container);
    }

    @Test
    public void testVerifySignedDoreplacedent() throws Exception {
        Container container = this.createNonEmptyContainer();
        replacedert.replacedertTrue(container.validate().isValid());
    }

    @Test
    public void testTestVerifyOnInvalidDoreplacedent() throws Exception {
        Container container = TestDataBuilderUtil.open("src/test/resources/testFiles/invalid-containers/invalid_container.bdoc");
        replacedert.replacedertFalse(container.validate().isValid());
    }

    @Test
    public void testValidateEmptyDoreplacedent() {
        Testreplacedert.replacedertContainerIsValid(this.createEmptyContainerBy(Container.DoreplacedentType.BDOC, Container.clreplaced));
    }

    @Test
    public void testValidate() throws Exception {
        Container container = this.createNonEmptyContainer();
        this.createSignatureBy(container, this.pkcs12SignatureToken);
        replacedert.replacedertEquals(0, container.validate().getErrors().size());
    }

    @Test
    public void testValidateBeforeAndAfterContainerChange() {
        Container container = this.createNonEmptyContainer();
        this.createSignatureBy(container, this.pkcs12SignatureToken);
        ContainerValidationResult result = container.validate();
        replacedert.replacedertTrue(result.isValid());
        replacedert.replacedertEquals(1, result.getReports().size());
        replacedert.replacedertEquals("ŽÕRINÜWŠKY,MÄRÜ-LÖÖZ,11404176865", result.getReports().get(0).getSignedBy());
        this.createSignatureBy(container, this.pkcs12Esteid2018SignatureToken);
        result = container.validate();
        replacedert.replacedertTrue(result.isValid());
        replacedert.replacedertEquals(2, result.getReports().size());
        replacedert.replacedertEquals("ŽÕRINÜWŠKY,MÄRÜ-LÖÖZ,11404176865", result.getReports().get(0).getSignedBy());
        replacedert.replacedertEquals("JÕEORG,JAAK-KRISTJAN,38001085718", result.getReports().get(1).getSignedBy());
    }

    @Test(expected = UnsupportedFormatException.clreplaced)
    public void notBDocThrowsException() {
        TestDataBuilderUtil.open("src/test/resources/testFiles/invalid-containers/notABDoc.bdoc");
    }

    @Test(expected = UnsupportedFormatException.clreplaced)
    public void incorrectMimetypeThrowsException() {
        TestDataBuilderUtil.open("src/test/resources/testFiles/invalid-containers/incorrectMimetype.bdoc");
    }

    @Test(expected = Exception.clreplaced)
    public void testExpiredCertSign() {
        try {
            DataToSign dataToSign = SignatureBuilder.aSignature(this.createNonEmptyContainer()).withSigningCertificate(TestSigningUtil.getSigningCertificate("src/test/resources/testFiles/p12/expired_signer.p12", "test")).buildDataToSign();
            dataToSign.finalize(TestSigningUtil.sign(dataToSign.getDataToSign(), dataToSign.getDigestAlgorithm()));
        } catch (Exception e) {
            replacedert.replacedertTrue(e.getMessage().contains("not in certificate validity range"));
            throw e;
        }
    }

    @Test
    public void signatureFileContainsIncorrectFileName() {
        Container container = ContainerOpener.open("src/test/resources/prodFiles/invalid-containers/filename_mismatch_signature.asice", PROD_CONFIGURATION);
        SignatureValidationResult validate = container.validate();
        List<DigiDoc4JException> errors = validate.getErrors();
        replacedert.replacedertEquals(4, errors.size());
        Testreplacedert.replacedertContainsError("(Signature ID: S0) - The signature file for signature S0 has an entry for file <0123456789~#%&()=`@{[]}'.txt> with mimetype <application/pdf> but the manifest file does not have an entry for this file", errors);
    }

    @Test
    public void containerFileContainsExtraFile() {
        Container container = ContainerOpener.open("src/test/resources/testFiles/invalid-containers/KS-18_lisatudfail.4.asice", this.configuration);
        SignatureValidationResult validate = container.validate();
        List<DigiDoc4JException> errors = validate.getErrors();
        replacedert.replacedertEquals(1, errors.size());
        Testreplacedert.replacedertContainsError("Container contains a file named <test1.txt> which is not found in the signature file", errors);
    }

    @Test
    public void containerFileAndManifestContainsExtraFile() {
        Container container = ContainerOpener.open("src/test/resources/testFiles/invalid-containers/KS-18_lisatudfilemanifest.4.asice", this.configuration);
        SignatureValidationResult validate = container.validate();
        List<DigiDoc4JException> errors = validate.getErrors();
        replacedert.replacedertEquals(2, errors.size());
        Testreplacedert.replacedertContainsError("(Signature ID: S0) - Manifest file has an entry for file <test1.txt> with mimetype " + "<application/octet-stream> but the signature file for signature S0 does not have an entry for this " + "file", errors);
        Testreplacedert.replacedertContainsError("Container contains a file named <test1.txt> which is not found in the signature file", errors);
    }

    @Test
    public void validateContainer_withChangedDataFileContent_isInvalid() throws Exception {
        Container container = ContainerOpener.open("src/test/resources/testFiles/invalid-containers/invalid-data-file.bdoc");
        SignatureValidationResult validate = container.validate();
        replacedert.replacedertEquals(1, validate.getErrors().size());
        replacedert.replacedertEquals("(Signature ID: S0) - The result of the LTV validation process is not acceptable to continue the process!", validate.getErrors().get(0).toString());
    }

    @Test
    public void secondSignatureFileContainsIncorrectFileName() throws IOException, CertificateException {
        TestTreplacedil.addSkTsaCertificateToTsl(this.configuration);
        Container container = ContainerOpener.open("src/test/resources/testFiles/invalid-containers/filename_mismatch_second_signature.asice", this.configuration);
        SignatureValidationResult validate = container.validate();
        List<DigiDoc4JException> errors = validate.getErrors();
        replacedert.replacedertEquals(3, errors.size());
        replacedert.replacedertEquals("(Signature ID: S1) - The result of the LTV validation process is not acceptable to continue the process!", errors.get(0).toString());
        replacedert.replacedertEquals("(Signature ID: S1) - Manifest file has an entry for file <test.txt> with mimetype <text/plain> but " + "the signature file for signature S1 does not have an entry for this file", errors.get(1).toString());
        replacedert.replacedertEquals("Container contains a file named <test.txt> which is not found in the signature file", errors.get(2).toString());
    }

    @Test
    public void manifestFileContainsIncorrectFileName() {
        Container container = ContainerOpener.open("src/test/resources/prodFiles/invalid-containers/filename_mismatch_manifest.asice", PROD_CONFIGURATION_WITH_TEST_POLICY);
        SignatureValidationResult validate = container.validate();
        replacedert.replacedertEquals(2, validate.getErrors().size());
        replacedert.replacedertEquals("(Signature ID: S0) - Manifest file has an entry for file <incorrect.txt> with mimetype <text/plain> but " + "the signature file for signature S0 does not have an entry for this file", validate.getErrors().get(0).toString());
        replacedert.replacedertEquals("(Signature ID: S0) - The signature file for signature S0 has an entry for file <RELEASE-NOTES.txt> " + "with mimetype <text/plain> but the manifest file does not have an entry for this file", validate.getErrors().get(1).toString());
    }

    @Test
    public void container_withChangedDataFileName_shouldBeInvalid() throws Exception {
        Container container = ContainerOpener.open("src/test/resources/testFiles/invalid-containers/bdoc-tm-with-changed-data-file-name.bdoc");
        SignatureValidationResult result = container.validate();
        replacedert.replacedertEquals(2, result.getErrors().size());
        replacedert.replacedertEquals("Container contains a file named <test1.txt> which is not found in the signature file", result.getErrors().get(1).getMessage());
    }

    @Test
    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
    public void revocationAndTimeStampDifferenceTooLarge() {
        Container container = ContainerOpener.open("src/test/resources/prodFiles/invalid-containers/revocation_timestamp_delta_26h.asice", PROD_CONFIGURATION);
        SignatureValidationResult validate = container.validate();
        replacedert.replacedertEquals(1, validate.getErrors().size());
        replacedert.replacedertEquals("(Signature ID: S0) - The difference between the OCSP response time and the signature timestamp is too large", validate.getErrors().get(0).toString());
    }

    @Test
    public void revocationAndTimeStampDifferenceNotTooLarge() {
        Configuration configuration = new Configuration(Configuration.Mode.PROD);
        int delta27Hours = 27 * 60;
        configuration.setRevocationAndTimestampDeltaInMinutes(delta27Hours);
        SignatureValidationResult result = ContainerOpener.open("src/test/resources/prodFiles/invalid-containers/revocation_timestamp_delta_26h.asice", configuration).validate();
        replacedert.replacedertEquals(0, result.getErrors().size());
        replacedert.replacedertEquals(2, result.getWarnings().size());
    }

    @Test
    public void signatureFileAndManifestFileContainDifferentMimeTypeForFile() {
        Container container = ContainerOpener.open("src/test/resources/prodFiles/invalid-containers/mimetype_mismatch.asice", PROD_CONFIGURATION_WITH_TEST_POLICY);
        SignatureValidationResult validate = container.validate();
        replacedert.replacedertEquals(1, validate.getErrors().size());
        replacedert.replacedertEquals("(Signature ID: S0) - Manifest file has an entry for file <RELEASE-NOTES.txt> with mimetype " + "<application/pdf> but the signature file for signature S0 indicates the mimetype is <text/plain>", validate.getErrors().get(0).toString());
    }

    @Test(expected = DuplicateDataFileException.clreplaced)
    public void duplicateFileThrowsException() {
        ContainerOpener.open("src/test/resources/testFiles/invalid-containers/22902_data_files_with_same_names.bdoc").validate();
    }

    @Test
    public void signaturesWithDuplicateId() {
        Container container = ContainerOpener.open("src/test/resources/testFiles/valid-containers/2_signatures_duplicate_id.asice");
        ValidationResult result = container.validate();
        replacedert.replacedertTrue(result.isValid());
    }

    @Test
    public void missingManifestFile() {
        Container container = ContainerOpener.open("src/test/resources/prodFiles/invalid-containers/missing_manifest.asice", PROD_CONFIGURATION);
        SignatureValidationResult result = container.validate();
        replacedert.replacedertFalse(result.isValid());
        replacedert.replacedertEquals("Unsupported format: Container does not contain a manifest file", result.getErrors().get(0).getMessage());
    }

    @Test(expected = DigiDoc4JException.clreplaced)
    public void missingMimeTypeFile() {
        ContainerOpener.open("src/test/resources/testFiles/invalid-containers/missing_mimetype_file.asice");
    }

    @Test
    public void containerHasFileWhichIsNotInManifestAndNotInSignatureFile() {
        Container container = ContainerOpener.open("src/test/resources/prodFiles/invalid-containers/extra_file_in_container.asice", PROD_CONFIGURATION_WITH_TEST_POLICY);
        SignatureValidationResult result = container.validate();
        List<DigiDoc4JException> errors = result.getErrors();
        replacedert.replacedertEquals(1, errors.size());
        replacedert.replacedertEquals("Container contains a file named <AdditionalFile.txt> which is not found in the signature file", errors.get(0).getMessage());
    }

    @Test
    public void containerMissesFileWhichIsInManifestAndSignatureFile() {
        TestTreplacedil.addSkTsaCertificateToTsl(this.configuration);
        Container container = ContainerOpener.open("src/test/resources/testFiles/invalid-containers/zip_misses_file_which_is_in_manifest.asice");
        SignatureValidationResult result = container.validate();
        List<DigiDoc4JException> errors = result.getErrors();
        // Timestamp issuer originates from PROD chain
        Testreplacedert.replacedertContainsError("(Signature ID: S0) - The certificate chain for timestamp is not trusted, there is no trusted anchor.", errors);
    }

    @Test
    public void containerMissingOCSPData() {
        Container container = ContainerOpener.open("src/test/resources/testFiles/invalid-containers/TS-06_23634_TS_missing_OCSP_adjusted.asice");
        SignatureValidationResult validate = container.validate();
        List<DigiDoc4JException> errors = validate.getErrors();
        replacedert.replacedertEquals(SignatureProfile.LT, container.getSignatures().get(0).getProfile());
        // Timestamp issuer originates from PROD chain
        Testreplacedert.replacedertContainsError("(Signature ID: S0) - Signature has an invalid timestamp", errors);
        Testreplacedert.replacedertContainsError("(Signature ID: S0) - Manifest file has an entry for file <test.txt> with mimetype <text/plain> but " + "the signature file for signature S0 indicates the mimetype is <application/octet-stream>", errors);
    }

    @Ignore("This signature has two OCSP responses: one correct and one is technically corrupted. Opening a container should not throw an exception")
    @Test(expected = DigiDoc4JException.clreplaced)
    public void corruptedOCSPDataThrowsException() {
        ContainerOpener.open("src/test/resources/testFiles/invalid-containers/corrupted_ocsp_data.asice");
    }

    @Test
    public void invalidNoncePolicyOid() {
        Container container = ContainerOpener.open("src/test/resources/prodFiles/invalid-containers/23608_bdoc21-invalid-nonce-policy-oid.bdoc", PROD_CONFIGURATION);
        SignatureValidationResult result = container.validate();
        List<DigiDoc4JException> errors = result.getErrors();
        replacedert.replacedertEquals(1, errors.size());
        replacedert.replacedertEquals("(Signature ID: S0) - Wrong policy identifier: 1.3.6.1.4.1.10015.1000.3.4.3", errors.get(0).toString());
    }

    @Test
    public void badNonceContent() {
        Container container = ContainerOpener.open("src/test/resources/prodFiles/invalid-containers/bdoc21-bad-nonce-content.bdoc", PROD_CONFIGURATION_WITH_TEST_POLICY);
        SignatureValidationResult result = container.validate();
        List<DigiDoc4JException> errors = result.getErrors();
        replacedert.replacedertEquals(1, errors.size());
        replacedert.replacedertEquals("(Signature ID: S0) - OCSP nonce is invalid", errors.get(0).toString());
    }

    @Test
    public void noSignedPropRefTM() {
        Container container = ContainerOpener.open("src/test/resources/prodFiles/invalid-containers/REF-03_bdoc21-TM-no-signedpropref.bdoc", PROD_CONFIGURATION_WITH_TEST_POLICY);
        SignatureValidationResult result = container.validate();
        List<DigiDoc4JException> errors = result.getErrors();
        replacedert.replacedertEquals(2, errors.size());
        Testreplacedert.replacedertContainsError("(Signature ID: S0) - SignedProperties Reference element is missing", errors);
        Testreplacedert.replacedertContainsError("(Signature ID: S0) - The result of the LTV validation process is not acceptable to continue the process!", errors);
        replacedert.replacedertEquals(2, container.getSignatures().get(0).validateSignature().getErrors().size());
    }

    @Test
    public void noSignedPropRefTS() {
        Container container = ContainerOpener.open("src/test/resources/prodFiles/invalid-containers/REF-03_bdoc21-TS-no-signedpropref.asice", PROD_CONFIGURATION_WITH_TEST_POLICY);
        SignatureValidationResult result = container.validate();
        List<DigiDoc4JException> errors = result.getErrors();
        replacedert.replacedertEquals(2, errors.size());
        Testreplacedert.replacedertContainsError("(Signature ID: S0) - SignedProperties Reference element is missing", errors);
        Testreplacedert.replacedertContainsError("(Signature ID: S0) - The result of the LTV validation process is not acceptable to continue the process!", errors);
    }

    @Test
    public void multipleSignedProperties() {
        Container container = ContainerOpener.open("src/test/resources/testFiles/invalid-containers/multiple_signed_properties.asice");
        SignatureValidationResult result = container.validate();
        List<DigiDoc4JException> errors = result.getErrors();
        Testreplacedert.replacedertContainsError("Multiple signed properties", errors);
        Testreplacedert.replacedertContainsError("ignature has an invalid timestamp", errors);
    }

    @Test
    public void incorrectSignedPropertiesReference() {
        Container container = ContainerOpener.open("src/test/resources/prodFiles/invalid-containers/signed_properties_reference_not_found.asice", PROD_CONFIGURATION_WITH_TEST_POLICY);
        SignatureValidationResult result = container.validate();
        List<DigiDoc4JException> errors = result.getErrors();
        replacedert.replacedertEquals(2, errors.size());
    }

    @Test
    public void nonceIncorrectContent() {
        Container container = ContainerOpener.open("src/test/resources/prodFiles/invalid-containers/nonce-vale-sisu.bdoc", PROD_CONFIGURATION_WITH_TEST_POLICY);
        SignatureValidationResult result = container.validate();
        List<DigiDoc4JException> errors = result.getErrors();
        replacedert.replacedertEquals(4, errors.size());
        replacedert.replacedertEquals("(Signature ID: S0) - Wrong policy identifier: 1.3.6.1.4.1.10015.1000.2.10.10", errors.get(0).toString());
        replacedert.replacedertEquals("(Signature ID: S0) - OCSP nonce is invalid", errors.get(2).toString());
    }

    @Test
    public void badNoncePolicyOidQualifier() {
        Container container = ContainerOpener.open("src/test/resources/prodFiles/invalid-containers/SP-03_bdoc21-bad-nonce-policy-oidasuri.bdoc", PROD_CONFIGURATION_WITH_TEST_POLICY);
        SignatureValidationResult result = container.validate();
        List<DigiDoc4JException> errors = result.getErrors();
        replacedert.replacedertEquals(1, errors.size());
        replacedert.replacedertEquals("(Signature ID: S0) - Wrong policy identifier qualifier: OIDAsURI", errors.get(0).toString());
        replacedert.replacedertEquals(1, container.getSignatures().get(0).validateSignature().getErrors().size());
    }

    @Test
    public void invalidNonce() {
        Container container = ContainerOpener.open("src/test/resources/testFiles/invalid-containers/23200_weakdigest-wrong-nonce.asice");
        SignatureValidationResult result = container.validate();
        List<DigiDoc4JException> errors = result.getErrors();
        replacedert.replacedertEquals(1, errors.size());
        replacedert.replacedertEquals("(Signature ID: S0) - OCSP nonce is invalid", errors.get(0).toString());
    }

    @Test
    public void invalidWeakDigestUnknownCa() {
        Container container = ContainerOpener.open("src/test/resources/testFiles/invalid-containers/23200_weakdigest-unknown-ca.asice");
        SignatureValidationResult result = container.validate();
        List<DigiDoc4JException> errors = result.getErrors();
        replacedert.replacedertEquals(2, errors.size());
        replacedert.replacedertEquals("(Signature ID: S0) - The certificate path is not trusted!", errors.get(0).toString());
    }

    @Test
    public void invalidUnknownCa() {
        Container container = ContainerOpener.open("src/test/resources/testFiles/invalid-containers/SS-4_teadmataCA.4.asice");
        SignatureValidationResult result = container.validate();
        List<DigiDoc4JException> errors = result.getErrors();
        replacedert.replacedertEquals(2, errors.size());
        replacedert.replacedertEquals("(Signature ID: S0) - The certificate path is not trusted!", errors.get(0).toString());
    }

    @Test
    public void validBDocRsa2047_whenASN1UnsafeIntegerAllowed() {
        PROD_CONFIGURATION.setAllowASN1UnsafeInteger(true);
        replacedert.replacedertEquals(true, PROD_CONFIGURATION.isASN1UnsafeIntegerAllowed());
        Container container = ContainerOpener.open("src/test/resources/prodFiles/valid-containers/IB-4183_3.4kaart_RSA2047.bdoc", PROD_CONFIGURATION);
        SignatureValidationResult result = container.validate();
        List<DigiDoc4JException> errors = result.getErrors();
        replacedert.replacedertEquals(0, errors.size());
        PROD_CONFIGURATION.setAllowASN1UnsafeInteger(false);
    }

    @Test
    public void validTSRsa2047_whenASN1UnsafeIntegerAllowed() {
        PROD_CONFIGURATION.setAllowASN1UnsafeInteger(true);
        replacedert.replacedertEquals(true, PROD_CONFIGURATION.isASN1UnsafeIntegerAllowed());
        Container container = ContainerOpener.open("src/test/resources/prodFiles/valid-containers/IB-4183_3.4kaart_RSA2047_TS.asice", PROD_CONFIGURATION);
        SignatureValidationResult result = container.validate();
        List<DigiDoc4JException> errors = result.getErrors();
        replacedert.replacedertEquals(0, errors.size());
        PROD_CONFIGURATION.setAllowASN1UnsafeInteger(false);
    }

    @Test(expected = TechnicalException.clreplaced)
    public void invalidBDocRsa2047_whenASN1UnsafeIntegerNotAllowed() {
        PROD_CONFIGURATION.setAllowASN1UnsafeInteger(false);
        replacedert.replacedertEquals(false, PROD_CONFIGURATION.isASN1UnsafeIntegerAllowed());
        Container container = ContainerOpener.open("src/test/resources/prodFiles/valid-containers/IB-4183_3.4kaart_RSA2047.bdoc", PROD_CONFIGURATION);
        container.validate();
    }

    @Test(expected = TechnicalException.clreplaced)
    public void invalidTSRsa2047_whenASN1UnsafeIntegerNotAllowed() {
        PROD_CONFIGURATION.setAllowASN1UnsafeInteger(false);
        replacedert.replacedertEquals(false, PROD_CONFIGURATION.isASN1UnsafeIntegerAllowed());
        Container container = ContainerOpener.open("src/test/resources/prodFiles/valid-containers/IB-4183_3.4kaart_RSA2047_TS.asice", PROD_CONFIGURATION);
        container.validate();
    }

    @Test
    public void brokenTS() {
        Container container = ContainerOpener.open("src/test/resources/testFiles/invalid-containers/TS_broken_TS.asice");
        SignatureValidationResult result = container.validate();
        List<DigiDoc4JException> errors = result.getErrors();
        replacedert.replacedertEquals(3, errors.size());
        replacedert.replacedertEquals("(Signature ID: S0) - The result of the timestamps validation process is not conclusive!", errors.get(0).toString());
        replacedert.replacedertEquals("(Signature ID: S0) - " + InvalidTimestampException.MESSAGE, errors.get(2).toString());
    }

    @Test
    public void asicValidationShouldFail_ifTimeStampHashDoesntMatchSignature() throws Exception {
        SignatureValidationResult result = this.openContainerBy(Paths.get("src/test/resources/testFiles/invalid-containers/TS-02_23634_TS_wrong_SignatureValue.asice")).validate();
        replacedert.replacedertFalse(result.isValid());
        Testreplacedert.replacedertContainsError(InvalidTimestampException.MESSAGE, result.getErrors());
    }

    @Test
    public void containerWithTMProfile_SignedWithExpiredCertificate_shouldBeInvalid() throws Exception {
        replacedert.replacedertFalse(this.openContainerBy(Paths.get("src/test/resources/testFiles/invalid-containers/invalid_bdoc_tm_old-sig-sigat-NOK-prodat-NOK.bdoc")).validate().isValid());
        replacedert.replacedertFalse(this.openContainerBy(Paths.get("src/test/resources/testFiles/invalid-containers/invalid_bdoc_tm_old-sig-sigat-OK-prodat-NOK.bdoc")).validate().isValid());
    }

    @Test
    public void containerWithTSProfile_SignedWithExpiredCertificate_shouldBeInvalid() throws Exception {
        replacedert.replacedertFalse(this.openContainerBy(Paths.get("src/test/resources/testFiles/invalid-containers/invalid_bdoc21-TS-old-cert.bdoc")).validate().isValid());
    }

    @Test
    public void bdocTM_signedWithValidCert_isExpiredByNow_shouldBeValid() throws Exception {
        String containerPath = "src/test/resources/testFiles/valid-containers/valid_bdoc_tm_signed_with_valid_cert_expired_by_now.bdoc";
        Configuration configuration = new Configuration(Configuration.Mode.TEST);
        TestTreplacedil.addCertificateFromFileToTsl(configuration, "src/test/resources/testFiles/certs/ESTEID-SK_2007_prod.pem.crt");
        Container container = ContainerBuilder.aContainer().fromExistingFile(containerPath).withConfiguration(configuration).build();
        replacedert.replacedertTrue(container.validate().isValid());
    }

    @Test
    public void signaturesWithCrlShouldBeInvalid() throws Exception {
        SignatureValidationResult result = this.openContainerByConfiguration(Paths.get("src/test/resources/prodFiles/invalid-containers/asic-with-crl-and-without-ocsp.asice"), PROD_CONFIGURATION).validate();
        replacedert.replacedertFalse(result.isValid());
        replacedert.replacedertTrue(result.getErrors().get(0) instanceof UntrustedRevocationSourceException);
    }

    @Test
    public void bDoc_withoutOcspResponse_shouldBeInvalid() throws Exception {
        replacedert.replacedertFalse(this.openContainerByConfiguration(Paths.get("src/test/resources/prodFiles/invalid-containers/23608-bdoc21-no-ocsp.bdoc"), PROD_CONFIGURATION).validate().isValid());
    }

    @Test
    public void bDoc_invalidOcspResponse() {
        try {
            this.openContainerByConfiguration(Paths.get("src/test/resources/prodFiles/invalid-containers/bdoc21-vigane-ocsp.bdoc"), PROD_CONFIGURATION);
            replacedert.fail("Should not be able to successfully open container!");
        } catch (DSSException exception) {
            replacedert.replacedertEquals("Cannot create the token reference. The element with local name [EncapsulatedOCSPValue] must contain an encapsulated base64 token value!", exception.getMessage());
        }
    }

    @Test
    public void ocspResponseShouldNotBeTakenFromPreviouslyValidatedSignatures_whenOcspResponseIsMissing() throws Exception {
        replacedert.replacedertFalse(this.openContainerByConfiguration(Paths.get("src/test/resources/testFiles/invalid-containers/bdoc-tm-ocsp-revoked.bdoc"), this.configuration).validate().isValid());
        replacedert.replacedertTrue(this.openContainerByConfiguration(Paths.get("src/test/resources/testFiles/valid-containers/valid-bdoc-tm.bdoc"), this.configuration).validate().isValid());
        replacedert.replacedertFalse(this.openContainerByConfiguration(Paths.get("src/test/resources/testFiles/invalid-containers/invalid-bdoc-tm-missing-revoked-ocsp.bdoc"), this.configuration).validate().isValid());
    }

    @Test
    public void validateContainerWithBomSymbolsInMimeType_shouldBeValid() throws Exception {
        replacedert.replacedertTrue(this.openContainerByConfiguration(Paths.get("src/test/resources/prodFiles/valid-containers/IB-4185_bdoc21_TM_mimetype_with_BOM_PROD.bdoc"), PROD_CONFIGURATION).validate().isValid());
    }

    @Test
    public void containerValidation_withManuallyAddedTrustedCertificates_shouldSucceed() throws Exception {
        TSLCertificateSourceImpl tsl = new TSLCertificateSourceImpl();
        Configuration conf = Configuration.of(Configuration.Mode.PROD);
        conf.setAllowASN1UnsafeInteger(true);
        conf.setTSL(tsl);
        try (InputStream inputStream = new FileInputStream("src/test/resources/prodFiles/certs/ESTEID-SK_2011.pem.crt")) {
            tsl.addTSLCertificate(DSSUtils.loadCertificate(inputStream).getCertificate());
        }
        try (InputStream inputStream = new FileInputStream("src/test/resources/prodFiles/certs/SK_OCSP_RESPONDER_2011.pem.cer")) {
            tsl.addTSLCertificate(DSSUtils.loadCertificate(inputStream).getCertificate());
        }
        try (InputStream inputStream = new FileInputStream("src/test/resources/prodFiles/certs/SK_TSA.pem.crt")) {
            tsl.addTSLCertificate(DSSUtils.loadCertificate(inputStream).getCertificate());
        }
        SignatureValidationResult result = this.openContainerByConfiguration(Paths.get("src/test/resources/prodFiles/valid-containers/IB-4183_3.4kaart_RSA2047_TS.asice"), conf).validate();
        replacedert.replacedertTrue(result.isValid());
        replacedert.replacedertEquals(0, result.getErrors().size());
        conf.setAllowASN1UnsafeInteger(false);
    }

    @Test
    public void havingOnlyCaCertificateInTSL_shouldNotValidateOCSPResponse() throws Exception {
        TSLCertificateSourceImpl tsl = new TSLCertificateSourceImpl();
        this.configuration.setTSL(tsl);
        try (InputStream inputStream = this.getClreplaced().getResourcereplacedtream("/certs/TEST ESTEID-SK 2011.crt")) {
            tsl.addTSLCertificate(DSSUtils.loadCertificate(inputStream).getCertificate());
        }
        SignatureValidationResult result = this.openContainerByConfiguration(Paths.get("src/test/resources/testFiles/valid-containers/valid-bdoc-tm.bdoc"), this.configuration).validate();
        replacedert.replacedertFalse(result.isValid());
    }

    @Test
    public void mixTSLCertAndTSLOnlineSources_SignatureTypeLT_valid() throws Exception {
        try (InputStream caStream = new FileInputStream("src/test/resources/testFiles/certs/exampleCA.cer")) {
            this.configuration.getTSL().addTSLCertificate(DSSUtils.loadCertificate(caStream).getCertificate());
            this.configuration.getTSL().addTSLCertificate(DSSUtils.loadCertificate(new FileInputStream("src/test/resources/testFiles/certs/SK-OCSP-RESPONDER-2011_test.cer")).getCertificate());
        }
        Container container = this.createNonEmptyContainerByConfiguration();
        this.createSignatureBy(container, SignatureProfile.LT, new PKCS12SignatureToken("src/test/resources/testFiles/p12/user_one.p12", "user_one".toCharArray()));
        SignatureValidationResult result = container.validate();
        replacedert.replacedertTrue(result.isValid());
        replacedert.replacedertEquals(0, result.getErrors().size());
    }

    @Test
    public void mixTSLCertAndTSLOnlineSources_SignatureTypeLT_notValid() throws Exception {
        TSLCertificateSource certificateSource = new TSLCertificateSourceImpl();
        try (InputStream inputStream = new FileInputStream("src/test/resources/testFiles/certs/exampleCA.cer")) {
            X509Certificate certificate = DSSUtils.loadCertificate(inputStream).getCertificate();
            certificateSource.addTSLCertificate(certificate);
            certificateSource.addTSLCertificate(DSSUtils.loadCertificate(new FileInputStream("src/test/resources/testFiles/certs/SK-OCSP-RESPONDER-2011_test.cer")).getCertificate());
        }
        this.configuration.setTSL(certificateSource);
        Container container = this.createNonEmptyContainerByConfiguration();
        this.createSignatureBy(container, SignatureProfile.LT, new PKCS12SignatureToken("src/test/resources/testFiles/p12/user_one.p12", "user_one".toCharArray()));
        SignatureValidationResult result = container.validate();
        List<DigiDoc4JException> errors = result.getErrors();
        List<Signature> signatureList = container.getSignatures();
        Signature signature = signatureList.get(0);
        String signatureId = signature.getId();
        replacedert.replacedertFalse(result.isValid());
        replacedert.replacedertEquals(3, errors.size());
        replacedert.replacedertEquals("(Signature ID: " + signatureId + ") - The result of the timestamps validation process is not conclusive!", errors.get(0).toString());
        replacedert.replacedertEquals("(Signature ID: " + signatureId + ") - Signature has an invalid timestamp", errors.get(2).toString());
    }

    @Test
    public void validateAsiceContainer_getNotValid() throws Exception {
        replacedert.replacedertFalse(this.openContainerByConfiguration(Paths.get("src/test/resources/testFiles/invalid-containers/TM-16_unknown.4.asice"), this.configuration).validate().isValid());
    }

    @Test
    public void validateSpuriElement_UriIsvalid() throws Exception {
        Container container = ContainerOpener.open("src/test/resources/testFiles/valid-containers/valid-bdoc-tm.bdoc", this.configuration);
        replacedert.replacedertTrue(container.validate().isValid());
    }

    @Test
    public void validateBDocTs_Isvalid() throws Exception {
        Container container = ContainerOpener.open("src/test/resources/prodFiles/invalid-containers/bdoc21-ts-ok.bdoc", PROD_CONFIGURATION);
        SignatureValidationResult result = container.validate();
        replacedert.replacedertFalse(result.isValid());
        replacedert.replacedertEquals(6, result.getErrors().size());
        Testreplacedert.replacedertContainsError("(Signature ID: S0) - The result of the timestamps validation process is not conclusive!", result.getErrors());
        Testreplacedert.replacedertContainsError("(Signature ID: S0) - Signature has an invalid timestamp", result.getErrors());
        Testreplacedert.replacedertContainsError("(Signature ID: S0) - Manifest file has an entry for file <build.xml> with mimetype <text/xml> but the " + "signature file for signature S0 indicates the mimetype is <>", result.getErrors());
    }

    @Test
    public void validateSpuriElement_UriIsMissing() throws Exception {
        Container container = ContainerOpener.open("src/test/resources/testFiles/valid-containers/23608_bdoc21-no-nonce-policy.bdoc", this.configuration);
        SignatureValidationResult result = container.validate();
        replacedert.replacedertFalse(container.validate().isValid());
        Testreplacedert.replacedertContainsError("Error: The URL in signature policy is empty or not available", result.getErrors());
    }

    @Test
    public void validateSpuriElement_UriIsEmpty() throws Exception {
        Container container = ContainerOpener.open("src/test/resources/testFiles/valid-containers/SP-06_bdoc21-no-uri.bdoc", this.configuration);
        SignatureValidationResult result = container.validate();
        replacedert.replacedertFalse(result.isValid());
        Testreplacedert.replacedertContainsError("The URL in signature policy is empty or not available", result.getErrors());
    }

    @Test
    public void invalidOcspResponder() {
        this.configuration.setAllowedOcspRespondersForTM("INVALID OCSP RESPONDER");
        Container container = ContainerOpener.open("src/test/resources/testFiles/valid-containers/valid-bdoc-tm.bdoc", this.configuration);
        SignatureValidationResult result = container.validate();
        Testreplacedert.replacedertContainsError("OCSP Responder does not meet TM requirements", result.getErrors());
    }

    @Test
    public void sameCertAddedTwiceToTSL_containerValidationShouldSucceed() {
        Configuration conf = Configuration.of(Configuration.Mode.PROD);
        conf.setTSL(new TSLCertificateSourceImpl());
        conf.setAllowASN1UnsafeInteger(true);
        TestTreplacedil.addCertificateFromFileToTsl(conf, "src/test/resources/prodFiles/certs/ESTEID-SK_2011.pem.crt");
        TestTreplacedil.addCertificateFromFileToTsl(conf, "src/test/resources/prodFiles/certs/ESTEID-SK_2011.pem.crt");
        TestTreplacedil.addCertificateFromFileToTsl(conf, "src/test/resources/prodFiles/certs/SK_OCSP_RESPONDER_2011.pem.cer");
        TestTreplacedil.addCertificateFromFileToTsl(conf, "src/test/resources/prodFiles/certs/SK_TSA.pem.crt");
        SignatureValidationResult result = this.openContainerByConfiguration(Paths.get("src/test/resources/prodFiles/valid-containers/IB-4183_3.4kaart_RSA2047_TS.asice"), conf).validate();
        replacedert.replacedertTrue(result.isValid());
        replacedert.replacedertEquals(0, result.getErrors().size());
        conf.setAllowASN1UnsafeInteger(false);
    }

    @Test
    public void prodContainerWithSignatureWarningOfTrustedCertificateNotMatchingWithTrustService_warningIsRemoved() {
        Container container = ContainerBuilder.aContainer().fromExistingFile("src/test/resources/prodFiles/valid-containers/Baltic MoU digital signing_EST_LT_LV.bdoc").withConfiguration(PROD_CONFIGURATION).build();
        ContainerValidationResult validationResult = container.validate();
        replacedert.replacedertTrue(validationResult.isValid());
        replacedert.replacedertTrue(validationResult.getErrors().isEmpty());
        replacedert.replacedertFalse(validationResult.getWarnings().contains(MessageTag.QUAL_IS_TRUST_CERT_MATCH_SERVICE_ANS2.getMessage()));
    }

    @Test
    public void testContainerWithSignatureWarningOfTrustedCertificateNotMatchingWithTrustService_warningIsRemoved() {
        Configuration configuration = new Configuration(Configuration.Mode.TEST);
        Container container = ContainerBuilder.aContainer().fromExistingFile("src/test/resources/testFiles/valid-containers/valid_bdoc_tm_signed_with_valid_cert_expired_by_now.bdoc").withConfiguration(configuration).build();
        TestTreplacedil.addCertificateFromFileToTsl(configuration, "src/test/resources/testFiles/certs/ESTEID-SK_2007_prod.pem.crt");
        ContainerValidationResult validationResult = container.validate();
        replacedert.replacedertTrue(validationResult.isValid());
        replacedert.replacedertTrue(validationResult.getErrors().isEmpty());
        replacedert.replacedertFalse(validationResult.getWarnings().contains(MessageTag.QUAL_IS_TRUST_CERT_MATCH_SERVICE_ANS2.getMessage()));
    }

    @Test
    public void container_withTimestampTakenWhenSigningCertificateWasNotValid_shouldBeInvalid() throws Exception {
        Container container = ContainerOpener.open("src/test/resources/testFiles/invalid-containers/signing_certificate_not_valid_during_timestamping.asice");
        SignatureValidationResult result = container.validate();
        replacedert.replacedertFalse("Signature must not be valid when timestamp was taken while signing certificate was not valid", result.isValid());
        replacedert.replacedertEquals(1, result.getErrors().size());
        replacedert.replacedertEquals("Signature has been created with expired certificate", result.getErrors().get(0).getMessage());
    }

    @Test
    public void container_withOcspBeforeTS_shouldBeInvalid() {
        Container container = ContainerOpener.open("src/test/resources/testFiles/invalid-containers/TS-08_23634_TS_OCSP_before_TS.asice");
        SignatureValidationResult result = container.validate();
        replacedert.replacedertFalse("Signature must not be valid when OCSP was taken before timestamp", result.isValid());
        replacedert.replacedertTrue("Result errors must contain " + TimestampAfterOCSPResponseTimeException.clreplaced.getSimpleName(), result.getErrors().stream().anyMatch(e -> e instanceof TimestampAfterOCSPResponseTimeException));
    }

    /*
   * RESTRICTED METHODS
   */
    @Override
    protected void before() {
        this.configuration = Configuration.of(Configuration.Mode.TEST);
    }
}

19 View Complete Implementation : TslIntegrityTest.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
public clreplaced TslIntegrityTest extends AbstractTest {

    private Configuration configuration;

    private int initialCertificatesCountInTslSource;

    private int initialCertificatesCountInTslPool;

    private int initialEnreplacediesCountInTslPool;

    @Before
    public void setUpCentralConfiguration() {
        configuration = Configuration.of(Configuration.Mode.TEST);
        configuration.getTSL().refresh();
        initialCertificatesCountInTslSource = configuration.getTSL().getNumberOfCertificates();
        initialCertificatesCountInTslPool = configuration.getTSL().getCertificatePool().getNumberOfCertificates();
        initialEnreplacediesCountInTslPool = configuration.getTSL().getCertificatePool().getNumberOfEnreplacedies();
        replacedert.replacedertEquals(initialCertificatesCountInTslSource, initialCertificatesCountInTslPool);
    }

    @Test
    public void centralTslShouldNotChangeAfterSignatureCreationNorValidation() {
        Signature signature = DetachedXadesSignatureBuilder.withConfiguration(configuration).withSignatureToken(pkcs12SignatureToken).withDataFile(createDefaultDataFile()).withSignatureId("SIG-ID").invokeSigning();
        replacedertCentralTslNotChanged(pkcs12SignatureToken.getCertificate());
        replacedert.replacedertNotNull(signature.validateSignature());
        replacedertCentralTslNotChanged(pkcs12SignatureToken.getCertificate());
    }

    @Test
    public void centralTslShouldNotChangeAfterSigningOrValidatingContainer() {
        Container container = ContainerBuilder.aContainer(Container.DoreplacedentType.ASICE).withDataFile(createDefaultDataFile()).withConfiguration(configuration).build();
        Signature signature = SignatureBuilder.aSignature(container).withSignatureToken(pkcs12SignatureToken).withSignatureId("SIG-ID").invokeSigning();
        replacedertCentralTslNotChanged(pkcs12SignatureToken.getCertificate());
        replacedert.replacedertNotNull(signature.validateSignature());
        replacedertCentralTslNotChanged(pkcs12SignatureToken.getCertificate());
        container.addSignature(signature);
        replacedertCentralTslNotChanged(pkcs12SignatureToken.getCertificate());
        replacedert.replacedertNotNull(container.validate());
        replacedertCentralTslNotChanged(pkcs12SignatureToken.getCertificate());
    }

    private void replacedertCentralTslNotChanged(X509Certificate certificateExpectedToBeMissing) {
        replacedertCentralTslCertificateSourceNotChanged(certificateExpectedToBeMissing);
        replacedertCentralTslCertificatePoolNotChanged(certificateExpectedToBeMissing);
    }

    private void replacedertCentralTslCertificateSourceNotChanged(X509Certificate certificateExpectedToBeMissing) {
        replacedert.replacedertEquals(String.format("TSL certificate source is expected to contain %d certificates", initialCertificatesCountInTslSource), initialCertificatesCountInTslSource, configuration.getTSL().getNumberOfCertificates());
        replacedert.replacedertFalse(String.format("TSL certificate source is expected not to contain certificate %s", certificateExpectedToBeMissing.getSubjectDN().getName()), configuration.getTSL().getCertificates().stream().anyMatch(ct -> certificateExpectedToBeMissing.equals(ct.getCertificate())));
    }

    private void replacedertCentralTslCertificatePoolNotChanged(X509Certificate certificateExpectedToBeMissing) {
        replacedert.replacedertEquals(String.format("TSL certificate pool is expected to contain %d certificates", initialCertificatesCountInTslPool), initialCertificatesCountInTslPool, configuration.getTSL().getCertificatePool().getNumberOfCertificates());
        replacedert.replacedertEquals(String.format("TSL certificate pool is expected to contain %d enreplacedies", initialEnreplacediesCountInTslPool), initialEnreplacediesCountInTslPool, configuration.getTSL().getCertificatePool().getNumberOfEnreplacedies());
        replacedert.replacedertFalse(String.format("TSL certificate pool is expected not to contain certificate %s", certificateExpectedToBeMissing.getSubjectDN().getName()), configuration.getTSL().getCertificatePool().getCertificateTokens().stream().anyMatch(ct -> certificateExpectedToBeMissing.equals(ct.getCertificate())));
    }

    private static DataFile createDefaultDataFile() {
        return new DataFile(new byte[] { 0, 1, 2, 3 }, "filename", "application/octet-stream");
    }
}

19 View Complete Implementation : AsicSignature.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * Setter for Configuration
 *
 * @param configuration
 */
public void setConfiguration(Configuration configuration) {
    this.configuration = configuration;
}

19 View Complete Implementation : ManifestValidatorTest.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
public clreplaced ManifestValidatorTest {

    private final Configuration configuration = new Configuration(Configuration.Mode.TEST);

    @Test
    public void validateEntries() throws Exception {
        Map<String, ManifestEntry> entriesFromManifest = new HashMap<String, ManifestEntry>() {

            {
                put("1", new ManifestEntry("1", "a"));
                put("2", new ManifestEntry("2", "b"));
            }
        };
        Set<ManifestEntry> entriesFromSignature = new HashSet<ManifestEntry>() {

            {
                add(new ManifestEntry("1", "a"));
                add(new ManifestEntry("2", "b"));
            }
        };
        replacedert.replacedertEquals(0, ManifestValidator.validateEntries(entriesFromManifest, entriesFromSignature, "").size());
    }

    @Test
    public void validateEntriesUnOrdered() throws Exception {
        Map<String, ManifestEntry> entriesFromManifest = new HashMap<String, ManifestEntry>() {

            {
                put("1", new ManifestEntry("1", "a"));
                put("2", new ManifestEntry("2", "b"));
            }
        };
        Set<ManifestEntry> entriesFromSignature = new HashSet<ManifestEntry>() {

            {
                add(new ManifestEntry("2", "b"));
                add(new ManifestEntry("1", "a"));
            }
        };
        replacedert.replacedertEquals(0, ManifestValidator.validateEntries(entriesFromManifest, entriesFromSignature, "").size());
    }

    @Test
    public void validateEntriesNotEqual() throws Exception {
        Map<String, ManifestEntry> entriesFromManifest = new HashMap<String, ManifestEntry>() {

            {
                put("1", new ManifestEntry("1", "a"));
                put("2", new ManifestEntry("2", "b"));
                put("2", new ManifestEntry("2", "f"));
            }
        };
        Set<ManifestEntry> entriesFromSignature = new HashSet<ManifestEntry>() {

            {
                add(new ManifestEntry("1", "a"));
                add(new ManifestEntry("2", "b"));
            }
        };
        List<ManifestErrorMessage> manifestErrorMessageList = ManifestValidator.validateEntries(entriesFromManifest, entriesFromSignature, "S0");
        replacedert.replacedertEquals(1, manifestErrorMessageList.size());
        ManifestErrorMessage manifestErrorMessage = manifestErrorMessageList.get(0);
        replacedert.replacedertEquals("Manifest file has an entry for file <2> with mimetype <f> but the signature file for " + "signature S0 indicates the mimetype is <b>", manifestErrorMessage.getErrorMessage());
        replacedert.replacedertEquals("S0", manifestErrorMessage.getSignatureId());
    }

    @Test
    public void validateEntriesNotEqualValueSwapped() throws Exception {
        Map<String, ManifestEntry> entriesFromManifest = new HashMap<String, ManifestEntry>() {

            {
                put("1", new ManifestEntry("1", "a"));
                put("2", new ManifestEntry("2", "b"));
            }
        };
        Set<ManifestEntry> entriesFromSignature = new HashSet<ManifestEntry>() {

            {
                add(new ManifestEntry("1", "b"));
                add(new ManifestEntry("2", "a"));
            }
        };
        List<ManifestErrorMessage> manifestErrorMessageList = ManifestValidator.validateEntries(entriesFromManifest, entriesFromSignature, "S0");
        replacedert.replacedertEquals(2, manifestErrorMessageList.size());
        ManifestErrorMessage file1ManifestErrorMessage = manifestErrorMessageList.get(0);
        replacedert.replacedertEquals("Manifest file has an entry for file <1> with mimetype <a> but the signature file for " + "signature S0 indicates the mimetype is <b>", file1ManifestErrorMessage.getErrorMessage());
        replacedert.replacedertEquals("S0", file1ManifestErrorMessage.getSignatureId());
        ManifestErrorMessage file2ManifestErrorMessage = manifestErrorMessageList.get(1);
        replacedert.replacedertEquals("Manifest file has an entry for file <2> with mimetype <b> but the signature file for " + "signature S0 indicates the mimetype is <a>", file2ManifestErrorMessage.getErrorMessage());
        replacedert.replacedertEquals("S0", file2ManifestErrorMessage.getSignatureId());
    }

    @Test
    public void validateEntriesMissingEntryInSignature() throws Exception {
        Map<String, ManifestEntry> entriesFromManifest = new HashMap<String, ManifestEntry>() {

            {
                put("1", new ManifestEntry("1", "a"));
                put("2", new ManifestEntry("2", "b"));
                put("3", new ManifestEntry("3", "c"));
            }
        };
        Set<ManifestEntry> entriesFromSignature = new HashSet<ManifestEntry>() {

            {
                add(new ManifestEntry("1", "a"));
                add(new ManifestEntry("3", "c"));
            }
        };
        List<ManifestErrorMessage> manifestErrorMessageList = ManifestValidator.validateEntries(entriesFromManifest, entriesFromSignature, "S0");
        replacedert.replacedertEquals(1, manifestErrorMessageList.size());
        ManifestErrorMessage manifestErrorMessage = manifestErrorMessageList.get(0);
        replacedert.replacedertEquals("Manifest file has an entry for file <2> with mimetype <b> but the signature file for " + "signature S0 does not have an entry for this file", manifestErrorMessage.getErrorMessage());
        replacedert.replacedertEquals("S0", manifestErrorMessage.getSignatureId());
    }

    @Test
    public void validateEntriesMissingEntryInManifest() throws Exception {
        Map<String, ManifestEntry> entriesFromManifest = new HashMap<String, ManifestEntry>() {

            {
                put("1", new ManifestEntry("1", "a"));
                put("3", new ManifestEntry("3", "c"));
            }
        };
        Set<ManifestEntry> entriesFromSignature = new HashSet<ManifestEntry>() {

            {
                add(new ManifestEntry("1", "a"));
                add(new ManifestEntry("2", "b"));
                add(new ManifestEntry("3", "c"));
            }
        };
        List<ManifestErrorMessage> manifestErrorMessageList = ManifestValidator.validateEntries(entriesFromManifest, entriesFromSignature, "S1");
        replacedert.replacedertEquals(1, manifestErrorMessageList.size());
        ManifestErrorMessage manifestErrorMessage = manifestErrorMessageList.get(0);
        replacedert.replacedertEquals("The signature file for signature S1 has an entry for file <2> with mimetype <b> but the " + "manifest file does not have an entry for this file", manifestErrorMessage.getErrorMessage());
        replacedert.replacedertEquals("S1", manifestErrorMessage.getSignatureId());
    }

    @Test
    public void validateHealthyContainer() throws Exception {
        ManifestParser manifestParser = this.createManifest(dataFile("test.txt", "text/plain"));
        List<DSSDoreplacedent> detachedContents = Arrays.asList(detachedContent("test.txt", "text/plain"));
        List<Signature> signatures = this.openSignature("src/test/resources/testFiles/xades/test-bdoc-ts.xml", detachedContents);
        List<ManifestErrorMessage> errors = new ManifestValidator(manifestParser, detachedContents, signatures).validateDoreplacedent();
        replacedert.replacedertTrue(errors.isEmpty());
    }

    @Test
    public void container_withDifferentDataFileName_shouldBeInvalid() throws Exception {
        ManifestParser manifestParser = this.createManifest(dataFile("test.txt", "text/plain"));
        List<DSSDoreplacedent> detachedContents = Arrays.asList(detachedContent("other.txt", "text/plain"), detachedContent("test.txt", "text/plain"));
        List<Signature> signatures = this.openSignature("src/test/resources/testFiles/xades/test-bdoc-ts.xml", detachedContents);
        List<ManifestErrorMessage> errors = new ManifestValidator(manifestParser, detachedContents, signatures).validateDoreplacedent();
        replacedert.replacedertFalse(errors.isEmpty());
        ManifestErrorMessage manifestErrorMessage = errors.get(0);
        replacedert.replacedertEquals("Container contains a file named <other.txt> which is not found in the signature file", manifestErrorMessage.getErrorMessage());
        replacedert.replacedertEquals("", manifestErrorMessage.getSignatureId());
    }

    @Test
    public void container_withSpecialDataFileCharacters_shouldBeValid() throws Exception {
        ManifestParser manifestParser = this.createManifest(dataFile("dds_JÜRIÖÖ € žŠ päev.txt", "application/octet-stream"));
        List<DSSDoreplacedent> detachedContents = Arrays.asList(detachedContent("dds_JÜRIÖÖ € žŠ päev.txt", "application/octet-stream"));
        List<Signature> signatures = this.openSignature("src/test/resources/testFiles/xades/test-bdoc-specia-chars-data-file.xml", detachedContents);
        List<ManifestErrorMessage> errors = new ManifestValidator(manifestParser, detachedContents, signatures).validateDoreplacedent();
        replacedert.replacedertTrue(errors.isEmpty());
    }

    /*
   * RESTRICTED METHODS
   */
    private List<Signature> openSignature(String signaturePath, List<DSSDoreplacedent> detachedContents) {
        AsicSignatureParser signatureParser = new AsicSignatureParser(detachedContents, configuration);
        FileDoreplacedent signatureDoreplacedent = new FileDoreplacedent(signaturePath);
        XadesSignature xadesSignature = signatureParser.parse(signatureDoreplacedent);
        XadesSignatureWrapper signatureWrapper = new XadesSignatureWrapper(xadesSignature, signatureDoreplacedent);
        BDocSignatureOpener signatureOpener = new BDocSignatureOpener(configuration);
        AsicSignature signature = signatureOpener.open(signatureWrapper);
        signature.getOrigin().getDssSignature().checkSignatureIntegrity();
        List<Signature> signatureList = new ArrayList<>(1);
        signatureList.add(signature);
        return signatureList;
    }

    private DataFile dataFile(String fileName, String mimeType) {
        return new DataFile(new byte[] { 1, 2, 3 }, fileName, mimeType);
    }

    private ManifestParser createManifest(DataFile... dataFile) {
        AsicManifest asicManifest = new AsicManifest();
        asicManifest.addFileEntry(Arrays.asList(dataFile));
        DSSDoreplacedent manifestFile = new InMemoryDoreplacedent(asicManifest.getBytes());
        return new ManifestParser(manifestFile);
    }

    private DSSDoreplacedent detachedContent(String name, String mimeType) {
        return new InMemoryDoreplacedent(new byte[] { 1, 2, 3 }, name, MimeType.fromMimeTypeString(mimeType));
    }
}

19 View Complete Implementation : CustomContainerBuilder.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
private Container instantiateContainer(String containerFilePath, Configuration configuration) {
    Clreplaced<?>[] parameterTypes = new Clreplaced[] { String.clreplaced, Configuration.clreplaced };
    Object[] constructorArguments = new Object[] { containerFilePath, configuration };
    return instantiateContainer(parameterTypes, constructorArguments);
}

19 View Complete Implementation : ConfigManagerInitializer.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * @param configuration configuration
 */
public static synchronized void forceInitConfigManager(Configuration configuration) {
    logger.info("Initializing DDoc configuration manager");
    ConfigManager.init(configuration.getDDoc4JConfiguration());
    ConfigManager.addProvider();
    configManagerInitialized = true;
}

19 View Complete Implementation : TestTSLUtil.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * This might be needed to validate already created containers that use test certificates but are timestamped by live TSA
 * @param configuration the configuration to add the certificate.
 * @return the same configuration with certificate added to TSL
 */
public static Configuration addSkTsaCertificateToTsl(Configuration configuration) {
    return TestTreplacedil.addCertificateFromFileToTsl(configuration, "src/test/resources/testFiles/certs/SK_TSA.pem.crt");
}

19 View Complete Implementation : MockConfigManagerInitializer.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
@Override
protected void initializeDDoc4JConfigManager(Configuration configuration) {
    super.initializeDDoc4JConfigManager(configuration);
    configManagerCallCount++;
}

19 View Complete Implementation : ConfigManagerInitializer.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
protected synchronized void initializeDDoc4JConfigManager(Configuration configuration) {
    // Using double-checked locking to avoid other threads to start initialization
    if (!configManagerInitialized) {
        forceInitConfigManager(configuration);
    }
}

19 View Complete Implementation : CustomContainerBuilder.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
private Container instantiateContainer(InputStream containerInputStream, Configuration configuration) {
    Clreplaced<?>[] parameterTypes = new Clreplaced[] { InputStream.clreplaced, Configuration.clreplaced };
    Object[] constructorArguments = new Object[] { containerInputStream, configuration };
    return instantiateContainer(parameterTypes, constructorArguments);
}

19 View Complete Implementation : CustomContainerBuilder.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
private Container instantiateContainer(Configuration configuration) {
    Clreplaced<?>[] parameterTypes = new Clreplaced[] { Configuration.clreplaced };
    Object[] constructorArguments = new Object[] { configuration };
    return instantiateContainer(parameterTypes, constructorArguments);
}

18 View Complete Implementation : OcspResponderValidator.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * Validator of OCSP responder for TM
 */
public clreplaced OcspResponderValidator {

    private XadesSignature signature;

    private Configuration configuration;

    /**
     * Constructor of the validator
     *
     * @param signature Xades signature object
     */
    public OcspResponderValidator(XadesSignature signature, Configuration configuration) {
        this.signature = signature;
        this.configuration = configuration;
    }

    /**
     * Method for asking if OCSP responder is valid or not.
     *
     * @return True if OCSP response is valid, false otherwise.
     */
    public boolean isValid() {
        if (SignatureProfile.LT_TM != signature.getProfile()) {
            return true;
        }
        try {
            return isOcspResponderCommonNameValid(signature.getOCSPCertificate());
        } catch (CertificateNotFoundException e) {
            return false;
        }
    }

    private boolean isOcspResponderCommonNameValid(X509Cert ocspCertificate) {
        if (ocspCertificate == null) {
            return false;
        }
        try {
            X500Name x500name = new JcaX509CertificateHolder(ocspCertificate.getX509Certificate()).getSubject();
            RDN dn = x500name.getRDNs(BCStyle.CN)[0];
            String commonName = IETFUtils.valueToString(dn.getFirst().getValue());
            return configuration.getAllowedOcspRespondersForTM().contains(commonName);
        } catch (CertificateEncodingException e) {
            throw new DigiDoc4JException("OCSP certificate encoding failed ", e);
        }
    }
}

18 View Complete Implementation : TslDataLoaderFactory.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * Manages the creation of data loaders for downloading certificates from the Trust Store (TSL).
 */
public clreplaced TslDataLoaderFactory implements DataLoaderFactory {

    private static final Logger logger = LoggerFactory.getLogger(TslDataLoaderFactory.clreplaced);

    private Configuration configuration;

    private File fileCacheDirectory;

    public TslDataLoaderFactory(Configuration configuration, File fileCacheDirectory) {
        this.configuration = configuration;
        this.fileCacheDirectory = fileCacheDirectory;
    }

    @Override
    public DataLoader create() {
        if (configuration.getTslDataLoaderFactory() == null) {
            return createDataLoader();
        } else {
            logger.debug("Using custom TSL data loader factory provided by the configuration");
            return configuration.getTslDataLoaderFactory().create();
        }
    }

    private DataLoader createDataLoader() {
        CommonsDataLoader commonsDataLoader = new CommonsDataLoader();
        if (Protocol.isHttpUrl(this.configuration.getTslLocation())) {
            DataLoaderDecorator.decorateWithProxySettingsFor(ExternalConnectionType.TSL, commonsDataLoader, configuration);
            DataLoaderDecorator.decorateWithSslSettingsFor(ExternalConnectionType.TSL, commonsDataLoader, configuration);
            commonsDataLoader.setTimeoutConnection(this.configuration.getConnectionTimeout());
            commonsDataLoader.setTimeoutSocket(this.configuration.getSocketTimeout());
            FileCacheDataLoader fileCacheDataLoader = new FileCacheDataLoader(commonsDataLoader);
            fileCacheDataLoader.setCacheExpirationTime(this.configuration.getTslCacheExpirationTime());
            fileCacheDataLoader.setFileCacheDirectory(this.fileCacheDirectory);
            logger.debug("Using file cache directory for storing TSL: {}", this.fileCacheDirectory);
            return fileCacheDataLoader;
        } else {
            return commonsDataLoader;
        }
    }
}

18 View Complete Implementation : TslLoader.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * TSL loader
 */
public clreplaced TslLoader implements Serializable {

    public static final File fileCacheDirectory = new File(System.getProperty("java.io.tmpdir") + "/digidoc4jTSLCache");

    private static final Logger logger = LoggerFactory.getLogger(TslLoader.clreplaced);

    private static final String DEFAULT_KEYSTORE_TYPE = "JKS";

    private transient TSLRepository tslRepository;

    private transient TSLCertificateSourceImpl tslCertificateSource;

    private transient TSLValidationJob tslValidationJob;

    private Configuration configuration;

    private boolean checkSignature = true;

    /**
     * @param configuration configuration context
     */
    public TslLoader(Configuration configuration) {
        this.configuration = configuration;
    }

    public static void invalidateCache() {
        logger.info("Cleaning TSL cache directory at {}", TslLoader.fileCacheDirectory.getPath());
        try {
            if (TslLoader.fileCacheDirectory.exists()) {
                FileUtils.cleanDirectory(TslLoader.fileCacheDirectory);
            } else {
                logger.debug("TSL cache directory doesn't exist");
            }
        } catch (Exception e) {
            throw new DigiDoc4JException(e);
        }
    }

    public void prepareTsl() {
        try {
            this.tslCertificateSource = new TSLCertificateSourceImpl();
            this.tslRepository = new TSLRepository();
            this.tslRepository.setTrustedListsCertificateSource(this.tslCertificateSource);
            this.tslValidationJob = this.createTslValidationJob(this.tslRepository);
        } catch (DSSException e) {
            throw new TslCertificateSourceInitializationException("Failed to initialize TSL: " + e.getMessage(), e);
        }
    }

    private TSLValidationJob createTslValidationJob(TSLRepository repository) {
        TSLValidationJob job = new TSLValidationJob();
        job.setDataLoader(new TslDataLoaderFactory(this.configuration, fileCacheDirectory).create());
        job.setOjContentKeyStore(this.getKeyStore());
        job.setLotlUrl(this.configuration.getTslLocation());
        job.setLotlCode("EU");
        job.setRepository(repository);
        job.setCheckLOTLSignature(this.checkSignature);
        job.setCheckTSLSignatures(this.checkSignature);
        job.setOjUrl("");
        job.setFilterTerritories(this.configuration.getTrustedTerritories());
        return job;
    }

    private KeyStoreCertificateSource getKeyStore() {
        try (InputStream tslKeyStoreInputStream = openTslKeyStoreInputStream()) {
            return new KeyStoreCertificateSource(tslKeyStoreInputStream, DEFAULT_KEYSTORE_TYPE, this.configuration.getTslKeyStorePreplacedword());
        } catch (IOException e) {
            throw new TslKeyStoreNotFoundException("Unable to retrieve keystore", e);
        }
    }

    private InputStream openTslKeyStoreInputStream() throws IOException, TslKeyStoreNotFoundException {
        String keystoreLocation = this.configuration.getTslKeyStoreLocation();
        if (ResourceUtils.isFileReadable(keystoreLocation)) {
            return new FileInputStream(keystoreLocation);
        }
        InputStream in = getClreplaced().getClreplacedLoader().getResourcereplacedtream(keystoreLocation);
        if (in == null) {
            throw new TslKeyStoreNotFoundException("Unable to retrieve TSL keystore", new RuntimeException(String.format("Keystore not found by location <%s>", keystoreLocation)));
        }
        return in;
    }

    /*
   * ACCESSORS
   */
    public void setCheckSignature(boolean checkSignature) {
        this.checkSignature = checkSignature;
    }

    public TSLCertificateSourceImpl getTslCertificateSource() {
        return tslCertificateSource;
    }

    public TSLValidationJob getTslValidationJob() {
        return tslValidationJob;
    }

    public TSLRepository getTslRepository() {
        return tslRepository;
    }
}

18 View Complete Implementation : TslManager.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
public clreplaced TslManager implements Serializable {

    private static final Logger logger = LoggerFactory.getLogger(TslManager.clreplaced);

    private TSLCertificateSource tslCertificateSource;

    private Configuration configuration;

    public TslManager(Configuration configuration) {
        this.configuration = configuration;
    }

    public TSLCertificateSource getTsl() {
        if (this.tslCertificateSource != null) {
            logger.debug("Using TSL cached copy");
            return tslCertificateSource;
        }
        this.loadTsl();
        return this.tslCertificateSource;
    }

    public void setTsl(TSLCertificateSource certificateSource) {
        this.tslCertificateSource = certificateSource;
    }

    /**
     * Loading TSL in a single thread in a synchronized block to avoid duplicate TSL loading by multiple threads.
     */
    private synchronized void loadTsl() {
        // Using double-checked locking to avoid other threads to start loading TSL
        if (this.tslCertificateSource == null) {
            logger.debug("Loading TSL in a synchronized block");
            TslLoader tslLoader = new TslLoader(this.configuration);
            tslLoader.setCheckSignature(true);
            LazyTslCertificateSource lazyTsl = new LazyTslCertificateSource(tslLoader);
            lazyTsl.setCacheExpirationTime(this.configuration.getTslCacheExpirationTime());
            this.tslCertificateSource = lazyTsl;
            logger.debug("Finished loading TSL in a synchronized block");
        }
    }
}

18 View Complete Implementation : ThreadPoolManager.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * Thread pool manager
 */
public clreplaced ThreadPoolManager {

    private static final Logger logger = LoggerFactory.getLogger(ThreadPoolManager.clreplaced);

    private static ExecutorService defaultThreadExecutor;

    private Configuration configuration;

    /**
     * @param configuration configuration context
     */
    public ThreadPoolManager(Configuration configuration) {
        this.configuration = configuration;
    }

    /**
     * @param threadExecutor default thread executor
     */
    public static void setDefaultThreadExecutor(ExecutorService threadExecutor) {
        ThreadPoolManager.defaultThreadExecutor = threadExecutor;
    }

    /**
     * @return default thread executor
     */
    public static ExecutorService getDefaultThreadExecutor() {
        return ThreadPoolManager.defaultThreadExecutor;
    }

    public ExecutorService getThreadExecutor() {
        if (this.configuration.getThreadExecutor() != null) {
            return this.configuration.getThreadExecutor();
        }
        if (ThreadPoolManager.defaultThreadExecutor == null) {
            ThreadPoolManager.initializeDefaultThreadExecutor();
        }
        return ThreadPoolManager.defaultThreadExecutor;
    }

    public <T> Future<T> submit(Callable<T> task) {
        return this.getThreadExecutor().submit(task);
    }

    /*
   * RESTRICTED METHODS
   */
    private static synchronized void initializeDefaultThreadExecutor() {
        // Using double-checked locking to avoid other threads to start initializing another executor
        if (ThreadPoolManager.defaultThreadExecutor == null) {
            int numberOfProcessors = Runtime.getRuntime().availableProcessors();
            logger.debug("Initializing a new default thread pool executor with <{}> threads", numberOfProcessors);
            ThreadPoolManager.defaultThreadExecutor = Executors.newFixedThreadPool(numberOfProcessors);
        }
    }
}

18 View Complete Implementation : XadesSignatureValidatorFactory.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
public clreplaced XadesSignatureValidatorFactory {

    private Configuration configuration;

    private XadesSignature signature;

    public XadesSignatureValidator create() {
        SignatureProfile profile = signature.getProfile();
        XadesSignatureValidator xadesValidator;
        if (profile == SignatureProfile.B_BES) {
            xadesValidator = new XadesSignatureValidator(signature, configuration);
        } else if (profile == SignatureProfile.LT_TM) {
            xadesValidator = new TimemarkSignatureValidator(signature, configuration);
        } else if (profile == SignatureProfile.LT) {
            xadesValidator = new TimestampSignatureValidator(signature, configuration);
        } else {
            xadesValidator = new TimestampSignatureValidator(signature, configuration);
        }
        return xadesValidator;
    }

    public void setConfiguration(Configuration configuration) {
        this.configuration = configuration;
    }

    public void setSignature(XadesSignature signature) {
        this.signature = signature;
    }
}

18 View Complete Implementation : ConfigurationSingeltonHolder.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * Configuration holder
 */
public clreplaced ConfigurationSingeltonHolder {

    private static final Logger logger = LoggerFactory.getLogger(ConfigurationSingeltonHolder.clreplaced);

    private static volatile Configuration configuration;

    /**
     * A thread-safe way of getting a single configuration object.
     */
    public static Configuration getInstance() {
        if (configuration == null) {
            // Using double-checked locking for ensuring that no other thread has started initializing Configuration object already
            synchronized (ConfigurationSingeltonHolder.clreplaced) {
                if (configuration == null) {
                    logger.info("Creating a new configuration instance");
                    configuration = new Configuration();
                }
            }
        } else {
            logger.info("Using existing configuration instance");
        }
        return configuration;
    }

    /**
     * @return configuration context
     */
    public static boolean isInitialized() {
        return ConfigurationSingeltonHolder.configuration != null;
    }

    protected static void reset() {
        configuration = null;
    }
}

18 View Complete Implementation : ConfigManagerInitializer.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * @param configuration configuration
 */
public void initConfigManager(Configuration configuration) {
    if (!configManagerInitialized) {
        initializeDDoc4JConfigManager(configuration);
    } else {
        logger.debug("Skipping DDoc configuration manager initialization");
    }
}

18 View Complete Implementation : OCSPCertificateValidator.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * Implementation clreplaced for validating certificates by using OCSP requests
 * <p>
 * Created by Janar Rahumeel (CGI Estonia)
 */
public clreplaced OCSPCertificateValidator implements CertificateValidator {

    private static final Logger LOGGER = LoggerFactory.getLogger(OCSPCertificateValidator.clreplaced);

    private final Configuration configuration;

    private final CertificateSource certificateSource;

    private final OCSPSource ocspSource;

    /**
     * @param configuration     configuration context
     * @param certificateSource the source of certificates
     * @param ocspSource        the source of OCSP
     */
    public OCSPCertificateValidator(Configuration configuration, CertificateSource certificateSource, OCSPSource ocspSource) {
        this.configuration = configuration;
        this.certificateSource = certificateSource;
        this.ocspSource = ocspSource;
    }

    @Override
    public void validate(X509Certificate subjectCertificate) throws CertificateValidationException {
        try {
            if (subjectCertificate == null) {
                throw new IllegalArgumentException("Subject certificate is not provided");
            }
            CertificateToken issuerCertificateToken = this.getIssuerCertificateToken(subjectCertificate);
            this.ocspSource.getRevocationToken(new CertificateToken(subjectCertificate), issuerCertificateToken);
        } catch (CertificateValidationException | NetworkException e) {
            throw e;
        } catch (Exception e) {
            throw CertificateValidationException.of(CertificateValidationStatus.TECHNICAL, "OCSP validation failed", e);
        }
    }

    /*
   * RESTRICTED METHODS
   */
    private CertificateToken getIssuerCertificateToken(X509Certificate certificate) throws CertificateEncodingException {
        CertificateToken certificateToken = null;
        try {
            certificateToken = DSSUtils.loadCertificate(certificate.getEncoded());
            return this.getIssuerForCertificateToken(certificateToken);
        } catch (IllegalStateException e) {
            LOGGER.warn("Certificate with DSS ID <{}> is untrusted. Not all the intermediate certificates added into OCSP" + " certificate source?", (certificateToken == null) ? certificate.getSubjectX500Principal().getName() : certificateToken.getDSSIdreplacedtring(), e);
        }
        throw CertificateValidationException.of(CertificateValidationStatus.UNTRUSTED, "Failed to parse issuer certificate token. Not all intermediate certificates added into OCSP.");
    }

    private CertificateToken getIssuerForCertificateToken(CertificateToken certificateToken) {
        List<CertificateToken> tokens = this.getIssuerFromCertificateSource(certificateToken);
        if (tokens.size() != 1) {
            throw new IllegalStateException(String.format("<%s> matching certificate tokens found from certificate source", tokens.size()));
        }
        return tokens.get(0);
    }

    private List<CertificateToken> getIssuerFromCertificateSource(CertificateToken certificateToken) {
        List<CertificateToken> issuers = this.configuration.getTSL().getCertificatePool().getIssuers(certificateToken);
        if (CollectionUtils.isEmpty(issuers)) {
            issuers = this.certificateSource.getCertificatePool().getIssuers(certificateToken);
        }
        return issuers;
    }

    /*
   * ACCESSORS
   */
    @Override
    public CertificateSource getCertificateSource() {
        return certificateSource;
    }
}

18 View Complete Implementation : OcspDataLoaderFactory.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * Manages the creation of new data loaders for getting OCSP responses.
 */
public clreplaced OcspDataLoaderFactory implements DataLoaderFactory {

    private static final Logger logger = LoggerFactory.getLogger(OcspDataLoaderFactory.clreplaced);

    private Configuration configuration;

    private String userAgent;

    public OcspDataLoaderFactory(Configuration configuration, String userAgent) {
        this.configuration = configuration;
        this.userAgent = userAgent;
    }

    @Override
    public DataLoader create() {
        if (configuration.getOcspDataLoaderFactory() == null) {
            return createDataLoader();
        } else {
            logger.debug("Using custom ocsp data loader factory provided by the configuration");
            return configuration.getOcspDataLoaderFactory().create();
        }
    }

    private DataLoader createDataLoader() {
        logger.debug("Creating OCSP data loader");
        SkDataLoader dataLoader = new SkOCSPDataLoader(configuration);
        dataLoader.setUserAgent(userAgent);
        return dataLoader;
    }
}

18 View Complete Implementation : PadesContainer.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * Created by Andrei on 17.11.2017.
 */
public clreplaced PadesContainer implements Container {

    static {
        PdfObjFactory.setInstance(new PdfBoxDefaultObjectFactory());
    }

    private static final Logger logger = LoggerFactory.getLogger(PadesContainer.clreplaced);

    public static final String PADES = "PADES";

    private final Configuration configuration;

    private final String containerPath;

    /**
     * @param configuration configuration context
     * @param containerPath the path of container
     */
    public PadesContainer(Configuration configuration, String containerPath) {
        this.configuration = configuration;
        this.containerPath = containerPath;
    }

    @Override
    public DataFile addDataFile(String path, String mimeType) {
        throw new NotYetImplementedException();
    }

    @Override
    public DataFile addDataFile(InputStream is, String fileName, String mimeType) {
        throw new NotYetImplementedException();
    }

    @Override
    public DataFile addDataFile(File file, String mimeType) {
        throw new NotYetImplementedException();
    }

    @Override
    public void addDataFile(DataFile dataFile) {
        throw new NotYetImplementedException();
    }

    @Override
    public void addSignature(Signature signature) {
        throw new NotYetImplementedException();
    }

    @Override
    public List<DataFile> getDataFiles() {
        throw new NotYetImplementedException();
    }

    @Override
    public String getType() {
        return PADES;
    }

    @Override
    public List<Signature> getSignatures() {
        throw new NotYetImplementedException();
    }

    @Override
    public void removeDataFile(DataFile file) {
        throw new NotYetImplementedException();
    }

    @Override
    public void removeSignature(Signature signature) {
        throw new NotYetImplementedException();
    }

    @Override
    public void extendSignatureProfile(SignatureProfile profile) {
        throw new NotYetImplementedException();
    }

    @Override
    public File saveAsFile(String filePath) {
        throw new NotYetImplementedException();
    }

    @Override
    public InputStream savereplacedtream() {
        throw new NotYetImplementedException();
    }

    /**
     * Validate pades container
     *
     * @return ValidationResult
     */
    public ContainerValidationResult validate() {
        FileDoreplacedent doreplacedent = new FileDoreplacedent(new File(this.containerPath));
        SignedDoreplacedentValidator validator = new PDFDoreplacedentValidator(new FileDoreplacedent(new File(this.containerPath)));
        if (!validator.isSupported(doreplacedent)) {
            String message = "Invalid PDF doreplacedent provided!";
            logger.error(message);
            throw new DigiDoc4JException(message);
        }
        validator.setCertificateVerifier(createCertificateVerifier());
        Reports reports = validator.validateDoreplacedent(this.getClreplaced().getClreplacedLoader().getResourcereplacedtream(this.configuration.getValidationPolicy()));
        PadesContainerValidationResult result = new PadesContainerValidationResult(reports.getSimpleReport());
        result.setReport(reports.getXmlSimpleReport());
        for (String id : reports.getSimpleReport().getSignatureIdList()) {
            Indication indication = reports.getSimpleReport().getIndication(id);
            if (!Indication.TOTAL_PreplacedED.equals(indication)) {
                result.getErrors().addAll(this.getExceptions(reports.getSimpleReport().getErrors(id)));
                result.getWarnings().addAll(this.getExceptions(reports.getSimpleReport().getWarnings(id)));
            }
        }
        addRevocationErrors(result, reports);
        result.print(this.configuration);
        return result;
    }

    /**
     * Copied from {@link TimestampSignatureValidator#addRevocationErrors()}
     * TODO: Refactor to avoid code duplications & add further error checking
     */
    private void addRevocationErrors(PadesContainerValidationResult result, Reports reports) {
        DiagnosticData diagnosticData = reports.getDiagnosticData();
        if (diagnosticData == null) {
            return;
        }
        RevocationType certificateRevocationSource = diagnosticData.getCertificateRevocationSource(diagnosticData.getFirstSigningCertificateId());
        logger.debug("Revocation source is <{}>", certificateRevocationSource);
        if (RevocationType.CRL.equals(certificateRevocationSource)) {
            logger.error("Signing certificate revocation source is CRL instead of OCSP");
            result.getErrors().add(new UntrustedRevocationSourceException());
        }
    }

    @Override
    public void setTimeStampToken(DataFile timeStampToken) {
        throw new NotSupportedException("Not for Pades container");
    }

    @Override
    public DataFile getTimeStampToken() {
        throw new NotSupportedException("Not for Pades container");
    }

    private List<DigiDoc4JException> getExceptions(List<String> exceptionString) {
        List<DigiDoc4JException> exc = new ArrayList<>();
        for (String s : exceptionString) {
            exc.add(new DigiDoc4JException(s));
        }
        return exc;
    }

    @Override
    public SignedInfo prepareSigning(X509Certificate signerCert) {
        throw new NotYetImplementedException();
    }

    @Override
    public Configuration getConfiguration() {
        return configuration;
    }

    @Override
    public String getSignatureProfile() {
        throw new NotYetImplementedException();
    }

    @Override
    public void setSignatureParameters(SignatureParameters signatureParameters) {
        throw new NotYetImplementedException();
    }

    @Override
    public DigestAlgorithm getDigestAlgorithm() {
        throw new NotYetImplementedException();
    }

    @Override
    public void addRawSignature(byte[] signature) {
        throw new NotYetImplementedException();
    }

    @Override
    public void addRawSignature(InputStream signatureStream) {
        throw new NotYetImplementedException();
    }

    @Override
    public DataFile getDataFile(int index) {
        throw new NotYetImplementedException();
    }

    @Override
    public int countDataFiles() {
        throw new NotYetImplementedException();
    }

    @Override
    public void removeDataFile(String fileName) {
        throw new NotYetImplementedException();
    }

    @Override
    public void removeSignature(int signatureId) {
        throw new NotYetImplementedException();
    }

    @Override
    public void save(String path) {
        throw new NotYetImplementedException();
    }

    @Override
    public void save(OutputStream out) {
        throw new NotYetImplementedException();
    }

    @Override
    public Signature sign(SignatureToken signatureToken) {
        throw new NotYetImplementedException();
    }

    @Override
    public Signature signRaw(byte[] rawSignature) {
        throw new NotYetImplementedException();
    }

    @Override
    public Signature getSignature(int index) {
        throw new NotYetImplementedException();
    }

    @Override
    public int countSignatures() {
        throw new NotYetImplementedException();
    }

    @Override
    public DoreplacedentType getDoreplacedentType() {
        throw new NotYetImplementedException();
    }

    @Override
    public String getVersion() {
        throw new NotYetImplementedException();
    }

    @Override
    public void extendTo(SignatureProfile profile) {
        throw new NotYetImplementedException();
    }

    @Override
    public void setSignatureProfile(SignatureProfile profile) {
        throw new NotYetImplementedException();
    }

    private CertificateVerifier createCertificateVerifier() {
        logger.debug("Creating new certificate verifier");
        CertificateVerifier certificateVerifier = new SKCommonCertificateVerifier();
        // Disable CRL checks
        certificateVerifier.setCrlSource(null);
        // Disable CRL checks
        certificateVerifier.setSignatureCRLSource(null);
        logger.debug("Setting trusted cert source to the certificate verifier");
        certificateVerifier.setTrustedCertSource(configuration.getTSL());
        logger.debug("Finished creating certificate verifier");
        return certificateVerifier;
    }
}

18 View Complete Implementation : SKOnlineOCSPSource.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * SK OCSP source location.
 */
public abstract clreplaced SKOnlineOCSPSource implements OCSPSource {

    public static final String OID_OCSP_SIGNING = "1.3.6.1.5.5.7.3.9";

    private static final Logger LOGGER = LoggerFactory.getLogger(SKOnlineOCSPSource.clreplaced);

    private DataLoader dataLoader;

    private Configuration configuration;

    /**
     * SK Online OCSP Source constructor
     *
     * @param configuration configuration to use for this source
     */
    public SKOnlineOCSPSource(Configuration configuration) {
        this.configuration = configuration;
    }

    @Override
    public OCSPToken getRevocationToken(CertificateToken certificateToken, CertificateToken issuerCertificateToken) {
        LOGGER.debug("Getting OCSP token ...");
        if (this.dataLoader == null) {
            throw new TechnicalException("Data loader is null");
        }
        if (LOGGER.isTraceEnabled()) {
            LOGGER.trace("Querying by DSS ID <{}>", certificateToken.getDSSIdreplacedtring());
        }
        String accessLocation = getAccessLocation(certificateToken.getCertificate());
        try {
            return queryOCSPToken(accessLocation, certificateToken, issuerCertificateToken);
        // DSS ignores and silently consumes DSSException resulting with invalid signature without OCSP.
        // Must rethrow as other exception to stop the signing process - no OCSP, no signature.
        // Any OCSP query exception should stop the signing process.
        } catch (DSSException e) {
            throw new TechnicalException("OCSP request failed", e);
        // Attach common data to CertificateValidationException and rethrow
        } catch (CertificateValidationException e) {
            e.setServiceType(getOCSPType());
            e.setServiceUrl(accessLocation);
            throw e;
        }
    }

    /**
     * Returns SK OCSP source location.
     *
     * @param certificate
     * @return OCSP source location
     */
    public String getAccessLocation(X509Certificate certificate) {
        if (getConfiguration() != null) {
            return getConfiguration().getOcspSource();
        }
        return Constant.Test.OCSP_SOURCE;
    }

    /*
   * RESTRICTED METHODS
   */
    protected abstract ServiceType getOCSPType();

    protected abstract Extension createNonce(X509Certificate certificate);

    private OCSPToken queryOCSPToken(String accessLocation, CertificateToken certificateToken, CertificateToken issuerCertificateToken) {
        CertificateID certificateID = DSSRevocationUtils.getOCSPCertificateID(certificateToken, issuerCertificateToken);
        Extension nonceExtension = createNonce(certificateToken.getCertificate());
        byte[] response = dataLoader.post(accessLocation, buildRequest(certificateID, nonceExtension));
        BasicOCSPResp ocspResponse = parseAndVerifyOCSPResponse(response, accessLocation);
        checkNonce(ocspResponse, nonceExtension);
        OCSPToken ocspToken = constructOCSPToken(ocspResponse, certificateID, accessLocation);
        verifyOCSPToken(ocspToken);
        return ocspToken;
    }

    private byte[] buildRequest(final CertificateID certificateID, Extension nonceExtension) {
        try {
            LOGGER.debug("Building OCSP request ...");
            OCSPReqBuilder builder = new OCSPReqBuilder();
            builder.addRequest(certificateID);
            if (nonceExtension != null) {
                builder.setRequestExtensions(new Extensions(nonceExtension));
            }
            if (this.configuration.hasToBeOCSPRequestSigned()) {
                LOGGER.info("Using signed OCSP request ...");
                JcaContentSignerBuilder signerBuilder = new JcaContentSignerBuilder("SHA1withRSA");
                if (!this.configuration.isOCSPSigningConfigurationAvailable()) {
                    throw new ConfigurationException("Configuration needed for OCSP request signing is not complete");
                }
                DSSPrivateKeyEntry privateKeyEntry = this.getOCSPAccessCertificatePrivateKey();
                X509Certificate signingCertificate = privateKeyEntry.getCertificate().getCertificate();
                builder.setRequestorName(new GeneralName(new JcaX509CertificateHolder(signingCertificate).getSubject()));
                return builder.build(signerBuilder.build(((KSPrivateKeyEntry) privateKeyEntry).getPrivateKey()), new X509CertificateHolder[] { new X509CertificateHolder(signingCertificate.getEncoded()) }).getEncoded();
            }
            return builder.build().getEncoded();
        } catch (Exception e) {
            throw new TechnicalException("Failed to construct OCSP request", e);
        }
    }

    private BasicOCSPResp parseAndVerifyOCSPResponse(byte[] response, String accessLocation) {
        try {
            OCSPResp ocspResp = new OCSPResp(response);
            validateOCSPResponseStatus(ocspResp.getStatus(), accessLocation);
            BasicOCSPResp ocspResponse = (BasicOCSPResp) ocspResp.getResponseObject();
            verifyOCSPResponse(ocspResponse);
            return ocspResponse;
        } catch (OCSPException | IOException e) {
            throw CertificateValidationException.of(CertificateValidationStatus.TECHNICAL, "Failed to parse OCSP response", e);
        }
    }

    private void validateOCSPResponseStatus(int ocspResponseStatus, String serviceUrl) {
        if (ocspResponseStatus == OCSPResp.SUCCESSFUL) {
            return;
        }
        LOGGER.warn("OCSP service responded with unsuccessful status <{}>", ocspResponseStatus);
        switch(ocspResponseStatus) {
            case OCSPResp.MALFORMED_REQUEST:
                throw CertificateValidationException.of(CertificateValidationStatus.TECHNICAL, "OCSP request malformed");
            case OCSPResp.INTERNAL_ERROR:
                throw CertificateValidationException.of(CertificateValidationStatus.TECHNICAL, "OCSP service internal error");
            case OCSPResp.SIG_REQUIRED:
                throw CertificateValidationException.of(CertificateValidationStatus.TECHNICAL, "OCSP request not signed");
            case OCSPResp.TRY_LATER:
                throw new ServiceUnavailableException(serviceUrl, getOCSPType());
            case OCSPResp.UNAUTHORIZED:
                throw new ServiceAccessDeniedException(serviceUrl, getOCSPType());
            default:
                throw CertificateValidationException.of(CertificateValidationStatus.TECHNICAL, "OCSP service responded with unknown status <" + ocspResponseStatus + ">");
        }
    }

    private void verifyOCSPResponse(BasicOCSPResp response) throws IOException {
        List<X509CertificateHolder> holders = Arrays.asList(response.getCerts());
        if (CollectionUtils.isNotEmpty(holders)) {
            for (X509CertificateHolder holder : holders) {
                CertificateToken token = DSSUtils.loadCertificate(holder.getEncoded());
                verifyOcspResponderCertificate(token);
                verifyOCSPResponseSignature(token, response);
            }
        } else {
            if (!this.configuration.isTest()) {
                LOGGER.warn("OCSP response signature will not be verified. No response certificates has been found");
            }
        }
    }

    protected void verifyOcspResponderCertificate(CertificateToken token) {
        if (!configuration.getTSL().isTrusted(token)) {
            throw CertificateValidationException.of(CertificateValidationStatus.UNTRUSTED, String.format("OCSP response certificate <%s> match is not found in TSL", token.getDSSIdreplacedtring()));
        }
        try {
            if (!token.getCertificate().getExtendedKeyUsage().contains(OID_OCSP_SIGNING)) {
                throw CertificateValidationException.of(CertificateValidationStatus.TECHNICAL, String.format("OCSP response certificate <%s> does not have 'OCSPSigning' extended key usage", token.getDSSIdreplacedtring()));
            }
        } catch (CertificateParsingException e) {
            throw CertificateValidationException.of(CertificateValidationStatus.TECHNICAL, String.format("Error on verifying 'OCSPSigning' extended key usage for OCSP response certificate <%s>", token.getDSSIdreplacedtring()), e);
        }
    }

    private void verifyOCSPResponseSignature(CertificateToken token, BasicOCSPResp ocspResponse) {
        boolean signatureValid;
        try {
            ContentVerifierProvider provider = new JcaContentVerifierProviderBuilder().setProvider("BC").build(new X509CertificateHolder(token.getEncoded()));
            signatureValid = ocspResponse.isSignatureValid(provider);
        } catch (Exception e) {
            throw CertificateValidationException.of(CertificateValidationStatus.TECHNICAL, "Failed to verify OCSP response signature", e);
        }
        if (!signatureValid) {
            throw CertificateValidationException.of(CertificateValidationStatus.UNTRUSTED, "OCSP response signature is invalid");
        }
    }

    protected DSSPrivateKeyEntry getOCSPAccessCertificatePrivateKey() throws IOException {
        Pkcs12SignatureToken signatureTokenConnection = new Pkcs12SignatureToken(this.configuration.getOCSPAccessCertificateFileName(), new KeyStore.PreplacedwordProtection(this.configuration.getOCSPAccessCertificatePreplacedword()));
        return signatureTokenConnection.getKeys().get(0);
    }

    protected void checkNonce(BasicOCSPResp response, Extension expectedNonceExtension) {
        Extension extension = response.getExtension(OCSPObjectIdentifiers.id_pkix_ocsp_nonce);
        DEROctetString expectedNonce = (DEROctetString) expectedNonceExtension.getExtnValue();
        DEROctetString receivedNonce = (DEROctetString) extension.getExtnValue();
        if (!receivedNonce.equals(expectedNonce)) {
            String errorMessage = String.format("The OCSP request was victim of the replay attack (nonce sent <%s>, nonce received <%s>)", expectedNonce, receivedNonce);
            throw CertificateValidationException.of(CertificateValidationStatus.UNTRUSTED, errorMessage);
        }
    }

    private OCSPToken constructOCSPToken(BasicOCSPResp ocspResponse, CertificateID certificateID, String accessLocation) {
        OCSPToken token = new OCSPToken();
        token.setBasicOCSPResp(ocspResponse);
        token.setCertId(certificateID);
        token.setSourceURL(accessLocation);
        token.initInfo();
        return token;
    }

    private void verifyOCSPToken(OCSPToken token) {
        if (token == null || token.getThisUpdate() == null) {
            throw CertificateValidationException.of(CertificateValidationStatus.TECHNICAL, "OCSP response token is missing");
        }
        if (token.getStatus() != null) {
            if (!token.getStatus()) {
                LOGGER.debug("Certificate with DSS ID <{}> - status <{}>", token.getDSSIdreplacedtring(), token.getReason().name());
                throw CertificateValidationException.of(CertificateValidationStatus.REVOKED, "Certificate status is revoked");
            }
        } else {
            if (token.getReason() != null) {
                LOGGER.debug("Certificate with DSS ID <{}> - status <{}>", token.getDSSIdreplacedtring(), token.getReason().name());
                throw CertificateValidationException.of(CertificateValidationStatus.UNKNOWN, "Certificate is unknown");
            }
        }
    }

    /*
   * ACCESSORS
   */
    /**
     * Gets configuration
     *
     * @return Configuration
     */
    public Configuration getConfiguration() {
        return configuration;
    }

    /**
     * Gets data loader
     *
     * @return DataLoader
     */
    public DataLoader getDataLoader() {
        return dataLoader;
    }

    /**
     * Define data loader.
     *
     * @param dataLoader Data loader object to be used.
     */
    public void setDataLoader(DataLoader dataLoader) {
        this.dataLoader = dataLoader;
    }
}

18 View Complete Implementation : TspDataLoaderFactory.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * Manages the creation of data loaders for getting TimeStamp responses.
 */
public clreplaced TspDataLoaderFactory implements DataLoaderFactory {

    private static final Logger logger = LoggerFactory.getLogger(TspDataLoaderFactory.clreplaced);

    private Configuration configuration;

    private String userAgent;

    public TspDataLoaderFactory(Configuration configuration, String userAgent) {
        this.configuration = configuration;
        this.userAgent = userAgent;
    }

    @Override
    public DataLoader create() {
        if (configuration.getTspDataLoaderFactory() == null) {
            return createDataLoader();
        } else {
            logger.debug("Using custom TSP data loader factory provided by the configuration");
            return configuration.getTspDataLoaderFactory().create();
        }
    }

    private DataLoader createDataLoader() {
        logger.debug("Creating TSP data loader");
        SkDataLoader dataLoader = new SkTimestampDataLoader(configuration);
        dataLoader.setUserAgent(userAgent);
        return dataLoader;
    }
}

18 View Complete Implementation : AsicESignatureOpener.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 *  Clreplaced for converting Xades signature to ASiCE signature.
 */
public clreplaced AsicESignatureOpener implements AsicSignatureOpener {

    private final static Logger logger = LoggerFactory.getLogger(AsicESignatureOpener.clreplaced);

    private Configuration configuration;

    /**
     * Constructor
     *
     * @param configuration configuration
     */
    public AsicESignatureOpener(Configuration configuration) {
        this.configuration = configuration;
    }

    /**
     * Xades signature wrapper opening method.
     * @param signatureWrapper wrapper containing signature doreplacedent and it's xades signature
     * @return ASiCE signature
     */
    @Override
    public AsicSignature open(XadesSignatureWrapper signatureWrapper) {
        logger.debug("Opening xades signature");
        return createAsicESignature(signatureWrapper);
    }

    private AsicESignature createAsicESignature(XadesSignatureWrapper signatureWrapper) {
        XadesSignatureValidator xadesValidator = createSignatureValidator(signatureWrapper.getSignature());
        AsicESignature asicESignature = new AsicESignature(signatureWrapper.getSignature(), xadesValidator);
        asicESignature.setSignatureDoreplacedent(signatureWrapper.getSignatureDoreplacedent());
        return asicESignature;
    }

    private XadesSignatureValidator createSignatureValidator(XadesSignature signature) {
        XadesSignatureValidatorFactory validatorFactory = new XadesSignatureValidatorFactory();
        validatorFactory.setConfiguration(configuration);
        validatorFactory.setSignature(signature);
        XadesSignatureValidator xadesValidator = validatorFactory.create();
        return xadesValidator;
    }
}

18 View Complete Implementation : BDocSignatureOpener.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * BDOC signature opener
 */
public clreplaced BDocSignatureOpener implements AsicSignatureOpener {

    private final static Logger logger = LoggerFactory.getLogger(BDocSignatureOpener.clreplaced);

    private Configuration configuration;

    /**
     * @param configuration configuration
     */
    public BDocSignatureOpener(Configuration configuration) {
        this.configuration = configuration;
    }

    /**
     * Xades signature wrapper opening method.
     * @param signatureWrapper wrapper containing signature doreplacedent and it's xades signature
     * @return BDoc signature
     */
    @Override
    public AsicSignature open(XadesSignatureWrapper signatureWrapper) {
        logger.debug("Opening xades signature");
        return createBDocSignature(signatureWrapper);
    }

    private BDocSignature createBDocSignature(XadesSignatureWrapper signatureWrapper) {
        XadesSignatureValidator xadesValidator = createSignatureValidator(signatureWrapper.getSignature());
        BDocSignature bDocSignature = new BDocSignature(signatureWrapper.getSignature(), xadesValidator);
        bDocSignature.setSignatureDoreplacedent(signatureWrapper.getSignatureDoreplacedent());
        return bDocSignature;
    }

    private XadesSignatureValidator createSignatureValidator(XadesSignature signature) {
        XadesSignatureValidatorFactory validatorFactory = new XadesSignatureValidatorFactory();
        validatorFactory.setConfiguration(configuration);
        validatorFactory.setSignature(signature);
        XadesSignatureValidator xadesValidator = validatorFactory.create();
        return xadesValidator;
    }
}

17 View Complete Implementation : AsicSignatureParser.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
public clreplaced AsicSignatureParser {

    private final static Logger logger = LoggerFactory.getLogger(AsicSignatureParser.clreplaced);

    private final List<DSSDoreplacedent> detachedContents;

    private final Configuration configuration;

    private final XadesSignatureParser xadesSignatureParser = new XadesSignatureParser();

    public AsicSignatureParser(List<DSSDoreplacedent> detachedContents, Configuration configuration) {
        this.configuration = configuration;
        this.detachedContents = detachedContents;
    }

    public XadesSignature parse(DSSDoreplacedent xadesDoreplacedent) {
        logger.debug("Parsing signature from xades doreplacedent");
        return createXadesSignature(xadesDoreplacedent);
    }

    private XadesSignature createXadesSignature(DSSDoreplacedent xadesDoreplacedent) {
        XadesValidationReportGenerator xadesReportGenerator = new XadesValidationReportGenerator(xadesDoreplacedent, detachedContents, configuration);
        return xadesSignatureParser.parse(xadesReportGenerator);
    }
}

17 View Complete Implementation : SignatureExtender.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
public clreplaced SignatureExtender {

    private static final Logger logger = LoggerFactory.getLogger(SignatureExtender.clreplaced);

    private static final Map<SignatureProfile, Set<SignatureProfile>> possibleExtensions = new HashMap<>(5);

    private Configuration configuration;

    private DSSDoreplacedent detachedContent;

    private List<DSSDoreplacedent> detachedContents;

    private XadesSigningDssFacade extendingFacade;

    static {
        possibleExtensions.put(B_BES, new HashSet<>(asList(LT, LTA)));
        possibleExtensions.put(B_EPES, new HashSet<>(singletonList(LT_TM)));
        possibleExtensions.put(LT, new HashSet<>(singletonList(LTA)));
        possibleExtensions.put(LT_TM, Collections.<SignatureProfile>emptySet());
        possibleExtensions.put(LTA, Collections.<SignatureProfile>emptySet());
    }

    public SignatureExtender(Configuration configuration, DSSDoreplacedent detachedContent) {
        this.configuration = configuration;
        this.detachedContent = detachedContent;
        extendingFacade = new XadesSigningDssFacade();
    }

    public SignatureExtender(Configuration configuration, List<DSSDoreplacedent> detachedContent) {
        this.configuration = configuration;
        this.detachedContents = detachedContent;
        extendingFacade = new XadesSigningDssFacade();
    }

    public List<DSSDoreplacedent> extend(List<Signature> signaturesToExtend, SignatureProfile profile) {
        logger.debug("Extending signatures to " + profile);
        validatePossibilityToExtendTo(signaturesToExtend, profile);
        prepareExtendingFacade(profile);
        List<DSSDoreplacedent> extendedSignatures = new ArrayList<>();
        for (Signature signature : signaturesToExtend) {
            DSSDoreplacedent extendedSignature = extendSignature(signature, profile);
            extendedSignatures.add(extendedSignature);
        }
        logger.debug("Finished extending signatures");
        return extendedSignatures;
    }

    private void prepareExtendingFacade(SignatureProfile profile) {
        extendingFacade.setCertificateSource(configuration.getTSL());
        OnlineTSPSource tspSource = createTimeStampProviderSource(profile);
        extendingFacade.setTspSource(tspSource);
        SignatureLevel signatureLevel = getSignatureLevel(profile);
        extendingFacade.setSignatureLevel(signatureLevel);
        setSignaturePolicy(profile);
    }

    private DSSDoreplacedent extendSignature(Signature signature, SignatureProfile profile) {
        OCSPSource ocspSource = createOcspSource(profile, ((AsicSignature) signature).getOrigin().getSignatureValue());
        extendingFacade.setOcspSource(ocspSource);
        DSSDoreplacedent signatureDoreplacedent = ((AsicSignature) signature).getSignatureDoreplacedent();
        return extendingFacade.extendSignature(signatureDoreplacedent, detachedContents);
    }

    private OCSPSource createOcspSource(SignatureProfile profile, byte[] signatureValue) {
        return OCSPSourceBuilder.anOcspSource().withSignatureProfile(profile).withSignatureValue(signatureValue).withConfiguration(this.configuration).build();
    }

    private OnlineTSPSource createTimeStampProviderSource(SignatureProfile profile) {
        OnlineTSPSource source = new OnlineTSPSource(this.configuration.getTspSource());
        DataLoader loader = new TspDataLoaderFactory(this.configuration, Helper.createBDocUserAgent(profile)).create();
        source.setDataLoader(loader);
        return source;
    }

    private SignatureLevel getSignatureLevel(SignatureProfile profile) {
        if (profile == SignatureProfile.LT || profile == SignatureProfile.LT_TM) {
            return SignatureLevel.XAdES_BASELINE_LT;
        }
        if (profile == SignatureProfile.LTA) {
            return SignatureLevel.XAdES_BASELINE_LTA;
        }
        logger.error("Extending signature to " + profile + " is not supported");
        throw new NotSupportedException("Extending signature to " + profile + " is not supported");
    }

    private void setSignaturePolicy(SignatureProfile profile) {
        if (profile == LT_TM) {
            Policy signaturePolicy = PolicyUtils.createBDocSignaturePolicy();
            extendingFacade.setSignaturePolicy(signaturePolicy);
        }
    }

    private void validatePossibilityToExtendTo(List<Signature> signatures, SignatureProfile profile) {
        logger.debug("Validating if it's possible to extend all the signatures to " + profile);
        for (Signature signature : signatures) {
            if (!canExtendSignatureToProfile(signature, profile)) {
                String message = "It is not possible to extend " + signature.getProfile() + " signature to " + signature.getProfile() + ".";
                logger.error(message);
                throw new NotSupportedException(message);
            }
        }
    }

    private boolean canExtendSignatureToProfile(Signature signature, SignatureProfile profile) {
        return possibleExtensions.get(signature.getProfile()).contains(profile);
    }
}

17 View Complete Implementation : DDocFacade.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * Offers validation specific functionality of a DDOC container.
 */
public clreplaced DDocFacade implements Serializable {

    private static final Logger logger = LoggerFactory.getLogger(DDocFacade.clreplaced);

    private static final String HASHCODE_CONTENT_TYPE = "HASHCODE";

    protected SignedDoc ddoc;

    private ArrayList<DigiDocException> openContainerExceptions = new ArrayList<>();

    private SignatureProfile signatureProfile = SignatureProfile.LT_TM;

    private Configuration configuration;

    static ConfigManagerInitializer configManagerInitializer = new ConfigManagerInitializer();

    /**
     * @param configuration configuration context
     */
    public DDocFacade(Configuration configuration) {
        this.configuration = configuration;
        this.initConfigManager();
    }

    DDocFacade(SignedDoc ddoc) {
        this.initilizeConfiguration();
        this.ddoc = ddoc;
    }

    public String getSignatureProfile() {
        String name = signatureProfile.name();
        logger.debug("Signature profile: " + name);
        return name;
    }

    public DigestAlgorithm getDigestAlgorithm() {
        return DigestAlgorithm.SHA1;
    }

    private void initilizeConfiguration() {
        this.configuration = Configuration.getInstance();
        this.initConfigManager();
    }

    public List<DataFile> getDataFiles() {
        List<DataFile> dataFiles = new ArrayList<>();
        ArrayList ddocDataFiles = ddoc.getDataFiles();
        if (ddocDataFiles == null)
            return dataFiles;
        for (Object ddocDataFile : ddocDataFiles) {
            org.digidoc4j.ddoc.DataFile dataFile = (org.digidoc4j.ddoc.DataFile) ddocDataFile;
            String dataFileName = FilenameUtils.getName(dataFile.getFileName());
            try {
                if (isHashcodeForm(dataFile)) {
                    DigestDataFile digestDataFile = new DigestDataFile(dataFileName, DigestAlgorithm.SHA1, dataFile.getDigestValueOfType("sha1"), dataFile.getMimeType());
                    digestDataFile.setContentType(HASHCODE_CONTENT_TYPE);
                    dataFiles.add(digestDataFile);
                } else {
                    if (dataFile.getBody() == null) {
                        DataFile dataFile1 = new DataFile(dataFile.getFileName(), dataFile.getMimeType());
                        dataFile1.setId(dataFile.getId());
                        dataFiles.add(dataFile1);
                    } else {
                        DataFile dataFile1 = new DataFile(dataFile.getBodyAsData(), dataFileName, dataFile.getMimeType());
                        dataFile1.setId(dataFile.getId());
                        dataFiles.add(dataFile1);
                    }
                }
            } catch (DigiDocException e) {
                throw new DigiDoc4JException(e.getMessage(), e.getNestedException());
            }
        }
        return dataFiles;
    }

    private boolean isHashcodeForm(org.digidoc4j.ddoc.DataFile dataFile) {
        return HASHCODE_CONTENT_TYPE.equals(dataFile.getContentType());
    }

    public int countDataFiles() {
        logger.debug("Get the number of data files");
        List<DataFile> dataFiles = getDataFiles();
        return (dataFiles == null) ? 0 : dataFiles.size();
    }

    public void save(String path) {
        logger.info("Saving container to path: " + path);
        try {
            ddoc.writeToFile(new File(path));
        } catch (DigiDocException e) {
            throw new DigiDoc4JException(e.getMessage(), e.getNestedException());
        }
    }

    public void save(OutputStream out) {
        logger.info("Saving container to stream");
        try {
            ddoc.writeToStream(out);
        } catch (DigiDocException e) {
            throw new DigiDoc4JException(e.getMessage(), e.getNestedException());
        }
    }

    public List<Signature> getSignatures() {
        List<Signature> signatures = new ArrayList<>();
        ArrayList dDocSignatures = ddoc.getSignatures();
        if (dDocSignatures == null) {
            return signatures;
        }
        int signatureIndexInArray = 0;
        for (Object signature : dDocSignatures) {
            DDocSignature finalSignature = mapDDoc4JSignatureToDigiDoc4J((org.digidoc4j.ddoc.Signature) signature);
            if (finalSignature != null) {
                finalSignature.setIndexInArray(signatureIndexInArray);
                signatures.add(finalSignature);
                signatureIndexInArray++;
            }
        }
        return signatures;
    }

    /**
     * @deprecated will be removed in the future.
     */
    public Signature getSignature(int index) {
        logger.debug("Get signature for index " + index);
        return getSignatures().get(index);
    }

    public int countSignatures() {
        logger.debug("Get the number of signatures");
        List<Signature> signatures = getSignatures();
        return (signatures == null) ? 0 : signatures.size();
    }

    private DDocSignature mapDDoc4JSignatureToDigiDoc4J(org.digidoc4j.ddoc.Signature signature) {
        DDocSignature finalSignature = new DDocSignature(signature);
        KeyInfo keyInfo = signature.getKeyInfo();
        if (keyInfo == null) {
            return null;
        }
        X509Certificate signersCertificate = keyInfo.getSignersCertificate();
        finalSignature.setCertificate(new X509Cert(signersCertificate));
        return finalSignature;
    }

    public Container.DoreplacedentType getDoreplacedentType() {
        return Container.DoreplacedentType.DDOC;
    }

    public ContainerValidationResult validate() {
        logger.debug("Validating DDoc container ...");
        List containerExceptions = this.ddoc.validate(true);
        containerExceptions.addAll(this.openContainerExceptions);
        DDocSignatureValidationResult result = new DDocSignatureValidationResult(this.ddoc.verify(true, true), containerExceptions, this.ddoc.getFormat());
        result.print(this.configuration);
        return result;
    }

    public String getVersion() {
        String version = ddoc.getVersion();
        logger.debug("Version: " + version);
        return version;
    }

    /**
     * Returns ddoc format
     *
     * @return format as string
     */
    public String getFormat() {
        return ddoc.getFormat();
    }

    public Configuration getConfiguration() {
        return configuration;
    }

    private void initConfigManager() {
        configManagerInitializer.initConfigManager(this.configuration);
    }

    protected void setSignedDoc(SignedDoc signedDoc) {
        ddoc = signedDoc;
    }

    protected void setContainerOpeningExceptions(ArrayList<DigiDocException> openContainerExceptions) {
        this.openContainerExceptions = openContainerExceptions;
    }
}

17 View Complete Implementation : DDocOpener.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
public DDocContainer open(InputStream stream, Configuration configuration) {
    logger.info("Opening DDoc from stream");
    DDocFacade facade = new DDocFacade(configuration);
    ArrayList<DigiDocException> containerOpeningExceptions = new ArrayList<>();
    SignedDoc signedDoc = openSignedDoc(stream, containerOpeningExceptions);
    validateOpenedContainerExceptions(containerOpeningExceptions);
    facade.setContainerOpeningExceptions(containerOpeningExceptions);
    return createContainer(facade, signedDoc);
}

17 View Complete Implementation : DDocOpener.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
public DDocContainer open(String fileName, Configuration configuration) {
    logger.info("Opening DDoc container from file: " + fileName);
    DDocFacade facade = new DDocFacade(configuration);
    ArrayList<DigiDocException> containerOpeningExceptions = new ArrayList<>();
    SignedDoc signedDoc = openSignedDoc(fileName, containerOpeningExceptions);
    validateOpenedContainerExceptions(containerOpeningExceptions);
    facade.setContainerOpeningExceptions(containerOpeningExceptions);
    return createContainer(facade, signedDoc);
}

17 View Complete Implementation : SignatureFinalizer.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * Signature finalizer for datafiles signing process.
 * Used by {@link SignatureBuilder}, by {@link SignatureBuilder} generated {@link DataToSign} and for two step signing (with serialization or local storage).
 */
public abstract clreplaced SignatureFinalizer implements Serializable {

    protected List<DataFile> dataFiles;

    protected SignatureParameters signatureParameters;

    protected Configuration configuration;

    public SignatureFinalizer(List<DataFile> dataFiles, SignatureParameters signatureParameters, Configuration configuration) {
        this.dataFiles = dataFiles;
        this.signatureParameters = signatureParameters;
        this.configuration = configuration;
    }

    /**
     * Finalizes signing process and constructs signature object from signature value.
     *
     * @param signatureValue signature value bytes
     * @return signature object
     */
    public abstract Signature finalizeSignature(byte[] signatureValue);

    /**
     * Constructs signature object from signed doreplacedent.
     *
     * @param signedDoreplacedent signed DSS doreplacedent
     * @return signature object
     */
    public abstract Signature createSignature(DSSDoreplacedent signedDoreplacedent);

    /**
     * Get data to be signed in bytes.
     * @return data to be signed in bytes
     */
    public abstract byte[] getDataToBeSigned();

    /**
     * Returns configuration object related to given signature finalization process.
     * @return configuration object
     */
    public Configuration getConfiguration() {
        return configuration;
    }

    /**
     * Returns signature parameters object related to given signature finalization process.
     * @return signature parameters object
     */
    public SignatureParameters getSignatureParameters() {
        return signatureParameters;
    }
}

17 View Complete Implementation : CommandLineExecutor.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
private void useAiaOcsp(Container container) {
    if (this.context.getCommandLine().hasOption("aiaocsp")) {
        Configuration configuration = container.getConfiguration();
        configuration.setPreferAiaOcsp(true);
    }
}

17 View Complete Implementation : DataLoaderDecoratorTest.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
@RunWith(MockitoJUnitRunner.clreplaced)
public clreplaced DataLoaderDecoratorTest {

    @Mock
    private Configuration configuration;

    @Mock
    private CommonsDataLoader dataLoader;

    @Test
    public void decorateWithSslSettingsShouldDoNothingWhenSslConfigurationNotEnabled() {
        Mockito.doReturn(false).when(configuration).isSslConfigurationEnabled();
        DataLoaderDecorator.decorateWithSslSettings(dataLoader, configuration);
        Mockito.verifyZeroInteractions(dataLoader);
    }

    @Test
    public void decorateWithSslSettingsForShouldDoNothingWhenSslConfigurationNotEnabled() {
        for (final ExternalConnectionType connectionType : ExternalConnectionType.values()) {
            Mockito.doReturn(false).when(configuration).isSslConfigurationEnabled();
            Mockito.doReturn(false).when(configuration).isSslConfigurationEnabledFor(connectionType);
            DataLoaderDecorator.decorateWithSslSettingsFor(connectionType, dataLoader, configuration);
            Mockito.verifyZeroInteractions(dataLoader);
            Mockito.reset(configuration, dataLoader);
        }
    }

    @Test
    public void decorateWithSslSettingsShouldApplySslKeystorePathIfConfigured() {
        Mockito.doReturn(true).when(configuration).isSslConfigurationEnabled();
        Mockito.doReturn("sslKeystorePath").when(configuration).getSslKeystorePath();
        Mockito.doReturn(null).when(configuration).getSupportedSslProtocols();
        Mockito.doReturn(null).when(configuration).getSupportedSslCipherSuites();
        DataLoaderDecorator.decorateWithSslSettings(dataLoader, configuration);
        Mockito.verify(dataLoader, Mockito.times(1)).setSslKeystorePath("sslKeystorePath");
        Mockito.verifyNoMoreInteractions(dataLoader);
    }

    @Test
    public void decorateWithSslSettingsForShouldApplySslKeystorePathIfConfigured() {
        for (final ExternalConnectionType connectionType : ExternalConnectionType.values()) {
            Mockito.doReturn(true).when(configuration).isSslConfigurationEnabledFor(connectionType);
            Mockito.doReturn("sslKeystorePath").when(configuration).getSslKeystorePathFor(connectionType);
            Mockito.doReturn(null).when(configuration).getSupportedSslProtocolsFor(connectionType);
            Mockito.doReturn(null).when(configuration).getSupportedSslCipherSuitesFor(connectionType);
            DataLoaderDecorator.decorateWithSslSettingsFor(connectionType, dataLoader, configuration);
            Mockito.verify(dataLoader, Mockito.times(1)).setSslKeystorePath("sslKeystorePath");
            Mockito.verifyNoMoreInteractions(dataLoader);
            Mockito.reset(configuration, dataLoader);
        }
    }

    @Test
    public void decorateWithSslSettingsShouldApplyAllSslKeystoreConfigurationIfPresent() {
        Mockito.doReturn(true).when(configuration).isSslConfigurationEnabled();
        Mockito.doReturn("sslKeystorePath").when(configuration).getSslKeystorePath();
        Mockito.doReturn("sslKeystoreType").when(configuration).getSslKeystoreType();
        Mockito.doReturn("sslKeystorePreplacedword").when(configuration).getSslKeystorePreplacedword();
        Mockito.doReturn(null).when(configuration).getSupportedSslProtocols();
        Mockito.doReturn(null).when(configuration).getSupportedSslCipherSuites();
        DataLoaderDecorator.decorateWithSslSettings(dataLoader, configuration);
        Mockito.verify(dataLoader, Mockito.times(1)).setSslKeystorePath("sslKeystorePath");
        Mockito.verify(dataLoader, Mockito.times(1)).setSslKeystoreType("sslKeystoreType");
        Mockito.verify(dataLoader, Mockito.times(1)).setSslKeystorePreplacedword("sslKeystorePreplacedword");
        Mockito.verifyNoMoreInteractions(dataLoader);
    }

    @Test
    public void decorateWithSslSettingsForShouldApplyAllSslKeystoreConfigurationIfPresent() {
        for (final ExternalConnectionType connectionType : ExternalConnectionType.values()) {
            Mockito.doReturn(true).when(configuration).isSslConfigurationEnabledFor(connectionType);
            Mockito.doReturn("sslKeystorePath").when(configuration).getSslKeystorePathFor(connectionType);
            Mockito.doReturn("sslKeystoreType").when(configuration).getSslKeystoreTypeFor(connectionType);
            Mockito.doReturn("sslKeystorePreplacedword").when(configuration).getSslKeystorePreplacedwordFor(connectionType);
            Mockito.doReturn(null).when(configuration).getSupportedSslProtocolsFor(connectionType);
            Mockito.doReturn(null).when(configuration).getSupportedSslCipherSuitesFor(connectionType);
            DataLoaderDecorator.decorateWithSslSettingsFor(connectionType, dataLoader, configuration);
            Mockito.verify(dataLoader, Mockito.times(1)).setSslKeystorePath("sslKeystorePath");
            Mockito.verify(dataLoader, Mockito.times(1)).setSslKeystoreType("sslKeystoreType");
            Mockito.verify(dataLoader, Mockito.times(1)).setSslKeystorePreplacedword("sslKeystorePreplacedword");
            Mockito.verifyNoMoreInteractions(dataLoader);
            Mockito.reset(configuration, dataLoader);
        }
    }

    @Test
    public void decorateWithSslSettingsShouldApplySslTruststorePathIfConfigured() {
        Mockito.doReturn(true).when(configuration).isSslConfigurationEnabled();
        Mockito.doReturn("sslTruststorePath").when(configuration).getSslTruststorePath();
        Mockito.doReturn(null).when(configuration).getSupportedSslProtocols();
        Mockito.doReturn(null).when(configuration).getSupportedSslCipherSuites();
        DataLoaderDecorator.decorateWithSslSettings(dataLoader, configuration);
        Mockito.verify(dataLoader, Mockito.times(1)).setSslTruststorePath("sslTruststorePath");
        Mockito.verifyNoMoreInteractions(dataLoader);
    }

    @Test
    public void decorateWithSslSettingsForShouldApplySslTruststorePathIfConfigured() {
        for (final ExternalConnectionType connectionType : ExternalConnectionType.values()) {
            Mockito.doReturn(true).when(configuration).isSslConfigurationEnabledFor(connectionType);
            Mockito.doReturn("sslTruststorePath").when(configuration).getSslTruststorePathFor(connectionType);
            Mockito.doReturn(null).when(configuration).getSupportedSslProtocolsFor(connectionType);
            Mockito.doReturn(null).when(configuration).getSupportedSslCipherSuitesFor(connectionType);
            DataLoaderDecorator.decorateWithSslSettingsFor(connectionType, dataLoader, configuration);
            Mockito.verify(dataLoader, Mockito.times(1)).setSslTruststorePath("sslTruststorePath");
            Mockito.verifyNoMoreInteractions(dataLoader);
            Mockito.reset(configuration, dataLoader);
        }
    }

    @Test
    public void decorateWithSslSettingsShouldApplyAllSslTruststoreConfigurationIfPresent() {
        Mockito.doReturn(true).when(configuration).isSslConfigurationEnabled();
        Mockito.doReturn("sslTruststorePath").when(configuration).getSslTruststorePath();
        Mockito.doReturn("sslTruststoreType").when(configuration).getSslTruststoreType();
        Mockito.doReturn("sslTruststorePreplacedword").when(configuration).getSslTruststorePreplacedword();
        Mockito.doReturn(null).when(configuration).getSupportedSslProtocols();
        Mockito.doReturn(null).when(configuration).getSupportedSslCipherSuites();
        DataLoaderDecorator.decorateWithSslSettings(dataLoader, configuration);
        Mockito.verify(dataLoader, Mockito.times(1)).setSslTruststorePath("sslTruststorePath");
        Mockito.verify(dataLoader, Mockito.times(1)).setSslTruststoreType("sslTruststoreType");
        Mockito.verify(dataLoader, Mockito.times(1)).setSslTruststorePreplacedword("sslTruststorePreplacedword");
        Mockito.verifyNoMoreInteractions(dataLoader);
    }

    @Test
    public void decorateWithSslSettingsForShouldApplyAllSslTruststoreConfigurationIfPresent() {
        for (final ExternalConnectionType connectionType : ExternalConnectionType.values()) {
            Mockito.doReturn(true).when(configuration).isSslConfigurationEnabledFor(connectionType);
            Mockito.doReturn("sslTruststorePath").when(configuration).getSslTruststorePathFor(connectionType);
            Mockito.doReturn("sslTruststoreType").when(configuration).getSslTruststoreTypeFor(connectionType);
            Mockito.doReturn("sslTruststorePreplacedword").when(configuration).getSslTruststorePreplacedwordFor(connectionType);
            Mockito.doReturn(null).when(configuration).getSupportedSslProtocolsFor(connectionType);
            Mockito.doReturn(null).when(configuration).getSupportedSslCipherSuitesFor(connectionType);
            DataLoaderDecorator.decorateWithSslSettingsFor(connectionType, dataLoader, configuration);
            Mockito.verify(dataLoader, Mockito.times(1)).setSslTruststorePath("sslTruststorePath");
            Mockito.verify(dataLoader, Mockito.times(1)).setSslTruststoreType("sslTruststoreType");
            Mockito.verify(dataLoader, Mockito.times(1)).setSslTruststorePreplacedword("sslTruststorePreplacedword");
            Mockito.verifyNoMoreInteractions(dataLoader);
            Mockito.reset(configuration, dataLoader);
        }
    }

    @Test
    public void decorateWithSslSettingsShouldApplySupportedSslProtocolsIfConfigured() {
        Mockito.doReturn(true).when(configuration).isSslConfigurationEnabled();
        Mockito.doReturn(Arrays.asList("sslProtocol1", "sslProtocol2")).when(configuration).getSupportedSslProtocols();
        Mockito.doReturn(null).when(configuration).getSupportedSslCipherSuites();
        DataLoaderDecorator.decorateWithSslSettings(dataLoader, configuration);
        ArgumentCaptor<String[]> argumentCaptor = ArgumentCaptor.forClreplaced(String[].clreplaced);
        Mockito.verify(dataLoader, Mockito.times(1)).setSupportedSSLProtocols(argumentCaptor.capture());
        replacedert.replacedertArrayEquals(new String[] { "sslProtocol1", "sslProtocol2" }, argumentCaptor.getValue());
        Mockito.verifyNoMoreInteractions(dataLoader);
    }

    @Test
    public void decorateWithSslSettingsForShouldApplySupportedSslProtocolsIfConfigured() {
        for (final ExternalConnectionType connectionType : ExternalConnectionType.values()) {
            Mockito.doReturn(true).when(configuration).isSslConfigurationEnabledFor(connectionType);
            Mockito.doReturn(Arrays.asList("sslProtocol1", "sslProtocol2")).when(configuration).getSupportedSslProtocolsFor(connectionType);
            Mockito.doReturn(null).when(configuration).getSupportedSslCipherSuitesFor(connectionType);
            DataLoaderDecorator.decorateWithSslSettingsFor(connectionType, dataLoader, configuration);
            ArgumentCaptor<String[]> argumentCaptor = ArgumentCaptor.forClreplaced(String[].clreplaced);
            Mockito.verify(dataLoader, Mockito.times(1)).setSupportedSSLProtocols(argumentCaptor.capture());
            replacedert.replacedertArrayEquals(new String[] { "sslProtocol1", "sslProtocol2" }, argumentCaptor.getValue());
            Mockito.verifyNoMoreInteractions(dataLoader);
            Mockito.reset(configuration, dataLoader);
        }
    }

    @Test
    public void decorateWithSslSettingsShouldApplySupportedSslCipherSuitesIfConfigured() {
        Mockito.doReturn(true).when(configuration).isSslConfigurationEnabled();
        Mockito.doReturn(null).when(configuration).getSupportedSslProtocols();
        Mockito.doReturn(Arrays.asList("sslCipherSuite1", "sslCipherSuite2")).when(configuration).getSupportedSslCipherSuites();
        DataLoaderDecorator.decorateWithSslSettings(dataLoader, configuration);
        ArgumentCaptor<String[]> argumentCaptor = ArgumentCaptor.forClreplaced(String[].clreplaced);
        Mockito.verify(dataLoader, Mockito.times(1)).setSupportedSSLCipherSuites(argumentCaptor.capture());
        replacedert.replacedertArrayEquals(new String[] { "sslCipherSuite1", "sslCipherSuite2" }, argumentCaptor.getValue());
        Mockito.verifyNoMoreInteractions(dataLoader);
    }

    @Test
    public void decorateWithSslSettingsForShouldApplySupportedSslCipherSuitesIfConfigured() {
        for (final ExternalConnectionType connectionType : ExternalConnectionType.values()) {
            Mockito.doReturn(true).when(configuration).isSslConfigurationEnabledFor(connectionType);
            Mockito.doReturn(null).when(configuration).getSupportedSslProtocolsFor(connectionType);
            Mockito.doReturn(Arrays.asList("sslCipherSuite1", "sslCipherSuite2")).when(configuration).getSupportedSslCipherSuitesFor(connectionType);
            DataLoaderDecorator.decorateWithSslSettingsFor(connectionType, dataLoader, configuration);
            ArgumentCaptor<String[]> argumentCaptor = ArgumentCaptor.forClreplaced(String[].clreplaced);
            Mockito.verify(dataLoader, Mockito.times(1)).setSupportedSSLCipherSuites(argumentCaptor.capture());
            replacedert.replacedertArrayEquals(new String[] { "sslCipherSuite1", "sslCipherSuite2" }, argumentCaptor.getValue());
            Mockito.verifyNoMoreInteractions(dataLoader);
            Mockito.reset(configuration, dataLoader);
        }
    }

    @Test
    public void decorateWithSslSettingsShouldApplyAllConfiguredSslProperties() {
        Mockito.doReturn(true).when(configuration).isSslConfigurationEnabled();
        Mockito.doReturn("sslKeystorePath").when(configuration).getSslKeystorePath();
        Mockito.doReturn("sslKeystoreType").when(configuration).getSslKeystoreType();
        Mockito.doReturn("sslKeystorePreplacedword").when(configuration).getSslKeystorePreplacedword();
        Mockito.doReturn("sslTruststorePath").when(configuration).getSslTruststorePath();
        Mockito.doReturn("sslTruststoreType").when(configuration).getSslTruststoreType();
        Mockito.doReturn("sslTruststorePreplacedword").when(configuration).getSslTruststorePreplacedword();
        Mockito.doReturn(Arrays.asList("sslProtocol1", "sslProtocol2")).when(configuration).getSupportedSslProtocols();
        Mockito.doReturn(Arrays.asList("sslCipherSuite1", "sslCipherSuite2")).when(configuration).getSupportedSslCipherSuites();
        DataLoaderDecorator.decorateWithSslSettings(dataLoader, configuration);
        Mockito.verify(dataLoader, Mockito.times(1)).setSslKeystorePath("sslKeystorePath");
        Mockito.verify(dataLoader, Mockito.times(1)).setSslKeystoreType("sslKeystoreType");
        Mockito.verify(dataLoader, Mockito.times(1)).setSslKeystorePreplacedword("sslKeystorePreplacedword");
        Mockito.verify(dataLoader, Mockito.times(1)).setSslTruststorePath("sslTruststorePath");
        Mockito.verify(dataLoader, Mockito.times(1)).setSslTruststoreType("sslTruststoreType");
        Mockito.verify(dataLoader, Mockito.times(1)).setSslTruststorePreplacedword("sslTruststorePreplacedword");
        ArgumentCaptor<String[]> protocolsCaptor = ArgumentCaptor.forClreplaced(String[].clreplaced);
        Mockito.verify(dataLoader, Mockito.times(1)).setSupportedSSLProtocols(protocolsCaptor.capture());
        replacedert.replacedertArrayEquals(new String[] { "sslProtocol1", "sslProtocol2" }, protocolsCaptor.getValue());
        ArgumentCaptor<String[]> cipherSuitedCaptor = ArgumentCaptor.forClreplaced(String[].clreplaced);
        Mockito.verify(dataLoader, Mockito.times(1)).setSupportedSSLCipherSuites(cipherSuitedCaptor.capture());
        replacedert.replacedertArrayEquals(new String[] { "sslCipherSuite1", "sslCipherSuite2" }, cipherSuitedCaptor.getValue());
        Mockito.verifyNoMoreInteractions(dataLoader);
    }

    @Test
    public void decorateWithSslSettingsForShouldApplyAllConfiguredSslProperties() {
        for (final ExternalConnectionType connectionType : ExternalConnectionType.values()) {
            Mockito.doReturn(true).when(configuration).isSslConfigurationEnabledFor(connectionType);
            Mockito.doReturn("sslKeystorePath").when(configuration).getSslKeystorePathFor(connectionType);
            Mockito.doReturn("sslKeystoreType").when(configuration).getSslKeystoreTypeFor(connectionType);
            Mockito.doReturn("sslKeystorePreplacedword").when(configuration).getSslKeystorePreplacedwordFor(connectionType);
            Mockito.doReturn("sslTruststorePath").when(configuration).getSslTruststorePathFor(connectionType);
            Mockito.doReturn("sslTruststoreType").when(configuration).getSslTruststoreTypeFor(connectionType);
            Mockito.doReturn("sslTruststorePreplacedword").when(configuration).getSslTruststorePreplacedwordFor(connectionType);
            Mockito.doReturn(Arrays.asList("sslProtocol1", "sslProtocol2")).when(configuration).getSupportedSslProtocolsFor(connectionType);
            Mockito.doReturn(Arrays.asList("sslCipherSuite1", "sslCipherSuite2")).when(configuration).getSupportedSslCipherSuitesFor(connectionType);
            DataLoaderDecorator.decorateWithSslSettingsFor(connectionType, dataLoader, configuration);
            Mockito.verify(dataLoader, Mockito.times(1)).setSslKeystorePath("sslKeystorePath");
            Mockito.verify(dataLoader, Mockito.times(1)).setSslKeystoreType("sslKeystoreType");
            Mockito.verify(dataLoader, Mockito.times(1)).setSslKeystorePreplacedword("sslKeystorePreplacedword");
            Mockito.verify(dataLoader, Mockito.times(1)).setSslTruststorePath("sslTruststorePath");
            Mockito.verify(dataLoader, Mockito.times(1)).setSslTruststoreType("sslTruststoreType");
            Mockito.verify(dataLoader, Mockito.times(1)).setSslTruststorePreplacedword("sslTruststorePreplacedword");
            ArgumentCaptor<String[]> protocolsCaptor = ArgumentCaptor.forClreplaced(String[].clreplaced);
            Mockito.verify(dataLoader, Mockito.times(1)).setSupportedSSLProtocols(protocolsCaptor.capture());
            replacedert.replacedertArrayEquals(new String[] { "sslProtocol1", "sslProtocol2" }, protocolsCaptor.getValue());
            ArgumentCaptor<String[]> cipherSuitedCaptor = ArgumentCaptor.forClreplaced(String[].clreplaced);
            Mockito.verify(dataLoader, Mockito.times(1)).setSupportedSSLCipherSuites(cipherSuitedCaptor.capture());
            replacedert.replacedertArrayEquals(new String[] { "sslCipherSuite1", "sslCipherSuite2" }, cipherSuitedCaptor.getValue());
            Mockito.verifyNoMoreInteractions(dataLoader);
            Mockito.reset(configuration, dataLoader);
        }
    }

    @Test
    public void decorateWithProxySettingsShouldDoNothingWhenNetworkProxyNotEnabled() {
        Mockito.doReturn(false).when(configuration).isNetworkProxyEnabled();
        DataLoaderDecorator.decorateWithProxySettings(dataLoader, configuration);
        Mockito.verifyZeroInteractions(dataLoader);
    }

    @Test
    public void decorateWithProxySettingsForShouldDoNothingWhenNetworkProxyNotEnabled() {
        for (final ExternalConnectionType connectionType : ExternalConnectionType.values()) {
            Mockito.doReturn(false).when(configuration).isNetworkProxyEnabledFor(connectionType);
            DataLoaderDecorator.decorateWithProxySettingsFor(connectionType, dataLoader, configuration);
            Mockito.verifyZeroInteractions(dataLoader);
            Mockito.reset(configuration, dataLoader);
        }
    }

    @Test
    public void decorateWithProxySettingsShouldApplyHttpHostAndPortIfConfigured() {
        Mockito.doReturn(true).when(configuration).isNetworkProxyEnabled();
        Mockito.doReturn(Integer.valueOf(8073)).when(configuration).getHttpProxyPort();
        Mockito.doReturn("httpProxyHost").when(configuration).getHttpProxyHost();
        DataLoaderDecorator.decorateWithProxySettings(dataLoader, configuration);
        ProxyConfig capturedProxyConfig = verifyDataLoaderProxyConfigSetAndCaptureProxyConfig();
        replacedertProxyPropertiesNotConfigured(capturedProxyConfig.getHttpsProperties());
        replacedert.replacedertEquals(8073, capturedProxyConfig.getHttpProperties().getPort());
        replacedert.replacedertEquals("httpProxyHost", capturedProxyConfig.getHttpProperties().getHost());
        replacedert.replacedertNull(capturedProxyConfig.getHttpProperties().getExcludedHosts());
        replacedert.replacedertNull(capturedProxyConfig.getHttpProperties().getUser());
        replacedert.replacedertNull(capturedProxyConfig.getHttpProperties().getPreplacedword());
    }

    @Test
    public void decorateWithProxySettingsForShouldApplyHttpHostAndPortIfConfigured() {
        for (final ExternalConnectionType connectionType : ExternalConnectionType.values()) {
            Mockito.doReturn(true).when(configuration).isNetworkProxyEnabledFor(connectionType);
            Mockito.doReturn(Integer.valueOf(8073)).when(configuration).getHttpProxyPortFor(connectionType);
            Mockito.doReturn("httpProxyHost").when(configuration).getHttpProxyHostFor(connectionType);
            DataLoaderDecorator.decorateWithProxySettingsFor(connectionType, dataLoader, configuration);
            ProxyConfig capturedProxyConfig = verifyDataLoaderProxyConfigSetAndCaptureProxyConfig();
            replacedertProxyPropertiesNotConfigured(capturedProxyConfig.getHttpsProperties());
            replacedert.replacedertEquals(8073, capturedProxyConfig.getHttpProperties().getPort());
            replacedert.replacedertEquals("httpProxyHost", capturedProxyConfig.getHttpProperties().getHost());
            replacedert.replacedertNull(capturedProxyConfig.getHttpProperties().getExcludedHosts());
            replacedert.replacedertNull(capturedProxyConfig.getHttpProperties().getUser());
            replacedert.replacedertNull(capturedProxyConfig.getHttpProperties().getPreplacedword());
            Mockito.reset(configuration, dataLoader);
        }
    }

    @Test
    public void decorateWithProxySettingsShouldApplyHttpsHostAndPortIfConfigured() {
        Mockito.doReturn(true).when(configuration).isNetworkProxyEnabled();
        Mockito.doReturn(Integer.valueOf(473)).when(configuration).getHttpsProxyPort();
        Mockito.doReturn("httpsProxyHost").when(configuration).getHttpsProxyHost();
        DataLoaderDecorator.decorateWithProxySettings(dataLoader, configuration);
        ProxyConfig capturedProxyConfig = verifyDataLoaderProxyConfigSetAndCaptureProxyConfig();
        replacedertProxyPropertiesNotConfigured(capturedProxyConfig.getHttpProperties());
        replacedert.replacedertEquals(473, capturedProxyConfig.getHttpsProperties().getPort());
        replacedert.replacedertEquals("httpsProxyHost", capturedProxyConfig.getHttpsProperties().getHost());
        replacedert.replacedertNull(capturedProxyConfig.getHttpsProperties().getExcludedHosts());
        replacedert.replacedertNull(capturedProxyConfig.getHttpsProperties().getUser());
        replacedert.replacedertNull(capturedProxyConfig.getHttpsProperties().getPreplacedword());
    }

    @Test
    public void decorateWithProxySettingsForShouldApplyHttpsHostAndPortIfConfigured() {
        for (final ExternalConnectionType connectionType : ExternalConnectionType.values()) {
            Mockito.doReturn(true).when(configuration).isNetworkProxyEnabledFor(connectionType);
            Mockito.doReturn(Integer.valueOf(473)).when(configuration).getHttpsProxyPortFor(connectionType);
            Mockito.doReturn("httpsProxyHost").when(configuration).getHttpsProxyHostFor(connectionType);
            DataLoaderDecorator.decorateWithProxySettingsFor(connectionType, dataLoader, configuration);
            ProxyConfig capturedProxyConfig = verifyDataLoaderProxyConfigSetAndCaptureProxyConfig();
            replacedertProxyPropertiesNotConfigured(capturedProxyConfig.getHttpProperties());
            replacedert.replacedertEquals(473, capturedProxyConfig.getHttpsProperties().getPort());
            replacedert.replacedertEquals("httpsProxyHost", capturedProxyConfig.getHttpsProperties().getHost());
            replacedert.replacedertNull(capturedProxyConfig.getHttpsProperties().getExcludedHosts());
            replacedert.replacedertNull(capturedProxyConfig.getHttpsProperties().getUser());
            replacedert.replacedertNull(capturedProxyConfig.getHttpsProperties().getPreplacedword());
            Mockito.reset(configuration, dataLoader);
        }
    }

    @Test
    public void decorateWithProxySettingsShouldApplyUserAndPreplacedwordIfConfigured() {
        Mockito.doReturn(true).when(configuration).isNetworkProxyEnabled();
        Mockito.doReturn("proxyUser").when(configuration).getHttpProxyUser();
        Mockito.doReturn("proxyPreplacedword").when(configuration).getHttpProxyPreplacedword();
        DataLoaderDecorator.decorateWithProxySettings(dataLoader, configuration);
        ProxyConfig capturedProxyConfig = verifyDataLoaderProxyConfigSetAndCaptureProxyConfig();
        replacedert.replacedertEquals(0, capturedProxyConfig.getHttpProperties().getPort());
        replacedert.replacedertNull(capturedProxyConfig.getHttpProperties().getHost());
        replacedert.replacedertNull(capturedProxyConfig.getHttpProperties().getExcludedHosts());
        replacedert.replacedertEquals("proxyUser", capturedProxyConfig.getHttpProperties().getUser());
        replacedert.replacedertEquals("proxyPreplacedword", capturedProxyConfig.getHttpProperties().getPreplacedword());
        replacedert.replacedertEquals(0, capturedProxyConfig.getHttpsProperties().getPort());
        replacedert.replacedertNull(capturedProxyConfig.getHttpsProperties().getHost());
        replacedert.replacedertNull(capturedProxyConfig.getHttpsProperties().getExcludedHosts());
        replacedert.replacedertEquals("proxyUser", capturedProxyConfig.getHttpsProperties().getUser());
        replacedert.replacedertEquals("proxyPreplacedword", capturedProxyConfig.getHttpsProperties().getPreplacedword());
    }

    @Test
    public void decorateWithProxySettingsForShouldApplyUserAndPreplacedwordIfConfigured() {
        for (final ExternalConnectionType connectionType : ExternalConnectionType.values()) {
            Mockito.doReturn(true).when(configuration).isNetworkProxyEnabledFor(connectionType);
            Mockito.doReturn("proxyUser").when(configuration).getHttpProxyUserFor(connectionType);
            Mockito.doReturn("proxyPreplacedword").when(configuration).getHttpProxyPreplacedwordFor(connectionType);
            DataLoaderDecorator.decorateWithProxySettingsFor(connectionType, dataLoader, configuration);
            ProxyConfig capturedProxyConfig = verifyDataLoaderProxyConfigSetAndCaptureProxyConfig();
            replacedert.replacedertEquals(0, capturedProxyConfig.getHttpProperties().getPort());
            replacedert.replacedertNull(capturedProxyConfig.getHttpProperties().getHost());
            replacedert.replacedertNull(capturedProxyConfig.getHttpProperties().getExcludedHosts());
            replacedert.replacedertEquals("proxyUser", capturedProxyConfig.getHttpProperties().getUser());
            replacedert.replacedertEquals("proxyPreplacedword", capturedProxyConfig.getHttpProperties().getPreplacedword());
            replacedert.replacedertEquals(0, capturedProxyConfig.getHttpsProperties().getPort());
            replacedert.replacedertNull(capturedProxyConfig.getHttpsProperties().getHost());
            replacedert.replacedertNull(capturedProxyConfig.getHttpsProperties().getExcludedHosts());
            replacedert.replacedertEquals("proxyUser", capturedProxyConfig.getHttpsProperties().getUser());
            replacedert.replacedertEquals("proxyPreplacedword", capturedProxyConfig.getHttpsProperties().getPreplacedword());
            Mockito.reset(configuration, dataLoader);
        }
    }

    @Test
    public void decorateWithProxySettingsShouldApplyAllConfiguredProxySettings() {
        Mockito.doReturn(true).when(configuration).isNetworkProxyEnabled();
        Mockito.doReturn(Integer.valueOf(8073)).when(configuration).getHttpProxyPort();
        Mockito.doReturn("httpProxyHost").when(configuration).getHttpProxyHost();
        Mockito.doReturn(Integer.valueOf(473)).when(configuration).getHttpsProxyPort();
        Mockito.doReturn("httpsProxyHost").when(configuration).getHttpsProxyHost();
        Mockito.doReturn("proxyUser").when(configuration).getHttpProxyUser();
        Mockito.doReturn("proxyPreplacedword").when(configuration).getHttpProxyPreplacedword();
        DataLoaderDecorator.decorateWithProxySettings(dataLoader, configuration);
        ProxyConfig capturedProxyConfig = verifyDataLoaderProxyConfigSetAndCaptureProxyConfig();
        replacedert.replacedertEquals(8073, capturedProxyConfig.getHttpProperties().getPort());
        replacedert.replacedertEquals("httpProxyHost", capturedProxyConfig.getHttpProperties().getHost());
        replacedert.replacedertNull(capturedProxyConfig.getHttpProperties().getExcludedHosts());
        replacedert.replacedertEquals("proxyUser", capturedProxyConfig.getHttpProperties().getUser());
        replacedert.replacedertEquals("proxyPreplacedword", capturedProxyConfig.getHttpProperties().getPreplacedword());
        replacedert.replacedertEquals(473, capturedProxyConfig.getHttpsProperties().getPort());
        replacedert.replacedertEquals("httpsProxyHost", capturedProxyConfig.getHttpsProperties().getHost());
        replacedert.replacedertNull(capturedProxyConfig.getHttpsProperties().getExcludedHosts());
        replacedert.replacedertEquals("proxyUser", capturedProxyConfig.getHttpsProperties().getUser());
        replacedert.replacedertEquals("proxyPreplacedword", capturedProxyConfig.getHttpsProperties().getPreplacedword());
    }

    @Test
    public void decorateWithProxySettingsForShouldApplyAllConfiguredProxySettings() {
        for (final ExternalConnectionType connectionType : ExternalConnectionType.values()) {
            Mockito.doReturn(true).when(configuration).isNetworkProxyEnabledFor(connectionType);
            Mockito.doReturn(Integer.valueOf(8073)).when(configuration).getHttpProxyPortFor(connectionType);
            Mockito.doReturn("httpProxyHost").when(configuration).getHttpProxyHostFor(connectionType);
            Mockito.doReturn(Integer.valueOf(473)).when(configuration).getHttpsProxyPortFor(connectionType);
            Mockito.doReturn("httpsProxyHost").when(configuration).getHttpsProxyHostFor(connectionType);
            Mockito.doReturn("proxyUser").when(configuration).getHttpProxyUserFor(connectionType);
            Mockito.doReturn("proxyPreplacedword").when(configuration).getHttpProxyPreplacedwordFor(connectionType);
            DataLoaderDecorator.decorateWithProxySettingsFor(connectionType, dataLoader, configuration);
            ProxyConfig capturedProxyConfig = verifyDataLoaderProxyConfigSetAndCaptureProxyConfig();
            replacedert.replacedertEquals(8073, capturedProxyConfig.getHttpProperties().getPort());
            replacedert.replacedertEquals("httpProxyHost", capturedProxyConfig.getHttpProperties().getHost());
            replacedert.replacedertNull(capturedProxyConfig.getHttpProperties().getExcludedHosts());
            replacedert.replacedertEquals("proxyUser", capturedProxyConfig.getHttpProperties().getUser());
            replacedert.replacedertEquals("proxyPreplacedword", capturedProxyConfig.getHttpProperties().getPreplacedword());
            replacedert.replacedertEquals(473, capturedProxyConfig.getHttpsProperties().getPort());
            replacedert.replacedertEquals("httpsProxyHost", capturedProxyConfig.getHttpsProperties().getHost());
            replacedert.replacedertNull(capturedProxyConfig.getHttpsProperties().getExcludedHosts());
            replacedert.replacedertEquals("proxyUser", capturedProxyConfig.getHttpsProperties().getUser());
            replacedert.replacedertEquals("proxyPreplacedword", capturedProxyConfig.getHttpsProperties().getPreplacedword());
            Mockito.reset(configuration, dataLoader);
        }
    }

    private ProxyConfig verifyDataLoaderProxyConfigSetAndCaptureProxyConfig() {
        ArgumentCaptor<ProxyConfig> argumentCaptor = ArgumentCaptor.forClreplaced(ProxyConfig.clreplaced);
        Mockito.verify(dataLoader, Mockito.times(1)).setProxyConfig(argumentCaptor.capture());
        Mockito.verifyNoMoreInteractions(dataLoader);
        return argumentCaptor.getValue();
    }

    private void replacedertProxyPropertiesNotConfigured(ProxyProperties proxyProperties) {
        replacedert.replacedertEquals(0, proxyProperties.getPort());
        replacedert.replacedertNull(proxyProperties.getExcludedHosts());
        replacedert.replacedertNull(proxyProperties.getHost());
        replacedert.replacedertNull(proxyProperties.getUser());
        replacedert.replacedertNull(proxyProperties.getPreplacedword());
    }
}

17 View Complete Implementation : ValidationTests.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
@Test
public void bdocTM_signedWithValidCert_isExpiredByNow_shouldBeValid() throws Exception {
    String containerPath = "src/test/resources/testFiles/valid-containers/valid_bdoc_tm_signed_with_valid_cert_expired_by_now.bdoc";
    Configuration configuration = new Configuration(Configuration.Mode.TEST);
    TestTreplacedil.addCertificateFromFileToTsl(configuration, "src/test/resources/testFiles/certs/ESTEID-SK_2007_prod.pem.crt");
    Container container = ContainerBuilder.aContainer().fromExistingFile(containerPath).withConfiguration(configuration).build();
    replacedert.replacedertTrue(container.validate().isValid());
}

17 View Complete Implementation : TestTSLUtil.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
public static Configuration addCertificateFromFileToTsl(Configuration configuration, String fileName) {
    try {
        FileInputStream fileInputStream = new FileInputStream(fileName);
        X509Certificate certificate = DSSUtils.loadCertificate(fileInputStream).getCertificate();
        configuration.getTSL().addTSLCertificate(certificate);
        fileInputStream.close();
        return configuration;
    } catch (DSSException | IOException e) {
        throw new RuntimeException(e);
    }
}

17 View Complete Implementation : AbstractValidationResult.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * @param configuration configuration context
 */
public void print(Configuration configuration) {
    if (configuration.getPrintValidationReport()) {
        boolean hasWarningsOnly = CollectionUtils.isNotEmpty(this.warnings) && this.isValid();
        if (hasWarningsOnly || CollectionUtils.isNotEmpty(this.errors)) {
            if (hasWarningsOnly) {
                Helper.printWarningSection(LOGGER, String.format("Start of <%s> validation result", this.getResultName()));
            } else {
                Helper.printErrorSection(LOGGER, String.format("Start of <%s> validation result", this.getResultName()));
            }
            if (CollectionUtils.isNotEmpty(this.errors)) {
                for (DigiDoc4JException error : this.errors) {
                    LOGGER.error(error.toString());
                }
            }
            if (CollectionUtils.isNotEmpty(this.warnings)) {
                for (DigiDoc4JException warning : this.warnings) {
                    LOGGER.warn(warning.toString());
                }
            }
            if (hasWarningsOnly) {
                Helper.printWarningSection(LOGGER, String.format("End of <%s> validation result", this.getResultName()));
            } else {
                Helper.printErrorSection(LOGGER, String.format("End of <%s> validation result", this.getResultName()));
            }
        }
    }
}

17 View Complete Implementation : AsicContainer.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * Created by Andrei on 7.11.2017.
 */
public abstract clreplaced AsicContainer implements Container {

    private static final Logger LOGGER = LoggerFactory.getLogger(AsicContainer.clreplaced);

    protected Configuration configuration;

    protected DataFile timeStampToken;

    private List<DataFile> dataFiles = new ArrayList<>();

    private List<Signature> newSignatures = new ArrayList<>();

    private List<Signature> signatures = new ArrayList<>();

    private List<DataFile> newDataFiles = new ArrayList<>();

    private AsicParseResult containerParseResult;

    private boolean dataFilesHaveChanged;

    private String containerType = "";

    protected abstract String createUserAgent();

    /**
     * ASicContainer constructor
     */
    public AsicContainer() {
        this.configuration = Configuration.getInstance();
    }

    /**
     * ASicContainer constructor
     *
     * @param configuration configuration
     */
    public AsicContainer(Configuration configuration) {
        this.configuration = configuration;
    }

    /**
     * ASicContainer constructor
     *
     * @param containerPath path
     * @param containerType type
     */
    public AsicContainer(String containerPath, String containerType) {
        this.configuration = Configuration.getInstance();
        this.containerType = containerType;
        this.openContainer(containerPath);
    }

    /**
     * ASicContainer constructor
     *
     * @param containerPath path
     * @param configuration configuration
     * @param containerType type
     */
    public AsicContainer(String containerPath, Configuration configuration, String containerType) {
        this.configuration = configuration;
        this.containerType = containerType;
        this.openContainer(containerPath);
    }

    /**
     * ASicContainer constructor
     *
     * @param stream        input stream
     * @param containerType type
     */
    public AsicContainer(InputStream stream, String containerType) {
        this.configuration = Configuration.getInstance();
        this.containerType = containerType;
        this.openContainer(stream);
    }

    /**
     * ASicContainer constructor
     *
     * @param stream        input stream
     * @param configuration configuration
     * @param containerType type
     */
    public AsicContainer(InputStream stream, Configuration configuration, String containerType) {
        this.configuration = configuration;
        this.containerType = containerType;
        this.openContainer(stream);
    }

    /**
     * ASicContainer constructor
     *
     * @param containerParseResult container parsed result
     * @param configuration configuration
     * @param containerType container type
     */
    public AsicContainer(AsicParseResult containerParseResult, Configuration configuration, String containerType) {
        this.configuration = configuration;
        this.containerType = containerType;
        this.populateContainerWithParseResult(containerParseResult);
    }

    @Override
    public ContainerValidationResult validate() {
        ContainerValidationResult validationResult = this.validateContainer();
        if (validationResult instanceof AbstractValidationResult) {
            ((AbstractValidationResult) validationResult).print(this.configuration);
        }
        return validationResult;
    }

    protected ContainerValidationResult validateContainer() {
        if (this.timeStampToken != null) {
            return this.validateTimestampToken();
        } else {
            if (!this.isNewContainer()) {
                if (DoreplacedentType.BDOC.name().equalsIgnoreCase(this.containerType)) {
                    return new BDocContainerValidator(this.containerParseResult, this.getConfiguration(), !this.dataFilesHaveChanged).validate(this.getSignatures());
                } else if (DoreplacedentType.ASICS.name().equalsIgnoreCase(this.containerType)) {
                    return new AsicSContainerValidator(this.containerParseResult, this.getConfiguration(), !this.dataFilesHaveChanged).validate(this.getSignatures());
                } else {
                    return new AsicEContainerValidator(this.containerParseResult, this.getConfiguration(), !this.dataFilesHaveChanged).validate(this.getSignatures());
                }
            } else {
                if (DoreplacedentType.BDOC.name().equalsIgnoreCase(this.containerType)) {
                    return new BDocContainerValidator(this.getConfiguration()).validate(this.getSignatures());
                } else if (DoreplacedentType.ASICS.name().equalsIgnoreCase(this.containerType)) {
                    return new AsicSContainerValidator(this.getConfiguration()).validate(this.getSignatures());
                } else {
                    return new AsicEContainerValidator(this.getConfiguration()).validate(this.getSignatures());
                }
            }
        }
    }

    private ContainerValidationResult validateTimestampToken() {
        if (this.containerParseResult == null) {
            this.containerParseResult = new AsicStreamContainerParser(this.savereplacedtream(), this.getConfiguration()).read();
        }
        return new TimeStampTokenValidator(this.containerParseResult).validate();
    }

    @Override
    public File saveAsFile(String filePath) {
        LOGGER.debug("Saving container to file: " + filePath);
        File file = new File(filePath);
        try (OutputStream stream = Helper.bufferedOutputStream(file)) {
            save(stream);
            LOGGER.info("Container was saved to file " + filePath);
            return file;
        } catch (IOException e) {
            LOGGER.error("Unable to close stream: " + e.getMessage());
            throw new TechnicalException("Unable to close stream", e);
        }
    }

    @Override
    public Configuration getConfiguration() {
        return configuration;
    }

    private List<Signature> openSignatures(List<XadesSignatureWrapper> signatureWrappers) {
        List<Signature> signatures = new ArrayList<>(signatureWrappers.size());
        for (XadesSignatureWrapper signatureWrapper : signatureWrappers) {
            signatures.add(getSignatureOpener().open(signatureWrapper));
        }
        return signatures;
    }

    protected abstract AsicSignatureOpener getSignatureOpener();

    @Override
    public InputStream savereplacedtream() {
        LOGGER.debug("Saving container as stream");
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        save(outputStream);
        InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
        LOGGER.info("Container was saved to stream");
        return inputStream;
    }

    protected void validateIncomingSignature(Signature signature) {
        if (signature == null) {
            throw new TechnicalException("ValidateIncomingSignature is null");
        }
        if (!((signature instanceof BDocSignature) || (signature instanceof AsicSSignature) || (signature instanceof AsicESignature) || (signature instanceof AsicSignature))) {
            throw new TechnicalException("BDoc signature must be an instance of AsicSignature");
        }
    }

    protected List<Signature> extendAllSignatureProfile(SignatureProfile profile, List<Signature> signatures, List<DataFile> dataFiles) {
        LOGGER.info("Extending all signatures' profile to " + profile.name());
        DetachedContentCreator detachedContentCreator = null;
        try {
            detachedContentCreator = new DetachedContentCreator().populate(dataFiles);
        } catch (Exception e) {
            LOGGER.error("Error in datafiles processing: " + e.getMessage());
            throw new DigiDoc4JException(e);
        }
        List<DSSDoreplacedent> detachedContentList = detachedContentCreator.getDetachedContentList();
        SignatureExtender signatureExtender = new SignatureExtender(getConfiguration(), detachedContentList);
        List<DSSDoreplacedent> extendedSignatureDoreplacedents = signatureExtender.extend(signatures, profile);
        List<XadesSignatureWrapper> parsedSignatures = parseSignaturesWrappers(extendedSignatureDoreplacedents, detachedContentList);
        List<Signature> extendedSignatures = openSignatures(parsedSignatures);
        LOGGER.debug("Finished extending all signatures");
        return extendedSignatures;
    }

    private List<XadesSignatureWrapper> parseSignaturesWrappers(List<DSSDoreplacedent> signatureDoreplacedents, List<DSSDoreplacedent> detachedContent) {
        AsicSignatureParser signatureParser = new AsicSignatureParser(detachedContent, configuration);
        List<XadesSignatureWrapper> parsedSignatures = new ArrayList<>();
        for (DSSDoreplacedent signatureDoreplacedent : signatureDoreplacedents) {
            XadesSignature signature = signatureParser.parse(signatureDoreplacedent);
            parsedSignatures.add(new XadesSignatureWrapper(signature, signatureDoreplacedent));
        }
        return parsedSignatures;
    }

    protected void validateDataFilesRemoval() {
        if (isContainerSigned()) {
            LOGGER.error("Datafiles cannot be removed from an already signed container");
            throw new RemovingDataFileException();
        }
    }

    protected void verifyIfAllowedToAddDataFile(String fileName) {
        if (isContainerSigned()) {
            String errorMessage = "Datafiles cannot be added to an already signed container";
            LOGGER.error(errorMessage);
            throw new DigiDoc4JException(errorMessage);
        }
        checkForDuplicateDataFile(fileName);
    }

    private boolean isContainerSigned() {
        return !getSignatures().isEmpty();
    }

    private void checkForDuplicateDataFile(String fileName) {
        for (DataFile dataFile : getDataFiles()) {
            String dataFileName = dataFile.getName();
            if (StringUtils.equals(dataFileName, fileName)) {
                String errorMessage = "Data file " + fileName + " already exists";
                LOGGER.error(errorMessage);
                throw new DuplicateDataFileException(errorMessage);
            }
        }
    }

    /**
     * @param containerType
     */
    public void setType(String containerType) {
        this.containerType = containerType;
    }

    @Override
    public String getType() {
        return containerType;
    }

    private void openContainer(String containerPath) {
        LOGGER.debug("Opening container from <{}>", containerPath);
        this.populateContainerWithParseResult(new AsicFileContainerParser(containerPath, this.getConfiguration()).read());
    }

    private void openContainer(InputStream inputStream) {
        LOGGER.debug("Opening container from stream");
        this.populateContainerWithParseResult(new AsicStreamContainerParser(inputStream, this.getConfiguration()).read());
    }

    private void populateContainerWithParseResult(AsicParseResult parseResult) {
        this.containerParseResult = parseResult;
        this.dataFiles.addAll(parseResult.getDataFiles());
        this.timeStampToken = parseResult.getTimeStampToken();
        this.signatures.addAll(this.openSignatures(parseResult.getSignatures()));
    }

    private void removeExistingSignature(AsicSignature signature) {
        DSSDoreplacedent signatureDoreplacedent = signature.getSignatureDoreplacedent();
        if (signatureDoreplacedent == null) {
            return;
        }
        String signatureFileName = signatureDoreplacedent.getName();
        removeExistingSignatureFromContainer(signatureFileName);
        removeExistingFileFromContainer(signatureFileName);
    }

    private void removeExistingSignatureFromContainer(String signatureName) {
        LOGGER.debug("Removing signature '{}' from the container", signatureName);
        if (containerParseResult.removeSignature(signatureName)) {
            LOGGER.debug("Signature '{}' successfully removed from container", signatureName);
        }
    }

    private void removeExistingFileFromContainer(String fileName) {
        LOGGER.debug("Removing file '{}' from the container" + fileName);
        if (containerParseResult.removeAsicEntry(fileName)) {
            LOGGER.debug("File '{}' successfully removed from container", fileName);
        }
    }

    private void removeAllExistingSignaturesFromContainer() {
        LOGGER.debug("Removing all existing signatures");
        for (Signature signature : signatures) {
            removeExistingSignature((AsicSignature) signature);
        }
    }

    private int determineNextSignatureFileIndex() {
        Integer currentUsedSignatureFileIndex = containerParseResult.getCurrentUsedSignatureFileIndex();
        if (currentUsedSignatureFileIndex == null) {
            return 0;
        }
        return currentUsedSignatureFileIndex + 1;
    }

    @Override
    public List<DataFile> getDataFiles() {
        return dataFiles;
    }

    @Override
    public DataFile addDataFile(String path, String mimeType) {
        DataFile dataFile = new DataFile(path, mimeType);
        addDataFile(dataFile);
        return dataFile;
    }

    @Override
    public DataFile addDataFile(InputStream inputStream, String fileName, String mimeType) {
        DataFile dataFile = new DataFile(inputStream, fileName, mimeType);
        addDataFile(dataFile);
        return dataFile;
    }

    @Override
    public DataFile addDataFile(File file, String mimeType) {
        DataFile dataFile = new DataFile(file.getPath(), mimeType);
        addDataFile(dataFile);
        return dataFile;
    }

    @Override
    public void addDataFile(DataFile dataFile) {
        String fileName = dataFile.getName();
        verifyIfAllowedToAddDataFile(fileName);
        if (Constant.ASICS_CONTAINER_TYPE.equals(getType())) {
            if (dataFiles.size() > 1) {
                throw new DigiDoc4JException("DataFile is already exists");
            } else if (newDataFiles.size() > 1) {
                throw new DigiDoc4JException("Not possible to add more than one datafile");
            }
        }
        dataFiles.add(dataFile);
        newDataFiles.add(dataFile);
        dataFilesHaveChanged = true;
        if (!isNewContainer()) {
            removeExistingFileFromContainer(AsicManifest.XML_PATH);
        }
    }

    @Override
    public void addSignature(Signature signature) {
        validateIncomingSignature(signature);
        validateSignatureId(signature);
        newSignatures.add(signature);
        signatures.add(signature);
    }

    /**
     * Set timestamp token to container
     *
     * @param timeStampToken
     */
    public void setTimeStampToken(DataFile timeStampToken) {
        this.timeStampToken = timeStampToken;
    }

    private void validateSignatureId(Signature signature) {
        for (Signature sig : signatures) {
            if (sig.getId() != null && sig.getId().equalsIgnoreCase(signature.getId())) {
                throw new TechnicalException("Signature with Id \"" + signature.getId() + "\" already exists");
            }
        }
    }

    /**
     * Controlls if timestamp token is defined
     *
     * @return true if timestemp token defined
     */
    public boolean isTimestampTokenDefined() {
        return timeStampToken != null;
    }

    // =======================================================
    @Override
    public void extendSignatureProfile(SignatureProfile profile) {
        if (!isNewContainer()) {
            removeAllExistingSignaturesFromContainer();
            List<Signature> signatures = extendAllSignaturesProfile(profile, this.signatures, dataFiles);
            this.signatures = signatures;
            newSignatures = new ArrayList<>(signatures);
        } else {
            signatures = extendAllSignaturesProfile(profile, signatures, dataFiles);
        }
    }

    private List<Signature> extendAllSignaturesProfile(SignatureProfile profile, List<Signature> signatures, List<DataFile> dataFiles) {
        List<Signature> extendedSignatures;
        if (Constant.ASICS_CONTAINER_TYPE.equals(getType())) {
            extendedSignatures = extendAllSignatureProfile(profile, signatures, Arrays.asList(dataFiles.get(0)));
        } else {
            extendedSignatures = extendAllSignatureProfile(profile, signatures, dataFiles);
        }
        return extendedSignatures;
    }

    @Override
    public void removeSignature(Signature signature) {
        if (signature == null) {
            LOGGER.warn("Cannot remove null signature");
            return;
        }
        LOGGER.info("Removing signature " + signature.getId());
        if (!isNewContainer()) {
            validateIncomingSignature(signature);
            boolean wasNewlyAddedSignature = newSignatures.remove(signature);
            boolean wasIncludedInContainer = signatures.remove(signature);
            if (wasIncludedInContainer && !wasNewlyAddedSignature) {
                LOGGER.debug("This signature was included in the container before the container was opened");
                removeExistingSignature((AsicSignature) signature);
            }
        } else {
            newSignatures.remove(signature);
            signatures.remove(signature);
        }
    }

    @Override
    @Deprecated
    public void removeSignature(int signatureId) {
        LOGGER.debug("Removing signature from index " + signatureId);
        Signature signature = signatures.get(signatureId);
        if (signature != null) {
            removeSignature(signature);
        }
    }

    @Override
    public void removeDataFile(String fileName) {
        validateDataFilesRemoval();
        for (DataFile dataFile : dataFiles) {
            String name = dataFile.getName();
            if (StringUtils.equals(fileName, name)) {
                removeDataFileFromContainer(dataFile);
                LOGGER.info("Data file named '{}' has been removed", fileName);
                return;
            }
        }
        throw new DataFileNotFoundException(fileName);
    }

    @Override
    public void removeDataFile(DataFile file) {
        validateDataFilesRemoval();
        boolean wasRemovalSuccessful = removeDataFileFromContainer(file);
        if (!wasRemovalSuccessful) {
            throw new DataFileNotFoundException(file.getName());
        }
        LOGGER.info("Data file named '{}' has been removed", file.getName());
    }

    private boolean removeDataFileFromContainer(DataFile dataFile) {
        if (!isNewContainer()) {
            removeExistingFileFromContainer(dataFile.getName());
            containerParseResult.getDataFiles().remove(dataFile);
            containerParseResult.getDetachedContents().remove(dataFile.getDoreplacedent());
        }
        newDataFiles.remove(dataFile);
        return dataFiles.remove(dataFile);
    }

    private boolean isNewContainer() {
        return containerParseResult == null;
    }

    @Override
    public List<Signature> getSignatures() {
        return signatures;
    }

    protected void writeAsicContainer(AsicContainerCreator zipCreator) {
        String userAgent = createUserAgent();
        zipCreator.setZipComment(userAgent);
        if (!isNewContainer()) {
            int nextSignatureFileIndex = determineNextSignatureFileIndex();
            zipCreator.writeExistingEntries(containerParseResult.getAsicEntries());
            if (dataFilesHaveChanged) {
                zipCreator.writeManifest(dataFiles, getType());
            }
            zipCreator.writeSignatures(newSignatures, nextSignatureFileIndex);
            zipCreator.writeDataFiles(newDataFiles);
            if (StringUtils.isNotBlank(containerParseResult.getZipFileComment())) {
                zipCreator.writeContainerComment(containerParseResult.getZipFileComment());
            }
        } else {
            int startingSignatureFileIndex = 0;
            zipCreator.writeAsiceMimeType(getType());
            zipCreator.writeManifest(dataFiles, getType());
            zipCreator.writeDataFiles(dataFiles);
            if (timeStampToken != null && Constant.ASICS_CONTAINER_TYPE.equals(getType())) {
                zipCreator.writeTimestampToken(timeStampToken);
            } else {
                zipCreator.writeSignatures(signatures, startingSignatureFileIndex);
            }
            zipCreator.writeContainerComment(userAgent);
        }
        zipCreator.finalizeZipFile();
    }

    // =============== Deprecated methods ====================
    @Override
    @Deprecated
    public void addRawSignature(byte[] signatureDoreplacedent) {
        LOGGER.info("Adding raw signature");
        Signature signature = SignatureBuilder.aSignature(this).openAdESSignature(signatureDoreplacedent);
        addSignature(signature);
    }

    @Override
    @Deprecated
    public void addRawSignature(InputStream signatureStream) {
        try {
            byte[] bytes = IOUtils.toByteArray(signatureStream);
            addRawSignature(bytes);
        } catch (IOException e) {
            LOGGER.error("Failed to read signature stream: " + e.getMessage());
            throw new InvalidSignatureException();
        }
    }

    @Override
    @Deprecated
    public int countDataFiles() {
        return getDataFiles().size();
    }

    @Override
    @Deprecated
    public int countSignatures() {
        return getSignatures().size();
    }

    @Override
    @Deprecated
    public DoreplacedentType getDoreplacedentType() {
        return Container.DoreplacedentType.BDOC;
    }

    @Override
    @Deprecated
    public String getVersion() {
        return "";
    }

    @Override
    @Deprecated
    public void extendTo(SignatureProfile profile) {
        extendSignatureProfile(profile);
    }

    @Override
    @Deprecated
    public void save(String path) {
        saveAsFile(path);
    }

    @Override
    @Deprecated
    public DataFile getDataFile(int index) {
        return getDataFiles().get(index);
    }

    @Override
    @Deprecated
    public Signature getSignature(int index) {
        return getSignatures().get(index);
    }

    /**
     * Prepare signing method is not supported by ASiC container.
     *
     * @param signerCert X509 Certificate to be used for preparing the signature
     * @return NotSupportedException
     */
    @Override
    @Deprecated
    public SignedInfo prepareSigning(X509Certificate signerCert) {
        throw new NotSupportedException("Prepare signing method is not supported by Asic container");
    }

    /**
     * Getting signature profile method is not supported by ASiC container.
     *
     * @return NotSupportedException
     */
    @Override
    @Deprecated
    public String getSignatureProfile() {
        throw new NotSupportedException("Getting signature profile method is not supported by Asic container");
    }

    /**
     * Setting signature parameters method is not supported by ASiC container
     *
     * @param signatureParameters Signature parameters. These are  related to the signing location and signer roles
     */
    @Override
    @Deprecated
    public void setSignatureParameters(SignatureParameters signatureParameters) {
        throw new NotSupportedException("Setting signature parameters method is not supported by Asic container");
    }

    /**
     * Getting digest algorithm method is not supported by ASiC container.
     *
     * @return NotSupportedException.
     */
    @Override
    @Deprecated
    public DigestAlgorithm getDigestAlgorithm() {
        throw new NotSupportedException("Getting digest algorithm method is not supported by Asic container");
    }

    /**
     * Sign method is not supported by ASiC container.
     *
     * @param signatureToken signatureToken implementation
     * @return NotSupportedException
     */
    @Override
    @Deprecated
    public Signature sign(SignatureToken signatureToken) {
        throw new NotSupportedException("Sign method is not supported by Asic container");
    }

    /**
     * Sign raw method is not supported by ASiC container.
     *
     * @param rawSignature raw signature
     * @return NotSupportedException
     */
    @Override
    @Deprecated
    public Signature signRaw(byte[] rawSignature) {
        throw new NotSupportedException("Sign raw method is not supported by Asic container");
    }

    /**
     * Setting signature profile method is not supported by ASiC container.
     *
     * @param profile signature profile
     */
    @Override
    @Deprecated
    public void setSignatureProfile(SignatureProfile profile) {
        throw new NotSupportedException("Setting signature profile method is not supported by Asic container");
    }

    public AsicParseResult getContainerParseResult() {
        return containerParseResult;
    }
}

17 View Complete Implementation : AsicSignature.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * Created by Andrei on 29.11.2017.
 */
public clreplaced AsicSignature implements Signature {

    private static final Logger logger = LoggerFactory.getLogger(AsicSignature.clreplaced);

    private ValidationResult validationResult;

    private XadesSignature xadesSignature;

    private SignatureValidator validator;

    private DSSDoreplacedent signatureDoreplacedent;

    private Configuration configuration;

    /**
     * Asic signature constructor.
     *
     * @param xadesSignature XADES signature
     * @param validator      signature validator
     */
    public AsicSignature(XadesSignature xadesSignature, SignatureValidator validator) {
        this.xadesSignature = xadesSignature;
        this.validator = validator;
    }

    @Override
    public String getCity() {
        return xadesSignature.getCity();
    }

    @Override
    public String getCountryName() {
        return xadesSignature.getCountryName();
    }

    @Override
    public String getId() {
        return xadesSignature.getId();
    }

    @Override
    public String getUniqueId() {
        return xadesSignature.getUniqueId();
    }

    @Override
    public byte[] getOCSPNonce() {
        throw new NotYetImplementedException();
    }

    @Override
    public X509Cert getOCSPCertificate() {
        return xadesSignature.getOCSPCertificate();
    }

    @Override
    @Deprecated
    public String getPolicy() {
        throw new NotYetImplementedException();
    }

    @Override
    public String getPostalCode() {
        return xadesSignature.getPostalCode();
    }

    /**
     * This method returns Date object, it can be null.
     *
     * @return Date
     */
    @Override
    public Date getOCSPResponseCreationTime() {
        return xadesSignature.getOCSPResponseCreationTime();
    }

    /**
     * This method returns Date object, it can be null.
     *
     * @return Date
     */
    @Override
    @Deprecated
    public Date getProducedAt() {
        return getOCSPResponseCreationTime();
    }

    @Override
    public Date getTimeStampCreationTime() {
        return xadesSignature.getTimeStampCreationTime();
    }

    /**
     * Trusted signing time should be taken based on the profile:
     * BES should return null,
     * LT_TM should return OCSP response creation time and
     * LT should return Timestamp creation time.
     *
     * @return signing time backed by a trusted service (not just a user's computer clock time).
     */
    @Override
    public Date getTrustedSigningTime() {
        return xadesSignature.getTrustedSigningTime();
    }

    @Override
    public SignatureProfile getProfile() {
        return xadesSignature.getProfile();
    }

    @Override
    public String getSignatureMethod() {
        return xadesSignature.getSignatureMethod();
    }

    @Override
    public List<String> getSignerRoles() {
        return xadesSignature.getSignerRoles();
    }

    @Override
    public X509Cert getSigningCertificate() {
        return xadesSignature.getSigningCertificate();
    }

    /**
     * This method returns Date object, it can be null.
     *
     * @return Date
     */
    @Override
    public Date getClaimedSigningTime() {
        return xadesSignature.getSigningTime();
    }

    /**
     * Gets signing time depending on the signature profile.
     *
     * @return Date
     */
    @Override
    public Date getSigningTime() {
        logger.debug("get signing time by profile: " + getProfile());
        switch(getProfile()) {
            case B_BES:
                return getClaimedSigningTime();
            case B_EPES:
                return getClaimedSigningTime();
            default:
                return getTrustedSigningTime();
        }
    }

    @Override
    @Deprecated
    public URI getSignaturePolicyURI() {
        throw new NotYetImplementedException();
    }

    @Override
    public String getStateOrProvince() {
        return xadesSignature.getStateOrProvince();
    }

    @Override
    public X509Cert getTimeStampTokenCertificate() {
        return xadesSignature.getTimeStampTokenCertificate();
    }

    @Override
    public ValidationResult validateSignature() {
        logger.debug("Validating signature");
        if (validationResult == null) {
            validationResult = this.validator.extractResult();
            logger.info("Signature has " + validationResult.getErrors().size() + " validation errors and " + validationResult.getWarnings().size() + " warnings");
        } else {
            logger.debug("Using existing validation errors with " + validationResult.getErrors().size() + " validation errors and " + validationResult.getWarnings().size() + " warnings");
        }
        return validationResult;
    }

    @Override
    @Deprecated
    public List<DigiDoc4JException> validate() {
        return validateSignature().getErrors();
    }

    @Override
    public byte[] getAdESSignature() {
        logger.debug("Getting full XAdES signature byte array");
        try {
            return IOUtils.toByteArray(signatureDoreplacedent.openStream());
        } catch (IOException e) {
            throw new TechnicalException("Error parsing xades signature: " + e.getMessage(), e);
        }
    }

    @Override
    @Deprecated
    public byte[] getRawSignature() {
        return getAdESSignature();
    }

    /**
     * This method returns XadesSignature object.
     *
     * @return xades signature.
     */
    public XadesSignature getOrigin() {
        return xadesSignature;
    }

    /**
     * Set signature doreplacedent.
     *
     * @param signatureDoreplacedent
     */
    public void setSignatureDoreplacedent(DSSDoreplacedent signatureDoreplacedent) {
        this.signatureDoreplacedent = signatureDoreplacedent;
    }

    /**
     * This method returns validation result (XadesValidationResult object).
     *
     * @return XadesValidationResult.
     */
    public XadesValidationResult getDssValidationReport() {
        return xadesSignature.validate();
    }

    /**
     * This method returns signature doreplacedent (SignatureDoreplacedent object).
     *
     * @return DSSDoreplacedent.
     */
    public DSSDoreplacedent getSignatureDoreplacedent() {
        return signatureDoreplacedent;
    }

    /**
     * Gets Signature Digest Algorithm
     *
     * @return DigestAlgorithm
     */
    public DigestAlgorithm getSignatureDigestAlgorithm() {
        return xadesSignature.getDssSignature().getDigestAlgorithm();
    }

    /**
     * Setter for Configuration
     *
     * @param configuration
     */
    public void setConfiguration(Configuration configuration) {
        this.configuration = configuration;
    }

    /**
     * Getter for Configuration
     *
     * @return Configuration
     */
    public Configuration getConfiguration() {
        return this.configuration;
    }
}

16 View Complete Implementation : XadesValidationDssFacade.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
public clreplaced XadesValidationDssFacade {

    private final static Logger logger = LoggerFactory.getLogger(XadesValidationDssFacade.clreplaced);

    private List<DSSDoreplacedent> detachedContents;

    private Configuration configuration;

    private CertificateVerifier certificateVerifier;

    public XadesValidationDssFacade(List<DSSDoreplacedent> detachedContents, Configuration configuration) {
        this.detachedContents = detachedContents;
        this.configuration = configuration;
        certificateVerifier = createCertificateVerifier();
    }

    public SignedDoreplacedentValidator openXadesValidator(DSSDoreplacedent signature) {
        try {
            logger.debug("Opening signature validator");
            SignedDoreplacedentValidator validator = new XMLDoreplacedentValidator(signature);
            logger.debug("Finished opening signature validator");
            validator.setDetachedContents(detachedContents);
            validator.setCertificateVerifier(certificateVerifier);
            SignaturePolicyProvider signaturePolicyProvider = Helper.getBdocSignaturePolicyProvider(signature);
            validator.setSignaturePolicyProvider(signaturePolicyProvider);
            return validator;
        } catch (DSSException e) {
            logger.error("Failed to parse xades signature: " + e.getMessage());
            throw new InvalidSignatureException();
        }
    }

    private CertificateVerifier createCertificateVerifier() {
        logger.debug("Creating new certificate verifier");
        CertificateVerifier certificateVerifier = new SKCommonCertificateVerifier();
        // Disable CRL checks
        certificateVerifier.setCrlSource(null);
        // Disable CRL checks
        certificateVerifier.setSignatureCRLSource(null);
        logger.debug("Setting trusted cert source to the certificate verifier");
        certificateVerifier.setTrustedCertSource(configuration.getTSL());
        logger.debug("Finished creating certificate verifier");
        return certificateVerifier;
    }
}

16 View Complete Implementation : CommandLineExecutor.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
private void verifyContainer(Container container) {
    Path reports = null;
    if (this.context.getCommandLine().hasOption("reportDir")) {
        reports = Paths.get(this.context.getCommandLine().getOptionValue("reportDir"));
    }
    if (this.context.getCommandLine().hasOption("verify")) {
        ContainerVerifier verifier = new ContainerVerifier(this.context.getCommandLine());
        if (this.context.getCommandLine().hasOption("showerrors")) {
            Configuration configuration = container.getConfiguration();
            configuration.setFullReportNeeded(true);
            verifier.verify(container, reports);
        } else {
            verifier.verify(container, reports);
        }
    }
}

16 View Complete Implementation : TimestampToken.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
private static OnlineTSPSource defineOnlineTSPSource(Configuration configuration) {
    OnlineTSPSource source = new OnlineTSPSource();
    if (configuration == null) {
        configuration = Configuration.getInstance();
    }
    source.setTspServer(configuration.getTspSource());
    DataLoader loader = new TspDataLoaderFactory(configuration, Helper.createBDocAsicSUserAgent()).create();
    source.setDataLoader(loader);
    return source;
}

16 View Complete Implementation : TimestampToken.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * generates timesstamp token for AsicS container
 *
 * @param digestAlgorithm
 * @param dataFiles
 * @return DataFile timestamp token
 */
public static DataFile generateTimestampToken(DigestAlgorithm digestAlgorithm, List<ContainerBuilder.ContainerDataFile> dataFiles, Configuration configuration) {
    if (dataFiles.isEmpty()) {
        throw new DigiDoc4JException("Add data file first");
    }
    if (dataFiles.size() > 1) {
        throw new DigiDoc4JException("Supports only asics with only one datafile");
    }
    ContainerBuilder.ContainerDataFile containerDataFile = dataFiles.get(0);
    OnlineTSPSource onlineTSPSource = defineOnlineTSPSource(configuration);
    byte[] dataFileDigest = getDigest(containerDataFile);
    byte[] digest = DSSUtils.digest(digestAlgorithm, dataFileDigest);
    DataFile timeStampToken = getTimestampToken(onlineTSPSource, digestAlgorithm, digest);
    return timeStampToken;
}

16 View Complete Implementation : IncompleteSigningTest.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * Sets up PROD configuration in order to get TSL without OCSP responder and signer CA certificates.
 * NB: OCSP and TSP sources are set to demo URLs in order to prevent requests to non-free TSA and/or OCSP!
 */
private void setUpProdConfigurationWithTestTsaAndOcsp() {
    configuration = Configuration.of(Configuration.Mode.PROD);
    Configuration testConfiguration = Configuration.of(Configuration.Mode.TEST);
    configuration.setOcspSource(testConfiguration.getOcspSource());
    configuration.setTspSource(testConfiguration.getTspSource());
}

16 View Complete Implementation : TestAssert.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
public static void replacedertOCSPSource(Configuration configuration, SKOnlineOCSPSource source, String userAgentPart) {
    replacedert.replacedertSame(configuration, source.getConfiguration());
    replacedert.replacedertNotNull(source.getDataLoader());
    replacedert.replacedertThat(((SkDataLoader) source.getDataLoader()).getUserAgent(), CoreMatchers.containsString(userAgentPart));
}

15 View Complete Implementation : AsicContainerParser.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * Abstract clreplaced for parsing ASiC containers.
 */
public abstract clreplaced AsicContainerParser {

    public static final String MANIFEST = "META-INF/manifest.xml";

    public static final String TIMESTAMP_TOKEN = "META-INF/timestamp.tst";

    private static final Logger logger = LoggerFactory.getLogger(AsicContainerParser.clreplaced);

    // Matches META-INF/*signatures*.xml where the last * is a number
    private static final String SIGNATURES_FILE_REGEX = "META-INF/(.*)signatures(.*).xml";

    private static final Pattern SIGNATURE_FILE_ENDING_PATTERN = Pattern.compile("(\\d+).xml");

    private final Configuration configuration;

    private AsicParseResult parseResult = new AsicParseResult();

    private List<DSSDoreplacedent> signatures = new ArrayList<>();

    private LinkedHashMap<String, DataFile> dataFiles = new LinkedHashMap<>();

    private List<DSSDoreplacedent> detachedContents = new ArrayList<>();

    private Integer currentSignatureFileIndex;

    private String mimeType;

    private String zipFileComment;

    private List<AsicEntry> asicEntries = new ArrayList<>();

    private Map<String, ManifestEntry> manifestFileItems = Collections.emptyMap();

    private ManifestParser manifestParser;

    private boolean storeDataFilesOnlyInMemory;

    private boolean manifestFound = false;

    private long maxDataFileCachedInBytes;

    private DataFile timestampToken;

    protected AsicContainerParser(Configuration configuration) {
        this.configuration = configuration;
        storeDataFilesOnlyInMemory = configuration.storeDataFilesOnlyInMemory();
        maxDataFileCachedInBytes = configuration.getMaxDataFileCachedInBytes();
    }

    /**
     * Method for parsing and validating ASiC container.
     * @return parsing result
     */
    public AsicParseResult read() {
        parseContainer();
        validateParseResult();
        populateParseResult();
        return parseResult;
    }

    protected abstract void parseContainer();

    protected abstract void extractManifest(ZipEntry entry);

    protected abstract InputStream getZipEntryInputStream(ZipEntry entry);

    protected void parseManifestEntry(DSSDoreplacedent manifestFile) {
        logger.debug("Parsing manifest");
        manifestParser = new ManifestParser(manifestFile);
        manifestFileItems = manifestParser.getManifestFileItems();
    }

    protected void parseEntry(ZipEntry entry) {
        String entryName = entry.getName();
        logger.debug("Paring zip entry " + entryName + " with comment: " + entry.getComment());
        if (isMimeType(entryName)) {
            extractMimeType(entry);
        } else if (isManifest(entryName)) {
            if (this.manifestFound) {
                throw new DigiDoc4JException("Multiple manifest.xml files disallowed");
            }
            this.manifestFound = true;
            extractManifest(entry);
        } else if (isSignaturesFile(entryName)) {
            determineCurrentSignatureFileIndex(entryName);
            extractSignature(entry);
        } else if (isDataFile(entryName)) {
            extractDataFile(entry);
        } else if (isTimeStampToken(entryName)) {
            extractTimeStamp(entry);
        } else {
            extractAsicEntry(entry);
        }
    }

    private void extractMimeType(ZipEntry entry) {
        try {
            InputStream zipFileInputStream = getZipEntryInputStream(entry);
            BOMInputStream bomInputStream = new BOMInputStream(zipFileInputStream);
            DSSDoreplacedent doreplacedent = new InMemoryDoreplacedent(bomInputStream);
            mimeType = StringUtils.trim(IOUtils.toString(getDoreplacedentBytes(doreplacedent), "UTF-8"));
            extractAsicEntry(entry, doreplacedent);
        } catch (IOException e) {
            logger.error("Error parsing container mime type: " + e.getMessage());
            throw new TechnicalException("Error parsing container mime type: " + e.getMessage(), e);
        }
    }

    private void extractSignature(ZipEntry entry) {
        logger.debug("Extracting signature");
        InputStream zipFileInputStream = getZipEntryInputStream(entry);
        String fileName = entry.getName();
        InMemoryDoreplacedent doreplacedent = new InMemoryDoreplacedent(zipFileInputStream, fileName);
        signatures.add(doreplacedent);
        extractSignatureAsicEntry(entry, doreplacedent);
    }

    private void extractTimeStamp(ZipEntry entry) {
        logger.debug("Extracting timestamp file");
        InputStream zipFileInputStream = getZipEntryInputStream(entry);
        String fileName = entry.getName();
        timestampToken = new DataFile(zipFileInputStream, fileName, MimeType.TST.getMimeTypeString());
    }

    private void extractDataFile(ZipEntry entry) {
        logger.debug("Extracting data file");
        String fileName = entry.getName();
        validateDataFile(fileName);
        DSSDoreplacedent doreplacedent = extractStreamDoreplacedent(entry);
        DataFile dataFile = new AsicDataFile(doreplacedent);
        dataFiles.put(fileName, dataFile);
        detachedContents.add(doreplacedent);
        extractAsicEntry(entry, doreplacedent);
    }

    private DSSDoreplacedent extractStreamDoreplacedent(ZipEntry entry) {
        logger.debug("Zip entry size is <{}> bytes", entry.getSize());
        MimeType mimeTypeCode = MimeTypeUtil.mimeTypeOf(this.getDataFileMimeType(entry.getName()));
        if (this.storeDataFilesOnlyInMemory || entry.getSize() <= this.maxDataFileCachedInBytes) {
            return new InMemoryDoreplacedent(this.getZipEntryInputStream(entry), entry.getName(), mimeTypeCode);
        } else {
            return new StreamDoreplacedent(this.getZipEntryInputStream(entry), entry.getName(), mimeTypeCode);
        }
    }

    protected AsicEntry extractAsicEntry(ZipEntry entry) {
        logger.debug("Extracting asic entry");
        DSSDoreplacedent doreplacedent = extractStreamDoreplacedent(entry);
        return extractAsicEntry(entry, doreplacedent);
    }

    private AsicEntry extractAsicEntry(ZipEntry zipEntry, DSSDoreplacedent doreplacedent) {
        AsicEntry asicEntry = new AsicEntry(zipEntry);
        asicEntry.setContent(doreplacedent);
        asicEntries.add(asicEntry);
        return asicEntry;
    }

    private void extractSignatureAsicEntry(ZipEntry entry, DSSDoreplacedent doreplacedent) {
        AsicEntry asicEntry = extractAsicEntry(entry, doreplacedent);
        asicEntry.setSignature(true);
    }

    protected String getDataFileMimeType(String fileName) {
        if (manifestFileItems.containsKey(fileName)) {
            ManifestEntry manifestEntry = manifestFileItems.get(fileName);
            return manifestEntry.getMimeType();
        } else {
            MimeType mimetype = MimeType.fromFileName(fileName);
            return mimetype.getMimeTypeString();
        }
    }

    private void validateParseResult() {
        if (!StringUtils.equalsIgnoreCase(MimeType.ASICE.getMimeTypeString(), mimeType) && !StringUtils.equalsIgnoreCase(MimeType.ASICS.getMimeTypeString(), mimeType)) {
            logger.error("Container mime type is not " + MimeType.ASICE.getMimeTypeString() + " but is " + mimeType);
            throw new UnsupportedFormatException("Container mime type is not " + MimeType.ASICE.getMimeTypeString() + " OR " + MimeType.ASICS.getMimeTypeString() + " but is " + mimeType);
        }
        if (!this.signatures.isEmpty() && this.dataFiles.isEmpty()) {
            throw new ContainerWithoutFilesException("The reference data object(s) is not found!");
        }
    }

    private void validateDataFile(String fileName) {
        if (dataFiles.containsKey(fileName)) {
            logger.error("Container contains duplicate data file: " + fileName);
            throw new DuplicateDataFileException("Container contains duplicate data file: " + fileName);
        }
    }

    private void populateParseResult() {
        Collection<DataFile> files = dataFiles.values();
        parseResult.setDataFiles(new ArrayList<>(files));
        parseResult.setCurrentUsedSignatureFileIndex(currentSignatureFileIndex);
        parseResult.setDetachedContents(detachedContents);
        parseResult.setSignatures(parseSignatures());
        parseResult.setManifestParser(manifestParser);
        parseResult.setZipFileComment(zipFileComment);
        parseResult.setAsicEntries(asicEntries);
        parseResult.setTimeStampToken(timestampToken);
        parseResult.setMimeType(mimeType);
    }

    private List<XadesSignatureWrapper> parseSignatures() {
        AsicSignatureParser signatureParser = new AsicSignatureParser(parseResult.getDetachedContents(), configuration);
        List<XadesSignatureWrapper> parsedSignatures = new ArrayList<>();
        for (DSSDoreplacedent signatureDoreplacedent : signatures) {
            XadesSignature signature = signatureParser.parse(signatureDoreplacedent);
            parsedSignatures.add(new XadesSignatureWrapper(signature, signatureDoreplacedent));
        }
        return parsedSignatures;
    }

    private boolean isMimeType(String entryName) {
        return StringUtils.equalsIgnoreCase("mimetype", entryName);
    }

    private boolean isDataFile(String entryName) {
        return !entryName.startsWith("META-INF/") && !isMimeType(entryName);
    }

    private boolean isTimeStampToken(String entryName) {
        return StringUtils.equalsIgnoreCase(TIMESTAMP_TOKEN, entryName);
    }

    private boolean isManifest(String entryName) {
        return StringUtils.equalsIgnoreCase(MANIFEST, entryName);
    }

    private boolean isSignaturesFile(String entryName) {
        return entryName.matches(SIGNATURES_FILE_REGEX);
    }

    private void determineCurrentSignatureFileIndex(String entryName) {
        Matcher fileEndingMatcher = SIGNATURE_FILE_ENDING_PATTERN.matcher(entryName);
        boolean fileEndingFound = fileEndingMatcher.find();
        if (fileEndingFound) {
            String fileEnding = fileEndingMatcher.group();
            String indexNumber = fileEnding.replace(".xml", "");
            int fileIndex = Integer.parseInt(indexNumber);
            if (currentSignatureFileIndex == null || currentSignatureFileIndex <= fileIndex) {
                currentSignatureFileIndex = fileIndex;
            }
        }
    }

    private byte[] getDoreplacedentBytes(DSSDoreplacedent doreplacedent) {
        try {
            return IOUtils.toByteArray(doreplacedent.openStream());
        } catch (IOException e) {
            logger.error("Error getting doreplacedent content: " + e.getMessage());
            throw new TechnicalException("Error getting doreplacedent content: " + e.getMessage(), e);
        }
    }

    void setZipFileComment(String zipFileComment) {
        this.zipFileComment = zipFileComment;
    }

    LinkedHashMap<String, DataFile> getDataFiles() {
        return dataFiles;
    }
}

15 View Complete Implementation : DataLoaderDecorator.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * @param dataLoader data loader
 * @param configuration configuration
 */
public static void decorateWithProxySettings(CommonsDataLoader dataLoader, Configuration configuration) {
    if (configuration.isNetworkProxyEnabled()) {
        ProxyProperties httpProxyProperties = createProxyProperties(configuration.getHttpProxyPort(), configuration.getHttpProxyHost(), configuration.getHttpProxyUser(), configuration.getHttpProxyPreplacedword());
        ProxyProperties httpsProxyProperties = createProxyProperties(configuration.getHttpsProxyPort(), configuration.getHttpsProxyHost(), configuration.getHttpProxyUser(), configuration.getHttpProxyPreplacedword());
        ProxyConfig proxyConfig = createProxyConfig(httpProxyProperties, httpsProxyProperties);
        dataLoader.setProxyConfig(proxyConfig);
    }
}

15 View Complete Implementation : DataLoaderDecorator.java
Copyright GNU Lesser General Public License v2.1
Author : open-eid
/**
 * @param dataLoader data loader
 * @param configuration configuration
 */
public static void decorateWithSslSettings(CommonsDataLoader dataLoader, Configuration configuration) {
    if (configuration.isSslConfigurationEnabled()) {
        logger.debug("Configuring SSL");
        configureSslKeystore(dataLoader, configuration.getSslKeystorePath(), configuration.getSslKeystoreType(), configuration.getSslKeystorePreplacedword());
        configureSslTruststore(dataLoader, configuration.getSslTruststorePath(), configuration.getSslTruststoreType(), configuration.getSslTruststorePreplacedword());
        configureSslProtocol(dataLoader, configuration.getSslProtocol());
        configureSupportedSslProtocols(dataLoader, configuration.getSupportedSslProtocols());
        configureSupportedSslCipherSuites(dataLoader, configuration.getSupportedSslCipherSuites());
    }
}