/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.eas.client.model; import com.eas.client.DatabasesClient; import com.eas.client.SqlQuery; import com.eas.client.cache.PlatypusFiles; import com.eas.client.model.query.QueryModel; import com.eas.client.model.store.XmlDom2QueryModel; import com.eas.client.queries.QueriesProxy; import com.eas.client.settings.SettingsConstants; import com.eas.util.FileUtils; import com.eas.xml.dom.Source2XmlDom; import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * * @author mg */ public class QueryDocument { public final static String OUTPUT_FIELDS_TAG_NAME = "outputFields"; public final static String OUTPUT_FIELD_TAG_NAME = "field"; public final static String FIELD_NAME_ATTRIBUTE_NAME = "bindedColumn"; public final static String FIELD_DESCRIPTION_ATTRIBUTE_NAME = "description"; public final static String FIELD_TYPE_ATTRIBUTE_NAME = "type"; public static class StoredFieldMetadata { public String bindedColumn; public String description; public String type; public StoredFieldMetadata() { super(); } public StoredFieldMetadata(String aBindedColumn) { super(); bindedColumn = aBindedColumn; } public String getType() { return type; } public void setType(String aValue) { type = aValue; } public String getBindedColumn() { return bindedColumn; } public String getDescription() { return description; } public void setDescription(String aValue) { description = aValue; } } protected SqlQuery query; protected QueryModel model; protected List<StoredFieldMetadata> additionalFieldsMetadata; public QueryDocument(SqlQuery aQuery, QueryModel aModel, List<StoredFieldMetadata> aAdditionalFieldsMetadata) { super(); query = aQuery; model = aModel; additionalFieldsMetadata = aAdditionalFieldsMetadata; query.setDatasourceName(model.getDatasourceName()); assert query.getEntityName() != null : "SqlQuery should be constructured with non-null entity id!"; } public List<StoredFieldMetadata> getAdditionalFieldsMetadata() { return additionalFieldsMetadata; } public SqlQuery getQuery() { return query; } public QueryModel getModel() { return model; } public static QueryDocument parse(String aName, File aMainFile, DatabasesClient aBasesProxy, QueriesProxy<SqlQuery> aQueriesPrioxy) throws Exception { Path mainPath = Paths.get(aMainFile.toURI()); String sqledName = mainPath.getFileName().toString(); String woExtension = sqledName.substring(0, sqledName.length() - PlatypusFiles.SQL_EXTENSION.length()); // sql source File sqlFile = aMainFile; String sqlContent = FileUtils.readString(sqlFile, SettingsConstants.COMMON_ENCODING); // sql dialect source File dialectFile = mainPath.resolveSibling(woExtension + PlatypusFiles.DIALECT_EXTENSION).toFile(); String dialectContent = FileUtils.readString(dialectFile, SettingsConstants.COMMON_ENCODING); // query model File modelFile = mainPath.resolveSibling(woExtension + PlatypusFiles.MODEL_EXTENSION).toFile(); String modelContent = FileUtils.readString(modelFile, SettingsConstants.COMMON_ENCODING); Document modelDoc = Source2XmlDom.transform(modelContent); QueryModel model = XmlDom2QueryModel.transform(aBasesProxy, aQueriesPrioxy, modelDoc); // output fields hints File outFile = mainPath.resolveSibling(woExtension + PlatypusFiles.OUT_EXTENSION).toFile(); String outContent = FileUtils.readString(outFile, SettingsConstants.COMMON_ENCODING); Document outDoc = Source2XmlDom.transform(outContent); List<QueryDocument.StoredFieldMetadata> additionalFields = parseFieldsHintsTag(outDoc.getDocumentElement()); // SqlQuery query = new SqlQuery(aBasesProxy); query.setEntityName(aName); query.setSqlText(sqlContent); query.setFullSqlText(dialectContent); return new QueryDocument(query, model, additionalFields); } public static List<QueryDocument.StoredFieldMetadata> parseFieldsHintsTag(Element aTag) { List<QueryDocument.StoredFieldMetadata> additionalFields = new ArrayList<>(); NodeList fieldsNodes = aTag.getChildNodes(); for (int k = 0; k < fieldsNodes.getLength(); k++) { Node fn = fieldsNodes.item(k); if (OUTPUT_FIELD_TAG_NAME.equals(fn.getNodeName())) { NamedNodeMap attrs = fn.getAttributes(); Node bindedColAttr = attrs.getNamedItem(FIELD_NAME_ATTRIBUTE_NAME), descAttr = attrs.getNamedItem(FIELD_DESCRIPTION_ATTRIBUTE_NAME), typeAttr = attrs.getNamedItem(FIELD_TYPE_ATTRIBUTE_NAME); if (bindedColAttr != null && (descAttr != null || typeAttr != null)) { QueryDocument.StoredFieldMetadata additionalField = new QueryDocument.StoredFieldMetadata(); additionalField.bindedColumn = bindedColAttr.getNodeValue(); if (descAttr != null) { additionalField.description = descAttr.getNodeValue(); } if (typeAttr != null) { additionalField.type = typeAttr.getNodeValue(); } additionalFields.add(additionalField); } } } return additionalFields; } }