package org.ntlab.rdlcanvas.generaterdl;
import org.ntlab.rdlcanvas.models.*;
import org.ntlab.rdlcanvas.parser.StringValue;
import org.ntlab.rdlcanvas.parser.Value;
import java.util.*;
public class ScreenGenerateRDL{
//-> RDLSpecStatementのリストにすべて入れる
// parser済みのJsonを引数とする
public ScreenGenerateRDL(Value value, RDLSpec spec){
createScreenConstant(value, spec);
}
// Jsonを構成するデータを抽出する
private void createScreenConstant(Value value, RDLSpec spec){
Map<StringValue, Value> screenmap = ((org.ntlab.rdlcanvas.parser.JsonValue)value).getJson();
for (StringValue key1 : screenmap.keySet()){
String scIdString = key1.getStringValue(); //ScreenIDをStringValue(key1)からStringに変換
Value widgets = screenmap.get(key1);
Map<StringValue, Value> widgetmap = ((org.ntlab.rdlcanvas.parser.JsonValue)widgets).getJson();
for (StringValue key2 : widgetmap.keySet()){
String wIdString = key2.getStringValue(); //widgetIDをStringValue(key2)からStringに変換
Value metas = widgetmap.get(key2);
Map<StringValue, Value> metamap = ((org.ntlab.rdlcanvas.parser.JsonValue)metas).getJson();
for (StringValue key3 : metamap.keySet()){
String metaIdString = key3.getStringValue(); //MetaIDをStringValue(key3)からStringへ変換
Value data = metamap.get(key3); //Dataを取得
createScreenDefinition(scIdString, wIdString, metaIdString, data, spec);
}
}
}
//spec.outputConstant(); //デバッグ用 Constantを出力
}
private ValueType checkValueType(Value value) {
if (value.getClass().getSimpleName().equals("StringValue")) {
return RDLSpecLang.typeString;
} else if (value.getClass().getSimpleName().equals("IntegerValue")) {
return RDLSpecLang.typeInt;
} else if (value.getClass().getSimpleName().equals("BooleanValue")) {
return RDLSpecLang.typeBoolean;
}
return RDLSpecLang.typeDouble;
}
//ex [wText : wId -> "editBotton"] : scId -> "一覧画面"] := "編集"
private void createScreenDefinition(String scIdName, String wIdName, String metaIdName, Value dataName, RDLSpec spec){
RDLSpecDependencyTerm insideDependencyTerm = new RDLSpecDependencyTerm(spec.getConstant(metaIdName, RDLSpecLang.typeString), new ArrayList<>(Arrays.asList(spec.getRDLSpecResourceDeclaration("wId").getResource())), new ArrayList<>(Arrays.asList(spec.getConstant(wIdName, RDLSpecLang.typeString))));
RDLSpecDependencyTerm outsideDependencyTerm = new RDLSpecDependencyTerm(insideDependencyTerm, new ArrayList<>(Arrays.asList(spec.getRDLSpecResourceDeclaration("scId").getResource())), new ArrayList<>(Arrays.asList(spec.getConstant(scIdName, RDLSpecLang.typeString))));
spec.addRDLSpecStatement(new RDLSpecInitialization(outsideDependencyTerm, spec.getConstant(dataName.toString(), checkValueType(dataName))));
}
}