package com.fr.plugin.db.redis.core; import com.fr.general.GeneralUtils; import com.fr.general.IOUtils; import com.fr.log.FineLoggerFactory; import com.fr.script.ScriptFactory; import com.fr.stable.StringUtils; import com.fr.workspace.WorkContext; import javax.script.ScriptEngine; import javax.script.ScriptException; import java.io.File; import java.io.FileInputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * Created by richie on 2017/6/5. */ public class DataWrapper { public static DataWrapper create(List> data, String[] columnNames) { return new DataWrapper(data, columnNames); } public static DataWrapper EMPTY = new DataWrapper(null, RedisConstants.DEFAULT_COLUMN_NAMES); private List> data; private String[] columnNames; private DataWrapper(List> data, String[] columnNames) { this.data = data; this.columnNames = columnNames; } public String[] getColumnNames() { if (columnNames == null) { return RedisConstants.DEFAULT_COLUMN_NAMES; } return columnNames; } public List> getData() { return data; } public void transform(String script) throws ScriptException { if (StringUtils.isBlank(script)) { return; } String scriptText = null; if (script.startsWith("file:///")) { try { FileInputStream in = new FileInputStream(new File(readAndRenderScriptFile(script))); scriptText = IOUtils.inputStream2String(in); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } } else { scriptText = String.format("(function(){%s})()", script); } ScriptEngine scriptEngine = ScriptFactory.newScriptEngine(); scriptEngine.put("$content", data); scriptEngine.put("$column", columnNames); Object r = scriptEngine.eval(scriptText); if (r instanceof Map) { Map map = (Map)r; if (map.containsKey("column") && map.containsKey("content")) { Object vector = map.get("column"); List names = new ArrayList(); for (Object name : ((Map)vector).values()) { names.add(GeneralUtils.objectToString(name)); } columnNames = names.toArray(new String[0]); Object content = map.get("content"); if (content instanceof Map) { List> list = new ArrayList>(); for (Object element : ((Map)content).values()) { list.add(object2List(element)); } data = list; } } } } private List object2List(Object obj) { List list = new ArrayList(); if (obj instanceof Map) { for (Object element : ((Map)obj).values()) { list.add((T)element); } } else { list.add((T)obj); } return list; } private String readAndRenderScriptFile(String filePath) { return filePath.replaceFirst("\\$ENV_HOME", WorkContext.getCurrent().getPath()); } }