forked from fanruan/demo-tabledata-redis
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.3 KiB
103 lines
3.3 KiB
package com.fr.plugin.db.redis.core; |
|
|
|
import com.fanruan.api.util.GeneralKit; |
|
import com.fanruan.api.log.LogKit; |
|
import com.fanruan.api.util.IOKit; |
|
import com.fanruan.api.script.ScriptKit; |
|
import com.fanruan.api.util.StringKit; |
|
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<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", WorkContext.getCurrent().getPath()); |
|
} |
|
}
|
|
|