/*
* 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 eu.sendregning.oxalis;
import brave.Span;
import brave.Tracer;
import com.google.common.io.ByteStreams;
import no.difi.oxalis.api.lang.OxalisTransmissionException;
import no.difi.oxalis.api.outbound.TransmissionRequest;
import no.difi.oxalis.api.outbound.TransmissionResponse;
import no.difi.oxalis.api.outbound.Transmitter;
import no.difi.oxalis.commons.filesystem.FileUtils;
import no.difi.oxalis.outbound.transmission.TransmissionRequestBuilder;
import no.difi.vefa.peppol.common.model.Endpoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.nio.file.Files;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
/**
* @author steinar
* Date: 07.01.2017
* Time: 22.43
*/
public class TransmissionTask implements Callable<TransmissionResult> {
public static final Logger log = LoggerFactory.getLogger(TransmissionTask.class);
private final TransmissionParameters params;
private final File xmlPayloadFile;
private final Tracer tracer;
public TransmissionTask(TransmissionParameters params, File xmlPayloadFile) {
this.params = params;
this.xmlPayloadFile = xmlPayloadFile;
this.tracer = params.getOxalisOutboundComponent().getInjector().getInstance(Tracer.class);
}
@Override
public TransmissionResult call() throws Exception {
Span span = tracer.newTrace().name("standalone").start();
try {
TransmissionResponse transmissionResponse;
long duration = 0;
if (params.isUseFactory()) {
try (InputStream inputStream = Files.newInputStream(xmlPayloadFile.toPath())) {
transmissionResponse = params.getOxalisOutboundComponent()
.getTransmissionService()
.send(inputStream, span);
}
} else {
TransmissionRequest transmissionRequest = createTransmissionRequest(span);
Transmitter transmitter;
Span span1 = tracer.newChild(span.context()).name("get transmitter").start();
try {
transmitter = params.getOxalisOutboundComponent().getTransmitter();
} finally {
span1.finish();
}
// Performs the transmission
long start = System.nanoTime();
transmissionResponse = performTransmission(
params.getEvidencePath(), transmitter, transmissionRequest, span);
long elapsed = System.nanoTime() - start;
duration = TimeUnit.MILLISECONDS.convert(elapsed, TimeUnit.NANOSECONDS);
return new TransmissionResult(duration, transmissionResponse.getTransmissionIdentifier());
}
return new TransmissionResult(duration, transmissionResponse.getTransmissionIdentifier());
} finally {
span.finish();
}
}
protected TransmissionRequest createTransmissionRequest(Span root) throws OxalisTransmissionException, IOException {
Span span = tracer.newChild(root.context()).name("create transmission request").start();
try {
// creates a transmission request builder and enables trace
TransmissionRequestBuilder requestBuilder =
params.getOxalisOutboundComponent().getTransmissionRequestBuilder();
requestBuilder.setTransmissionBuilderOverride(true);
// add receiver participant
if (params.getReceiver().isPresent()) {
requestBuilder.receiver(params.getReceiver().get());
}
// add sender participant
if (params.getSender().isPresent()) {
requestBuilder.sender(params.getSender().get());
}
if (params.getDocType().isPresent()) {
requestBuilder.documentType(params.getDocType().get());
}
if (params.getProcessIdentifier().isPresent()) {
requestBuilder.processType(params.getProcessIdentifier().get());
}
// Supplies the payload
requestBuilder.payLoad(new FileInputStream(xmlPayloadFile));
// Overrides the destination URL if so requested
if (params.getEndpoint().isPresent()) {
final Endpoint endpoint = params.getEndpoint().get();
requestBuilder.overrideAs2Endpoint(endpoint);
}
// Specifying the details completed, creates the transmission request
return requestBuilder.build(span);
} catch (Exception e) {
span.tag("exception", String.valueOf(e.getMessage()));
System.out.println("");
System.out.println("Message failed : " + e.getMessage());
//e.printStackTrace();
System.out.println("");
return null;
} finally {
span.finish();
}
}
protected TransmissionResponse performTransmission(File evidencePath, Transmitter transmitter,
TransmissionRequest transmissionRequest, Span root)
throws OxalisTransmissionException, IOException {
Span span = tracer.newChild(root.context()).name("transmission").start();
try {
// ... and performs the transmission
long start = System.nanoTime();
TransmissionResponse transmissionResponse = transmitter.transmit(transmissionRequest, span);
long elapsed = System.nanoTime() - start;
long durartionInMs = TimeUnit.MILLISECONDS.convert(elapsed, TimeUnit.NANOSECONDS);
// Write the transmission id and where the message was delivered
log.debug(String.format("Message using messageId %s sent to %s using %s was assigned transmissionId %s took %dms\n",
transmissionResponse.getHeader().getIdentifier().getIdentifier(),
transmissionResponse.getEndpoint().getAddress(),
transmissionResponse.getProtocol().getValue(),
transmissionResponse.getTransmissionIdentifier(),
durartionInMs
));
saveEvidence(transmissionResponse, evidencePath, span);
return transmissionResponse;
} finally {
span.finish();
}
}
protected void saveEvidence(TransmissionResponse transmissionResponse, File evidencePath, Span root)
throws IOException {
Span span = tracer.newChild(root.context()).name("save evidence").start();
try {
// saveEvidence(transmissionResponse, "-rem-evidence.xml",
// transmissionResponse::getRemEvidenceBytes, evidencePath);
saveEvidence(transmissionResponse, "-as2-mdn.txt",
transmissionResponse::getNativeEvidenceBytes, evidencePath);
} finally {
span.finish();
}
}
void saveEvidence(TransmissionResponse transmissionResponse, String suffix, Supplier<byte[]> supplier,
File evidencePath) throws IOException {
String fileName = FileUtils.filterString(transmissionResponse.getTransmissionIdentifier().toString()) + suffix;
File evidenceFile = new File(evidencePath, fileName);
ByteStreams.copy(new ByteArrayInputStream(supplier.get()), new FileOutputStream(evidenceFile));
log.info("Evidence written to '{}'.", evidenceFile);
}
}