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

no.difi.meldingsutveksling.noarkexchange.P360Client Maven / Gradle / Ivy

There is a newer version: 2.28.0
Show newest version
package no.difi.meldingsutveksling.noarkexchange;


import no.difi.meldingsutveksling.noarkexchange.p360.PutMessageRequestMapper;
import no.difi.meldingsutveksling.noarkexchange.p360.schema.*;
import no.difi.meldingsutveksling.noarkexchange.schema.PutMessageRequestType;
import no.difi.meldingsutveksling.noarkexchange.schema.PutMessageResponseType;
import org.modelmapper.ModelMapper;
import org.springframework.ws.client.core.WebServiceTemplate;
import org.springframework.ws.soap.client.core.SoapActionCallback;

import javax.xml.bind.JAXBElement;
import java.util.ArrayList;
import java.util.List;

import static no.difi.meldingsutveksling.logging.MarkerFactory.receiverMarker;

public class P360Client implements NoarkClient {

    private static final String SOAP_ACTION = "http://www.arkivverket.no/Noark/Exchange/IEDUImport/PutMessage";

    private final WebServiceTemplateFactory templateFactory;
    private final NoarkClientSettings settings;

    public P360Client(NoarkClientSettings settings) {
        this.settings = settings;
        templateFactory = settings.createTemplateFactory();
    }


    @Override
    public NoarkClientSettings getNoarkClientSettings() {
        return settings;
    }

    @Override
    public boolean canRecieveMessage(String orgnr) {
        GetCanReceiveMessageRequestType r = new GetCanReceiveMessageRequestType();
        AddressType addressType = new AddressType();
        addressType.setOrgnr(orgnr);
        r.setReceiver(addressType);

        JAXBElement request = new ObjectFactory().createGetCanReceiveMessageRequest(r);

        final WebServiceTemplate template = templateFactory.createTemplate("no.difi.meldingsutveksling.noarkexchange.p360.schema", receiverMarker(orgnr));
        JAXBElement result = (JAXBElement) template.marshalSendAndReceive(settings.getEndpointUrl(), request);
        return result.getValue().isResult();
    }

    @Override
    public PutMessageResponseType sendEduMelding(PutMessageRequestType request) {

        JAXBElement p360request
                = new PutMessageRequestMapper().mapFrom(request);

        final WebServiceTemplate template = templateFactory.createTemplate("no.difi.meldingsutveksling.noarkexchange.p360.schema", PutMessageMarker.markerFrom(new PutMessageRequestWrapper(request)));
        JAXBElement response
                = (JAXBElement) template.marshalSendAndReceive(settings.getEndpointUrl(), p360request,
                new SoapActionCallback(SOAP_ACTION));

        PutMessageResponseType theResponse = new PutMessageResponseType();
        ModelMapper modelMapper = new ModelMapper();
        modelMapper.map(response.getValue(), theResponse);

        setUnmappedValues(response, theResponse);

        if (!isValid(theResponse)) {
            theResponse = new PutMessageResponseType();
            final no.difi.meldingsutveksling.noarkexchange.schema.AppReceiptType appReceiptType = new no.difi.meldingsutveksling.noarkexchange.schema.AppReceiptType();
            theResponse.setResult(appReceiptType);
            appReceiptType.setType("OK");
        }

        return theResponse;
    }

    private boolean isValid(PutMessageResponseType theResponse) {
        return theResponse != null && theResponse.getResult() != null;
    }

    /**
     * Use this method to set values not "mapped" by modelmapper. For instance statusMessage
     *
     * @param p360Response from the archive system
     * @param response     p360Response from this client
     */
    private void setUnmappedValues(JAXBElement p360Response, PutMessageResponseType response) {
        List statusMessages = getStatusMessages(p360Response);

        if (!statusMessages.isEmpty()) {
            no.difi.meldingsutveksling.noarkexchange.schema.StatusMessageType statusMessage = new no.difi.meldingsutveksling.noarkexchange.schema.StatusMessageType();
            statusMessage.setCode(statusMessages.get(0).getCode());
            statusMessage.setText(statusMessages.get(0).getText());
            response.getResult().getMessage().add(statusMessage);
        }
    }

    private List getStatusMessages(JAXBElement response) {
        List statusMessageTypes = new ArrayList<>();

        if (response.isNil()) {
            return statusMessageTypes;
        }

        AppReceiptType appReceipt = response.getValue().getResult();
        if (appReceipt != null) {
            statusMessageTypes = appReceipt.getMessage();
        }

        return statusMessageTypes;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy