Newer
Older
RDLCanvas / src / main / java / org / ntlab / rdlcanvas / generaterdl / ScreenGenerateRDL.java
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("structureType", "value");
                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("structureType", "value");
                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("structureType", "value");
                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);
    }



}