package com.cabletech.business.webservice.interfaces.impl;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.commons.collections.CollectionUtils;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.Element;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.cabletech.business.webservice.interfaces.ExternalWebService;
import com.cabletech.business.webservice.service.BusinessService;
import com.cabletech.business.webservice.utils.XmlReaderUtils;
import com.cabletech.common.xmlparse.ParseXmlTools;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
/**
* 外部WEBSERVICE接口实现
*
* @author 杨隽 2012-08-16 创建
*
*/
@Component
public class ExternalWebServiceImpl implements ExternalWebService {
public static final String CMD_KEY = "cmd";
/**
* 日志输出
*/
private Logger logger = Logger.getLogger("WebServiceImpl");
/**
* 解析工具
*/
@Resource(name = "parseXmlTools")
private ParseXmlTools parseXmlTools;
/**
* 业务处理方法
*/
@Autowired
private Map<String, BusinessService> businessServiceMap;
@SuppressWarnings("unchecked")
@Override
public String invokeService(String xmlText) {
logger.info("input xml::" + xmlText);
Document document = null;
try {
document = XmlReaderUtils.read(xmlText);
} catch (Exception ex) {
logger.error("解析XML字串出错", ex);
Map<String, Object> map = new HashMap<String, Object>();
map.put("code", ExternalWebService.PARSE_ERROR_CODE);
String datafomat = "yyyy-MM-dd HH:mm:ss";
Gson gson = new GsonBuilder().setDateFormat(datafomat).create();
return gson.toJson(map);
}
Element root = document.getRootElement();
if (root == null) {
return "";
}
List<Element> list = root.elements();
if (CollectionUtils.isEmpty(list)) {
return "";
}
Map<String, Object> map = new HashMap<String, Object>();
for (int i = 0; i < list.size(); i++) {
Element element = list.get(i);
map.put(element.getName(), element.getTextTrim());
}
return doInvokeMethod(map);
}
/**
* 调用访问服务对应的方法
*
* @param map
* Map<String, Object>
* @return String
*/
@SuppressWarnings("unchecked")
private String doInvokeMethod(Map<String, Object> map) {
String cmd = (String) map.get(CMD_KEY);
Element webserviceElement = parseXmlTools
.getImportXmlElement("webserviceConfig");
Element cmdElement = getElement(webserviceElement, cmd);
if (cmdElement == null) {
Map<String, Object> valueMap = new HashMap<String, Object>();
valueMap.put("code", ExternalWebService.NO_CMD_ERROR_CODE);
valueMap.put("cmd", cmd);
String datafomat = "yyyy-MM-dd HH:mm:ss";
Gson gson = new GsonBuilder().setDateFormat(datafomat).create();
return gson.toJson(valueMap);
}
List<Element> propElementList = cmdElement
.elements(ParseXmlTools.PROP_ELEMENT_KEY);
BusinessService businessService = businessServiceMap.get(cmdElement
.attributeValue(ParseXmlTools.SERVICE_ATTRIBUTE_KEY));
if (businessService == null) {
return "";
}
return businessService.doBusiness(cmd, map, propElementList);
}
/**
* 获取命令的元素
*
* @param webserviceElement
* Element
* @param cmd
* String
* @return Element
*/
@SuppressWarnings("unchecked")
private Element getElement(Element webserviceElement, String cmd) {
List<Element> cmdElementList = webserviceElement
.elements(ParseXmlTools.CMD_ELEMENT_KEY);
if (CollectionUtils.isEmpty(cmdElementList)) {
return null;
}
for (int i = 0; i < cmdElementList.size(); i++) {
Element cmdElement = cmdElementList.get(i);
if (cmd.equals(cmdElement
.attributeValue(ParseXmlTools.ID_ATTRBUTE_KEY))) {
return cmdElement;
}
}
return null;
}
}