package org.ntlab.rdlcanvas.generaterdl;
import org.ntlab.rdlcanvas.parser.StringValue;
import org.ntlab.rdlcanvas.parser.Value;
import java.util.*;
import java.util.stream.Collectors;
public class ScreenGenerateRDL extends BaseGenerateRDL{
List<List<String>> screenDataList = new ArrayList<>(); //各画面のWidget一覧
List<StringBuilder> screenRDLList = new ArrayList<>(); //RDLの式を格納するリスト
Map<String, HashMap<String, Object>> screenDataMap = new HashMap<>();
//-> RDLSpecStatementのリストにすべて入れる
public ScreenGenerateRDL(Value value){
createData(value);
createRDL(screenDataList);
//outputData(); //デバッグ用
//outputRDL(); //デバッグ用
}
// Jsonを構成するデータを抽出する
private void createData(Value value){
Map<StringValue, Value> screenmap = ((org.ntlab.rdlcanvas.parser.JsonValue)value).getJson();
for (StringValue key1 : screenmap.keySet()){
String screenId = key1.getStringValue(); //ScreenIDを取得
if(!screenDataMap.containsKey(screenId)){
screenDataMap.computeIfAbsent(screenId, k -> new HashMap<>()).put("order", 1); //1階として値を登録
screenDataMap.computeIfAbsent(screenId, k -> new HashMap<>()).put("structureType", "id");
screenDataMap.computeIfAbsent(screenId, k -> new HashMap<>()).put("valueType", "string");
}
Value widget = screenmap.get(key1);
Map<StringValue, Value> widgetmap = ((org.ntlab.rdlcanvas.parser.JsonValue)widget).getJson();
for (StringValue key2 : widgetmap.keySet()){
String wId = key2.getStringValue(); //WidgetIDを取得
if(!screenDataMap.containsKey(wId)) {
screenDataMap.computeIfAbsent(wId, k -> new HashMap<>()).put("order", 2); //2階として値を登録
screenDataMap.computeIfAbsent(wId, k -> new HashMap<>()).put("structureType", "id");
screenDataMap.computeIfAbsent(wId, k -> new HashMap<>()).put("valueType", "string");
}
Value meta = widgetmap.get(key2);
Map<StringValue, Value> metamap = ((org.ntlab.rdlcanvas.parser.JsonValue)meta).getJson();
for (StringValue key3 : metamap.keySet()){
String metaId = key3.getStringValue(); //MetaIDを取得
Value data = metamap.get(key3); //Dataを取得
createDataMap(data);
List<String> datalist = new ArrayList<>(Arrays.asList(screenId, wId, metaId, data.toString()));
screenDataList.add(datalist);
//System.out.println("screenId: " + screenId + ", wId: " + wId + ", metaID: " + metaId + ", data: " + data.toString());
}
}
}
System.out.println(screenDataMap);
}
// 抽出したデータからRDL式を作成する
private void createRDL(List<List<String>> screenDataList){
for(List<String> data: screenDataList){
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("[[");
stringBuilder.append(data.get(2));
stringBuilder.append(":wId->");
stringBuilder.append(data.get(1));
stringBuilder.append("]:scId->");
stringBuilder.append(data.get(0));
stringBuilder.append("]=");
stringBuilder.append(data.get(3));
screenRDLList.add(stringBuilder);
}
}
private void createDataMap(Value data){
if(!screenDataMap.containsKey(data.toString())) {
if (data.getClass().getSimpleName().equals("StringValue")) {
screenDataMap.computeIfAbsent(data.toString(), k -> new HashMap<>()).put("order", 2); //1階として値を登録
screenDataMap.computeIfAbsent(data.toString(), k -> new HashMap<>()).put("structuralType", "primitive");
screenDataMap.computeIfAbsent(data.toString(), k -> new HashMap<>()).put("valueType", "string");
} else if (data.getClass().getSimpleName().equals("IntegerValue")) {
screenDataMap.computeIfAbsent(data.toString(), k -> new HashMap<>()).put("order", 2); //1階として値を登録
screenDataMap.computeIfAbsent(data.toString(), k -> new HashMap<>()).put("structuralType", "primitive");
screenDataMap.computeIfAbsent(data.toString(), k -> new HashMap<>()).put("valueType", "int");
} else if (data.getClass().getSimpleName().equals("BooleanValue")) {
screenDataMap.computeIfAbsent(data.toString(), k -> new HashMap<>()).put("order", 2); //1階として値を登録
screenDataMap.computeIfAbsent(data.toString(), k -> new HashMap<>()).put("structuralType", "primitive");
screenDataMap.computeIfAbsent(data.toString(), k -> new HashMap<>()).put("valueType", "boolean");
}
}
}
//Json構成データを返す
@Override
public List<List<String>> getDataList(){
return screenDataList;
}
//DataListに渡された値のリストを追加
@Override
public void setDataList(String screenId, String wId, String metaID, String data){
screenDataList.add(Arrays.asList(screenId, wId, metaID, data));
}
// DataListを標準出力
@Override
public void outputData(){
for(List<String> data : screenDataList){
System.out.println("screenId: " + data.get(0) + ", wId: " + data.get(1) + ", wMeta: " + data.get(2) + ", data: " + data.get(3));
}
}
//RDL式を返す
@Override
public List<StringBuilder> getRDLList(){
return screenRDLList;
}
//RDL式を標準出力
@Override
public void outputRDL(){
String result = screenRDLList.stream()
.map(StringBuilder::toString)
.collect(Collectors.joining("\n"));
System.out.println(result);
}
}