package cz.abclinuxu.datoveschranky.impl; import cz.abclinuxu.datoveschranky.common.entities.DataBox; import cz.abclinuxu.datoveschranky.common.entities.DeliveryEvent; import cz.abclinuxu.datoveschranky.common.entities.Hash; import cz.abclinuxu.datoveschranky.common.entities.MessageEnvelope; import cz.abclinuxu.datoveschranky.common.entities.MessageType; import cz.abclinuxu.datoveschranky.common.entities.DeliveryInfo; import cz.abclinuxu.datoveschranky.common.entities.DocumentIdent; import cz.abclinuxu.datoveschranky.common.entities.MessageState; import cz.abclinuxu.datoveschranky.common.entities.MessageStateChange; import cz.abclinuxu.datoveschranky.common.impl.DataBoxException; import cz.abclinuxu.datoveschranky.common.interfaces.DataBoxMessagesService; import cz.abclinuxu.datoveschranky.ws.XMLUtils; import cz.abclinuxu.datoveschranky.ws.dm.DmInfoPortType; import cz.abclinuxu.datoveschranky.ws.dm.TDelivery; import cz.abclinuxu.datoveschranky.ws.dm.TEvent; import cz.abclinuxu.datoveschranky.ws.dm.THash; import cz.abclinuxu.datoveschranky.ws.dm.TRecord; import cz.abclinuxu.datoveschranky.ws.dm.TRecordsArray; import cz.abclinuxu.datoveschranky.ws.dm.TStateChangesArray; import cz.abclinuxu.datoveschranky.ws.dm.TStateChangesRecord; import cz.abclinuxu.datoveschranky.ws.dm.TStatus; import java.io.IOException; import java.io.OutputStream; import java.math.BigInteger; import java.util.ArrayList; import java.util.Date; import java.util.EnumSet; import java.util.List; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.ws.Holder; import org.apache.log4j.Logger; /** * * @author xrosecky */ public class DataBoxMessagesServiceImpl implements DataBoxMessagesService { protected DmInfoPortType dataMessageInfo; static Logger logger = Logger.getLogger(DataBoxMessagesServiceImpl.class); public DataBoxMessagesServiceImpl(DmInfoPortType dmInfo) { this.dataMessageInfo = dmInfo; } public List<MessageEnvelope> getListOfReceivedMessages(Date from, Date to, EnumSet<MessageState> filter, int offset, int limit) { logger.info(String.format("getListOfReceivedMessages: offset:%s limit:%s", offset, limit)); Holder<TRecordsArray> records = new Holder<TRecordsArray>(); Holder<TStatus> status = new Holder<TStatus>(); XMLGregorianCalendar xmlFrom = XMLUtils.toXmlDate(from); XMLGregorianCalendar xmlTo = XMLUtils.toXmlDate(to); BigInteger bOffset = BigInteger.valueOf(offset); BigInteger bLimit = BigInteger.valueOf(limit); String value = String.valueOf(MessageState.toInt(filter)); dataMessageInfo.getListOfReceivedMessages(xmlFrom, xmlTo, null, value, bOffset, bLimit, records, status); ErrorHandling.throwIfError("Nemohu stahnout seznam prijatych zprav", status.value); logger.info(String.format("getListOfReceivedMessages finished")); return createMessages(records.value, MessageType.RECEIVED); } public List<MessageEnvelope> getListOfSentMessages(Date from, Date to, EnumSet<MessageState> filter, int offset, int limit) { logger.info(String.format("getListOfSentMessages: offset:%s limit:%s", offset, limit)); Holder<TRecordsArray> records = new Holder<TRecordsArray>(); Holder<TStatus> status = new Holder<TStatus>(); XMLGregorianCalendar xmlSince = XMLUtils.toXmlDate(from); XMLGregorianCalendar xmlTo = XMLUtils.toXmlDate(to); BigInteger bOffset = BigInteger.valueOf(offset); BigInteger bLimit = BigInteger.valueOf(limit); String value = String.valueOf(MessageState.toInt(filter)); dataMessageInfo.getListOfSentMessages(xmlSince, xmlTo, null, value, bOffset, bLimit, records, status); ErrorHandling.throwIfError("Nemohu stahnout seznam odeslanych zprav", status.value); logger.info(String.format("getListOfSentMessages finished")); return createMessages(records.value, MessageType.SENT); } public List<MessageStateChange> GetMessageStateChanges(Date from, Date to) { logger.info(String.format("GetMessageStateChanges: from:%s to:%s", from, to)); Holder<TStatus> status = new Holder<TStatus>(); Holder<TStateChangesArray> changes = new Holder<TStateChangesArray>(); XMLGregorianCalendar xmlSince = null; if (from != null) { xmlSince = XMLUtils.toXmlDate(from); } XMLGregorianCalendar xmlTo = null; if (to != null) { xmlTo = XMLUtils.toXmlDate(to); } dataMessageInfo.getMessageStateChanges(xmlSince, xmlTo, changes, status); ErrorHandling.throwIfError("GetMessageStateChanges failed", status.value); List<MessageStateChange> result = new ArrayList<MessageStateChange>(); for (TStateChangesRecord record : changes.value.getDmRecord()) { MessageStateChange stateChange = new MessageStateChange(); stateChange.setEventTime(record.getDmEventTime().toGregorianCalendar()); stateChange.setMessageId(record.getDmID()); stateChange.setState(MessageState.valueOf(record.getDmMessageStatus())); result.add(stateChange); } logger.info(String.format("GetMessageStateChanges finished, result size is %s.", changes.value.getDmRecord().size())); return result; } public Hash verifyMessage(MessageEnvelope envelope) { Holder<TStatus> status = new Holder<TStatus>(); Holder<THash> hash = new Holder<THash>(); dataMessageInfo.verifyMessage(envelope.getMessageID(), hash, status); ErrorHandling.throwIfError("Nemohu overit hash zpravy.", status.value); return new Hash(hash.value.getAlgorithm(), hash.value.getValue()); } public void markMessageAsDownloaded(MessageEnvelope env) { TStatus status = dataMessageInfo.markMessageAsDownloaded(env.getMessageID()); ErrorHandling.throwIfError("Nemohu oznacit zpravu jako prectenou.", status); } public DeliveryInfo getDeliveryInfo(MessageEnvelope env) { Holder<TStatus> status = new Holder<TStatus>(); Holder<TDelivery> delivery = new Holder<TDelivery>(); dataMessageInfo.getDeliveryInfo(env.getMessageID(), delivery, status); ErrorHandling.throwIfError("Nemohu stahnout informace o doruceni.", status.value); return MessageValidator.buildDeliveryInfo(env, delivery.value); } public void getSignedDeliveryInfo(MessageEnvelope envelope, OutputStream os) { Holder<TStatus> status = new Holder<TStatus>(); Holder<byte[]> signedDeliveryInfo = new Holder<byte[]>(); dataMessageInfo.getSignedDeliveryInfo(envelope.getMessageID(), signedDeliveryInfo, status); ErrorHandling.throwIfError(String.format("Nemohu stahnout podepsanou dorucenku pro zpravu s id=%s.", envelope.getMessageID()), status.value); try { os.write(signedDeliveryInfo.value); os.flush(); logger.info(String.format("getSignedDeliveryInfo successfull")); } catch (IOException ioe) { throw new DataBoxException("Chyba pri zapisu do vystupniho proudu.", ioe); } } protected List<MessageEnvelope> createMessages(TRecordsArray records, MessageType type) { List<MessageEnvelope> result = new ArrayList<MessageEnvelope>(); for (TRecord record : records.getDmRecord()) { // odesílatel String senderID = record.getDbIDSender().getValue(); String senderIdentity = record.getDmSender().getValue(); String senderAddress = record.getDmSenderAddress().getValue(); DataBox sender = new DataBox(senderID, senderIdentity, senderAddress); // příjemce String recipientID = record.getDbIDRecipient().getValue(); String recipientIdentity = record.getDmRecipient().getValue(); String recipientAddress = record.getDmRecipientAddress().getValue(); DataBox recipient = new DataBox(recipientID, recipientIdentity, recipientAddress); // anotace String annotation = record.getDmAnnotation().getValue(); if (annotation == null) { // může se stát, že anotace je null... annotation = ""; } String messageID = record.getDmID(); MessageEnvelope env = new MessageEnvelope(type, sender, recipient, messageID, annotation); if (record.getDmAcceptanceTime().getValue() != null) { env.setAcceptanceTime(record.getDmAcceptanceTime().getValue().toGregorianCalendar()); } if (record.getDmDeliveryTime().getValue() != null) { env.setDeliveryTime(record.getDmDeliveryTime().getValue().toGregorianCalendar()); } env.setState(MessageState.valueOf(record.getDmMessageStatus().intValue())); // identifikace zprávy odesílatelem String senderIdent = record.getDmSenderIdent().getValue(); String senderRefNumber = record.getDmSenderRefNumber().getValue(); env.setSenderIdent(new DocumentIdent(senderRefNumber, senderIdent)); // identifikace zprávy příjemcem String recipientIdent = record.getDmRecipientIdent().getValue(); String recipientRefNumber = record.getDmRecipientRefNumber().getValue(); env.setRecipientIdent(new DocumentIdent(recipientRefNumber, recipientIdent)); env.setToHands(record.getDmToHands().getValue()); env.setAllowSubstDelivery(record.getDmAllowSubstDelivery().getValue()); env.setPersonalDelivery(record.getDmPersonalDelivery().getValue()); // a máme hotovo :-) result.add(env); } return result; } }