www.pudn.com > mobileMms.rar > SOAPDecoder.java


/**File Name:SOAPDecoder.java 
 * Company:  中国移动集团公司 
 * Date  :   2004-2-12 
 * */ 
 
package com.cmcc.mm7.vasp.common; 
 
import java.io.*; 
import java.util.*; 
import java.text.*; 
import org.jdom.*; 
import org.jdom.input.*; 
import sun.misc.BASE64Decoder; 
import com.cmcc.mm7.vasp.message.*; 
 
public class SOAPDecoder 
{ 
  private MM7RSReq mm7rsReq; 
  private boolean bDecoder; 
  private boolean bMessageExist; 
  private OutputStream OutputMessage; 
  private String MessageName; 
  private String strEnvelope; 
  private ByteArrayOutputStream SoapStream; 
 
  /**默认构造方法*/ 
  public SOAPDecoder() 
  { 
    reset(); 
  } 
  public void reset() 
  { 
    bDecoder = false; 
    bMessageExist = false; 
    OutputMessage = null; 
    MessageName = ""; 
    mm7rsReq = new MM7RSReq(); 
    strEnvelope = ""; 
    SoapStream = new ByteArrayOutputStream(); 
  } 
  private void setEnvelope(String env) 
  { 
    strEnvelope = env; 
  } 
  public String getEnvelope() 
  { 
    return strEnvelope; 
  } 
  private void setSoapStream(ByteArrayOutputStream soapstream) 
  { 
    SoapStream = soapstream; 
  } 
  public ByteArrayOutputStream getSoapStream() 
  { 
    return SoapStream; 
  } 
 
  /**传入的是OutputStream*/ 
  public void setMessage(OutputStream output) 
  { 
    OutputMessage = output; 
    bMessageExist = true; 
  } 
 
  /**得到封装好的MM7RSReq消息*/ 
  public MM7RSReq getMessage() 
  { 
    if(bDecoder) 
      return mm7rsReq; 
    else 
      return null; 
  } 
 
  public String getMessageName() 
  { 
    return MessageName; 
  } 
 
  /**进行消息的解码*/ 
  public void decodeMessage() throws SOAPDecodeException 
  { 
    if (!bMessageExist) 
      throw new SOAPDecodeException("No Multimedia Messages get in the decoder!"); 
    try 
    { 
      if (OutputMessage == null) { 
        bDecoder = false; 
      } 
      else { 
        ByteArrayOutputStream baos = (ByteArrayOutputStream) OutputMessage; 
        ByteArrayOutputStream attachbaos = new ByteArrayOutputStream(); 
        //得到整个输出流 
        String message = baos.toString(); 
        if (message.indexOf("encoding=\"UTF-8\"") > 0) { 
          byte byteXml[] = baos.toByteArray(); 
          message = new String(byteXml, "UTF-8"); 
        } 
        else if (message.indexOf("encoding=\"GB2312\"") > 0) { 
          byte byteXml[] = baos.toByteArray(); 
          message = new String(byteXml, "GB2312"); 
        } 
        int xmlbeg = message.indexOf(MMConstants.BEGINXMLFLAG); 
        //得到SOAP消息的Envelope部分 
        //add by hudm 2004-03-21 
        int index1 = message.indexOf(MMConstants.BOUNDARY); 
        String strboundary = ""; 
        String xmlContent = ""; 
        int index2 = 0, index3 = 0, xmlend = 0; 
        if (index1 > 0) { 
          index2 = message.indexOf("\"", index1 + 1); 
          index3 = message.indexOf("\"", index2 + 1); 
          strboundary = message.substring(index2 + 1, index3); 
          xmlend = message.indexOf("--" + strboundary, xmlbeg + 1); 
          if (xmlend > 0) 
            xmlContent = message.substring(xmlbeg, xmlend); 
        } 
        else 
          xmlContent = message.substring(xmlbeg); 
        setEnvelope(xmlContent); 
        ByteArrayOutputStream bb = new ByteArrayOutputStream(); 
        bb.write(baos.toByteArray(), xmlbeg, (baos.size() - xmlbeg)); 
        setSoapStream(bb); 
        //解析SOAPEnvelope部分,并返回MM7RSReq消息 
        MM7RSReq req = new MM7RSReq(); 
        req = parseXML(xmlContent); 
        if (req != null) { 
          attachbaos.write(baos.toByteArray(), xmlend, (baos.size() - xmlend)); 
          /**若返回的消息类型为MM7DeliverReq,则进行附件的解析, 
           * 返回MM7DeliverReq类型的消息*/ 
          if (req instanceof MM7DeliverReq) { 
            MM7DeliverReq deliverReq = (MM7DeliverReq) req; 
            req = parseAttachment(attachbaos, deliverReq); 
          } 
          bDecoder = true; 
        } 
        else { 
          bDecoder = false; 
        } 
      } 
    } 
    catch (Exception e) { 
      System.err.println(e); 
    } 
  } 
 
  private MM7DeliverReq parseAttachment(ByteArrayOutputStream content,MM7DeliverReq deliverReq) 
  { 
 
    MMContent deliverContent = new MMContent(); 
    //add by hudm 2004-03-21 
    String boundary = ""; 
    int bound_index1 = content.toString().indexOf(MMConstants.BOUNDARY); 
    if(bound_index1>0) 
    { 
    	int bound_index2 = bound_index1 + MMConstants.BOUNDARY.length(); 
        char c = content.toString().charAt(bound_index2 + 1); 
        if(c == '"') 
          bound_index2 ++; 
        int bound_index3 = bound_index2; 
        while(1 == 1) 
        { 
          c = content.toString().charAt(bound_index3); 
          if(c == ';' || c == '\r' || c == '\n') 
            break; 
          bound_index3 ++; 
        } 
        c = content.toString().charAt(bound_index3 - 1); 
        if(c == '"') 
          bound_index3 --; 
    	boundary = content.toString().substring(bound_index2+1,bound_index3); 
    } 
    //end add by hudm 2004-03-21 
    int length = boundary.length()+2; 
    List bound = new ArrayList(); 
    //得到所有边界部分的index 
    byte[] bContent = content.toByteArray(); 
    int index = 0; 
    byte[] bBoundary = ("--"+boundary).getBytes(); 
    int m= 0; 
    for(int i=0;i0) 
      { 
        //得到附件的具体内容,并进行赋值 
        int attindex = attachment.toString().indexOf("\r\n\r\n"); 
        if(attindex>0) 
        { 
          ByteArrayOutputStream att = new ByteArrayOutputStream(); 
          //add by hudm 2004-04-01 
          //修改目的:判断内容是否进行了base64编码,若是则先进行base64解码 
          String strEncoding = "Content-Transfer-Encoding"; 
          int encodingindex = attachment.toString().indexOf(strEncoding); 
          if(encodingindex>=0) 
          { 
            int endEncoding = attachment.toString().indexOf("\r\n",encodingindex+1); 
            String EncodingType = attachment.toString().substring( 
                encodingindex+strEncoding.length()+1,endEncoding).trim(); 
            if(EncodingType.equalsIgnoreCase("base64")) 
            { 
              att = getFromBASE64(attachment.toString().substring(endEncoding,attachment.size()).trim()); 
            } 
            else 
            { 
              att.write(attachment.toByteArray(), attindex + 4, 
                      attachment.size() - attindex - 4); 
            } 
          } 
          else 
          { 
            att.write(attachment.toByteArray(), attindex + 4, 
                      attachment.size() - attindex - 4); 
          } 
          //end add by hudm 2004-04-01 
          subContent = MMContent.createFromBytes(att.toByteArray()); 
        } 
        int lineend = attachment.toString().indexOf("\r\n",type_index+1); 
        attach_index = lineend; 
        int linebeg = type_index+MMConstants.CONTENT_TYPE.length()+1; 
        String contentType = attachment.toString().substring(linebeg,lineend).trim(); 
        if(contentType == null || contentType.equals("")) 
          continue; 
        subContent.setContentType(new MMContentType(contentType)); 
        int id_index = attachment.toString().toLowerCase().indexOf(MMConstants.CONTENT_ID); 
        //若存在ContentID,则取得值并进行赋值 
        if (id_index > 0) { 
          lineend = attachment.toString().indexOf("\r", id_index + 1); 
          attach_index = lineend; 
          linebeg = id_index + MMConstants.CONTENT_ID.length() + 1; 
          String contentID = attachment.toString().substring(linebeg, lineend).trim(); 
          subContent.setContentID(contentID); 
        } 
 
        int char_index1 = attachment.toString().indexOf(MMConstants.CHARSET); 
        if(char_index1 > 0) 
        { 
          int char_index2 = char_index1 + MMConstants.CHARSET.length(); 
          char c = attachment.toString().charAt(char_index2 + 1); 
          if (c == '"') 
            char_index2++; 
          int char_index3 = char_index2; 
          while (1 == 1) { 
            c = attachment.toString().charAt(char_index3); 
            if (c == ';' || c == '\r' || c == '\n') 
              break; 
            char_index3++; 
          } 
          c = attachment.toString().charAt(char_index3 - 1); 
          if (c == '"') 
            char_index3--; 
          String charset = attachment.toString().substring(char_index2 + 1,char_index3).trim(); 
          subContent.setCharset(charset); 
        } 
 
        int loc_index1 = attachment.toString().indexOf("Content-Location"); 
        if(loc_index1 > 0) 
        { 
          int loc_index2 = loc_index1 + "Content-Location".length(); 
          char c = attachment.toString().charAt(loc_index2 + 1); 
          if (c == '"') 
              loc_index2++; 
          int loc_index3 = loc_index2; 
          while(1 == 1){ 
            c = attachment.toString().charAt(loc_index3); 
            if(c == ';' || c == '\r' || c == '\n') 
              break; 
            loc_index3++; 
          } 
          c = attachment.toString().charAt(loc_index3 -1); 
          if(c == '"') 
            loc_index3--; 
          String location = attachment.toString().substring(loc_index2 + 1,loc_index3).trim(); 
          subContent.setContentLocation(location); 
        } 
 
        deliverContent.addSubContent(subContent); 
      } 
      else 
        continue; 
    } 
    deliverReq.setContent(deliverContent); 
    return deliverReq; 
  } 
 
  /**对SOAP的Envelope部分进行解码*/ 
  private MM7RSReq parseXML(String xmlContent) 
  { 
    String xml = ""; 
    int index1 = xmlContent.indexOf("encoding=\"UTF-8\""); 
    if(index1 > 0) 
    { 
      xml = xmlContent.substring(0, index1) + "encoding=\"GB2312\"" + 
          xmlContent.substring(index1 + "encoding=\"UTF-8\"".length()); 
      xmlContent = xml; 
    } 
    if(xmlContent.lastIndexOf("Envelope>")>0) 
    { 
      SAXBuilder sax = new SAXBuilder(); 
      try { 
        ByteArrayInputStream in = new ByteArrayInputStream(xmlContent.getBytes( 
            "GB2312")); 
        Document doc = sax.build(in); 
        Element root = doc.getRootElement(); 
        Element envBody = (Element) root.getChildren().get(1); 
        Element Message = (Element) envBody.getChildren().get(0); 
        mm7rsReq = DecodeBody(Message); 
        Element envHeader = (Element) root.getChildren().get(0); 
        Element transID = (Element) envHeader.getChildren().get(0); 
        String transactionID = transID.getTextTrim(); 
        if (transactionID != null || !transactionID.equals("")) 
          mm7rsReq.setTransactionID(transactionID); 
        else 
          System.err.println("TransactionID必须有。"); 
        return mm7rsReq; 
      } 
      catch (JDOMException jdome) { 
        jdome.printStackTrace(); 
        return null; 
      } 
      catch (Exception e) { 
        //System.out.println("e=" + e); 
        return null; 
      } 
    } 
    else 
    { 
      return null; 
    } 
  } 
 
  /**对soap Envelope中的env:Body部分进行解码*/ 
  private MM7RSReq DecodeBody(Element message) 
  { 
    String messageType = message.getName(); 
    MessageName = messageType; 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
    int size = message.getChildren().size(); 
    try{ 
      if (messageType.equals("DeliverReq")) { 
        MM7DeliverReq deliverReq = new MM7DeliverReq(); 
        for (int i = 0; i < size; i++) { 
          Element child = (Element) message.getChildren().get(i); 
          String name = child.getName(); 
          if (name.equals("Sender")) 
          { 
            //Element sub = (Element)child.getChildren().get(0); 
            deliverReq.setSender(child.getTextTrim()); 
            //deliverReq.setSender(sub.getTextTrim()); 
            continue; 
          } 
          if (name.equals("Recipients")) { 
            List To = new ArrayList(); 
            List Cc = new ArrayList(); 
            List Bcc = new ArrayList(); 
            int recsize = child.getChildren().size(); 
            for (int j = 0; j < recsize; j++) { 
              Element rec = (Element) child.getChildren().get(j); 
              if (rec.getName().equals("To")) { 
                int tosize = rec.getChildren().size(); 
                for (int m = 0; m < tosize; m++) { 
                  Element ele = (Element) rec.getChildren().get(m); 
                  if (ele.getName().equals("Number")||ele.getName().equals("RFC2822Address") 
                      || ele.getName().equals("ShortCode")) 
                    To.add(ele.getTextTrim()); 
                } 
                continue; 
              } 
              if (rec.getName().equals("Cc")) { 
                int ccsize = rec.getChildren().size(); 
                for (int m = 0; m < ccsize; m++) { 
                  Element ele = (Element) rec.getChildren().get(m); 
                  if (ele.getName().equals("Number")||ele.getName().equals("RFC2822Address") 
                      || ele.getName().equals("ShortCode")) 
                    Cc.add(ele.getTextTrim()); 
                } 
                continue; 
              } 
              if (rec.getName().equals("Bcc")) { 
                int bccsize = rec.getChildren().size(); 
                for (int m = 0; m < bccsize; m++) { 
                  Element ele = (Element) rec.getChildren().get(m); 
                  if (ele.getName().equals("Number")||ele.getName().equals("RFC2822Address") 
                      || ele.getName().equals("ShortCode")) 
                    Bcc.add(ele.getTextTrim()); 
                } 
                continue; 
              } 
            } 
            if(!To.isEmpty()) 
              deliverReq.setTo(To); 
            if(!Cc.isEmpty()) 
              deliverReq.setCc(Cc); 
            if(!Bcc.isEmpty()) 
              deliverReq.setBcc(Bcc); 
            continue; 
          } 
          if (name.equals("LinkedID")){ 
            deliverReq.setLinkedID(child.getTextTrim()); 
            continue; } 
          if (name.equals("MMSRelayServerID")){ 
            deliverReq.setMMSRelayServerID(child.getTextTrim()); 
            continue; } 
          if (name.equals("ReplyChargingID")){ 
            deliverReq.setReplyChargingID(child.getTextTrim()); 
            continue; } 
          if (name.equals("Subject")){ 
            deliverReq.setSubject(child.getTextTrim()); 
            continue; } 
          if (name.equals("Priority")){ 
            if(child.getTextTrim().equalsIgnoreCase("Low")) 
              deliverReq.setPriority((byte)0); 
            else if(child.getTextTrim().equalsIgnoreCase("Normal")) 
              deliverReq.setPriority((byte)1); 
            else if(child.getTextTrim().equalsIgnoreCase("High")) 
              deliverReq.setPriority((byte)2); 
            continue; } 
          if (name.equals("TimeStamp")){ 
            String time = child.getTextTrim(); 
            if(time.length()>19) 
            { 
              time = time.substring(0, 19); 
            } 
            deliverReq.setTimeStamp(sdf.parse(time)); 
            continue; } 
        } 
        return deliverReq; 
      } 
      else if (messageType.equals("DeliveryReportReq")) { 
        MM7DeliveryReportReq deliveryReportReq = new MM7DeliveryReportReq(); 
        for (int i = 0; i < size; i++) { 
          Element child = (Element) message.getChildren().get(i); 
          String name = child.getName(); 
          if(name.equals("MMSRelayServerID")){ 
            deliveryReportReq.setMMSRelayServerID(child.getTextTrim()); 
            continue; } 
          if(name.equals("MessageID")){ 
            deliveryReportReq.setMessageID(child.getTextTrim()); 
            continue; } 
          if (name.equals("Recipient")) { 
            int recsize = child.getChildren().size(); 
            for (int j = 0; j < recsize; j++) { 
              Element rec = (Element) child.getChildren().get(j); 
              deliveryReportReq.setRecipient(rec.getTextTrim()); 
              continue; 
            } 
          } 
          if(name.equals("Sender")){ 
            deliveryReportReq.setSender(child.getTextTrim()); 
            continue; } 
          if(name.equals("TimeStamp")){ 
            String time = child.getTextTrim(); 
            if(time.length()>19) 
            { 
              time = time.substring(0, 19); 
            } 
            deliveryReportReq.setTimeStamp(sdf.parse(time)); 
            continue; } 
          if(name.equals("MMStatus")){ 
            if(child.getTextTrim().equalsIgnoreCase("Expired")) 
              deliveryReportReq.setMMStatus((byte)0); 
            else if(child.getTextTrim().equalsIgnoreCase("Retrieved")) 
              deliveryReportReq.setMMStatus((byte)1); 
            else if(child.getTextTrim().equalsIgnoreCase("Rejected")) 
              deliveryReportReq.setMMStatus((byte)2); 
            else if(child.getTextTrim().equalsIgnoreCase("System Rejected")) 
              deliveryReportReq.setMMStatus((byte)2); 
            else if(child.getTextTrim().equalsIgnoreCase("Recipient Rejected")) 
              deliveryReportReq.setMMStatus((byte)3); 
            else if(child.getTextTrim().equalsIgnoreCase("Indeterminate")) 
              deliveryReportReq.setMMStatus((byte)4); 
            else if(child.getTextTrim().equalsIgnoreCase("Forwarded")) 
              deliveryReportReq.setMMStatus((byte)5); 
            else 
              deliveryReportReq.setMMStatus((byte)4); 
            continue; 
          } 
          if(name.equals("StatusText")){ 
            deliveryReportReq.setStatusText(child.getTextTrim()); 
            continue;} 
        } 
        mm7rsReq = deliveryReportReq; 
      } 
      else if (messageType.equals("ReadReplyReq")) { 
        MM7ReadReplyReq readReplyReq = new MM7ReadReplyReq(); 
        for (int i = 0; i < size; i++) { 
          Element child = (Element) message.getChildren().get(i); 
          String name = child.getName(); 
          if(name.equals("MMSReplayServerID")){ 
            readReplyReq.setMMSRelayServerID(child.getTextTrim()); 
            continue; } 
          if(name.equals("MessageID")){ 
            readReplyReq.setMessageID(child.getTextTrim()); 
            continue; } 
          if (name.equals("Recipient")) { 
            int recsize = child.getChildren().size(); 
            for (int j = 0; j < recsize; j++) { 
              Element rec = (Element) child.getChildren().get(j); 
              readReplyReq.setRecipient(rec.getTextTrim()); 
              continue; 
            } 
          } 
          if(name.equals("Sender")){ 
            readReplyReq.setSender(child.getTextTrim()); 
            continue; } 
          if(name.equals("TimeStamp")){ 
            String time = child.getTextTrim(); 
            if(time.length()>19) 
            { 
              time = time.substring(0, 19); 
            } 
            readReplyReq.setTimeStamp(sdf.parse(time)); 
            continue; } 
          if(name.equals("MMStatus")){ 
            String strReadStatus = child.getTextTrim().trim(); 
            byte bReadStatus = 2; 
            if(strReadStatus.equalsIgnoreCase("read")) 
              bReadStatus = 0; 
            else if(strReadStatus.equalsIgnoreCase("deleted")) 
              bReadStatus = 1; 
            else 
              bReadStatus = 2; 
            readReplyReq.setMMStatus(bReadStatus); 
           // readReplyReq.setMMStatus(Byte.parseByte(child.getTextTrim())); 
            continue; } 
          if(name.equals("StatusText")){ 
            readReplyReq.setStatusText(child.getTextTrim()); 
            continue; } 
        } 
        mm7rsReq = readReplyReq; 
      } 
      else 
        return null; 
      return mm7rsReq; 
    }catch(ParseException e) 
    { 
      e.printStackTrace(); 
      return null; 
    } 
  } 
 
  /**对内容进行BASE64解码*/ 
  // 将 BASE64 编码的字符串 s 进行解码 
  public static ByteArrayOutputStream getFromBASE64(String s) { 
    if (s == null) 
      return null; 
    BASE64Decoder decoder = new BASE64Decoder(); 
    ByteArrayOutputStream decodebaos = new ByteArrayOutputStream(); 
    try { 
      byte[] b = decoder.decodeBuffer(s); 
      decodebaos.write(b); 
      return decodebaos; 
    } 
    catch (Exception e) { 
      return null; 
    } 
  } 
}