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;
}
}