|
|
|
package com.fr.plugin.db.redis.core;
|
|
|
|
|
|
|
|
import com.fanruan.api.log.LogKit;
|
|
|
|
import com.fanruan.api.runtime.EnvKit;
|
|
|
|
import com.fanruan.api.script.ScriptKit;
|
|
|
|
import com.fanruan.api.util.GeneralKit;
|
|
|
|
import com.fanruan.api.util.IOKit;
|
|
|
|
import com.fanruan.api.util.StringKit;
|
|
|
|
|
|
|
|
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<T> {
|
|
|
|
|
|
|
|
public static <T> DataWrapper<T> create(List<List<T>> data, String[] columnNames) {
|
|
|
|
return new DataWrapper<T>(data, columnNames);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static DataWrapper EMPTY = new DataWrapper(null, RedisConstants.DEFAULT_COLUMN_NAMES);
|
|
|
|
|
|
|
|
private List<List<T>> data;
|
|
|
|
private String[] columnNames;
|
|
|
|
|
|
|
|
private DataWrapper(List<List<T>> data, String[] columnNames) {
|
|
|
|
this.data = data;
|
|
|
|
this.columnNames = columnNames;
|
|
|
|
}
|
|
|
|
|
|
|
|
public String[] getColumnNames() {
|
|
|
|
if (columnNames == null) {
|
|
|
|
return RedisConstants.DEFAULT_COLUMN_NAMES;
|
|
|
|
}
|
|
|
|
return columnNames;
|
|
|
|
}
|
|
|
|
|
|
|
|
public List<List<T>> getData() {
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void transform(String script) throws ScriptException {
|
|
|
|
if (StringKit.isBlank(script)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
String scriptText = null;
|
|
|
|
if (script.startsWith("file:///")) {
|
|
|
|
try {
|
|
|
|
FileInputStream in = new FileInputStream(new File(readAndRenderScriptFile(script)));
|
|
|
|
scriptText = IOKit.inputStream2String(in);
|
|
|
|
} catch (Exception e) {
|
|
|
|
LogKit.error(e.getMessage(), e);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
scriptText = String.format("(function(){%s})()", script);
|
|
|
|
}
|
|
|
|
ScriptEngine scriptEngine = ScriptKit.newScriptEngine();
|
|
|
|
scriptEngine.put("$content", data);
|
|
|
|
scriptEngine.put("$column", columnNames);
|
|
|
|
Object r = scriptEngine.eval(scriptText);
|
|
|
|
if (r instanceof Map) {
|
|
|
|
Map<String, Object> map = (Map<String, Object>)r;
|
|
|
|
if (map.containsKey("column") && map.containsKey("content")) {
|
|
|
|
Object vector = map.get("column");
|
|
|
|
List<String> names = new ArrayList<String>();
|
|
|
|
for (Object name : ((Map)vector).values()) {
|
|
|
|
names.add(GeneralKit.objectToString(name));
|
|
|
|
}
|
|
|
|
columnNames = names.toArray(new String[0]);
|
|
|
|
Object content = map.get("content");
|
|
|
|
if (content instanceof Map) {
|
|
|
|
List<List<T>> list = new ArrayList<List<T>>();
|
|
|
|
for (Object element : ((Map)content).values()) {
|
|
|
|
list.add(object2List(element));
|
|
|
|
}
|
|
|
|
data = list;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private List<T> object2List(Object obj) {
|
|
|
|
List<T> list = new ArrayList<T>();
|
|
|
|
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", EnvKit.getCurrent().getPath());
|
|
|
|
}
|
|
|
|
}
|