用心写的

package com.huawei.rcs.cab.cabserver.transport.rest.provider;

import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.text.ParseException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.Provider;
import javax.xml.bind.annotation.XmlRootElement;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;

import org.apache.cxf.jaxrs.ext.MessageContext;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;

import com.huawei.rcs.cab.cabserver.facade.util.PinyinUtil;
import com.huawei.rcs.cab.cabserver.facade.validate.util.GzipUtility;
import com.huawei.rcs.cab.cabserver.module.contact.constants.Constant;
import com.huawei.rcs.cab.cabserver.module.contact.vo.ContactExVO;
import com.huawei.rcs.cab.cabserver.module.contact.vo.ContactNameVO;
import com.huawei.rcs.cab.cabserver.module.contact.vo.ContactVO;
import com.huawei.rcs.cab.cabserver.module.contact.vo.ContactWithListIDObj;
import com.huawei.rcs.cab.cabserver.module.contact.vo.dto.ContactDTO;
import com.huawei.rcs.cab.cabserver.module.contact.vo.dto.ContactJacksonDTO;
import com.huawei.rcs.cab.cabserver.transport.rest.util.json.CustomTransform;
import com.huawei.rcs.cab.pub.constants.Constants;
import com.huawei.rcs.cab.pub.manager.ContextManager;
import com.huawei.rcs.cab.pub.util.DateUtil;
import com.huawei.rcs.cab.pub.util.HttpUtil;
import com.huawei.rcs.cab.pub.util.IOUtil;
import com.huawei.rcs.cab.pub.util.LogUtil;
import com.huawei.rcs.comm.log.bme.DebugLog;
import com.huawei.rcs.comm.log.bme.LogFactory;

/**
* 鎻愪緵contactDTO瀵硅薄鍜孲tring涔嬮棿浜掕浆
*
* @author pengjinhui
* @version RCS CAB V100R002 2010-7-19
* @since RCS CAB V100R002C01L00201
*/
@Produces("application/json")
@Consumes("application/json")
@Provider
public final class ContactDTOProvider implements MessageBodyReader<ContactDTO>
{
    /**
     * 璋冩祴鏃ュ織璁板綍鍣ㄣ€?
     */
    private static final DebugLog DEBUGGER = LogFactory
            .getDebugLog(ContactDTOProvider.class);

    private static JsonGenerator jsonGenerator = null;

    private static final ObjectMapper MAPPER = new ObjectMapper();

    @Context
    private MessageContext messageContext;

    /**
     * 鏄惁鍙
     *
     * @param type
     *            contact瀵硅薄绫诲瀷
     * @param genericType
     *            genericType
     * @param annotations
     *            annotations
     * @param m
     *            璇锋眰娑堟伅鏍煎紡
     * @return boolean 鏄惁鍙
     */
    public boolean isReadable(Class<?> type, Type genericType,
            Annotation[] annotations, MediaType m)
    {
        return type.getAnnotation(XmlRootElement.class) != null;
    }

    /**
     * 鑾峰彇娑堟伅闀垮害
     *
     * @param contactDTO
     *            contactDTO
     * @param type
     *            contact瀵硅薄绫诲瀷
     * @param genericType
     *            genericType
     * @param annotations
     *            annotations
     * @param m
     *            璇锋眰娑堟伅鏍煎紡
     * @return long 娑堟伅闀垮害
     */
    public long getSize(ContactDTO contactDTO, Class<?> type, Type genericType,
            Annotation[] annotations, MediaType m)
    {
        return -1;
    }

    /**
     * 璇锋眰娑堟伅杞寲鎴怌ontact瀵硅薄
     *
     * @param type
     *            contact瀵硅薄绫诲瀷
     * @param genericType
     *            genericType
     * @param annotations
     *            annotations
     * @param m
     *            璇锋眰娑堟伅鏍煎紡
     * @param headers
     *            璇锋眰娑堟伅澶翠俊鎭?
     * @param is
     *            杈撳叆娴?
     * @return ContactDTO contactDTO
     */
    public ContactDTO readFrom(Class<ContactDTO> type, Type genericType,
            Annotation[] annotations, MediaType m,
            MultivaluedMap<String, String> headers, InputStream is)
    {
        // 鑾峰彇鎺ュ叆鏂瑰紡
        int accessType = ContextManager.getContext().getAccessType();

        ContactDTO contactDTO = new ContactDTO();

        Map<String, String> headersMap = HttpUtil
                .getRequestHeaders(messageContext.getHttpServletRequest());
        String isGzip = headersMap.get(Constants.CONTENT_ENCODING);
        // 浠嶤ontactDTO涓緱鍒癈ontactWithListIDObj鐨勯泦鍚?
        List<ContactWithListIDObj> contactList = contactDTO.getContactVoList();
        String json = "";

        if (null != isGzip && Constant.FORMAT_GZIP.equals(isGzip))
        {
            // 鏄痝zip鐨勫帇缂╁寘鏉ヨВ鍘?
            json = new String(GzipUtility.unzip(is));
            contactDTO.setGzip(isGzip);
        }
        else
        {
            // 闈瀏zip鐨勫帇缂╂姤锛岄€氳繃io娴佽鍙栵紝骞惰浆鍖栨垚瀛楃涓?
            json = IOUtil.ioToString(is);
        }

        if (DEBUGGER.isInfoEnable())
        {
            LogUtil.info(DEBUGGER, LogUtil.LogType.USER, "addContactJson = "
                    + json);
        }

        // 濡傛灉鎺ュ叆鏂瑰紡涓?锛屽嵆DSServer鍒欓噰鐢╦ackson杞寲
        ContactJacksonDTO contactJacksonDTO = new ContactJacksonDTO();
        if (accessType == 3)
        {
            try
            {
                // 杞崲褰撳墠鏃堕棿涓篣TC鏃堕棿
                String localTime = DateUtil.localTime2UTC(
                        System.currentTimeMillis(), Constant.UTCPATTERN,
                        Constant.UTCPATTERN).toString();
                // jackson杞崲
                contactJacksonDTO = MAPPER.readValue(json,
                        ContactJacksonDTO.class);

                List<ContactWithListIDObj> contactWithListIDObjs = contactJacksonDTO
                        .getContactWithListIDs();
                ContactNameVO contactName = new ContactNameVO();

                if (null != contactWithListIDObjs
                        && !contactWithListIDObjs.isEmpty())
                {
                    for (ContactWithListIDObj contactWithListIDObj : contactWithListIDObjs)
                    {
                        // 灏嗚仈绯讳汉鍚嶅瓧涓惈鏈変腑鏂囧瓧绗︾殑杞崲涓烘嫾闊?
                        contactName = PinyinUtil
                                .chineseToSpell(contactWithListIDObj
                                        .getContactInfo().getName());
                        contactWithListIDObj.getContactInfo().setName(
                                contactName);
                        contactWithListIDObj
                                .getContactInfo()
                                .setDisplayNameSpell(
                                        PinyinUtil
                                                .chineseToSpell(contactWithListIDObj
                                                        .getContactInfo()
                                                        .getDisplayName()));
                        contactWithListIDObj.getContactInfo()
                                .setLastUpdateTime(localTime);
                    }
                    contactDTO.setContactVoList(contactWithListIDObjs);
                }

            }
            catch (JsonParseException e)
            {
                if (DEBUGGER.isErrorEnable())
                {
                    LogUtil.error(DEBUGGER, "parse json to object fail", e);
                }
                contactDTO.setFlag(true);// 璁剧疆json杞崲澶辫触鐨勬爣蹇?
            }
            catch (JsonMappingException e)
            {
                if (DEBUGGER.isErrorEnable())
                {
                    LogUtil.error(DEBUGGER, "parse json to object fail", e);
                }
                contactDTO.setFlag(true);// 璁剧疆json杞崲澶辫触鐨勬爣蹇?
            }
            catch (IOException e)
            {
                if (DEBUGGER.isErrorEnable())
                {
                    LogUtil.error(DEBUGGER, "parse json to object fail", e);
                }
                contactDTO.setFlag(true);// 璁剧疆json杞崲澶辫触鐨勬爣蹇?
            }
            catch (ParseException e)
            {
                if (DEBUGGER.isErrorEnable())
                {
                    LogUtil.error(DEBUGGER, "parse json to object fail", e);
                }
                contactDTO.setFlag(true);// 璁剧疆json杞崲澶辫触鐨勬爣蹇?
            }
            contactDTO.setHeadersMap(headersMap);
            return contactDTO;
        }

        try
        {
            JsonConfig jsonConfig = new JsonConfig();

            // jsonConfig.getJavaIdentifierTransformer();

            jsonConfig.setJavaIdentifierTransformer(new CustomTransform());
            // 灏唈son杞崲鎴恓son瀵硅薄
            JSONObject object = JSONObject.fromObject(json, jsonConfig);
            // 璁剧疆json瀵硅薄鐨勬牴绫?
            jsonConfig.setRootClass(ContactVO.class);

            Map<String, Class<?>> classMap = new HashMap<String, Class<?>>();
            // 鎸囧畾绫诲瀷鏄泦鍚堢殑灞炴€? 鏄犲皠鍒扮殑绫?
            classMap.put(Constant.ADUCONTACTINTERFACE.INTERFACE_PROPERTIES,
                    ContactExVO.class);
            classMap
                    .put(
                            Constant.ADUCONTACTINTERFACE.INTERFACE_ALTERNATECHATACCOUNTS,
                            ContactExVO.class);
            classMap
                    .put(
                            Constant.ADUCONTACTINTERFACE.INTERFACE_ALTERNATESOCIALACCOUNT,
                            ContactExVO.class);
            classMap.put(Constant.ADUCONTACTINTERFACE.INTERFACE_OTHERACCOUNT,
                    ContactExVO.class);
            jsonConfig.setClassMap(classMap);

            // 浠巎son瀵硅薄涓彇contactWithListIDs,寰楀埌涓€涓猨son鏁扮粍;
            JSONArray jsonArray = object
                    .getJSONArray(Constant.ADUCONTACTINTERFACE.INTERFACE_CONTACTWITHLISTIDS);

            // 寰楀埌褰撳墠绯荤粺鏃堕棿鐨勫瓧绗︿覆
            // modify by jinjungang 20110113 for 淇敼闂鍗旸TS2010121002382锛屼娇鐢║TC鏃堕棿
            // begin
            // String localTime = ContactUtil.getLocalTime();
            String localTime = DateUtil.localTime2UTC(
                    System.currentTimeMillis(), Constant.UTCPATTERN,
                    Constant.UTCPATTERN).toString();
            // modify by jinjungang 20110113 for 淇敼闂鍗旸TS2010121002382锛屼娇鐢║TC鏃堕棿
            // end
            ContactWithListIDObj contactWithListIDObj;
            String[] ids;
            JSONObject obj;
            ContactVO pro;
            JSONArray contactListIDs;
            int temp = 0;
            ContactNameVO contactNameVO;
            String displayname;
            for (int i = 0; i < jsonArray.size(); i++)
            {
                contactWithListIDObj = new ContactWithListIDObj();
                obj = jsonArray.getJSONObject(i);
                JSONObject contactJSONObject = (JSONObject) obj
                        .get(Constant.ADUCONTACTINTERFACE.INTERFACE_CONTACTINFO); // 浠巎son瀵硅薄涓彇鍑篶ontactInfo

                if (null == contactJSONObject)
                {
                    contactJSONObject = (JSONObject) obj
                            .get(Constant.ADUCONTACTINTERFACE.CONTACTINFO);
                }

                ValidateIntegerProperty.validateIntProperty(contactJSONObject,
                        Constant.ADUCONTACTINTERFACE.INTERFACE_GENDER);
                ValidateIntegerProperty.validateIntProperty(contactJSONObject,
                        Constant.ADUCONTACTINTERFACE.INTERFACE_MARRIAGESTATUS);
                // 鍒ゆ柇json瀵硅薄涓槸鍚︽湁鍒嗙粍ID鐨勯泦鍚?
                if (null != obj
                        .get(Constant.ADUCONTACTINTERFACE.INTERFACE_CONTACTLISTIDS))
                {
                    contactListIDs = (JSONArray) obj
                            .getJSONArray(Constant.ADUCONTACTINTERFACE.INTERFACE_CONTACTLISTIDS);// 浠巎son瀵硅薄涓彇鍑哄垎缁処D鐨勯泦鍚?
                    ids = new String[contactListIDs.size()];
                    Iterator iter = contactListIDs.iterator();// 閬嶅巻鍒嗙粍ID鐨勯泦鍚?
                    temp = 0;// 璁℃暟鍣?
                    while (iter.hasNext())
                    {
                        Object obj1 = iter.next();
                        ids[temp] = obj1.toString();// 灏嗘瘡涓垎缁刬d鏀惧叆鍒版暟缁勪腑
                        temp++;
                    }
                    contactWithListIDObj.setContactListIDs(ids);// 璁剧疆鍒嗙粍ID鐨勯泦鍚堝埌ContactWithListIDObj涓?
                }
                pro = (ContactVO) JSONObject.toBean(contactJSONObject,
                        jsonConfig);// 灏唈son瀵硅薄杞崲鎴恈ontactVO
                pro.setLastUpdateTime(localTime);// 璁剧疆褰撳墠鏃堕棿
                pro.setContactID((String) obj
                        .get(Constant.ADUCONTACTINTERFACE.INTERFACE_CONTACTID));// 鑾峰緱contactID,鐒跺悗璁剧疆鍒癱ontactVO涓?
                /** add by caolang 2011-07-05 start **/
                // 灏嗚仈绯讳汉鍚嶅瓧涓惈鏈変腑鏂囧瓧绗︾殑杞崲涓烘嫾闊?
                contactNameVO = pro.getName();
                contactNameVO = PinyinUtil.chineseToSpell(contactNameVO);
                pro.setName(contactNameVO);
                displayname = pro.getDisplayName();
                pro.setDisplayNameSpell(PinyinUtil.chineseToSpell(displayname));
                /** add by caolang 2011-07-05 start **/
                contactWithListIDObj.setContactInfo(pro);// 璁剧疆contactVO鍒癈ontactWithListIDObj涓?
                contactList.add(contactWithListIDObj);// 灏咰ontactWithListIDObj鏀惧叆鍒癓ist闆嗗悎涓?
            }
        }
        catch (Exception e)
        {
            // if (DEBUGGER.isErrorEnable())
            // {
            // DEBUGGER.error(Constants.VALIDATELOG_FLAG
            // + "parse json to object fail" + e.toString());
            // }
            if (DEBUGGER.isErrorEnable())
            {
                LogUtil.error(DEBUGGER, "parse json to object fail", e);
            }
            contactDTO.setFlag(true);// 璁剧疆json杞崲澶辫触鐨勬爣蹇?
        }

        contactDTO.setHeadersMap(headersMap);
        contactDTO.setContactVoList(contactList);// 璁剧疆contactList鍒癱ontactDTO涓?
        return contactDTO;
    }

    /**
     * 鑾峰彇娑堟伅闀垮害
     *
     * @param cotnactVO
     *            cotnactVO
     * @param type
     *            contact瀵硅薄绫诲瀷
     * @param genericType
     *            genericType
     * @param annotations
     *            annotations
     * @param m
     *            璇锋眰娑堟伅鏍煎紡
     * @return long 娑堟伅闀垮害
     */
    public long getSize(ContactVO cotnactVO, Class<?> type, Type genericType,
            Annotation[] annotations, MediaType m)
    {

        return -1;
    }

}

猜你喜欢

转载自dajieangel.iteye.com/blog/1294529
今日推荐