DeliveryReceipt.java :  » Messenger » jsmpp » org » jsmpp » bean » Java Open Source

Java Open Source » Messenger » jsmpp 
jsmpp » org » jsmpp » bean » DeliveryReceipt.java
/*
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 * you may not use this file except in compliance with the License. 
 * You may obtain a copy of the License at
 * 
 *    http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 */
package org.jsmpp.bean;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.jsmpp.util.DeliveryReceiptState;
import org.jsmpp.util.InvalidDeliveryReceiptException;


/**
 * @author uudashr
 *
 */
public class DeliveryReceipt {
    // attributes of delivery receipt
    public static final String DELREC_ID = "id";
    public static final String DELREC_SUB = "sub";
    public static final String DELREC_DLVRD = "dlvrd";
    public static final String DELREC_SUBMIT_DATE = "submit date";
    public static final String DELREC_DONE_DATE = "done date";
    public static final String DELREC_STAT = "stat";
    public static final String DELREC_ERR = "err";
    public static final String DELREC_TEXT = "Text";

    /**
     * Date format for the <b>submit date</b> and <b>done date</b> attribute
     */
    private final SimpleDateFormat dateFormat = new SimpleDateFormat(
            "yyMMddHHmm");

    private String id;
    private int submitted;
    private int delivered;
    private Date submitDate;
    private Date doneDate;
    private DeliveryReceiptState finalStatus;
    private String error;
    private String text;

    public DeliveryReceipt() {
    }

    public DeliveryReceipt(String formattedDelieryReceipt)
            throws InvalidDeliveryReceiptException {
        /*
         * id:IIIIIIIIII sub:SSS dlvrd:DDD submit date:YYMMDDhhmm done
         * date:YYMMDDhhmm stat:DDDDDDD err:E Text: ..........
         */
        try {
            id = getDeliveryReceiptValue(DeliveryReceipt.DELREC_ID, formattedDelieryReceipt);
            submitted = Integer.parseInt(getDeliveryReceiptValue(
                    DeliveryReceipt.DELREC_SUB, formattedDelieryReceipt));
            delivered = Integer.parseInt(getDeliveryReceiptValue(
                    DeliveryReceipt.DELREC_DLVRD, formattedDelieryReceipt));
            submitDate = string2Date(getDeliveryReceiptValue(
                    DeliveryReceipt.DELREC_SUBMIT_DATE, formattedDelieryReceipt));
            doneDate = string2Date(getDeliveryReceiptValue(
                    DeliveryReceipt.DELREC_DONE_DATE, formattedDelieryReceipt));
            finalStatus = DeliveryReceiptState
                    .getByName(getDeliveryReceiptValue(
                            DeliveryReceipt.DELREC_STAT, formattedDelieryReceipt));
            error = getDeliveryReceiptValue(DeliveryReceipt.DELREC_ERR, formattedDelieryReceipt);
            text = getDeliveryReceiptTextValue(formattedDelieryReceipt);
        } catch (Exception e) {
            throw new InvalidDeliveryReceiptException(
                    "There is an error found when parsing delivery receipt", e);
        }
    }
    
    public DeliveryReceipt(String id, int submitted, int delivered,
            Date submitDate, Date doneDate, DeliveryReceiptState finalStatus,
            String error, String text) {
        this.id = id;
        this.submitted = submitted;
        this.delivered = delivered;
        this.submitDate = submitDate;
        this.doneDate = doneDate;
        this.finalStatus = finalStatus;
        this.error = error;
        if (text.length() > 20) {
            this.text = text.substring(0, 20);
        } else {
            this.text = text;
        }
    }

    /**
     * @return Returns the delivered.
     */
    public int getDelivered() {
        return delivered;
    }

    /**
     * @param delivered The delivered to set.
     */
    public void setDelivered(int delivered) {
        this.delivered = delivered;
    }

    /**
     * @return Returns the doneDate.
     */
    public Date getDoneDate() {
        return doneDate;
    }

    /**
     * @param doneDate The doneDate to set.
     */
    public void setDoneDate(Date doneDate) {
        this.doneDate = doneDate;
    }

    /**
     * @return Returns the error.
     */
    public String getError() {
        return error;
    }

    /**
     * @param error The error to set.
     */
    public void setError(String error) {
        this.error = error;
    }

    /**
     * @return Returns the finalStatus.
     */
    public DeliveryReceiptState getFinalStatus() {
        return finalStatus;
    }

    /**
     * @param finalStatus The finalStatus to set.
     */
    public void setFinalStatus(DeliveryReceiptState finalStatus) {
        this.finalStatus = finalStatus;
    }

    /**
     * @return Returns the id.
     */
    public String getId() {
        return id;
    }

    /**
     * @param id The id to set.
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * @return Returns the submitDate.
     */
    public Date getSubmitDate() {
        return submitDate;
    }

    /**
     * @param submitDate The submitDate to set.
     */
    public void setSubmitDate(Date submitDate) {
        this.submitDate = submitDate;
    }

    /**
     * @return Returns the submitted.
     */
    public int getSubmitted() {
        return submitted;
    }

    /**
     * @param submitted The submitted to set.
     */
    public void setSubmitted(int submitted) {
        this.submitted = submitted;
    }

    /**
     * @return Returns the text.
     */
    public String getText() {
        return text;
    }

    /**
     * Set the text of delivery receipt. Text more than 20 characters will be trim automatically.
     *
     * @param text the text to set.
     */
    public void setText(String text) {
        if (text != null && text.length() > 20) {
            this.text = text.substring(0, 20);
        } else {
            this.text = text;
        }
    }

    public String toString() {
        /*
         * id:IIIIIIIIII sub:SSS dlvrd:DDD submit date:YYMMDDhhmm done
         * date:YYMMDDhhmm stat:DDDDDDD err:E Text: . . . . . . . . .
         */
        StringBuffer sBuf = new StringBuffer(120);
        sBuf.append(DELREC_ID + ":" + id);
        sBuf.append(" ");
        sBuf.append(DELREC_SUB + ":" + intToString(submitted, 3));
        sBuf.append(" ");
        sBuf.append(DELREC_DLVRD + ":" + intToString(delivered, 3));
        sBuf.append(" ");
        sBuf.append(DELREC_SUBMIT_DATE + ":" + dateFormat.format(submitDate));
        sBuf.append(" ");
        sBuf.append(DELREC_DONE_DATE + ":" + dateFormat.format(doneDate));
        sBuf.append(" ");
        sBuf.append(DELREC_STAT + ":" + finalStatus);
        sBuf.append(" ");
        sBuf.append(DELREC_ERR + ":" + error);
        sBuf.append(" ");
        sBuf.append(DELREC_TEXT.toLowerCase() + ":" + text);
        return sBuf.toString();
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result
                + ((dateFormat == null) ? 0 : dateFormat.hashCode());
        result = prime * result + delivered;
        result = prime * result
                + ((doneDate == null) ? 0 : doneDate.hashCode());
        result = prime * result + ((error == null) ? 0 : error.hashCode());
        result = prime * result
                + ((finalStatus == null) ? 0 : finalStatus.hashCode());
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        result = prime * result
                + ((submitDate == null) ? 0 : submitDate.hashCode());
        result = prime * result + submitted;
        result = prime * result + ((text == null) ? 0 : text.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        final DeliveryReceipt other = (DeliveryReceipt)obj;
        if (!hasEqualId(other)) {
            return false;
        }
        if (submitted != other.submitted) {
            return false;
        }
        if (delivered != other.delivered) {
            return false;
        }
        if (!hasEqualSubmitDate(other)) {
            return false;
        }
        if (!hasEqualDoneDate(other)) {
            return false;
        }
        if (!hasEqualFinalStatus(other)) {
            return false;
        }
        if (!hasEqualError(other)) {
            return false;
        }
        if (!hasEqualText(other)) {
            return false;
        }
        return true;
    }

    /**
     * Create String representation of integer. Preceding 0 will be add as
     * needed.
     * 
     * @param value is the value.
     * @param digit is the digit should be shown.
     * @return the String representation of int value.
     */
    private static String intToString(int value, int digit) {
        StringBuffer sBuf = new StringBuffer(digit);
        sBuf.append(Integer.toString(value));
        while (sBuf.length() < digit) {
            sBuf.insert(0, "0");
        }
        return sBuf.toString();
    }

    private boolean hasEqualId(DeliveryReceipt other) {
        if (id == null) {
            if (other.id != null) {
                return false;
            }
        }
        return id.equals(other.id);
    }

    private boolean hasEqualDoneDate(DeliveryReceipt other) {
        if (doneDate == null) {
            if (other.doneDate != null) {
                return false;
            }
        }
        return doneDate.equals(other.doneDate);
    }

    private boolean hasEqualError(DeliveryReceipt other) {
        if (error == null) {
            if (other.error != null) {
                return false;
            }
        }
        return error.equals(other.error);
    }

    private boolean hasEqualFinalStatus(DeliveryReceipt other) {
        if (finalStatus == null) {
            if (other.finalStatus != null) {
                return false;
            }
        }
        return finalStatus.equals(other.finalStatus);
    }

    private boolean hasEqualSubmitDate(DeliveryReceipt other) {
        if (submitDate == null) {
            if (other.submitDate != null) {
                return false;
            }
        }
        return submitDate.equals(other.submitDate);
    }

    private boolean hasEqualText(DeliveryReceipt other) {
        if (text == null) {
            if (other.text != null) {
                return false;
            }
        }
        return text.equals(other.text);
    }
    
    /**
     * Get the delivery receipt attribute value.
     * 
     * @param attrName is the attribute name.
     * @param source the original source id:IIIIIIIIII sub:SSS dlvrd:DDD submit
     *        date:YYMMDDhhmm done date:YYMMDDhhmm stat:DDDDDDD err:E
     *        Text:....................
     * @return the value of specified attribute.
     * @throws IndexOutOfBoundsException
     */
    private static String getDeliveryReceiptValue(String attrName, String source)
            throws IndexOutOfBoundsException {
        String tmpAttr = attrName + ":";
        int startIndex = source.indexOf(tmpAttr);
        if (startIndex < 0)
            return null;
        startIndex = startIndex + tmpAttr.length();
        int endIndex = source.indexOf(" ", startIndex);
        if (endIndex > 0)
            return source.substring(startIndex, endIndex);
        return source.substring(startIndex);
    }
    
    /**
     * YYMMDDhhmm where:
     * <ul>
     * <li>YY = last two digits of the year (00-99)</li>
     * <li>MM = month (01-12)</li>
     * <li>DD = day (01-31)</li>
     * <li>hh = hour (00-23)</li>
     * <li>mm = minute (00-59)</li>
     * </ul>
     * 
     * Java format is (yyMMddHHmm).
     * 
     * @param date in <tt>String</tt> format.
     * @return
     * @throws NumberFormatException if there is contains non number on
     *         <code>date</code> parameter.
     * @throws IndexOutOfBoundsException if the date length in <tt>String</tt>
     *         format is less than 10.
     */
    private static Date string2Date(String date) {

        int year = Integer.parseInt(date.substring(0, 2));
        int month = Integer.parseInt(date.substring(2, 4));
        int day = Integer.parseInt(date.substring(4, 6));
        int hour = Integer.parseInt(date.substring(6, 8));
        int minute = Integer.parseInt(date.substring(8, 10));
        Calendar cal = Calendar.getInstance();
        cal.set(convertTwoDigitYear(year), month - 1, day, hour, minute, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return cal.getTime();
    }
    
    private static int convertTwoDigitYear(int year) {
        if (year >=0 && year <= 37) {
            return 2000 + year;
        } else if (year >= 38 && year <= 99) {
            return 1900 + year;
        } else {
            // should never happen
            return year;
        }
    }
    
    /**
     * @param source
     * @return
     * @throws IndexOutOfBoundsException
     */
    private static String getDeliveryReceiptTextValue(String source) {
        String tmpAttr = DeliveryReceipt.DELREC_TEXT + ":";
        int startIndex = source.indexOf(tmpAttr);
        if (startIndex < 0) {
            tmpAttr = DeliveryReceipt.DELREC_TEXT.toLowerCase() + ":";
            startIndex = source.indexOf(tmpAttr);
        }
        if (startIndex < 0) {
            return null;
        }
        startIndex = startIndex + tmpAttr.length();
        return source.substring(startIndex);
    }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.