no.difi.sdp.client2.SikkerDigitalPostKlient Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of sikker-digital-post-klient-java Show documentation
Show all versions of sikker-digital-post-klient-java Show documentation
Klient for sending av sikker digital post fra offentlige virksomheter.
package no.difi.sdp.client2;
import no.difi.sdp.client2.domain.Databehandler;
import no.difi.sdp.client2.domain.Forsendelse;
import no.difi.sdp.client2.domain.exceptions.SendException;
import no.difi.sdp.client2.domain.kvittering.ForretningsKvittering;
import no.difi.sdp.client2.domain.kvittering.KvitteringForespoersel;
import no.difi.sdp.client2.internal.Billable;
import no.difi.sdp.client2.internal.CertificateValidator;
import no.difi.sdp.client2.internal.DigipostMessageSenderFacade;
import no.difi.sdp.client2.internal.EbmsForsendelseBuilder;
import no.difi.sdp.client2.internal.KvitteringBuilder;
import no.difi.sdp.client2.util.CryptoChecker;
import no.digipost.api.representations.EbmsApplikasjonsKvittering;
import no.digipost.api.representations.EbmsForsendelse;
import no.digipost.api.representations.EbmsPullRequest;
import no.digipost.api.representations.KanBekreftesSomBehandletKvittering;
import no.digipost.api.representations.TransportKvittering;
public class SikkerDigitalPostKlient {
private final Databehandler databehandler;
private final EbmsForsendelseBuilder ebmsForsendelseBuilder;
private final KvitteringBuilder kvitteringBuilder;
private final DigipostMessageSenderFacade digipostMessageSenderFacade;
private final KlientKonfigurasjon klientKonfigurasjon;
/**
* @param databehandler parten som er ansvarlig for den tekniske utførelsen av sendingen.
* Se oversikt over aktører for mer informasjon.
* @param klientKonfigurasjon Oppsett for blant annet oppkoblingen mot meldingsformidler og interceptorer for å få ut data som sendes.
*/
public SikkerDigitalPostKlient(Databehandler databehandler, KlientKonfigurasjon klientKonfigurasjon) {
CryptoChecker.checkCryptoPolicy();
this.ebmsForsendelseBuilder = new EbmsForsendelseBuilder();
this.kvitteringBuilder = new KvitteringBuilder();
this.digipostMessageSenderFacade = new DigipostMessageSenderFacade(databehandler, klientKonfigurasjon);
this.klientKonfigurasjon = klientKonfigurasjon;
this.databehandler = databehandler;
CertificateValidator.validate(klientKonfigurasjon.getMiljo(), databehandler.noekkelpar.getVirksomhetssertifikat().getX509Certificate());
}
/**
* Sender en forsendelse til meldingsformidler. Dersom noe feilet i sendingen til meldingsformidler, vil det kastes en exception med beskrivende feilmelding.
*
* @param forsendelse Et objekt som har all informasjon klar til å kunne sendes (mottakerinformasjon, sertifikater, dokumenter mm),
* enten digitalt eller fyisk.
* @throws SendException
*/
public SendResultat send(Forsendelse forsendelse) throws SendException {
Billable forsendelseBundleWithBillableBytes = ebmsForsendelseBuilder.buildEbmsForsendelse(databehandler, klientKonfigurasjon.getMeldingsformidlerOrganisasjon(), forsendelse);
TransportKvittering kvittering = digipostMessageSenderFacade.send(forsendelseBundleWithBillableBytes.entity);
return new SendResultat(kvittering.messageId, kvittering.refToMessageId, forsendelseBundleWithBillableBytes.billableBytes);
}
/**
* Forespør kvittering for forsendelser. Kvitteringer blir tilgjengeliggjort etterhvert som de er klare i meldingsformidler.
* Det er ikke mulig å etterspørre kvittering for en spesifikk forsendelse.
*
* Dersom det ikke er tilgjengelige kvitteringer skal det ventes følgende tidsintervaller før en ny forespørsel gjøres:
*
* - normal
* - Minimum 10 minutter
* - prioritert
* - Minimum 1 minutt
*
*/
public ForretningsKvittering hentKvittering(KvitteringForespoersel kvitteringForespoersel) throws SendException {
return hentKvitteringOgBekreftForrige(kvitteringForespoersel, null);
}
/**
* Forespør kvittering for forsendelser med mulighet til å samtidig bekrefte på forrige kvittering for å slippe å kjøre eget kall for bekreft.
* Kvitteringer blir tilgjengeliggjort etterhvert som de er klare i meldingsformidler. Det er ikke mulig å etterspørre kvittering for en
* spesifikk forsendelse.
*
* Dersom det ikke er tilgjengelige kvitteringer skal det ventes følgende tidsintervaller før en ny forespørsel gjøres:
*
* - normal
* - Minimum 10 minutter
* - prioritert
* - Minimum 1 minutt
*
*/
public ForretningsKvittering hentKvitteringOgBekreftForrige(KvitteringForespoersel kvitteringForespoersel, KanBekreftesSomBehandletKvittering forrigeKvittering) throws SendException {
EbmsPullRequest ebmsPullRequest = kvitteringBuilder.buildEbmsPullRequest(klientKonfigurasjon.getMeldingsformidlerOrganisasjon(), kvitteringForespoersel);
EbmsApplikasjonsKvittering ebmsApplikasjonsKvittering;
if (forrigeKvittering == null) {
ebmsApplikasjonsKvittering = digipostMessageSenderFacade.hentKvittering(ebmsPullRequest);
} else {
ebmsApplikasjonsKvittering = digipostMessageSenderFacade.hentKvittering(ebmsPullRequest, forrigeKvittering);
}
if (ebmsApplikasjonsKvittering == null) {
return null;
}
return kvitteringBuilder.buildForretningsKvittering(ebmsApplikasjonsKvittering);
}
/**
* Bekreft mottak av forretningskvittering gjennom {@link #hentKvittering(KvitteringForespoersel)}.
* {@link #hentKvittering(KvitteringForespoersel)} kommer ikke til å returnere en ny kvittering før mottak av den forrige er bekreftet.
*
* Dette legger opp til følgende arbeidsflyt:
*
* - {@link #hentKvittering(KvitteringForespoersel)}
* - Gjør intern prosessering av kvitteringen (lagre til database, og så videre)
* - Bekreft mottak av kvittering
*
*/
public void bekreft(KanBekreftesSomBehandletKvittering forrigeKvittering) throws SendException {
digipostMessageSenderFacade.bekreft(forrigeKvittering);
}
/**
* Registrer egen ExceptionMapper.
*/
public void setExceptionMapper(ExceptionMapper exceptionMapper) {
this.digipostMessageSenderFacade.setExceptionMapper(exceptionMapper);
}
}