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
今日推荐
周排行