Newer
Older
RDLCanvas / src / main / java / org / ntlab / rdlcanvas / models / RDLSpec.java
package org.ntlab.rdlcanvas.models;

import java.util.*;

public class RDLSpec {
    private Map<String, RDLSpecResourceDeclaration> resourceMap;
    private List<RDLSpecStatement> rdlSpecStatements;
    private Map<String, Map<ValueType, RDLSpecResourceConstant>> rdlSpecResourceConstantMap;

    public RDLSpec() {
        resourceMap = new HashMap<>();
        rdlSpecStatements = new ArrayList<>();
        rdlSpecResourceConstantMap = new HashMap<>();
    }

    public void addRDLSpecResourceDeclaration(String name, int order, StructuralType structuralType, ValueType valueType) {
        resourceMap.put(name, new RDLSpecResourceDeclaration(name, order, structuralType, valueType));
    }

    public void addRDLSpecResourceDeclaration(String name, int order, ValueType valueType) {
        resourceMap.put(name, new RDLSpecResourceDeclaration(name, order, valueType));
    }

    public RDLSpecResourceDeclaration getRDLSpecResourceDeclaration(String name) {
        if (!resourceMap.containsKey(name)) {
            return null;
        }
        return resourceMap.get(name);
    }

    public RDLSpecResourceConstant getConstant(String value, ValueType valueType) {
        if (rdlSpecResourceConstantMap.containsKey(value)) {
            if (rdlSpecResourceConstantMap.get(value).containsKey(valueType)) {
                return rdlSpecResourceConstantMap.get(value).get(valueType);
            } else {
                rdlSpecResourceConstantMap.get(value).put(valueType,new RDLSpecResourceConstant(value, valueType));
            }
        } else {
            rdlSpecResourceConstantMap.put(value, new HashMap<>());
            rdlSpecResourceConstantMap.get(value).put(valueType, new RDLSpecResourceConstant(value, valueType));
        }
        return rdlSpecResourceConstantMap.get(value).get(valueType);
    }

    public RDLSpecResourceConstant getTrue() {
        if (!rdlSpecResourceConstantMap.containsKey("true")) {
            rdlSpecResourceConstantMap.put("true", new HashMap<>());
            if (!rdlSpecResourceConstantMap.get("true").containsKey(RDLSpecLang.typeBoolean)) {
                rdlSpecResourceConstantMap.get("true").put(RDLSpecLang.typeBoolean, new RDLSpecResourceConstant("true", RDLSpecLang.typeBoolean));
            }
        }
        return rdlSpecResourceConstantMap.get("true").get(RDLSpecLang.typeBoolean);
    }

    public RDLSpecResourceConstant getFalse() {
        if (!rdlSpecResourceConstantMap.containsKey("false")) {
            rdlSpecResourceConstantMap.put("false", new HashMap<>());
            if (!rdlSpecResourceConstantMap.get("false").containsKey(RDLSpecLang.typeBoolean)) {
                rdlSpecResourceConstantMap.get("false").put(RDLSpecLang.typeBoolean, new RDLSpecResourceConstant("false", RDLSpecLang.typeBoolean));
            }
        }
        return rdlSpecResourceConstantMap.get("false").get(RDLSpecLang.typeBoolean);
    }

    public void addRDLSpecStatement(RDLSpecStatement rdlSpecStatement) {
        rdlSpecStatements.add(rdlSpecStatement);
        rdlSpecStatements.sort(Comparator.comparing(obj -> {
            if (obj.isRDLSpecResourceDeclaration()) {
                return 1;
            }
            if (obj.isRDLSpecInitialization()) {
                return 2;
            }
            return 3;
        }));
    }

    public List<RDLSpecStatement> getRDLSpecStatements() {
        return rdlSpecStatements;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < rdlSpecStatements.size(); i++) {
            sb.append(rdlSpecStatements.get(i)).append("\n");
        }
        return sb.toString();
    }
}