public class RequestMultiPartConverter implements IProtocolConverter<Message, OperatorMessage> {
    private final MultipartMessageParameterFactory multipartMessageParameterFactory;

    public RequestMultiPartConverter() {
        multipartMessageParameterFactory = new MultipartMessageParameterFactory();
    }

    @Override
    public CompositeMessage<Message, OperatorMessage> convert(CompositeMessage<Message, OperatorMessage> compositeMessage) throws ProtocolConversionException {
        Message message = compositeMessage.getMessage();
        OperatorMessage operatorMessage = compositeMessage.getPayload();

        //Do some other protocol conversion operations ...

        setMultipartParameters(operatorMessage, message.getMessagePartInfo());

        return MessageFactory.fromMessage(message).withPayload(operatorMessage).build();
    }

    private void setMultipartParameters(OperatorMessage operatorMessage, String messagepartInfo) throws ProtocolConversionException {

        if (StringUtils.isNotBlank(messagepartInfo)) {
            Map<String, Short> parameters = multipartMessageParameterFactory.createFrom(messagepartInfo);

            if (!parameters.isEmpty()) {
                operatorMessage.setMessageReferenceNumber(parameters.get(Parameters.MESSAGE_REFERENCE_NUMBER));
                try {
                    operatorMessage.setSegmentSeqnum(parameters.get(Parameters.SEGMENT_SEQUENCE_NUMBER));
                } catch (IntegerOutOfRangeException ioore) {
                    throw new ProtocolConversionException("UDH segment sequence number out of range", ioore);
                }
                try {
                    operatorMessage.setTotalSegments(parameters.get(Parameters.TOTAL_SEQUENCE_NUMBER));
                } catch (IntegerOutOfRangeException ioore) {
                    throw new ProtocolConversionException("MessagePart total sequence number out of range", ioore);
                }
            }
        }
    }

    public static class Parameters {
        public static final String SEGMENT_SEQUENCE_NUMBER = "SegmentSeqNumber";
        public static final String TOTAL_SEQUENCE_NUMBER = "TotalSeqNumber";
        public static final String MESSAGE_REFERENCE_NUMBER = "MessageReferenceNumber";

        private Parameters() {// Static use only
        }
    }
}