/*
* Copyright 2010-2017 Norwegian Agency for Public Management and eGovernment (Difi)
*
* Licensed under the EUPL, Version 1.1 or – as soon they
* will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
*
* You may not use this work except in compliance with the Licence.
*
* You may obtain a copy of the Licence at:
*
* https://joinup.ec.europa.eu/community/eupl/og_page/eupl
*
* Unless required by applicable law or agreed to in
* writing, software distributed under the Licence is
* distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the Licence for the specific language governing
* permissions and limitations under the Licence.
*/
package no.difi.oxalis.commons.evidence;
import com.google.inject.Inject;
import no.difi.oxalis.commons.util.OxalisVersion;
import no.difi.oxalis.api.evidence.EvidenceFactory;
import no.difi.oxalis.api.lang.EvidenceException;
import no.difi.oxalis.api.outbound.TransmissionResponse;
import no.difi.oxalis.api.transmission.TransmissionResult;
import no.difi.vefa.peppol.common.model.InstanceIdentifier;
import no.difi.vefa.peppol.evidence.jaxb.receipt.TransmissionRole;
import no.difi.vefa.peppol.evidence.lang.RemEvidenceException;
import no.difi.vefa.peppol.evidence.rem.EventCode;
import no.difi.vefa.peppol.evidence.rem.Evidence;
import no.difi.vefa.peppol.evidence.rem.EvidenceTypeInstance;
import no.difi.vefa.peppol.evidence.rem.SignedEvidenceWriter;
import no.difi.vefa.peppol.security.lang.PeppolSecurityException;
import java.io.OutputStream;
import java.security.KeyStore;
/**
* @author erlend
* @since 4.0.0
*/
public class RemEvidenceFactory implements EvidenceFactory {
private static final String ISSUER = String.format("Oxalis %s", OxalisVersion.getVersion());
private final KeyStore.PrivateKeyEntry privateKeyEntry;
@Inject
public RemEvidenceFactory(KeyStore.PrivateKeyEntry privateKeyEntry) {
this.privateKeyEntry = privateKeyEntry;
}
@Override
public void write(OutputStream outputStream, TransmissionResult transmissionResult) throws EvidenceException {
try {
Evidence evidence = Evidence.newInstance()
.type(EvidenceTypeInstance.DELIVERY_NON_DELIVERY_TO_RECIPIENT)
.eventCode(EventCode.DELIVERY)
// Missing optional "EventReason"
.issuer(ISSUER)
.evidenceIdentifier(InstanceIdentifier.generateUUID())
.timestamp(transmissionResult.getTimestamp())
.header(transmissionResult.getHeader())
// Missing optional "IssuerPolicy"
.digest(transmissionResult.getDigest())
.messageIdentifier(transmissionResult.getTransmissionIdentifier())
.transportProtocol(transmissionResult.getTransportProtocol())
.transmissionRole(transmissionResult instanceof TransmissionResponse ?
TransmissionRole.C_2 : TransmissionRole.C_3)
.originalReceipts(transmissionResult.getReceipts());
SignedEvidenceWriter.write(outputStream, privateKeyEntry, evidence);
} catch (RemEvidenceException | PeppolSecurityException e) {
throw new EvidenceException(e.getMessage(), e);
}
}
}