All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jladder.lang.Mappings Maven / Gradle / Ivy

package com.jladder.lang;

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.jladder.data.MappingInfo;
import com.jladder.data.Receipt;
import com.jladder.data.Record;
import com.jladder.db.Rs;
import com.jladder.db.SqlText;
import com.jladder.db.jdbc.impl.Dao;
import com.jladder.script.Script;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;

public class Mappings {

    /**
     * 整理后返回数据
     */
    private Record m_ret = new Record();
    /**
     * 源数据
     */
    private JSONObject m_data;


    private Map m_dic = new HashMap();

    private boolean pass=true;
    private String message=null;

    /**
     * 获取整理返回数据
     * @return
     */
    public Record getRet(){
        return m_ret;
    }

    public void setData(Object data){
        m_data = (JSONObject) JSONObject.parse(Json.toJson(data));
    }
    public void setMapping(List config){
        if (!Rs.isBlank(config)) {
            config.forEach(x -> { m_dic.put(x.getSourcepath(), x); });
        }
    }

    /**
     * 修复数据
     * @param source
     * @param mappings
     * @return
     */
    public static Receipt repair(Object source, List mappings){
        Mappings mapping = new Mappings();
        mapping.setData(source);
        mapping.setMapping(mappings);
        mapping.parse();
        if(mapping.pass)return new Receipt().setData(mapping.m_ret);
        else return new Receipt(false,mapping.message).setData(mapping.m_ret);
    }





    public Receipt put(MappingInfo mapping, Object value){
        if(mapping==null || Strings.isBlank(mapping.getDestpath())) return new Receipt();
        if(mapping.getEnable()!=1)return new Receipt();
        try{
            String[] keys = mapping.getDestpath().split("/");
            Object r = m_ret;
            int type = 1;//2数组 0//基本型
            if(keys.length - 1 > 0){
                for (String key : keys) {
                    if (Strings.isBlank(key)) continue;
                    if (Regex.isMatch(key,"^[\\w\\W]*?\\[[\\w]*\\]$")){
                        Matcher match = Regex.match(key, "^([\\w\\W]*?)\\[([\\w]*)\\]$");
                        String k = match.group(1);
                        String n = match.group(2);
                        if (Strings.isBlank(n)){
                            if (type == 1){
                                Record d = (Record)r;
                                String kk = d.haveKey(k);
                                if (Strings.isBlank(kk)){
                                    r = new Record();
                                    List newlist = new ArrayList();
                                    newlist.add((Record)r);
                                    d.put(k, newlist);
                                }
                                else{
                                    r = new Record();
                                    List newlist = (List) d.get(kk);
                                    newlist.add((Record)r);
                                }
                            }
                            else{
                                List d = (List) r;
                                //可能没有

                            }
                        }
                        else{
                            if (type == 1){
                                Record d = (Record) r;
                                String  kk = d.haveKey(k);
                                if (Strings.isBlank(kk)){
                                    List newlist = new ArrayList();
                                    while (newlist.size() < (Convert.toInt(n)+1)){
                                        newlist.add(new Record());
                                    }
                                    d.put(k, newlist);
                                    r = newlist.get(Convert.toInt(n));
                                }
                                else{
                                    r = new Record();
                                    List newlist = (List) d.get(kk);
                                    while (newlist.size() < (Convert.toInt(n) + 1)){
                                        newlist.add(new Record());
                                    }
                                    r = newlist.get(Convert.toInt(n));
                                }
                            }
                            else{
                                List d = (List)r;
                                //可能没有
                            }
                        }
                        type = 2;
                    }
                    else{
                        Record d = (Record)r;
                        String k = d.haveKey(key);
                        if (Strings.isBlank(k)) d.put(key, new Record());
                        r = d.get(key);
                        type = 1;
                    }
                }
            }
            String last = Collections.last(keys);
            if (Regex.isMatch(last, "^[\\w\\W]*?\\[[\\w]*\\]$")){
                Matcher match = Regex.match(last, "^(\\w\\W]*?)\\[([\\w]*)\\]$");
                String k = match.group(1);
                String n = match.group(2);
                type = 2;
            }
            else{
                Record d = (Record) r;
//            if (value is JToken)
//            {
//                var jv = value as JToken;
//
//                value = jv.ToString();
//            }
                if(Strings.hasValue(mapping.getValid())){
                    if("required".equalsIgnoreCase(mapping.getValid())){
                        if(value==null || Strings.isBlank(value.toString()))return new Receipt(false,mapping.getDestpath()+"不能为空");
                    }else{
                        if(!Script.eval(Strings.mapping(mapping.getValid(),d),Boolean.class))return new Receipt(false,mapping.getDestpath()+"未通过验证");
                    }
                }
                Receipt reData = reData(mapping, value);
                if (reData.isSuccess()){
                    d.put(last, reData.getData());
                    return new Receipt().setData(reData.getData());
                }else{
                    return reData;
                }

            }
            return new Receipt();
        }catch (Exception e){
            return new Receipt(false,e.getMessage());
        }
    }

    public Receipt reData(MappingInfo x, Object data){
        Object v = null;
        //存在固定值选项
        v = Strings.hasValue(x.getValue()) ?Strings.mapping( x.getValue(),m_ret) : data;
        String strv = v.toString();
        if (Strings.hasValue(x.getCmdtype())) {
            String cmd = x.getCmdtext();
            switch (x.getCmdtype()){
                //字典列表
                case "dic":
                    {
                        Record rec = Record.parse(cmd);
                        if (v == null || Strings.isBlank(strv)){
                            v = rec.get("_default_,_else_");
                        }
                        else{
                            String k = rec.haveKey(v.toString());
                            v = rec.get(Strings.hasValue(k) ? k : "_else_");
                        }
                    }
                    break;
                case "fun": //BiilForBasicFunctions的函数
                    //v = typeof(BiilForBasicFunctions).GetMethod(cmd)?.Invoke(null, new object[] { dic, product });
                    break;
                case "ref": //反射函数
                    v = Refs.invoke(cmd, m_ret);
                    break;
                //包含字符处理
                case "has":
                {
                    Record rec = Record.parse(cmd);
                    if (v == null || Strings.isBlank(strv)){
                        v = rec.get("_default_,_else_");
                    }
                    else{
                        boolean find = false;
                        for (Map.Entry kv : rec.entrySet()) {
                            if (strv.contains(kv.getKey()))
                            {
                                v = kv.getValue();
                                find = true;
                                break;
                            }
                        }
                        if (!find && rec.containsKey("_else_"))
                        {
                            v = rec.get("_else_");
                        }
                    }
                }
                break;
                case "rep": //替换字符
                    if (Strings.hasValue(strv)){
                        if(Strings.isJson(cmd)){
                            Record rs = Record.parse(cmd);
                            for (Map.Entry kv : rs.entrySet()) {
                                strv = strv.replace(kv.getKey(), kv.getValue()==null?"": kv.getValue().toString());
                            }
                            v = strv;
                        }
                        else{
                            String[] d = cmd.split("@@");
                            v = strv.replace(d[0], d.length > 1 ? Collections.last(d) : "");
                        }
                    }
                    break;
                case "sql":
                    int index = cmd.indexOf("|");
                    Dao dao = new Dao(index == -1 ? "" : cmd.substring(0, index));
                    try{
                        String sql = Strings.mapping(cmd.substring(index + 1),"value",strv);
                        v = dao.getValue(new SqlText(Strings.mapping(Strings.mapping(sql,m_ret),m_ret)),String.class);
                    }
                    finally{
                        dao.close();
                    }
                    break;
            }
        }
        return new Receipt().setData(v);
    }


    /**
     * 解析数据
     */
    public void parse(){
        parse("",m_data);
        for (Map.Entry dic : m_dic.entrySet()){
          String key = dic.getValue().getDestpath();
          if(dic.getValue().getIgnore()==1 && Strings.isBlank(m_ret.getString(key))){
              m_ret.delete(key);
          }
        }
    }

    /**
     * 解析对象型数据
     * @param pre 前缀
     * @param dat 对象数据
     */
    public void parse(String pre,JSONObject dat){
        for (Map.Entry d : dat.entrySet()){
            if (d.getValue() == null){

            }
            else{
                String path = Strings.hasValue(pre)?( pre + "/" + d.getKey()): d.getKey();
                String iPath = Collections.haveKey(m_dic,path);
                if (Strings.hasValue(iPath)){
                    put(m_dic.get(iPath), d.getValue());
                }
                else{
                    if(d.getValue() instanceof JSONObject){
                        parse(path, (JSONObject)d.getValue());
                    }
                    if(d.getValue() instanceof JSONArray){
                        parse(pre, d.getKey(), (JSONArray) d.getValue());
                    }
                }
            }
        }
    }

    /**
     * 解析数组型数据
     * @param pre 前缀
     * @param key 键值
     * @param dat 数据
     */
    public void parse(String pre,String key, JSONArray dat){
        for(int index = 0; index < dat.size(); index++){
            Object data = dat.get(index);
            if(data instanceof JSONObject){
                parse(pre + "/" + key + "[]", (JSONObject)data);
                parse(pre + "/" + key + "["+index+"]", (JSONObject)data);
            }
            if(data instanceof JSONArray){
                parse(pre + "/" + key + "[]","[]", (JSONArray)data);
                parse(pre + "/" + key + "["+index+"]","[]",(JSONArray)data);
            }
        }
    }




}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy