写这篇文章的目的只是为了在以后有相似表结构时,怎样编写这样的复杂递归。因为游戏交易平台与游戏厂商的接口对接是一件很麻烦的事情,所以开发一个通用的支持tcp、http以及支持rmi、webservice、页面嵌入、hession等各种方式是非常必要的,如果要通用就必须在数据库设计阶段对entity进行高度的抽象。设计虽然对于架构师来说不是难事,但是一旦设计不到位,就肯能导致项目返工。就算设计ok,在开发时为了保证通用性和扩展性,其中还是会经常遇到一些复杂的处理。下面是实现从N个pojo中找到本系统的接口请求参数并把值替换成为游戏商接口的对应参数的对应值。其中的递归调用最为复杂,所以写下来以防忘记。
createParams方法参数:游戏接口对象,请求参数模版,替换参数模版中${}占位符值的pojos
返回接口参数列表
public static List<NameValuePair> createParams(Interfaces inter,String template,Object...vals) throws HttpException, IOException{
List<NameValuePair> rl = new ArrayList<NameValuePair>();
//接口位置
String url = inter.getInterfaceUri();
//解析模版
List<String> interArgs = new ArrayList<String>();//参数
List<String> interValues = new ArrayList<String>();//参数对应值
//1.[a=${a},b=${b}]
String[] s1 = template.split("&");
for(int a=0;a<s1.length;a++){
//2.a=${a}-->a a
String[] s2 = s1[a].split("=");
interArgs.add(s2[0]);//
interValues.add(s2[1]);//值:${}_${}
}
//替换成接口值
//检查是否是复合值
for(int j=0;j<interArgs.size();j++){
String tmp = interValues.get(j);
//按照正则替换:[${a.b.c},${b.d}]
String[] tmp1 = tmp.split("_");
StringBuffer val=new StringBuffer();
for(int a=0;a<tmp1.length;a++){
tmp1[a] = tmp1[a].replace("${", "").replace("}", "");
//获取值
Object m = null;
m = getAttrValues(tmp1[a], vals);
List l = addArrayList(m);
if(l.size()>0){
m = l.get(0);
}else{
m=null;
}
//拼接复合值
val.append((m!=null?String.valueOf(m):"")+(val.equals("")?"":"_"));
}
val.deleteCharAt(val.length()-1);
//查询接口参数对应关系
String vv = replaceArg(inter,interArgs.get(j),val.toString());
rl.add(new NameValuePair(interArgs.get(j), vv));
}
return rl;
}
private static String replaceArg(Interfaces inter,String interAttrName,Object sysArgValue){
Iterator<InterfcaeArgumentsRelational> i = inter.getInterfcaeArgumentsRelationals().iterator();
while(i.hasNext()){
InterfcaeArgumentsRelational tmp = i.next();
if(tmp.getInterfaceArgCode().equalsIgnoreCase(interAttrName)&&tmp.getSystemArgValue()!=null
&&tmp.getInterfaceArgValue()!=null&&!tmp.getInterfaceArgValue().equals("")
&&tmp.getSystemArgValue().equals(sysArgValue.toString().trim())){
return tmp.getInterfaceArgValue();
}
}
return sysArgValue!=null?sysArgValue.toString():null;
}
public static Object getAttrValues(String attrName,Object vals){
if(attrName.indexOf(".")<0&&attrName.indexOf("[")<=0){
//sign
List l = new ArrayList();
for(Object val:addArrayList(vals)){
try{
Class clazz = val.getClass();
String mn = StringUnit.get(clazz.getDeclaredField(attrName).getName());
l.addAll(addArrayList(clazz.getMethod(mn).invoke(val)));
} catch (Exception e) {
}
}
return l.toArray();
}else if(attrName.indexOf("[")>0&&attrName.indexOf(".")>0){
if(attrName.indexOf("[")<attrName.indexOf(".")){
String before = attrName.substring(0,attrName.lastIndexOf("]")+1);
String after = attrName.substring(attrName.lastIndexOf("]")+2);
Object v = selector(before,vals);
return getAttrValues(after,v);
}else{
String before = attrName.substring(0,attrName.indexOf("."));
String after = attrName.substring(attrName.indexOf("."));
return getAttrValues(after,getAttrValues(before,vals));
}
}
return null;
}
public static Object selector(String selectorName,Object val){
if(selectorName.indexOf("[")>0){
String sVal = selectorName.substring(0,selectorName.indexOf("["));
String slt = selectorName.substring(selectorName.indexOf("[")+1,selectorName.lastIndexOf("]"));
String after = selectorName.substring(selectorName.indexOf(slt)+slt.length()+1);
if(after==null||after.equals("")){
List l = addArrayList(getAttrValues(sVal,val));
for(Object tmp:l){
if(selector(slt,tmp)!=null)
return tmp;
}
return null;
}else{
return getAttrValues(after.substring(1),selector(slt,selector(sVal,val)));
}
}else{
if(selectorName.indexOf(".")>0){
String before = selectorName.substring(0,selectorName.indexOf("."));
String after = selectorName.substring(selectorName.indexOf(".")+1);
List l = addArrayList(getAttrValues(before, val));
for(Object tmp:l){
if(selector(after,tmp)!=null)
return tmp;
}
return null;
}else{
if(selectorName.indexOf("#")>0){
String attr = selectorName.substring(0,selectorName.indexOf("#"));
String after = selectorName.substring(selectorName.indexOf("#")+1);
List l = addArrayList(getAttrValues(attr,val));
for(Object tmp:l){
if(tmp.equals(after))
return val;
}
return null;
}else{
return getAttrValues(selectorName,val);
}
}
}
}
private static List addArrayList(Object m,Object...selector){
List rv = new ArrayList();
if(m instanceof Collection){
Iterator arr = ((Collection)m).iterator();
while(arr.hasNext()){
Object v = arr.next();
if(selector==null||selector.length<=0){
rv.add(v);
}else{
for(Object sel:selector){
if(v.equals(sel))
rv.add(v);
}
}
}
}else if(m instanceof Object[]){
Object[] arr = ((Object[])m);
for(Object v:arr){
if(selector==null||selector.length<=0){
rv.add(v);
}else{
for(Object sel:selector){
if(v.equals(sel))
rv.add(v);
}
}
}
}else{
rv.add(m);
}
return rv;
}
游戏接口平台开发中的复杂递归
最新推荐文章于 2022-05-10 15:16:32 发布