Newer
Older
RDLCanvas / src / main / java / org / ntlab / rdlcanvas / generaterdl / ScreenGenerateRDL.java
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に変換
            spec.getConstant(scIdString, checkValueType(key1)); //定数(Constant)の一覧に値を登録
            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に変換
                spec.getConstant(wIdString, checkValueType(key2));
                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を取得
                    String dataString = data.toString();
                    spec.getConstant(dataString, checkValueType(data));
                    createScreenDefinition(scIdString, wIdString, metaIdString, dataString, 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;
    }

    //ただし定数はどうStatementに持ってくるか
    private void createScreenDefinition(String scIdName, String wIdName, String metaIdName, String dataName, RDLSpec spec){
        RDLSpecDependencyTerm insideDependencyTerm = new RDLSpecDependencyTerm(spec.getRDLSpecResourceDeclaration(metaIdName).getResource(), new ArrayList<>(Arrays.asList(spec.getRDLSpecResourceDeclaration("wId").getResource())), new ArrayList<>(Arrays.asList(spec.getRDLSpecResourceDeclaration(wIdName).getResource())));
        RDLSpecDependencyTerm outsideDependencyTerm = new RDLSpecDependencyTerm(insideDependencyTerm, new ArrayList<>(Arrays.asList(spec.getRDLSpecResourceDeclaration("scId").getResource())), new ArrayList<>(Arrays.asList(spec.getRDLSpecResourceDeclaration(scIdName).getResource())));
        spec.addRDLSpecStatement(new RDLSpecInitialization(outsideDependencyTerm, spec.getRDLSpecResourceDeclaration(dataName).getResource()));
    }
}