package cz.abclinuxu.datoveschranky.impl;
import cz.abclinuxu.datoveschranky.common.entities.Message;
import cz.abclinuxu.datoveschranky.common.entities.MessageEnvelope;
import cz.abclinuxu.datoveschranky.common.entities.MessageType;
import cz.abclinuxu.datoveschranky.common.impl.DataBoxException;
import cz.abclinuxu.datoveschranky.common.interfaces.AttachmentStorer;
import cz.abclinuxu.datoveschranky.common.interfaces.DataBoxDownloadService;
import cz.abclinuxu.datoveschranky.ws.dm.DmOperationsPortType;
import cz.abclinuxu.datoveschranky.ws.dm.TReturnedMessage;
import cz.abclinuxu.datoveschranky.ws.dm.TStatus;
import java.io.IOException;
import java.io.OutputStream;
import javax.xml.ws.Holder;
import org.apache.log4j.Logger;
/**
*
* @author xrosecky
*/
public class DataBoxDownloadServiceImpl implements DataBoxDownloadService {
private DmOperationsPortType dmOp = null;
private MessageValidator validator = null;
static Logger logger = Logger.getLogger(DataBoxDownloadServiceImpl.class);
public DataBoxDownloadServiceImpl(DmOperationsPortType dmOpService, MessageValidator validate) {
this.dmOp = dmOpService;
this.validator = validate;
}
/*
* Stahne prijatou zpravu. Pro odeslane zpravy se muzi pouzit downloadSignedMessage - omezeni na strane ISDS..
*/
public Message downloadMessage(MessageEnvelope envelope, AttachmentStorer storer) {
logger.info(String.format("downloadMessage: id:%s", envelope.getMessageID()));
if (envelope.getType() != MessageType.RECEIVED) {
throw new DataBoxException("Mohu stahnout pouze prijatou zpravu.");
}
Holder<TStatus> status = new Holder<TStatus>();
Holder<TReturnedMessage> hMessage = new Holder<TReturnedMessage>();
dmOp.messageDownload(envelope.getMessageID(), hMessage, status);
ErrorHandling.throwIfError("Nemohu stahnout prijatou zpravu.", status.value);
logger.info(String.format("downloadMessage successfull"));
TReturnedMessage message = hMessage.value;
return validator.buildMessage(envelope, message, storer);
}
public void downloadSignedMessage(MessageEnvelope env, OutputStream os) {
logger.info(String.format("downloadSignedMessage: id:%s", env.getMessageID()));
String id = env.getMessageID();
Holder<byte[]> messageAsPKCS7 = new Holder<byte[]>();
Holder<TStatus> status = new Holder<TStatus>();
switch (env.getType()) {
case RECEIVED:
dmOp.signedMessageDownload(id, messageAsPKCS7, status);
break;
case SENT:
dmOp.signedSentMessageDownload(id, messageAsPKCS7, status);
break;
default:
throw new DataBoxException("Neodeslanou zpravu nelze stahnout");
}
ErrorHandling.throwIfError("Nemohu stahnout podepsanou zpravu.", status.value);
try {
os.write(messageAsPKCS7.value);
os.flush();
logger.info(String.format("downloadSignedMessage successfull"));
} catch (IOException ioe) {
throw new DataBoxException("Chyba pri zapisu do vystupniho proudu.", ioe);
}
}
}