package no.difi.oxalis.commons.persist; import com.google.common.io.ByteStreams; import com.google.inject.Inject; import com.google.inject.name.Named; import no.difi.oxalis.api.evidence.EvidenceFactory; import no.difi.oxalis.api.inbound.InboundMetadata; import no.difi.oxalis.api.lang.EvidenceException; import no.difi.oxalis.api.model.TransmissionIdentifier; import no.difi.oxalis.api.persist.PayloadPersister; import no.difi.oxalis.api.persist.ReceiptPersister; import no.difi.oxalis.commons.filesystem.FileUtils; import no.difi.vefa.peppol.common.model.Header; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; /** * @author erlend * @since 4.0.0 */ public class DefaultPersister implements PayloadPersister, ReceiptPersister { public static final Logger LOGGER = LoggerFactory.getLogger(DefaultPersister.class); private final EvidenceFactory evidenceFactory; private final Path inboundFolder; @Inject public DefaultPersister(@Named("inbound") Path inboundFolder, EvidenceFactory evidenceFactory) { this.inboundFolder = inboundFolder; this.evidenceFactory = evidenceFactory; } @Override public Path persist(TransmissionIdentifier transmissionIdentifier, Header header, InputStream inputStream) throws IOException { Path path = PersisterUtils.createArtifactFolders(inboundFolder, header).resolve( String.format("%s.doc.xml", FileUtils.filterString(transmissionIdentifier.getIdentifier()))); try (OutputStream outputStream = Files.newOutputStream(path)) { ByteStreams.copy(inputStream, outputStream); } LOGGER.debug("Payload persisted to: {}", path); return path; } @Override public void persist(InboundMetadata inboundMetadata, Path payloadPath) throws IOException { Path path = PersisterUtils.createArtifactFolders(inboundFolder, inboundMetadata.getHeader()).resolve( String.format("%s.receipt.dat", FileUtils.filterString(inboundMetadata.getTransmissionIdentifier().getIdentifier()))); try (OutputStream outputStream = Files.newOutputStream(path)) { evidenceFactory.write(outputStream, inboundMetadata); } catch (EvidenceException e) { throw new IOException("Unable to persist receipt.", e); } LOGGER.debug("Receipt persisted to: {}", path); } }