游戏接口平台开发中的复杂递归

 

写这篇文章的目的只是为了在以后有相似表结构时,怎样编写这样的复杂递归。因为游戏交易平台与游戏厂商的接口对接是一件很麻烦的事情,所以开发一个通用的支持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;
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值