All Downloads are FREE. Search and download functionalities are using the official Maven repository.

no.difi.sdp.client2.internal.SDPBuilder Maven / Gradle / Ivy

There is a newer version: 7.0.0-RC2
Show newest version
package no.difi.sdp.client2.internal;

import no.difi.begrep.sdp.schema_v10.SDPAvsender;
import no.difi.begrep.sdp.schema_v10.SDPDigitalPost;
import no.difi.begrep.sdp.schema_v10.SDPDigitalPostInfo;
import no.difi.begrep.sdp.schema_v10.SDPDokument;
import no.difi.begrep.sdp.schema_v10.SDPDokumentData;
import no.difi.begrep.sdp.schema_v10.SDPEpostVarsel;
import no.difi.begrep.sdp.schema_v10.SDPEpostVarselTekst;
import no.difi.begrep.sdp.schema_v10.SDPFysiskPostInfo;
import no.difi.begrep.sdp.schema_v10.SDPFysiskPostRetur;
import no.difi.begrep.sdp.schema_v10.SDPFysiskPostadresse;
import no.difi.begrep.sdp.schema_v10.SDPIso6523Authority;
import no.difi.begrep.sdp.schema_v10.SDPManifest;
import no.difi.begrep.sdp.schema_v10.SDPMottaker;
import no.difi.begrep.sdp.schema_v10.SDPNorskPostadresse;
import no.difi.begrep.sdp.schema_v10.SDPOrganisasjon;
import no.difi.begrep.sdp.schema_v10.SDPPerson;
import no.difi.begrep.sdp.schema_v10.SDPRepetisjoner;
import no.difi.begrep.sdp.schema_v10.SDPSikkerhetsnivaa;
import no.difi.begrep.sdp.schema_v10.SDPSmsVarsel;
import no.difi.begrep.sdp.schema_v10.SDPSmsVarselTekst;
import no.difi.begrep.sdp.schema_v10.SDPTittel;
import no.difi.begrep.sdp.schema_v10.SDPUtenlandskPostadresse;
import no.difi.begrep.sdp.schema_v10.SDPVarsler;
import no.difi.sdp.client2.domain.Avsender;
import no.difi.sdp.client2.domain.Dokument;
import no.difi.sdp.client2.domain.Forsendelse;
import no.difi.sdp.client2.domain.digital_post.DigitalPost;
import no.difi.sdp.client2.domain.digital_post.EpostVarsel;
import no.difi.sdp.client2.domain.digital_post.SmsVarsel;
import no.difi.sdp.client2.domain.fysisk_post.FysiskPost;
import no.difi.sdp.client2.domain.fysisk_post.KonvoluttAdresse;
import no.difi.sdp.client2.domain.fysisk_post.KonvoluttAdresse.Type;
import org.w3.xmldsig.Reference;
import org.w3.xmldsig.Signature;

import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import static no.difi.sdp.client2.domain.fysisk_post.KonvoluttAdresse.Type.NORSK;
import static no.difi.sdp.client2.domain.fysisk_post.KonvoluttAdresse.Type.UTENLANDSK;
import static no.difi.sdp.client2.internal.SdpTimeConstants.UTC;

@SuppressWarnings("ConstantConditions")
public class SDPBuilder {

    /**
     * ISO6523-identifikasjon av Brønnøysundregisterets organisasjonsnummer som identifikator.
     */
    private static final String ORGNR_IDENTIFIER = "9908:";

    public SDPManifest createManifest(final Forsendelse forsendelse) {
        SDPMottaker sdpMottaker = sdpMottaker(forsendelse.getDigitalPost());
        SDPAvsender sdpAvsender = sdpAvsender(forsendelse.getAvsender());
        String spraakkode = forsendelse.getSpraakkode();
        SDPDokument sdpHovedDokument = sdpDokument(forsendelse.getDokumentpakke().getHoveddokument(), spraakkode);

        List sdpVedlegg = new ArrayList();
        for (Dokument dokument : forsendelse.getDokumentpakke().getVedlegg()) {
            sdpVedlegg.add(sdpDokument(dokument, spraakkode));
        }

        return new SDPManifest(sdpMottaker, sdpAvsender, sdpHovedDokument, sdpVedlegg, null);
    }

    public SDPDigitalPost buildDigitalPost(final Forsendelse forsendelse) {
        SDPAvsender sdpAvsender = sdpAvsender(forsendelse.getAvsender());
        SDPMottaker sdpMottaker = sdpMottaker(forsendelse.getDigitalPost());

        SDPDigitalPostInfo sdpDigitalPostInfo = sdpDigitalPostinfo(forsendelse);
        SDPFysiskPostInfo fysiskPostInfo = sdpFysiskPostInfo(forsendelse.getFysiskPost());

        // Signatur og fingeravtrykk legges på automatisk av klienten hvis de ikke er satt
        Signature signature = null;
        Reference dokumentpakkefingeravtrykk = null;

        return new SDPDigitalPost(signature, sdpAvsender, sdpMottaker, sdpDigitalPostInfo, fysiskPostInfo, dokumentpakkefingeravtrykk);
    }

	private SDPDokument sdpDokument(final Dokument dokument, final String spraakkode) {
        final String dokumentTittel = dokument.getTittel();
        SDPTittel sdpTittel = dokumentTittel != null ? new SDPTittel(dokumentTittel, spraakkode) : null;
        SDPDokumentData sdpDokumentData = dokument.getMetadataDocument().map(d -> new SDPDokumentData(d.getFileName(), d.getMimeType())).orElse(null);
        return new SDPDokument(sdpTittel, sdpDokumentData, dokument.getFilnavn(), dokument.getMimeType());
    }

    private SDPMottaker sdpMottaker(final DigitalPost digitalPost) {
    	if (digitalPost == null) {
    		return null;
    	}
        SDPPerson sdpPerson = new SDPPerson(digitalPost.getMottaker().getPersonidentifikator(), digitalPost.getMottaker().getPostkasseadresse());
        return new SDPMottaker(sdpPerson);
    }

    private SDPAvsender sdpAvsender(final Avsender avsender) {
        String fakturaReferanse = avsender.getFakturaReferanse();
        String identifikator = avsender.getAvsenderIdentifikator();
        SDPOrganisasjon organisasjon = sdpOrganisasjon(avsender);

        return new SDPAvsender(organisasjon, identifikator, fakturaReferanse);
    }

    private SDPOrganisasjon sdpOrganisasjon(final Avsender avsender) {
        return new SDPOrganisasjon(ORGNR_IDENTIFIER + avsender.getOrganisasjonsnummer(), SDPIso6523Authority.ISO_6523_ACTORID_UPIS);
    }

    private SDPDigitalPostInfo sdpDigitalPostinfo(final Forsendelse forsendelse) {
        DigitalPost digitalPost = forsendelse.getDigitalPost();
        if (digitalPost == null) {
        	return null;
        }

        ZonedDateTime virkningstidspunkt = null;
        if (digitalPost.getVirkningsdato() != null) {
            virkningstidspunkt = ZonedDateTime.ofInstant(digitalPost.getVirkningsdato().toInstant(), UTC);
        }

        boolean aapningskvittering = digitalPost.isAapningskvittering();
        SDPSikkerhetsnivaa sikkerhetsnivaa = digitalPost.getSikkerhetsnivaa().getXmlValue();
        SDPTittel tittel = new SDPTittel(digitalPost.getIkkeSensitivTittel(), forsendelse.getSpraakkode());
        SDPVarsler varsler = sdpVarsler(forsendelse);

        return new SDPDigitalPostInfo(virkningstidspunkt, null, aapningskvittering, sikkerhetsnivaa, tittel, varsler);
    }

    private SDPFysiskPostInfo sdpFysiskPostInfo(FysiskPost fysiskPost) {
    	if (fysiskPost == null) {
    		return null;
    	}

    	return new SDPFysiskPostInfo()
    		.withMottaker(sdpPostadresse(fysiskPost.getAdresse()))
    		.withPosttype(fysiskPost.getPosttype().sdpType)
    		.withUtskriftsfarge(fysiskPost.getUtskriftsfarge().sdpUtskriftsfarge)
    		.withRetur(new SDPFysiskPostRetur(fysiskPost.getReturhaandtering().sdpReturhaandtering, sdpPostadresse(fysiskPost.getReturadresse())));
    }

    private SDPFysiskPostadresse sdpPostadresse(KonvoluttAdresse adresse) {
    	SDPFysiskPostadresse sdpAdresse = new SDPFysiskPostadresse().withNavn(adresse.getNavn());
    	if (adresse.er(UTENLANDSK)) {
    		UpTo4ElementsOfList adresselinjer = UpTo4ElementsOfList.extract(adresse.getAdresselinjer());
    		sdpAdresse.setUtenlandskAdresse(new SDPUtenlandskPostadresse(adresselinjer._1, adresselinjer._2, adresselinjer._3, adresselinjer._4, adresse.getLandkode(), adresse.getLand()));
    	} else if (adresse.er(NORSK)) {
    		UpTo4ElementsOfList adresselinjer = UpTo4ElementsOfList.extract(adresse.getAdresselinjer());
    		sdpAdresse.setNorskAdresse(new SDPNorskPostadresse(adresselinjer._1, adresselinjer._2, adresselinjer._3, adresse.getPostnummer(), adresse.getPoststed()));
    	} else {
    		throw new IllegalArgumentException("Ukjent " + KonvoluttAdresse.class.getSimpleName() + "." + Type.class.getSimpleName() + ": " + adresse.getType());
    	}
    	return sdpAdresse;
    }


    private SDPVarsler sdpVarsler(final Forsendelse forsendelse) {
        String spraakkode = forsendelse.getSpraakkode();

        SDPEpostVarsel epostVarsel = sdpEpostVarsel(forsendelse.getDigitalPost().getEpostVarsel(), spraakkode);
        SDPSmsVarsel smsVarsel = sdpSmsVarsel(forsendelse.getDigitalPost().getSmsVarsel(), spraakkode);

        return new SDPVarsler(epostVarsel, smsVarsel);
    }

    private SDPSmsVarsel sdpSmsVarsel(final SmsVarsel smsVarsel, final String spraakkode) {
        if (smsVarsel != null) {
            SDPSmsVarselTekst smsVarselTekst = new SDPSmsVarselTekst(smsVarsel.getVarslingsTekst(), spraakkode);
            return new SDPSmsVarsel(smsVarsel.getMobilnummer(), smsVarselTekst, new SDPRepetisjoner(smsVarsel.getDagerEtter()));
        }
        return null;
    }

    private SDPEpostVarsel sdpEpostVarsel(final EpostVarsel epostVarsel, final String spraakkode) {
        if (epostVarsel != null) {
            SDPEpostVarselTekst epostVarselTekst = new SDPEpostVarselTekst(epostVarsel.getVarslingsTekst(), spraakkode);
            return new SDPEpostVarsel(epostVarsel.getEpostadresse(), epostVarselTekst, new SDPRepetisjoner(epostVarsel.getDagerEtter()));
        }
        return null;
    }

    static class UpTo4ElementsOfList {
    	final T _1;
    	final T _2;
    	final T _3;
    	final T _4;

    	static  UpTo4ElementsOfList extract(Iterable iterable) {
    		return new UpTo4ElementsOfList(iterable);
    	}

    	private UpTo4ElementsOfList(Iterable iterable) {
    		Iterator iterator = iterable.iterator();
    		_1 = iterator.hasNext() ? iterator.next() : null;
    		_2 = iterator.hasNext() ? iterator.next() : null;
    		_3 = iterator.hasNext() ? iterator.next() : null;
    		_4 = iterator.hasNext() ? iterator.next() : null;
    	}
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy