NodeTranslator.java [src/java/crlmod/utils] Revision:   Date:
/*
 * $Id: 1.0+62 NodeTranslator.java a170e1637ffa 2021-12-20 od $
 *
 * This file is part of the Cloud Services Integration Platform (CSIP),
 * a Model-as-a-Service framework, API, and application suite.
 *
 * 2012-2024, OMSLab, Colorado State University.
 *
 * OMSLab licenses this file to you under the MIT license.
 * See the LICENSE file in the project root for more information.
 */
package crlmod.utils;

import crlmod.nodes.Contour;
import crlmod.nodes.Fuel;
import crlmod.nodes.HydraulicElementSystem;
import crlmod.nodes.PermeableBarrier;
import crlmod.nodes.Strip;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 * This class allows for translations from various csip-lmod 'nodes' to various
 * file formats. It's designed to augment rather than replace previously
 * existing translation services.
 *
 * @author Lucas Yaege
 */
public class NodeTranslator {

//  @Deprecated
//    public static String getManagementJSON(
//            String fileKey,
//            String path,
//            String name,
//            JSONObject self,
//            HashMap<String, Unit> units,
//            ArrayList<Triple<String, String[], String>> parameters,
//            SessionLogger LOG) throws SQLException, JSONException {
//        JSONObject file = new JSONObject();
//        JSONObject metadata = new JSONObject();
//        JSONObject params = new JSONObject();
//        JSONArray jparameters = new JSONArray();
//
//        //add managaement data
//        String error = null;
//
//        file.put("path", path);
//        file.put("name", name);
//        file.put("key", fileKey);
//        file.put("type", "MANAGEMENT");
//        file.put("version", "1.0");
//
//        String param_name;
//        String[] values;
//        JSONObject residue = null;
//        for (int i = 0; i < parameters.size(); i++) {
//            Triple<String, String[], String> parameter_info = parameters.get(i);
//            param_name = parameter_info.getX();
//            values = parameter_info.getY();
//
//            //filter out the param nodes which are not of interest to end users of the data
//            if ((param_name.contains("PTR") && !param_name.contains(":file_key"))
//                    || param_name.contains(":override") || param_name.contains("ROTATION_BUILDER_MAN_PTRS")) {
//                continue;
//            }
//
//            Parameter param = new Parameter(param_name);
//            param.setData(values);
//
//            error = param.populate(units);
//            if (error != null) {
//                LOG.log(Level.SEVERE, error);
//                return error;
//            }
//
//            JSONObject jParam = new JSONObject();
//            System.out.println("BEFORE PARAM DATA: " + Utils.getTime());
//            error = param.toJSON(jParam, parameters);
//            System.out.println("AFTER PARAM DATA: " + Utils.getTime());
//            if (error != null) {
//                LOG.log(Level.SEVERE, error);
//                return error;
//            }
//            if (param_name.equals("RES_ADDED_COVER")) {
//                residue = new JSONObject();
//                residue.put("name", "RES_COVER_ADDED");
//                residue.put("type", jParam.get("type"));
//                residue.put("units", jParam.get("units"));
//                residue.put("dim", jParam.getJSONObject("dim"));
//                residue.put("data", jParam.getJSONArray("data"));
//            }
//            jparameters.put(jParam);
//        }
//        if (residue != null) {
//            jparameters.put(residue);
//        }
//        file.put("metadata", metadata);
//        params.put("param", jparameters);
//        file.put("params", params);
//        self.put("lmod_file", file);
//
//        return error;
//    }

    public static String getContourR2XML(Contour c, Document doc) {
        if (c == null) {
            return "Error - null contour passed into getContourR2XML method.  Cannot translate a null contour object";
        }
        //Create Obj root element
        Element element_obj = doc.createElement("Obj");

        //Add Science Element if exists
        if (c.scienceVersion == null || c.scienceVersion.isEmpty()) {
            return "Error - Contour does not contain science version.  Not enough data to transform.";
        }

        Element element_science = doc.createElement("Science");
        element_science.setTextContent(c.scienceVersion);
        element_obj.appendChild(element_science);

        //Add Contour Type
        if (c.type != null && !c.type.isEmpty()) {
            Element element_type_Lst = doc.createElement("Lst");
            //Create name and data nodes as children.
            Element element_type_name = doc.createElement("Name");
            Element element_type_data = doc.createElement("Data");

            element_type_name.setTextContent("CONTOUR_TYPE");
            element_type_data.setTextContent(c.type);

            element_type_Lst.appendChild(element_type_name);
            element_type_Lst.appendChild(element_type_data);

            element_obj.appendChild(element_type_Lst);
        }

        //Add Contour Rel
        if (c.rel != null && !c.rel.isEmpty()) {
            Element element_rel_Flt = doc.createElement("Flt");
            //Create name, data, and unit nodes as children.
            Element element_rel_name = doc.createElement("Name");
            Element element_rel_data = doc.createElement("Data");
            Element element_rel_unit = doc.createElement("Unit");

            element_rel_name.setTextContent("CONTOUR_REL");
            element_rel_data.setTextContent(c.rel);
            element_rel_unit.setTextContent("U_PERCENT");

            element_rel_Flt.appendChild(element_rel_name);
            element_rel_Flt.appendChild(element_rel_data);
            element_rel_Flt.appendChild(element_rel_unit);

            element_obj.appendChild(element_rel_Flt);
        }

        //Add Contour Abs
        if (c.abs != null && !c.abs.isEmpty()) {
            Element element_abs_Flt = doc.createElement("Flt");
            //Create name, data, and unit nodes as children.
            Element element_abs_name = doc.createElement("Name");
            Element element_abs_data = doc.createElement("Data");
            Element element_abs_unit = doc.createElement("Unit");

            element_abs_name.setTextContent("CONTOUR_ABS");
            element_abs_data.setTextContent(c.abs);
            element_abs_unit.setTextContent("U_PERCENT_SLOPE");

            element_abs_Flt.appendChild(element_abs_name);
            element_abs_Flt.appendChild(element_abs_data);
            element_abs_Flt.appendChild(element_abs_unit);

            element_obj.appendChild(element_abs_Flt);
        }

        //Add Contour System Description
        if (c.descrip != null && !c.descrip.isEmpty()) {
            Element element_desc_Str = doc.createElement("Str");
            //Create name and data nodes as children.
            Element element_desc_name = doc.createElement("Name");
            Element element_desc_data = doc.createElement("Data");

            element_desc_name.setTextContent("CONTOUR_SYSTEM_DESCRIP");
            element_desc_data.setTextContent(c.descrip);

            element_desc_Str.appendChild(element_desc_name);
            element_desc_Str.appendChild(element_desc_data);

            element_obj.appendChild(element_desc_Str);
        }

        doc.appendChild(element_obj);

        String error = null;
        return error;
    }


    public static String getFuelR2XML(Fuel f, Document doc) {
        if (f == null) {
            return "Error - null fuel passed into getFuelR2XML method.  Cannot translate a null fuel object";
        }
        //Create Obj root element
        Element element_obj = doc.createElement("Obj");

        //Add Science Element if exists
        if (f.scienceVersion == null || f.scienceVersion.isEmpty()) {
            return "Error - Fuel does not contain science version.  Not enough data to transform.";
        }

        Element element_science = doc.createElement("Science");
        element_science.setTextContent(f.scienceVersion);
        element_obj.appendChild(element_science);

        //Add Fuel Cost
        if (f.cost != null && !f.cost.isEmpty()) {
            Element element_cost_Flt = doc.createElement("Flt");
            //Create name and data nodes as children.
            Element element_cost_name = doc.createElement("Name");
            Element element_cost_data = doc.createElement("Data");
            Element element_cost_unit = doc.createElement("Unit");

            element_cost_name.setTextContent("FUEL_COST_PER_UNIT_VOLUME");
            element_cost_data.setTextContent(f.cost);
            element_cost_unit.setTextContent("U_US_DOLLARS_P_GALLON");

            element_cost_Flt.appendChild(element_cost_name);
            element_cost_Flt.appendChild(element_cost_data);
            element_cost_Flt.appendChild(element_cost_unit);

            element_obj.appendChild(element_cost_Flt);
        }

        //Add Fuel Energy
        if (f.energy != null && !f.energy.isEmpty()) {
            Element element_energy_Flt = doc.createElement("Flt");
            //Create name, data, and unit nodes as children.
            Element element_energy_name = doc.createElement("Name");
            Element element_energy_data = doc.createElement("Data");
            Element element_energy_unit = doc.createElement("Unit");

            element_energy_name.setTextContent("FUEL_ENERGY_PER_VOLUME");
            element_energy_data.setTextContent(f.energy);
            element_energy_unit.setTextContent("U_BTU_P_GALLON");

            element_energy_Flt.appendChild(element_energy_name);
            element_energy_Flt.appendChild(element_energy_data);
            element_energy_Flt.appendChild(element_energy_unit);

            element_obj.appendChild(element_energy_Flt);
        }

        //Add Fuel Conversion Factor
        if (f.convert != null && !f.convert.isEmpty()) {
            Element element_convert_Flt = doc.createElement("Flt");
            //Create name, data, and unit nodes as children.
            Element element_convert_name = doc.createElement("Name");
            Element element_convert_data = doc.createElement("Data");
            Element element_convert_unit = doc.createElement("Unit");

            element_convert_name.setTextContent("FUEL_CONVERT_DIESEL_TO_THIS_FUEL");
            element_convert_data.setTextContent(f.convert);
            element_convert_unit.setTextContent("U_NONE");

            element_convert_Flt.appendChild(element_convert_name);
            element_convert_Flt.appendChild(element_convert_data);
            element_convert_Flt.appendChild(element_convert_unit);

            element_obj.appendChild(element_convert_Flt);
        }

        //Add Fuel Description
        if (f.descrip != null && !f.descrip.isEmpty()) {
            Element element_desc_Str = doc.createElement("Str");
            //Create name and data nodes as children.
            Element element_desc_name = doc.createElement("Name");
            Element element_desc_data = doc.createElement("Data");

            element_desc_name.setTextContent("FUEL_DESCRIP");
            element_desc_data.setTextContent(f.descrip);

            element_desc_Str.appendChild(element_desc_name);
            element_desc_Str.appendChild(element_desc_data);

            element_obj.appendChild(element_desc_Str);
        }

        doc.appendChild(element_obj);

        String error = null;
        return error;
    }


    public static String getStripR2XML(Strip s, Document doc) {
        if (s == null) {
            return "Error - null strip passed into getFuelR2XML method.  Cannot translate a null strip object";
        }
        //Create Obj root element
        Element element_obj = doc.createElement("Obj");

        //Add Science Element if exists
        if (s.scienceVersion == null || s.scienceVersion.isEmpty()) {
            return "Error - Strip does not contain science version.  Not enough data to transform.";
        }

        Element element_science = doc.createElement("Science");
        element_science.setTextContent(s.scienceVersion);
        element_obj.appendChild(element_science);

        if (s.BarrierType != null && !s.BarrierType.isEmpty()) {
            Element element_type_Lst = doc.createElement("Lst");
            //Create name and data nodes as children.
            Element element_type_name = doc.createElement("Name");
            Element element_type_data = doc.createElement("Data");

            element_type_name.setTextContent("STRIP_BARRIER_TYPE");
            element_type_data.setTextContent(s.BarrierType);

            element_type_Lst.appendChild(element_type_name);
            element_type_Lst.appendChild(element_type_data);

            element_obj.appendChild(element_type_Lst);
        }

        if (s.BarrierForWQ != null && !s.BarrierForWQ.isEmpty()) {
            Element element_forwq_bol = doc.createElement("Bol");
            //Create name and data nodes as children.
            Element element_forwq_name = doc.createElement("Name");
            Element element_forwq_data = doc.createElement("Data");

            element_forwq_name.setTextContent("STRIP_BARRIER_FOR_WQ");
            if (s.BarrierForWQ.equals("1")) {
                element_forwq_data.setTextContent("Yes");
            } else {
                element_forwq_data.setTextContent("No");
            }

            element_forwq_bol.appendChild(element_forwq_name);
            element_forwq_bol.appendChild(element_forwq_data);

            element_obj.appendChild(element_forwq_bol);
        }

        if (s.BarrierManagement != null && !s.BarrierManagement.isEmpty()) {
            Element element_man_obr = doc.createElement("Obr");
            //Create name and data nodes as children.
            Element element_man_name = doc.createElement("Name");
            Element element_man_data = doc.createElement("Data");
            Element element_man_type = doc.createElement("Type");

            element_man_name.setTextContent("STRIP_BARRIER_MANAGEMENT");
            element_man_data.setTextContent(s.BarrierManagement.replaceAll("\\\\+", "\\\\"));
            element_man_type.setTextContent("MANAGEMENT");

            element_man_obr.appendChild(element_man_name);
            element_man_obr.appendChild(element_man_data);
            element_man_obr.appendChild(element_man_type);

            element_obj.appendChild(element_man_obr);
        }

        if (s.BarrierAtBottom != null && !s.BarrierAtBottom.isEmpty()) {
            Element element_bottom_bol = doc.createElement("Bol");
            //Create name and data nodes as children.
            Element element_bottom_name = doc.createElement("Name");
            Element element_bottom_data = doc.createElement("Data");

            element_bottom_name.setTextContent("STRIP_BARRIER_AT_BOTTOM");
            if (s.BarrierAtBottom.equals("1")) {
                element_bottom_data.setTextContent("Yes");
            } else {
                element_bottom_data.setTextContent("No");
            }

            element_bottom_bol.appendChild(element_bottom_name);
            element_bottom_bol.appendChild(element_bottom_data);

            element_obj.appendChild(element_bottom_bol);
        }

        if (s.BarrierSpecWidth != null && !s.BarrierSpecWidth.isEmpty()) {
            Element element_Swidth_Lst = doc.createElement("Lst");
            //Create name and data nodes as children.
            Element element_Swidth_name = doc.createElement("Name");
            Element element_Swidth_data = doc.createElement("Data");

            element_Swidth_name.setTextContent("STRIP_BARRIER_SPEC_WIDTH");
            element_Swidth_data.setTextContent(s.BarrierSpecWidth);

            element_Swidth_Lst.appendChild(element_Swidth_name);
            element_Swidth_Lst.appendChild(element_Swidth_data);

            element_obj.appendChild(element_Swidth_Lst);
        }

        if (s.BarrierWidthAbs != null && !s.BarrierWidthAbs.isEmpty()) {
            Element element_absWidth_Flt = doc.createElement("Flt");
            //Create name, data, and unit nodes as children.
            Element element_absWidth_name = doc.createElement("Name");
            Element element_absWidth_data = doc.createElement("Data");
            Element element_absWidth_unit = doc.createElement("Unit");

            element_absWidth_name.setTextContent("STRIP_BARRIER_WIDTH_ABS");
            element_absWidth_data.setTextContent(s.BarrierWidthAbs);
            element_absWidth_unit.setTextContent("U_FOOT");

            element_absWidth_Flt.appendChild(element_absWidth_name);
            element_absWidth_Flt.appendChild(element_absWidth_data);
            element_absWidth_Flt.appendChild(element_absWidth_unit);

            element_obj.appendChild(element_absWidth_Flt);
        }

        if (s.BarrierWidthRel != null && !s.BarrierWidthRel.isEmpty()) {
            Element element_relWidth_Flt = doc.createElement("Flt");
            //Create name, data, and unit nodes as children.
            Element element_relWidth_name = doc.createElement("Name");
            Element element_relWidth_data = doc.createElement("Data");
            Element element_relWidth_unit = doc.createElement("Unit");

            element_relWidth_name.setTextContent("STRIP_BARRIER_WIDTH_REL");
            element_relWidth_data.setTextContent(s.BarrierWidthRel);
            element_relWidth_unit.setTextContent("U_PERCENT");

            element_relWidth_Flt.appendChild(element_relWidth_name);
            element_relWidth_Flt.appendChild(element_relWidth_data);
            element_relWidth_Flt.appendChild(element_relWidth_unit);

            element_obj.appendChild(element_relWidth_Flt);
        }

        if (s.BarrierNumStrips > -1) {
            Element element_numStrips_Flt = doc.createElement("Flt");
            //Create name, data, and unit nodes as children.
            Element element_numStrips_name = doc.createElement("Name");
            Element element_numStrips_data = doc.createElement("Data");
            Element element_numStrips_unit = doc.createElement("Unit");

            element_numStrips_name.setTextContent("NUM_STRIPS_BARRIERS");
            element_numStrips_data.setTextContent(s.BarrierNumStrips + "");
            element_numStrips_unit.setTextContent("U_NONE");

            element_numStrips_Flt.appendChild(element_numStrips_name);
            element_numStrips_Flt.appendChild(element_numStrips_data);
            element_numStrips_Flt.appendChild(element_numStrips_unit);

            element_obj.appendChild(element_numStrips_Flt);
        }

        doc.appendChild(element_obj);
        return null;
    }


    //TODO: Implement this method.
    public static String getPermeableBarrierR2XML(PermeableBarrier p, Document doc) {
        if (p == null) {
            return "Error - null permeable barrier passed into getFuelR2XML method.  Cannot translate a null permeable barrier object";
        }
        //Create Obj root element
        Element element_obj = doc.createElement("Obj");

        //Add Science Element if exists
        if (p.scienceVersion == null || p.scienceVersion.isEmpty()) {
            return "Error - permeable barrier does not contain science version.  Not enough data to transform.";
        }

        Element element_science = doc.createElement("Science");
        element_science.setTextContent(p.scienceVersion);
        element_obj.appendChild(element_science);

        //Add Retartance Class
        if (p.retardClass != null && !p.retardClass.isEmpty()) {
            Element element_retard_Lst = doc.createElement("Lst");
            //Create name and data nodes as children.
            Element element_retard_name = doc.createElement("Name");
            Element element_retard_data = doc.createElement("Data");

            element_retard_name.setTextContent("PERM_BARRIER_RETARD_CLASS");
            element_retard_data.setTextContent(p.retardClass);

            element_retard_Lst.appendChild(element_retard_name);
            element_retard_Lst.appendChild(element_retard_data);

            element_obj.appendChild(element_retard_Lst);
        }

        //Add Permeable Barrier Description
        if (p.description != null && !p.description.isEmpty()) {
            Element element_desc_Str = doc.createElement("Str");
            //Create name and data nodes as children.
            Element element_desc_name = doc.createElement("Name");
            Element element_desc_data = doc.createElement("Data");

            element_desc_name.setTextContent("PERM_BARRIER_DESCRIP");
            element_desc_data.setTextContent(p.description);

            element_desc_Str.appendChild(element_desc_name);
            element_desc_Str.appendChild(element_desc_data);

            element_obj.appendChild(element_desc_Str);
        }

        doc.appendChild(element_obj);

        String error = null;
        return error;
    }


    public static String getHydraulicElementSystemR2XML(HydraulicElementSystem hes, Document doc) {
        if (hes == null) {
            return "Error - null permeable barrier passed into getFuelR2XML method.  Cannot translate a null permeable barrier object";
        }
        //Create Obj root element
        Element element_obj = doc.createElement("Obj");

        //Add Science Element if exists
        if (hes.scienceVersion == null || hes.scienceVersion.isEmpty()) {
            return "Error - permeable barrier does not contain science version.  Not enough data to transform.";
        }

        Element element_science = doc.createElement("Science");
        element_science.setTextContent(hes.scienceVersion);
        element_obj.appendChild(element_science);

        //Add numFlowPaths
        if (hes.numFlowPaths != null && !hes.numFlowPaths.isEmpty()) {
            Element element_flowPaths_Flt = doc.createElement("Flt");
            //Create name and data nodes as children.
            Element element_flowPaths_name = doc.createElement("Name");
            Element element_flowPaths_data = doc.createElement("Data");
            Element element_flowPaths_unit = doc.createElement("Unit");

            element_flowPaths_name.setTextContent("NUM_FLOW_PATH_IN_SYSTEM");
            element_flowPaths_data.setTextContent(hes.numFlowPaths);
            element_flowPaths_unit.setTextContent("U_NONE");

            element_flowPaths_Flt.appendChild(element_flowPaths_name);
            element_flowPaths_Flt.appendChild(element_flowPaths_data);
            element_flowPaths_Flt.appendChild(element_flowPaths_unit);

            element_obj.appendChild(element_flowPaths_Flt);
        }

        //Add flowPathAtBottom
        if (hes.flowPathAtBottom != null && !hes.flowPathAtBottom.isEmpty()) {
            Element element_flowPathAtBottom_Bol = doc.createElement("Bol");
            //Create name and data nodes as children.
            Element element_flowPathAtBottom_name = doc.createElement("Name");
            Element element_flowPathAtBottom_data = doc.createElement("Data");

            element_flowPathAtBottom_name.setTextContent("FLOW_PATH_AT_BOTTOM");
            if (hes.flowPathAtBottom == "true") {
                element_flowPathAtBottom_data.setTextContent("1");
            } else {
                element_flowPathAtBottom_data.setTextContent("0");
            }

            element_flowPathAtBottom_Bol.appendChild(element_flowPathAtBottom_name);
            element_flowPathAtBottom_Bol.appendChild(element_flowPathAtBottom_data);

            element_obj.appendChild(element_flowPathAtBottom_Bol);
        }

        //Add flowPathType
        if (hes.flowPathType != null && !hes.flowPathType.isEmpty()) {
            Element element_flowPathType_Obr = doc.createElement("Obr");
            //Create name and data nodes as children.
            Element element_flowPaths_name = doc.createElement("Name");
            Element element_flowPaths_data = doc.createElement("Data");
            Element element_flowPaths_type = doc.createElement("Type");

            element_flowPaths_name.setTextContent("HYD_SYSTEM_FLOW_PATH_TYPE");
            element_flowPaths_data.setTextContent(hes.flowPathType.replace("hydraulic-element-flow-paths\\\\", ""));
            element_flowPaths_type.setTextContent("HYD_ELEMENT_FLOW_PATH");

            element_flowPathType_Obr.appendChild(element_flowPaths_name);
            element_flowPathType_Obr.appendChild(element_flowPaths_data);
            element_flowPathType_Obr.appendChild(element_flowPaths_type);

            element_obj.appendChild(element_flowPathType_Obr);
        }

        //Add description
        if (hes.descrip != null && !hes.descrip.isEmpty()) {
            Element element_desc_Str = doc.createElement("Str");
            //Create name and data nodes as children.
            Element element_desc_name = doc.createElement("Name");
            Element element_desc_data = doc.createElement("Data");

            element_desc_name.setTextContent("HYD_ELEMENT_SYSTEM_DESCRIP");
            element_desc_data.setTextContent("'" + hes.descrip + "'");

            element_desc_Str.appendChild(element_desc_name);
            element_desc_Str.appendChild(element_desc_data);

            element_obj.appendChild(element_desc_Str);
        }
        doc.appendChild(element_obj);
        String error = null;
        return error;
    }
}