com.cloopen.rest.sdk.CCPRestSDK.java Source code

Java tutorial

Introduction

Here is the source code for com.cloopen.rest.sdk.CCPRestSDK.java

Source

/*
 *  Copyright (c) 2014 The CCP project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a Beijing Speedtong Information Technology Co.,Ltd license
 *  that can be found in the LICENSE file in the root of the web site.
 *
 *   http://www.yuntongxun.com
 *
 *  An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */
package com.cloopen.rest.sdk;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import ytx.org.apache.http.HttpEntity;
import ytx.org.apache.http.HttpResponse;
import ytx.org.apache.http.client.methods.HttpGet;
import ytx.org.apache.http.client.methods.HttpPost;
import ytx.org.apache.http.client.methods.HttpRequestBase;
import ytx.org.apache.http.entity.BasicHttpEntity;
import ytx.org.apache.http.impl.client.DefaultHttpClient;
import ytx.org.apache.http.message.AbstractHttpMessage;
import ytx.org.apache.http.util.EntityUtils;

import com.cloopen.rest.sdk.utils.CcopHttpClient;
import com.cloopen.rest.sdk.utils.DateUtil;
import com.cloopen.rest.sdk.utils.EncryptUtil;
import com.cloopen.rest.sdk.utils.LoggerUtil;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

public class CCPRestSDK {
    int status;
    private static final int Request_Get = 0;

    private static final int Request_Post = 1;
    private static final String Account_Info = "AccountInfo";
    private static final String Create_SubAccount = "SubAccounts";
    private static final String Get_SubAccounts = "GetSubAccounts";
    private static final String Query_SubAccountByName = "QuerySubAccountByName";

    private static final String SMSMessages = "SMS/Messages";
    private static final String TemplateSMS = "SMS/TemplateSMS";
    private static final String Query_SMSTemplate = "SMS/QuerySMSTemplate";
    private static final String LandingCalls = "Calls/LandingCalls";
    private static final String VoiceVerify = "Calls/VoiceVerify";
    private static final String IvrDial = "ivr/dial";
    private static final String BillRecords = "BillRecords";
    private static final String queryCallState = "ivr/call";
    private static final String callResult = "CallResult";
    private static final String mediaFileUpload = "Calls/MediaFileUpload";
    private String SERVER_IP;
    private String SERVER_PORT;
    private String ACCOUNT_SID;
    private String ACCOUNT_TOKEN;
    private String SUBACCOUNT_SID;
    private String SUBACCOUNT_Token;
    public String App_ID;
    private BodyType BODY_TYPE = BodyType.Type_XML;
    public String Callsid;

    public enum BodyType {
        Type_XML, Type_JSON;
    }

    public enum AccountType {
        Accounts, SubAccounts;
    }

    /**
     * ????
     * 
     * @param serverIP
     *            ? ??
     * @param serverPort
     *            ? ??
     */
    public void init(String serverIP, String serverPort) {
        if (isEmpty(serverIP) || isEmpty(serverPort)) {
            LoggerUtil.fatal("?:serverIPserverPort");
            throw new IllegalArgumentException("?:" + (isEmpty(serverIP) ? " ?? " : "")
                    + (isEmpty(serverPort) ? " ?? " : "") + "");
        }
        SERVER_IP = serverIP;
        SERVER_PORT = serverPort;
    }

    /**
     * ????
     * 
     * @param accountSid
     * 
     *            ? ??
     * @param accountToken
     *            ? ??TOKEN
     */
    public void setAccount(String accountSid, String accountToken) {
        if (isEmpty(accountSid) || isEmpty(accountToken)) {
            LoggerUtil.fatal("?:accountSidaccountToken");
            throw new IllegalArgumentException("?:" + (isEmpty(accountSid) ? " ??" : "")
                    + (isEmpty(accountToken) ? " ??TOKEN " : "") + "");
        }
        ACCOUNT_SID = accountSid;
        ACCOUNT_TOKEN = accountToken;
    }

    /**
     * ?????
     * 
     * @param subAccountSid
     *            ? ???
     * @param subAccountToken
     *            ? ???TOKEN
     */
    public void setSubAccount(String subAccountSid, String subAccountToken) {
        if (isEmpty(subAccountSid) || isEmpty(subAccountToken)) {
            LoggerUtil.fatal("?:subAccountSidsubAccountToken");
            throw new IllegalArgumentException("?:" + (isEmpty(subAccountSid) ? " ???" : "")
                    + (isEmpty(subAccountToken) ? " ???TOKEN " : "") + "");
        }
        SUBACCOUNT_SID = subAccountSid;
        SUBACCOUNT_Token = subAccountToken;
    }

    /**
     * ?Id
     * 
     * @param appId
     *            ? Id
     */
    public void setAppId(String appId) {
        if (isEmpty(appId)) {
            LoggerUtil.fatal("?:appId");
            throw new IllegalArgumentException("?: Id ");
        }
        App_ID = appId;
    }

    /**
     * ??
     * 
     * @param date
     *            ? day ??00:00  23:59
     * @param keywords
     *            ?? ??????
     * @return
     */
    public HashMap<String, Object> billRecords(String date, String keywords) {

        HashMap<String, Object> validate = accountValidate();
        if (validate != null)
            return validate;
        if ((isEmpty(date))) {
            LoggerUtil.fatal("?:   ");
            throw new IllegalArgumentException("?:   ");
        }
        CcopHttpClient chc = new CcopHttpClient();
        DefaultHttpClient httpclient = null;
        try {
            httpclient = chc.registerSSL(SERVER_IP, "TLS", Integer.parseInt(SERVER_PORT), "https");
        } catch (Exception e1) {
            //e1.printStackTrace();
            LoggerUtil.error(e1.getMessage());
            throw new RuntimeException("?httpclient" + e1.getMessage());
        }
        String result = "";
        try {
            HttpPost httppost = (HttpPost) getHttpRequestBase(1, BillRecords);
            String requsetbody = "";
            if (BODY_TYPE == BodyType.Type_JSON) {
                JsonObject json = new JsonObject();
                json.addProperty("appId", App_ID);
                json.addProperty("date", date);
                if (!(isEmpty(keywords)))
                    json.addProperty("keywords", keywords);

                requsetbody = json.toString();
            } else {
                StringBuilder sb = new StringBuilder("<?xml version='1.0' encoding='utf-8'?><BillRecords>");
                sb.append("<appId>").append(App_ID).append("</appId>").append("<date>").append(date)
                        .append("</date>");
                if (!(isEmpty(keywords)))
                    sb.append("<keywords>").append(keywords).append("</keywords>");

                sb.append("</BillRecords>").toString();
                requsetbody = sb.toString();
            }
            LoggerUtil.info("billRecords Request body = : " + requsetbody);
            //?
            System.out.println("" + requsetbody);
            BasicHttpEntity requestBody = new BasicHttpEntity();
            requestBody.setContent(new ByteArrayInputStream(requsetbody.getBytes("UTF-8")));
            requestBody.setContentLength(requsetbody.getBytes("UTF-8").length);
            httppost.setEntity(requestBody);
            HttpResponse response = httpclient.execute(httppost);

            status = response.getStatusLine().getStatusCode();

            System.out.println("Https??" + status);

            HttpEntity entity = response.getEntity();
            if (entity != null)
                result = EntityUtils.toString(entity, "UTF-8");

            EntityUtils.consume(entity);
        } catch (IOException e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172001", "");
        } catch (Exception e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172002", "");
        } finally {
            if (httpclient != null)
                httpclient.getConnectionManager().shutdown();
        }
        LoggerUtil.info("billRecords response body = " + result);
        try {
            if (BODY_TYPE == BodyType.Type_JSON) {
                return jsonToMap(result);
            } else {
                return xmlToMap(result);
            }
        } catch (Exception e) {

            return getMyError("172003", "");
        }
    }

    /**
     * ?IVR
     * 
     * @param number
     *            ? ???Dial
     * @param userdata
     *            ?? ?<startservice>??Dial
     * @param record
     *            ?? ??truefalsefalse?Dial
     * @param disnumber
     *            ?? ??????
     * @return
     */
    public HashMap<String, Object> ivrDial(String number, String userdata, boolean record, String disnumber) {
        HashMap<String, Object> validate = accountValidate();
        if (validate != null)
            return validate;
        if (isEmpty(number)) {
            LoggerUtil.fatal("?: ???   ");
            throw new IllegalArgumentException("?: ???   ");
        }
        CcopHttpClient chc = new CcopHttpClient();
        DefaultHttpClient httpclient = null;
        try {
            httpclient = chc.registerSSL(SERVER_IP, "TLS", Integer.parseInt(SERVER_PORT), "https");
        } catch (Exception e1) {
            e1.printStackTrace();
            throw new RuntimeException("?httpclient" + e1.getMessage());
        }
        String result = "";
        try {
            HttpPost httppost = (HttpPost) getHttpRequestBase(1, IvrDial);
            String requsetbody = "";

            StringBuilder sb = new StringBuilder("<?xml version='1.0' encoding='utf-8'?><Request>");
            sb.append("<Appid>").append(App_ID).append("</Appid>").append("<Dial number=").append("\"")
                    .append(number).append("\"");
            if (record) {
                sb.append(" record=").append("\"").append(record).append("\"");
            }
            if (userdata != null) {
                sb.append(" userdata=").append("\"").append(userdata).append("\"");
            }
            if (disnumber != null) {
                sb.append(" disnumber=").append("\"").append(disnumber).append("\"");
            }
            sb.append("></Dial></Request>").toString();
            requsetbody = sb.toString();

            LoggerUtil.info("ivrDial Request body = : " + requsetbody);
            System.out.println("" + requsetbody);

            BasicHttpEntity requestBody = new BasicHttpEntity();
            requestBody.setContent(new ByteArrayInputStream(requsetbody.getBytes("UTF-8")));
            requestBody.setContentLength(requsetbody.getBytes("UTF-8").length);
            httppost.setEntity(requestBody);
            HttpResponse response = httpclient.execute(httppost);
            status = response.getStatusLine().getStatusCode();

            System.out.println("Https??" + status);

            HttpEntity entity = response.getEntity();
            if (entity != null)
                result = EntityUtils.toString(entity, "UTF-8");

            EntityUtils.consume(entity);
        } catch (IOException e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172001", "");
        } catch (Exception e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172002", "");
        } finally {
            if (httpclient != null)
                httpclient.getConnectionManager().shutdown();
        }
        LoggerUtil.info("ivrDial response body = " + result);
        try {
            return xmlToMap(result);
        } catch (Exception e) {
            return getMyError("172003", "");
        }
    }

    /**
     * ???
     * 
     * @param verifyCode
     *            ? ?????4-8?
     * @param to
     *            ? ??
     * @param displayNum
     *            ?? ??????
     * @param playTimes
     *            ?? 1?31
     * @param respUrl
     *            ?? ??????Url????
     * @param lang
     *            ?? 
     * @param userData
     *            ?? ??
     * @param welcomePrompt
     *               ?? wav??????????verifyCodeplayVerifyCode
     * @param playVerifyCode 
     *            ?? wav????????verifyCode???playVerifyCode
     * @param maxCallTime 
     *               ?? ? 
     * @return
     */
    public HashMap<String, Object> voiceVerify(String verifyCode, String to, String displayNum, String playTimes,
            String respUrl, String lang, String userData, String welcomePrompt, String playVerifyCode,
            String maxCallTime) {
        HashMap<String, Object> validate = accountValidate();
        if (validate != null)
            return validate;
        if ((isEmpty(verifyCode)) || (isEmpty(to)))
            throw new IllegalArgumentException("?:" + (isEmpty(verifyCode) ? " ?? " : "")
                    + (isEmpty(to) ? " ?? " : "") + "");
        CcopHttpClient chc = new CcopHttpClient();
        DefaultHttpClient httpclient = null;
        try {
            httpclient = chc.registerSSL(SERVER_IP, "TLS", Integer.parseInt(SERVER_PORT), "https");
        } catch (Exception e1) {
            e1.printStackTrace();
            throw new RuntimeException("?httpclient" + e1.getMessage());
        }
        String result = "";
        try {
            HttpPost httppost = (HttpPost) getHttpRequestBase(1, VoiceVerify);
            String requsetbody = "";
            if (BODY_TYPE == BodyType.Type_JSON) {
                JsonObject json = new JsonObject();
                json.addProperty("appId", App_ID);
                json.addProperty("verifyCode", verifyCode);
                json.addProperty("to", to);
                if (!(isEmpty(displayNum)))
                    json.addProperty("displayNum", displayNum);

                if (!(isEmpty(playTimes)))
                    json.addProperty("playTimes", playTimes);

                if (!(isEmpty(respUrl)))
                    json.addProperty("respUrl", respUrl);
                if (!(isEmpty(lang)))
                    json.addProperty("lang", lang);
                if (!(isEmpty(userData)))
                    json.addProperty("userData", userData);
                if (!(isEmpty(welcomePrompt)))
                    json.addProperty("welcomePrompt", welcomePrompt);
                if (!(isEmpty(playVerifyCode)))
                    json.addProperty("playVerifyCode", playVerifyCode);
                if (!(isEmpty(maxCallTime)))
                    json.addProperty("maxCallTime", maxCallTime);

                requsetbody = json.toString();
            } else {
                StringBuilder sb = new StringBuilder("<?xml version='1.0' encoding='utf-8'?><VoiceVerify>");
                sb.append("<appId>").append(App_ID).append("</appId>").append("<verifyCode>").append(verifyCode)
                        .append("</verifyCode>").append("<to>").append(to).append("</to>");
                if (!(isEmpty(displayNum)))
                    sb.append("<displayNum>").append(displayNum).append("</displayNum>");

                if (!(isEmpty(playTimes)))
                    sb.append("<playTimes>").append(playTimes).append("</playTimes>");

                if (!(isEmpty(respUrl)))
                    sb.append("<respUrl>").append(respUrl).append("</respUrl>");
                if (!(isEmpty(lang)))
                    sb.append("<lang>").append(lang).append("</lang>");
                if (!(isEmpty(userData)))
                    sb.append("<userData>").append(userData).append("</userData>");
                if (!(isEmpty(welcomePrompt)))
                    sb.append("<welcomePrompt>").append(welcomePrompt).append("</welcomePrompt>");
                if (!(isEmpty(playVerifyCode)))
                    sb.append("<playVerifyCode>").append(playVerifyCode).append("</playVerifyCode>");
                if (!(isEmpty(maxCallTime)))
                    sb.append("<maxCallTime>").append(maxCallTime).append("</maxCallTime>");

                sb.append("</VoiceVerify>").toString();
                requsetbody = sb.toString();
            }

            LoggerUtil.info("voiceVerify Request body = : " + requsetbody);
            System.out.println("" + requsetbody);

            BasicHttpEntity requestBody = new BasicHttpEntity();
            requestBody.setContent(new ByteArrayInputStream(requsetbody.getBytes("UTF-8")));
            requestBody.setContentLength(requsetbody.getBytes("UTF-8").length);
            httppost.setEntity(requestBody);
            HttpResponse response = httpclient.execute(httppost);
            status = response.getStatusLine().getStatusCode();
            System.out.println("Https??" + status);

            HttpEntity entity = response.getEntity();
            if (entity != null)
                result = EntityUtils.toString(entity, "UTF-8");

            EntityUtils.consume(entity);
        } catch (IOException e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172001", "");
        } catch (Exception e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172002", "");
        } finally {
            if (httpclient != null)
                httpclient.getConnectionManager().shutdown();
        }

        LoggerUtil.info("voiceVerify response body = " + result);

        try {
            if (BODY_TYPE == BodyType.Type_JSON) {
                return jsonToMap(result);
            } else {
                return xmlToMap(result);
            }
        } catch (Exception e) {

            return getMyError("172003", "");
        }
    }

    /**
     * ??
     * 
     * @param to
     *            ? ???
     * @param mediaName
     *            ?? ??? wavmediaTxt???mediaTxt
     * @param mediaTxt
     *            ?? 
     * @param displayNum
     *            ?? ??????
     * @param playTimes
     *            ?? 1?31
     * @param respUrl
     *            ?? ????Url????
     * @param userData
     *            ?? ??
     * @param txtSpeed
     *            ?? ???-500500mediaTxt?0
     * @param txtVolume
     *            ?? ????-2020mediaTxt?0
     * @param txtPitch
     *            ?? ??-500500mediaTxt?0
     * @param txtBgsound
     *            ?? ?????6?16??0????mediaTxt? 
     * @param playMode
     *            ?? ?? , 0?? 1?0
     * @return
     */
    public HashMap<String, Object> landingCall(String to, String mediaName, String mediaTxt, String displayNum,
            String playTimes, String respUrl, String userData, String txtSpeed, String txtVolume, String txtPitch,
            String txtBgsound, String playMode) {
        HashMap<String, Object> validate = accountValidate();
        if (validate != null)
            return validate;
        if (isEmpty(to))
            throw new IllegalArgumentException("?:" + (isEmpty(to) ? " ??? " : "") + "");
        if ((isEmpty(mediaName)) && (isEmpty(mediaTxt)))
            throw new IllegalArgumentException(
                    "??????");
        CcopHttpClient chc = new CcopHttpClient();
        DefaultHttpClient httpclient = null;
        try {
            httpclient = chc.registerSSL(SERVER_IP, "TLS", Integer.parseInt(SERVER_PORT), "https");
        } catch (Exception e1) {
            e1.printStackTrace();
            throw new RuntimeException("?httpclient" + e1.getMessage());
        }
        String result = "";
        try {
            HttpPost httppost = (HttpPost) getHttpRequestBase(1, LandingCalls);
            String requsetbody = "";
            if (BODY_TYPE == BodyType.Type_JSON) {
                JsonObject json = new JsonObject();
                json.addProperty("appId", App_ID);
                json.addProperty("to", to);

                if (!(isEmpty(mediaName)))
                    json.addProperty("mediaName", mediaName);

                if (!(isEmpty(mediaTxt)))
                    json.addProperty("mediaTxt", mediaTxt);

                if (!(isEmpty(displayNum)))
                    json.addProperty("displayNum", displayNum);
                if (!(isEmpty(playTimes)))
                    json.addProperty("playTimes", playTimes);

                if (!(isEmpty(respUrl)))
                    json.addProperty("respUrl", respUrl);
                if (!(isEmpty(userData)))
                    json.addProperty("userData", userData);
                if (!(isEmpty(txtSpeed)))
                    json.addProperty("txtSpeed", txtSpeed);
                if (!(isEmpty(txtVolume)))
                    json.addProperty("txtVolume", txtVolume);
                if (!(isEmpty(txtPitch)))
                    json.addProperty("txtPitch", txtPitch);
                if (!(isEmpty(txtBgsound)))
                    json.addProperty("txtBgsound", txtBgsound);
                if (!(isEmpty(playMode)))
                    json.addProperty("playMode", playMode);

                requsetbody = json.toString();
            } else {
                StringBuilder sb = new StringBuilder("<?xml version='1.0' encoding='utf-8'?><LandingCall>");
                sb.append("<appId>").append(App_ID).append("</appId>").append("<to>").append(to).append("</to>");
                if (!(isEmpty(mediaName)))
                    sb.append("<mediaName>").append(mediaName).append("</mediaName>");
                else if (!(isEmpty(mediaName)))
                    sb.append("<mediaName>").append(mediaName).append("</mediaName>");

                if (!(isEmpty(mediaTxt)))
                    sb.append("<mediaTxt>").append(mediaTxt).append("</mediaTxt>");

                if (!(isEmpty(displayNum)))
                    sb.append("<displayNum>").append(displayNum).append("</displayNum>");
                if (!(isEmpty(playTimes)))
                    sb.append("<playTimes>").append(playTimes).append("</playTimes>");

                if (!(isEmpty(respUrl)))
                    sb.append("<respUrl>").append(respUrl).append("</respUrl>");
                if (!(isEmpty(userData)))
                    sb.append("<userData>").append(userData).append("</userData>");
                if (!(isEmpty(txtSpeed)))
                    sb.append("<txtSpeed>").append(txtSpeed).append("</txtSpeed>");
                if (!(isEmpty(txtVolume)))
                    sb.append("<txtVolume>").append(txtVolume).append("</txtVolume>");
                if (!(isEmpty(txtPitch)))
                    sb.append("<txtPitch>").append(txtPitch).append("</txtPitch>");
                if (!(isEmpty(txtBgsound)))
                    sb.append("<txtBgsound>").append(txtBgsound).append("</txtBgsound>");
                if (!(isEmpty(playMode)))
                    sb.append("<playMode>").append(playMode).append("</playMode>");

                sb.append("</LandingCall>").toString();
                requsetbody = sb.toString();
            }
            LoggerUtil.info("landingCalls Request body = : " + requsetbody);

            System.out.println("" + requsetbody);
            BasicHttpEntity requestBody = new BasicHttpEntity();
            requestBody.setContent(new ByteArrayInputStream(requsetbody.getBytes("UTF-8")));
            requestBody.setContentLength(requsetbody.getBytes("UTF-8").length);
            httppost.setEntity(requestBody);
            HttpResponse response = httpclient.execute(httppost);
            status = response.getStatusLine().getStatusCode();
            System.out.println("Https??" + status);

            HttpEntity entity = response.getEntity();
            if (entity != null)
                result = EntityUtils.toString(entity, "UTF-8");

            EntityUtils.consume(entity);
        } catch (IOException e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172001", "");
        } catch (Exception e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172002", "");
        } finally {
            if (httpclient != null)
                httpclient.getConnectionManager().shutdown();
        }

        LoggerUtil.info("landingCall response body = " + result);

        try {
            if (BODY_TYPE == BodyType.Type_JSON) {
                return jsonToMap(result);
            } else {
                return xmlToMap(result);
            }
        } catch (Exception e) {

            return getMyError("172003", "");
        }
    }

    /**
     * ???
     * 
     * @param to
     *            ? ??????????100
     * @param templateId
     *            ? ?Id
     * @param datas
     *            ?? ???{??}
     * @return
     */
    public HashMap<String, Object> sendTemplateSMS(String to, String templateId, String[] datas) {
        HashMap<String, Object> validate = accountValidate();
        if (validate != null)
            return validate;
        if ((isEmpty(to)) || (isEmpty(App_ID)) || (isEmpty(templateId)))
            throw new IllegalArgumentException("?:" + (isEmpty(to) ? " ?? " : "")
                    + (isEmpty(templateId) ? " ?Id " : "") + "");
        CcopHttpClient chc = new CcopHttpClient();
        DefaultHttpClient httpclient = null;
        try {
            httpclient = chc.registerSSL(SERVER_IP, "TLS", Integer.parseInt(SERVER_PORT), "https");
        } catch (Exception e1) {
            e1.printStackTrace();
            throw new RuntimeException("?httpclient" + e1.getMessage());
        }
        String result = "";

        try {
            HttpPost httppost = (HttpPost) getHttpRequestBase(1, TemplateSMS);
            String requsetbody = "";
            if (BODY_TYPE == BodyType.Type_JSON) {
                JsonObject json = new JsonObject();
                json.addProperty("appId", App_ID);
                json.addProperty("to", to);
                json.addProperty("templateId", templateId);
                if (datas != null) {
                    StringBuilder sb = new StringBuilder("[");
                    for (String s : datas) {
                        sb.append("\"" + s + "\"" + ",");
                    }
                    sb.replace(sb.length() - 1, sb.length(), "]");
                    JsonParser parser = new JsonParser();
                    JsonArray Jarray = parser.parse(sb.toString()).getAsJsonArray();
                    json.add("datas", Jarray);
                }
                requsetbody = json.toString();
            } else {
                StringBuilder sb = new StringBuilder("<?xml version='1.0' encoding='utf-8'?><TemplateSMS>");
                sb.append("<appId>").append(App_ID).append("</appId>").append("<to>").append(to).append("</to>")
                        .append("<templateId>").append(templateId).append("</templateId>");
                if (datas != null) {
                    sb.append("<datas>");
                    for (String s : datas) {
                        sb.append("<data>").append(s).append("</data>");
                    }
                    sb.append("</datas>");
                }
                sb.append("</TemplateSMS>").toString();
                requsetbody = sb.toString();
            }
            //?
            System.out.println("" + requsetbody);
            LoggerUtil.info("sendTemplateSMS Request body =  " + requsetbody);
            BasicHttpEntity requestBody = new BasicHttpEntity();
            requestBody.setContent(new ByteArrayInputStream(requsetbody.getBytes("UTF-8")));
            requestBody.setContentLength(requsetbody.getBytes("UTF-8").length);
            httppost.setEntity(requestBody);

            HttpResponse response = httpclient.execute(httppost);

            //???

            status = response.getStatusLine().getStatusCode();

            System.out.println("Https??" + status);

            HttpEntity entity = response.getEntity();
            if (entity != null)
                result = EntityUtils.toString(entity, "UTF-8");

            EntityUtils.consume(entity);
        } catch (IOException e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172001", "" + "Https?" + status);
        } catch (Exception e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172002", "");
        } finally {
            if (httpclient != null)
                httpclient.getConnectionManager().shutdown();
        }

        LoggerUtil.info("sendTemplateSMS response body = " + result);

        try {
            if (BODY_TYPE == BodyType.Type_JSON) {
                return jsonToMap(result);
            } else {
                return xmlToMap(result);
            }
        } catch (Exception e) {

            return getMyError("172003", "");
        }
    }

    /**
     * ?????
     * 
     * @param appId
     *            ? Id
     * @param friendlyName
     *            ? ?????
     * @return
     */
    public HashMap<String, Object> querySubAccount(String friendlyName) {
        HashMap<String, Object> validate = accountValidate();
        if (validate != null)
            return validate;
        if ((isEmpty(friendlyName))) {
            LoggerUtil.fatal("?: ????? ");
            throw new IllegalArgumentException("?: ????? ");
        }
        CcopHttpClient chc = new CcopHttpClient();
        DefaultHttpClient httpclient = null;
        try {
            httpclient = chc.registerSSL(SERVER_IP, "TLS", Integer.parseInt(SERVER_PORT), "https");
        } catch (Exception e1) {
            e1.printStackTrace();
            throw new RuntimeException("?httpclient" + e1.getMessage());
        }
        String result = "";
        try {
            HttpPost httppost = (HttpPost) getHttpRequestBase(1, Query_SubAccountByName);
            String requsetbody = "";
            if (BODY_TYPE == BodyType.Type_JSON) {
                JsonObject json = new JsonObject();
                json.addProperty("appId", App_ID);
                json.addProperty("friendlyName", friendlyName);
                requsetbody = json.toString();
            } else {
                requsetbody = "<?xml version='1.0' encoding='utf-8'?><SubAccount>" + "<appId>" + App_ID + "</appId>"
                        + "<friendlyName>" + friendlyName + "</friendlyName>" + "</SubAccount>";
            }
            LoggerUtil.info("querySubAccountByName Request body =  " + requsetbody);
            System.out.println("" + requsetbody);

            BasicHttpEntity requestBody = new BasicHttpEntity();
            requestBody.setContent(new ByteArrayInputStream(requsetbody.getBytes("UTF-8")));
            requestBody.setContentLength(requsetbody.getBytes("UTF-8").length);
            httppost.setEntity(requestBody);
            HttpResponse response = httpclient.execute(httppost);
            status = response.getStatusLine().getStatusCode();
            System.out.println("Https??" + status);

            HttpEntity entity = response.getEntity();
            if (entity != null)
                result = EntityUtils.toString(entity, "UTF-8");

            EntityUtils.consume(entity);
        } catch (IOException e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172001", "");
        } catch (Exception e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172002", "");
        } finally {
            if (httpclient != null)
                httpclient.getConnectionManager().shutdown();
        }

        LoggerUtil.info("querySubAccount result " + result);

        try {
            if (BODY_TYPE == BodyType.Type_JSON) {
                return jsonToMap(result);
            } else {
                return xmlToMap(result);
            }
        } catch (Exception e) {

            return getMyError("172003", "");
        }

    }

    /**
     * ????
     * 
     * @param startNo
     *            ?? ??0
     * @param offset
     *            ?? ??1?100?
     * @return
     */
    public HashMap<String, Object> getSubAccounts(String startNo, String offset) {
        HashMap<String, Object> validate = accountValidate();
        if (validate != null)
            return validate;
        CcopHttpClient chc = new CcopHttpClient();
        DefaultHttpClient httpclient = null;
        try {
            httpclient = chc.registerSSL(SERVER_IP, "TLS", Integer.parseInt(SERVER_PORT), "https");
        } catch (Exception e1) {
            e1.printStackTrace();
            throw new RuntimeException("?httpclient" + e1.getMessage());
        }
        String result = "";
        try {
            HttpPost httppost = (HttpPost) getHttpRequestBase(1, Get_SubAccounts);
            String requsetbody = "";
            if (BODY_TYPE == BodyType.Type_JSON) {
                JsonObject json = new JsonObject();
                json.addProperty("appId", App_ID);
                if (!(isEmpty(startNo)))
                    json.addProperty("startNo", startNo);
                if (!(isEmpty(offset)))
                    json.addProperty("offset", offset);
                requsetbody = json.toString();
            } else {
                StringBuilder sb = new StringBuilder("<?xml version='1.0' encoding='utf-8'?><SubAccount>");
                sb.append("<appId>").append(App_ID).append("</appId>");
                if (!(isEmpty(startNo)))
                    sb.append("<startNo>").append(startNo).append("</startNo>");
                if (!(isEmpty(offset)))
                    sb.append("<offset>").append(offset).append("</offset>");
                sb.append("</SubAccount>").toString();
                requsetbody = sb.toString();
            }
            LoggerUtil.info("GetSubAccounts Request body =  " + requsetbody);
            System.out.println("" + requsetbody);

            BasicHttpEntity requestBody = new BasicHttpEntity();
            requestBody.setContent(new ByteArrayInputStream(requsetbody.getBytes("UTF-8")));
            requestBody.setContentLength(requsetbody.getBytes("UTF-8").length);
            httppost.setEntity(requestBody);
            HttpResponse response = httpclient.execute(httppost);
            status = response.getStatusLine().getStatusCode();
            System.out.println("Https??" + status);

            HttpEntity entity = response.getEntity();
            if (entity != null)
                result = EntityUtils.toString(entity, "UTF-8");

            EntityUtils.consume(entity);
        } catch (IOException e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172001", "");
        } catch (Exception e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172002", "");
        } finally {
            if (httpclient != null)
                httpclient.getConnectionManager().shutdown();
        }
        LoggerUtil.info("getSubAccounts result " + result);

        try {
            if (BODY_TYPE == BodyType.Type_JSON) {
                return jsonToMap(result);
            } else {
                return xmlToMap(result);
            }
        } catch (Exception e) {

            return getMyError("172003", "");
        }
    }

    /**
     * ????
     * 
     * @return
     */
    public HashMap<String, Object> queryAccountInfo() {
        if ((isEmpty(SERVER_IP))) {
            return getMyError("172004", "IP");
        }
        if ((isEmpty(SERVER_PORT))) {
            return getMyError("172005", "?");
        }
        if ((isEmpty(ACCOUNT_SID))) {
            return getMyError("172006", "??");
        }
        if ((isEmpty(ACCOUNT_TOKEN))) {
            return getMyError("172007", "??TOKEN");
        }

        CcopHttpClient chc = new CcopHttpClient();
        DefaultHttpClient httpclient = null;
        try {
            httpclient = chc.registerSSL(SERVER_IP, "TLS", Integer.parseInt(SERVER_PORT), "https");
        } catch (Exception e1) {
            e1.printStackTrace();
            LoggerUtil.fatal(e1.getMessage());
            throw new RuntimeException("?httpclient" + e1.getMessage());
        }
        String result = "";
        try {
            HttpGet httpGet = (HttpGet) getHttpRequestBase(0, Account_Info);
            HttpResponse response = httpclient.execute(httpGet);
            status = response.getStatusLine().getStatusCode();
            System.out.println("Https??" + status);

            HttpEntity entity = response.getEntity();
            if (entity != null)
                result = EntityUtils.toString(entity, "UTF-8");

            EntityUtils.consume(entity);
        } catch (IOException e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172001", "");
        } catch (Exception e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172002", "");
        } finally {
            if (httpclient != null)
                httpclient.getConnectionManager().shutdown();
        }
        LoggerUtil.info("queryAccountInfo response body = " + result);
        try {
            if (BODY_TYPE == BodyType.Type_JSON) {
                return jsonToMap(result);
            } else {
                return xmlToMap(result);
            }
        } catch (Exception e) {

            return getMyError("172003", "");
        }
    }

    /**
     * ???
     * 
     * @param friendlyName
     *            ? ?????????????????
     * @return
     */
    public HashMap<String, Object> createSubAccount(String friendlyName) {
        HashMap<String, Object> validate = accountValidate();
        if (validate != null)
            return validate;
        if (isEmpty(friendlyName)) {
            LoggerUtil.fatal("?: ????? ");
            throw new IllegalArgumentException("?: ????? ");
        }

        CcopHttpClient chc = new CcopHttpClient();
        DefaultHttpClient httpclient = null;
        try {
            httpclient = chc.registerSSL(SERVER_IP, "TLS", Integer.parseInt(SERVER_PORT), "https");
        } catch (Exception e1) {
            e1.printStackTrace();
            LoggerUtil.error(e1.getMessage());
            throw new RuntimeException("?httpclient" + e1.getMessage());
        }
        String result = "";
        try {
            HttpPost httppost = (HttpPost) getHttpRequestBase(1, Create_SubAccount);
            String requsetbody = "";

            if (BODY_TYPE == BodyType.Type_JSON) {
                JsonObject json = new JsonObject();
                json.addProperty("appId", App_ID);
                json.addProperty("friendlyName", friendlyName);
                requsetbody = json.toString();
            } else {
                requsetbody = "<?xml version='1.0' encoding='utf-8'?><SubAccount>" + "<appId>" + App_ID + "</appId>"
                        + "<friendlyName>" + friendlyName + "</friendlyName>" + "</SubAccount>";
            }
            LoggerUtil.info("CreateSubAccount Request body =  " + requsetbody);
            System.out.println("" + requsetbody);

            BasicHttpEntity requestBody = new BasicHttpEntity();
            requestBody.setContent(new ByteArrayInputStream(requsetbody.getBytes("UTF-8")));
            requestBody.setContentLength(requsetbody.getBytes("UTF-8").length);
            httppost.setEntity(requestBody);

            HttpResponse response = httpclient.execute(httppost);
            status = response.getStatusLine().getStatusCode();

            System.out.println("Https??" + status);

            HttpEntity entity = response.getEntity();

            if (entity != null) {
                result = EntityUtils.toString(entity, "UTF-8");
            }

            EntityUtils.consume(entity);
        } catch (IOException e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172001", "");
        } catch (Exception e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172002", "");
        } finally {
            if (httpclient != null)
                httpclient.getConnectionManager().shutdown();
        }
        LoggerUtil.info("createSubAccount response body = " + result);
        try {
            if (BODY_TYPE == BodyType.Type_JSON) {
                return jsonToMap(result);
            } else {
                return xmlToMap(result);
            }
        } catch (Exception e) {

            return getMyError("172003", "");
        }
    }

    /**
     * ?
     * 
     * @param templateId
     *            ?? ?Id????
     * @return
     */
    public HashMap<String, Object> QuerySMSTemplate(String templateId) {
        HashMap<String, Object> validate = accountValidate();
        if (validate != null)
            return validate;

        CcopHttpClient chc = new CcopHttpClient();
        DefaultHttpClient httpclient = null;
        try {
            httpclient = chc.registerSSL(SERVER_IP, "TLS", Integer.parseInt(SERVER_PORT), "https");
        } catch (Exception e1) {
            e1.printStackTrace();
            LoggerUtil.error(e1.getMessage());
            throw new RuntimeException("?httpclient" + e1.getMessage());
        }
        String result = "";
        try {
            HttpPost httppost = (HttpPost) getHttpRequestBase(1, Query_SMSTemplate);
            String requsetbody = "";

            if (BODY_TYPE == BodyType.Type_JSON) {
                JsonObject json = new JsonObject();
                json.addProperty("appId", App_ID);
                json.addProperty("templateId", templateId);
                requsetbody = json.toString();
            } else {
                requsetbody = "<?xml version='1.0' encoding='utf-8'?><Request>" + "<appId>" + App_ID + "</appId>"
                        + "<templateId>" + templateId + "</templateId>" + "</Request>";
            }
            LoggerUtil.info("QuerySMSTemplate Request body =  " + requsetbody);
            //?
            System.out.println("" + requsetbody);
            BasicHttpEntity requestBody = new BasicHttpEntity();
            requestBody.setContent(new ByteArrayInputStream(requsetbody.getBytes("UTF-8")));
            requestBody.setContentLength(requsetbody.getBytes("UTF-8").length);
            httppost.setEntity(requestBody);

            HttpResponse response = httpclient.execute(httppost);

            //???

            status = response.getStatusLine().getStatusCode();

            System.out.println("Https??" + status);

            HttpEntity entity = response.getEntity();

            if (entity != null) {
                result = EntityUtils.toString(entity, "UTF-8");
            }

            EntityUtils.consume(entity);
        } catch (IOException e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172001", "");
        } catch (Exception e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172002", "");
        } finally {
            if (httpclient != null)
                httpclient.getConnectionManager().shutdown();
        }
        LoggerUtil.info("QuerySMSTemplate response body = " + result);
        try {
            if (BODY_TYPE == BodyType.Type_JSON) {
                return jsonToMap(result);
            } else {
                return xmlToMap(result);
            }
        } catch (Exception e) {

            return getMyError("172003", "");
        }
    }

    /**
     * ??
     * 
     * @param callid
     *            ? ?Id
     * @param action
     *            ?? url?
     * @return
     */
    public HashMap<String, Object> QueryCallState(String callid, String action) {

        HashMap<String, Object> validate = accountValidate();
        if (validate != null)
            return validate;
        if ((isEmpty(callid))) {
            LoggerUtil.fatal("?: callid  ");
            throw new IllegalArgumentException("?: callid ");
        }
        Callsid = callid;
        CcopHttpClient chc = new CcopHttpClient();
        DefaultHttpClient httpclient = null;
        try {
            httpclient = chc.registerSSL(SERVER_IP, "TLS", Integer.parseInt(SERVER_PORT), "https");
        } catch (Exception e1) {
            e1.printStackTrace();
            LoggerUtil.error(e1.getMessage());
            throw new RuntimeException("?httpclient" + e1.getMessage());
        }
        String result = "";
        try {
            HttpPost httppost = (HttpPost) getHttpRequestBase(1, queryCallState);
            String requsetbody = "";
            if (BODY_TYPE == BodyType.Type_JSON) {
                JsonObject json = new JsonObject();
                JsonObject json2 = new JsonObject();
                json.addProperty("Appid", App_ID);
                json2.addProperty("callid", callid);
                if (!(isEmpty(action)))
                    json2.addProperty("action", action);
                json.addProperty("QueryCallState", json2.toString());
                requsetbody = json.toString();
            } else {
                StringBuilder sb = new StringBuilder("<?xml version='1.0' encoding='utf-8'?><Request>");
                sb.append("<Appid>").append(App_ID).append("</Appid>").append("<QueryCallState callid=")
                        .append("\"").append(callid).append("\"");
                if (action != null) {
                    sb.append(" action=").append("\"").append(action).append("\"").append("/");
                }

                sb.append("></Request>").toString();
                requsetbody = sb.toString();
            }
            LoggerUtil.info("queryCallState Request body = : " + requsetbody);
            System.out.println("" + requsetbody);

            BasicHttpEntity requestBody = new BasicHttpEntity();
            requestBody.setContent(new ByteArrayInputStream(requsetbody.getBytes("UTF-8")));
            requestBody.setContentLength(requsetbody.getBytes("UTF-8").length);
            httppost.setEntity(requestBody);
            HttpResponse response = httpclient.execute(httppost);
            status = response.getStatusLine().getStatusCode();
            System.out.println("Https??" + status);

            HttpEntity entity = response.getEntity();
            if (entity != null)
                result = EntityUtils.toString(entity, "UTF-8");

            EntityUtils.consume(entity);
        } catch (IOException e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172001", "");
        } catch (Exception e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172002", "");
        } finally {
            if (httpclient != null)
                httpclient.getConnectionManager().shutdown();
        }
        LoggerUtil.info("billRecords response body = " + result);
        try {
            if (BODY_TYPE == BodyType.Type_JSON) {
                return jsonToMap(result);
            } else {
                return xmlToMap(result);
            }
        } catch (Exception e) {

            return getMyError("172003", "");
        }
    }

    /**
     * ?
     * 
     * @param callSid
     *            ? ?Id
     * @return
     */
    public HashMap<String, Object> CallResult(String callSid) {
        if ((isEmpty(SERVER_IP))) {
            return getMyError("172004", "IP");
        }
        if ((isEmpty(SERVER_PORT))) {
            return getMyError("172005", "?");
        }
        if ((isEmpty(ACCOUNT_SID))) {
            return getMyError("172006", "??");
        }
        if ((isEmpty(ACCOUNT_TOKEN))) {
            return getMyError("172007", "??TOKEN");
        }
        Callsid = callSid;
        CcopHttpClient chc = new CcopHttpClient();
        DefaultHttpClient httpclient = null;
        try {
            httpclient = chc.registerSSL(SERVER_IP, "TLS", Integer.parseInt(SERVER_PORT), "https");
        } catch (Exception e1) {
            e1.printStackTrace();
            LoggerUtil.fatal(e1.getMessage());
            throw new RuntimeException("?httpclient" + e1.getMessage());
        }
        String result = "";
        try {
            HttpGet httpGet = (HttpGet) getHttpRequestBase(0, callResult);
            HttpResponse response = httpclient.execute(httpGet);

            status = response.getStatusLine().getStatusCode();

            System.out.println("Https??" + status);
            HttpEntity entity = response.getEntity();
            if (entity != null)
                result = EntityUtils.toString(entity, "UTF-8");

            EntityUtils.consume(entity);
        } catch (IOException e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172001", "");
        } catch (Exception e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172002", "");
        } finally {
            if (httpclient != null)
                httpclient.getConnectionManager().shutdown();
        }
        LoggerUtil.info("queryAccountInfo response body = " + result);
        try {
            if (BODY_TYPE == BodyType.Type_JSON) {
                return jsonToMap(result);
            } else {
                return xmlToMap(result);
            }
        } catch (Exception e) {

            return getMyError("172003", "");
        }
    }

    /**
     * 
     * 
     * @param filename
     *            ? ??
     * @param fis
     *            ? ??
     * @return
     */
    public String Filename;

    public HashMap<String, Object> MediaFileUpload(String filename, FileInputStream fis) {

        HashMap<String, Object> validate = accountValidate();
        if (validate != null)
            return validate;
        if ((isEmpty(filename))) {
            LoggerUtil.fatal("?: filename  ");
            throw new IllegalArgumentException("?: filename ");
        }
        if (fis == null) {
            LoggerUtil.fatal("?: fis  ");
            throw new IllegalArgumentException("");
        }

        Filename = filename;
        CcopHttpClient chc = new CcopHttpClient();
        DefaultHttpClient httpclient = new DefaultHttpClient();
        try {
            httpclient = chc.registerSSL(SERVER_IP, "TLS", Integer.parseInt(SERVER_PORT), "https");
        } catch (Exception e1) {
            e1.printStackTrace();
            LoggerUtil.error(e1.getMessage());
            throw new RuntimeException("?httpclient" + e1.getMessage());
        }
        String result = "";
        try {
            HttpPost httppost = (HttpPost) getHttpRequestBase(1, mediaFileUpload);

            LoggerUtil.info("MediaFileUpload Request body = : " + fis);
            BasicHttpEntity requestBody = new BasicHttpEntity();
            requestBody.setContent(fis);
            requestBody.setContentLength(fis.available());
            System.out.println("" + requestBody);

            httppost.setEntity(requestBody);
            HttpResponse response = httpclient.execute(httppost);
            status = response.getStatusLine().getStatusCode();
            System.out.println("Https??" + status);

            HttpEntity entity = response.getEntity();
            if (entity != null)
                result = EntityUtils.toString(entity, "UTF-8");

            EntityUtils.consume(entity);
        } catch (IOException e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172001", "");
        } catch (Exception e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
            return getMyError("172002", "");
        } finally {
            if (httpclient != null)
                httpclient.getConnectionManager().shutdown();
        }
        LoggerUtil.info("billRecords response body = " + result);
        try {
            if (BODY_TYPE == BodyType.Type_JSON) {
                return jsonToMap(result);
            } else {
                return xmlToMap(result);
            }
        } catch (Exception e) {

            return getMyError("172003", "");
        }
    }

    private HashMap<String, Object> jsonToMap(String result) {
        HashMap<String, Object> hashMap = new HashMap<String, Object>();
        JsonParser parser = new JsonParser();
        JsonObject asJsonObject = parser.parse(result).getAsJsonObject();
        Set<Entry<String, JsonElement>> entrySet = asJsonObject.entrySet();
        HashMap<String, Object> hashMap2 = new HashMap<String, Object>();

        for (Map.Entry<String, JsonElement> m : entrySet) {
            if ("statusCode".equals(m.getKey()) || "statusMsg".equals(m.getKey()))
                hashMap.put(m.getKey(), m.getValue().getAsString());
            else {
                if ("SubAccount".equals(m.getKey()) || "totalCount".equals(m.getKey())
                        || "smsTemplateList".equals(m.getKey()) || "token".equals(m.getKey())
                        || "callSid".equals(m.getKey()) || "state".equals(m.getKey())
                        || "downUrl".equals(m.getKey())) {
                    if (!"SubAccount".equals(m.getKey()) && !"smsTemplateList".equals(m.getKey()))
                        hashMap2.put(m.getKey(), m.getValue().getAsString());
                    else {
                        try {
                            if ((m.getValue().toString().trim().length() <= 2)
                                    && !m.getValue().toString().contains("[")) {
                                hashMap2.put(m.getKey(), m.getValue().getAsString());
                                hashMap.put("data", hashMap2);
                                break;
                            }
                            if (m.getValue().toString().contains("[]")) {
                                hashMap2.put(m.getKey(), new JsonArray());
                                hashMap.put("data", hashMap2);
                                continue;
                            }
                            JsonArray asJsonArray = parser.parse(m.getValue().toString()).getAsJsonArray();
                            ArrayList<HashMap<String, Object>> arrayList = new ArrayList<HashMap<String, Object>>();
                            for (JsonElement j : asJsonArray) {
                                Set<Entry<String, JsonElement>> entrySet2 = j.getAsJsonObject().entrySet();
                                HashMap<String, Object> hashMap3 = new HashMap<String, Object>();
                                for (Map.Entry<String, JsonElement> m2 : entrySet2) {
                                    hashMap3.put(m2.getKey(), m2.getValue().getAsString());
                                }
                                arrayList.add(hashMap3);
                            }
                            hashMap2.put(m.getKey(), arrayList);
                        } catch (Exception e) {
                            JsonObject asJsonObject2 = parser.parse(m.getValue().toString()).getAsJsonObject();
                            Set<Entry<String, JsonElement>> entrySet2 = asJsonObject2.entrySet();
                            HashMap<String, Object> hashMap3 = new HashMap<String, Object>();
                            for (Map.Entry<String, JsonElement> m2 : entrySet2) {
                                hashMap3.put(m2.getKey(), m2.getValue().getAsString());
                            }
                            hashMap2.put(m.getKey(), hashMap3);
                            hashMap.put("data", hashMap2);
                        }

                    }
                    hashMap.put("data", hashMap2);
                } else {

                    JsonObject asJsonObject2 = parser.parse(m.getValue().toString()).getAsJsonObject();
                    Set<Entry<String, JsonElement>> entrySet2 = asJsonObject2.entrySet();
                    HashMap<String, Object> hashMap3 = new HashMap<String, Object>();
                    for (Map.Entry<String, JsonElement> m2 : entrySet2) {
                        hashMap3.put(m2.getKey(), m2.getValue().getAsString());
                    }
                    if (hashMap3.size() != 0) {
                        hashMap2.put(m.getKey(), hashMap3);
                    } else {
                        hashMap2.put(m.getKey(), m.getValue().getAsString());
                    }
                    hashMap.put("data", hashMap2);
                }
            }
        }
        return hashMap;
    }

    /**
     * @description xml??map
     * @param xml
     * @return Map
     */
    private HashMap<String, Object> xmlToMap(String xml) {
        HashMap<String, Object> map = new HashMap<String, Object>();
        Document doc = null;
        try {
            doc = DocumentHelper.parseText(xml); // XML
            Element rootElt = doc.getRootElement(); // ?
            HashMap<String, Object> hashMap2 = new HashMap<String, Object>();
            ArrayList<HashMap<String, Object>> arrayList = new ArrayList<HashMap<String, Object>>();
            for (Iterator i = rootElt.elementIterator(); i.hasNext();) {
                Element e = (Element) i.next();
                if ("statusCode".equals(e.getName()) || "statusMsg".equals(e.getName()))
                    map.put(e.getName(), e.getText());
                else {
                    if ("SubAccount".equals(e.getName()) || "TemplateSMS".equals(e.getName())
                            || "totalCount".equals(e.getName()) || "token".equals(e.getName())
                            || "callSid".equals(e.getName()) || "state".equals(e.getName())
                            || "downUrl".equals(e.getName())) {
                        if (!"SubAccount".equals(e.getName()) && !"TemplateSMS".equals(e.getName())) {
                            hashMap2.put(e.getName(), e.getText());
                        } else if ("SubAccount".equals(e.getName())) {

                            HashMap<String, Object> hashMap3 = new HashMap<String, Object>();
                            for (Iterator i2 = e.elementIterator(); i2.hasNext();) {
                                Element e2 = (Element) i2.next();
                                hashMap3.put(e2.getName(), e2.getText());
                            }
                            arrayList.add(hashMap3);
                            hashMap2.put("SubAccount", arrayList);
                        } else if ("TemplateSMS".equals(e.getName())) {

                            HashMap<String, Object> hashMap3 = new HashMap<String, Object>();
                            for (Iterator i2 = e.elementIterator(); i2.hasNext();) {
                                Element e2 = (Element) i2.next();
                                hashMap3.put(e2.getName(), e2.getText());
                            }
                            arrayList.add(hashMap3);
                            hashMap2.put("TemplateSMS", arrayList);
                        }
                        map.put("data", hashMap2);
                    } else {

                        HashMap<String, Object> hashMap3 = new HashMap<String, Object>();
                        for (Iterator i2 = e.elementIterator(); i2.hasNext();) {
                            Element e2 = (Element) i2.next();
                            // hashMap2.put(e2.getName(),e2.getText());
                            hashMap3.put(e2.getName(), e2.getText());
                        }
                        if (hashMap3.size() != 0) {
                            hashMap2.put(e.getName(), hashMap3);
                        } else {
                            hashMap2.put(e.getName(), e.getText());
                        }
                        map.put("data", hashMap2);
                    }
                }
            }
        } catch (DocumentException e) {
            e.printStackTrace();
            LoggerUtil.error(e.getMessage());
        } catch (Exception e) {
            LoggerUtil.error(e.getMessage());
            e.printStackTrace();
        }
        return map;
    }

    private HttpRequestBase getHttpRequestBase(int get, String action)
            throws NoSuchAlgorithmException, UnsupportedEncodingException {
        return getHttpRequestBase(get, action, AccountType.Accounts);
    }

    private HttpRequestBase getHttpRequestBase(int get, String action, AccountType mAccountType)
            throws NoSuchAlgorithmException, UnsupportedEncodingException {
        String timestamp = DateUtil.dateToStr(new Date(), DateUtil.DATE_TIME_NO_SLASH);
        EncryptUtil eu = new EncryptUtil();
        String sig = "";
        String acountName = "";
        String acountType = "";
        if (mAccountType == AccountType.Accounts) {
            acountName = ACCOUNT_SID;
            sig = ACCOUNT_SID + ACCOUNT_TOKEN + timestamp;
            acountType = "Accounts";
        } else {
            acountName = SUBACCOUNT_SID;
            sig = SUBACCOUNT_SID + SUBACCOUNT_Token + timestamp;
            acountType = "SubAccounts";
        }
        String signature = eu.md5Digest(sig);

        String url = getBaseUrl().append("/" + acountType + "/").append(acountName).append("/" + action + "?sig=")
                .append(signature).toString();
        if (callResult.equals(action)) {
            url = url + "&callsid=" + Callsid;
        }
        if (queryCallState.equals(action)) {
            url = url + "&callid=" + Callsid;
        }
        if (mediaFileUpload.equals(action)) {
            url = url + "&appid=" + App_ID + "&filename=" + Filename;
        }
        LoggerUtil.info(getmethodName(action) + " url = " + url);
        //System.out.println(getmethodName(action) + " url = " + url);
        HttpRequestBase mHttpRequestBase = null;
        if (get == Request_Get)
            mHttpRequestBase = new HttpGet(url);
        else if (get == Request_Post)
            mHttpRequestBase = new HttpPost(url);
        if (IvrDial.equals(action)) {
            setHttpHeaderXML(mHttpRequestBase);
        } else if (mediaFileUpload.equals(action)) {
            setHttpHeaderMedia(mHttpRequestBase);
        } else {
            setHttpHeader(mHttpRequestBase);
        }

        String src = acountName + ":" + timestamp;

        String auth = eu.base64Encoder(src);
        mHttpRequestBase.setHeader("Authorization", auth);
        System.out.println("Url" + mHttpRequestBase);//?Url
        return mHttpRequestBase;

    }

    private String getmethodName(String action) {
        if (action.equals(Account_Info)) {
            return "queryAccountInfo";
        } else if (action.equals(Create_SubAccount)) {
            return "createSubAccount";
        } else if (action.equals(Get_SubAccounts)) {
            return "getSubAccounts";
        } else if (action.equals(Query_SubAccountByName)) {
            return "querySubAccount";
        } else if (action.equals(SMSMessages)) {
            return "sendSMS";
        } else if (action.equals(TemplateSMS)) {
            return "sendTemplateSMS";
        } else if (action.equals(LandingCalls)) {
            return "landingCalls";
        } else if (action.equals(VoiceVerify)) {
            return "voiceVerify";
        } else if (action.equals(IvrDial)) {
            return "ivrDial";
        } else if (action.equals(BillRecords)) {
            return "billRecords";
        } else {
            return "";
        }
    }

    private void setHttpHeaderXML(AbstractHttpMessage httpMessage) {
        httpMessage.setHeader("Accept", "application/xml");
        httpMessage.setHeader("Content-Type", "application/xml;charset=utf-8");
    }

    private void setHttpHeaderMedia(AbstractHttpMessage httpMessage) {
        if (BODY_TYPE == BodyType.Type_JSON) {
            httpMessage.setHeader("Accept", "application/json");
            httpMessage.setHeader("Content-Type", "application/octet-stream;charset=utf-8;");
        } else {
            httpMessage.setHeader("Accept", "application/xml");
            httpMessage.setHeader("Content-Type", "application/octet-stream;charset=utf-8;");
        }
    }

    private void setHttpHeader(AbstractHttpMessage httpMessage) {
        if (BODY_TYPE == BodyType.Type_JSON) {
            httpMessage.setHeader("Accept", "application/json");
            httpMessage.setHeader("Content-Type", "application/json;charset=utf-8");

        } else {
            httpMessage.setHeader("Accept", "application/xml");
            httpMessage.setHeader("Content-Type", "application/xml;charset=utf-8");
        }
    }

    private StringBuffer getBaseUrl() {
        StringBuffer sb = new StringBuffer("https://");
        sb.append(SERVER_IP).append(":").append(SERVER_PORT);
        sb.append("/2013-12-26");
        return sb;
    }

    private boolean isEmpty(String str) {
        return (("".equals(str)) || (str == null));
    }

    private HashMap<String, Object> getMyError(String code, String msg) {
        HashMap<String, Object> hashMap = new HashMap<String, Object>();
        hashMap.put("statusCode", code);
        hashMap.put("statusMsg", msg);
        return hashMap;
    }

    private HashMap<String, Object> subAccountValidate() {
        if ((isEmpty(SERVER_IP))) {
            return getMyError("172004", "IP");
        }
        if ((isEmpty(SERVER_PORT))) {
            return getMyError("172005", "?");
        }
        if (isEmpty(SUBACCOUNT_SID))
            return getMyError("172008", "???");
        if (isEmpty(SUBACCOUNT_Token))
            return getMyError("172009", "???TOKEN");
        return null;
    }

    private HashMap<String, Object> accountValidate() {
        if ((isEmpty(SERVER_IP))) {
            return getMyError("172004", "IP");
        }
        if ((isEmpty(SERVER_PORT))) {
            return getMyError("172005", "?");
        }
        if ((isEmpty(ACCOUNT_SID))) {
            return getMyError("172006", "??");
        }
        if ((isEmpty(ACCOUNT_TOKEN))) {
            return getMyError("172007", "??TOKEN");
        }
        if ((isEmpty(App_ID))) {
            return getMyError("172012", "ID");
        }
        return null;
    }

    private void setBodyType(BodyType bodyType) {
        BODY_TYPE = bodyType;
    }
}