Java tutorial
/*! * Copyright 2002 - 2015 Webdetails, a Pentaho company. All rights reserved. * * This software was developed by Webdetails and is provided under the terms * of the Mozilla Public License, Version 2.0, or any later version. You may not use * this file except in compliance with the license. If you need a copy of the license, * please go to http://mozilla.org/MPL/2.0/. The Initial Developer is Webdetails. * * Software distributed under the Mozilla Public License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. Please refer to * the license for the specific language governing your rights and limitations. */ package pt.webdetails.cdf.dd.model.inst.writer.cdfrunjs.properties; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import pt.webdetails.cdf.dd.model.core.writer.ThingWriteException; import pt.webdetails.cdf.dd.model.inst.DataSourceComponent; import pt.webdetails.cdf.dd.model.inst.PropertyBinding; import pt.webdetails.cdf.dd.model.inst.writer.cdfrunjs.dashboard.CdfRunJsDashboardWriteContext; import pt.webdetails.cdf.dd.model.meta.DataSourceComponentType; import pt.webdetails.cdf.dd.util.JsonUtils; import pt.webdetails.cpf.Util; import pt.webdetails.cpf.repository.util.RepositoryHelper; public class CdfRunJsDataSourcePropertyBindingWriter extends CdfRunJsPropertyBindingWriter { protected static final Log logger = LogFactory.getLog(CdfRunJsDataSourcePropertyBindingWriter.class); private static final String META_TYPE_CDA = "CDA"; private static final String META_TYPE_CPK = "CPK"; /** * This class contains the constants that represent the names of the * data source properties that are to be rendered to Javascript. */ private static class PropertyName { // Datasource public static final String QUERY_TYPE = "queryType"; public static final String QUERY = "query"; public static final String SQL_QUERY = "sqlquery"; public static final String MDX_QUERY = "mdxquery"; public static final String JNDI = "jndi"; public static final String CATALOG = "catalog"; public static final String CUBE = "cube"; // CPK DataSource public static final String DATA_ACCESS_ID = "dataAccessId"; public static final String ENDPOINT = "endpoint"; public static final String PLUGIN_ID = "pluginId"; public static final String KETTLE_OUTPUT_FORMAT = "kettleOutput"; public static final String KETTLE_OUTPUT_STEP_NAME = "stepName"; // CDA DataSource public static final String OUTPUT_INDEX_ID = "outputIndexId"; public static final String SOLUTION = "solution"; public static final String PATH = "path"; public static final String FILE = "file"; } /** * This class contains the constant values for data source properties. */ private static class PropertyValue { public static final String CPK_QUERY_TYPE = "cpk"; public static final String MDX_QUERY_TYPE = "mdx"; public static final String SQL_QUERY_TYPE = "sql"; } protected static String buildJsStringValue(String value) { return JsonUtils.toJsString(replaceParameters(value == null ? "" : value)); } protected static String replaceParameters(String value) { // TODO: Someone explain this SHIT! if (value != null) { Pattern pattern = Pattern.compile("\\$\\{[^}]*\\}"); Matcher matcher = pattern.matcher(value); while (matcher.find()) { String parameter = matcher.group(); value = value.replace(matcher.group(), "Dashboards.ev(" + parameter.substring(2, parameter.length() - 1) + ")"); } } return value; } public void write(StringBuilder out, CdfRunJsDashboardWriteContext context, PropertyBinding propBind) throws ThingWriteException { DataSourceComponent dataSourceComp = this.getDataSourceComponent(context, propBind); if (dataSourceComp == null) { return; } String dataAccessId = dataSourceComp.tryGetPropertyValue(PropertyName.DATA_ACCESS_ID, null); if (dataAccessId != null) { renderCdaDatasource(out, context, dataSourceComp, dataAccessId); } else { // "meta" attribute has the value "CDA", "CPK" ? // See DataSourceModelReader#readDataSourceComponent String metaType = dataSourceComp.getMeta().tryGetAttributeValue("", ""); if (StringUtils.isEmpty(metaType)) { renderDatasource(out, context, dataSourceComp); } else if (metaType.equals(META_TYPE_CDA)) { renderBuiltinCdaDatasource(out, context, dataSourceComp); } else if (metaType.equals(META_TYPE_CPK)) { renderCpkDatasource(out, context, dataSourceComp); } else { throw new ThingWriteException( "Cannot render a data source property of meta type '" + metaType + "'."); } } } protected DataSourceComponent getDataSourceComponent(CdfRunJsDashboardWriteContext context, PropertyBinding propBind) { String dataSourceName = propBind.getValue(); return StringUtils.isEmpty(dataSourceName) ? null : context.getDashboard().tryGetDataSource(dataSourceName); } protected void renderCdaDatasource(StringBuilder out, CdfRunJsDashboardWriteContext context, DataSourceComponent dataSourceComp, String dataAccessId) { String dashPath = context.getDashboard().getSourcePath(); this.renderCdaDatasource(out, context, dataSourceComp, dataAccessId, dashPath); } protected void renderCdaDatasource(StringBuilder out, CdfRunJsDashboardWriteContext context, DataSourceComponent dataSourceComp, String dataAccessId, String dashPath) { String indent = context.getIndent(); addJsProperty(out, PropertyName.DATA_ACCESS_ID, buildJsStringValue(dataAccessId), indent, context.isFirstInList()); context.setIsFirstInList(false); String outputIndexId = dataSourceComp.tryGetPropertyValue(PropertyName.OUTPUT_INDEX_ID, null); if (outputIndexId != null) { addJsProperty(out, PropertyName.OUTPUT_INDEX_ID, buildJsStringValue(outputIndexId), indent, false); } // Check if we have a cdaFile String cdaPath = dataSourceComp.tryGetPropertyValue("cdaPath", null); if (cdaPath != null) { // Check if path is relative if (!cdaPath.startsWith("/")) { dashPath = FilenameUtils.getPath(dashPath); cdaPath = RepositoryHelper.normalize(Util.joinPath(dashPath, cdaPath)); } addJsProperty(out, PropertyName.PATH, buildJsStringValue(cdaPath), indent, false); } else { // legacy String solution = buildJsStringValue(dataSourceComp.tryGetPropertyValue(PropertyName.SOLUTION, "")); addJsProperty(out, PropertyName.SOLUTION, solution, indent, false); String path = buildJsStringValue(dataSourceComp.tryGetPropertyValue(PropertyName.PATH, "")); addJsProperty(out, PropertyName.PATH, path, indent, false); String file = buildJsStringValue(dataSourceComp.tryGetPropertyValue(PropertyName.FILE, "")); addJsProperty(out, PropertyName.FILE, file, indent, false); } } protected void renderBuiltinCdaDatasource(StringBuilder out, CdfRunJsDashboardWriteContext context, DataSourceComponent dataSourceComp) { String indent = context.getIndent(); addJsProperty(out, PropertyName.DATA_ACCESS_ID, buildJsStringValue(dataSourceComp.getName()), indent, context.isFirstInList()); context.setIsFirstInList(false); String cdeFilePath = context.getDashboard().getSourcePath(); if (cdeFilePath.contains(".wcdf")) { logger.error("renderBuiltinCdaDatasource: [fileName] receiving a .wcdf when a .cdfde was expected!"); cdeFilePath = cdeFilePath.replace(".wcdf", ".cda"); } String cdaFilePath = cdeFilePath.replaceAll(".cdfde", ".cda"); addJsProperty(out, PropertyName.PATH, JsonUtils.toJsString(cdaFilePath), indent, false); } // --------------------- protected void renderCpkDatasource(StringBuilder out, CdfRunJsDashboardWriteContext context, DataSourceComponent dataSourceComp) { String indent = context.getIndent(); DataSourceComponentType compType = dataSourceComp.getMeta(); String endPoint = buildJsStringValue(compType.tryGetAttributeValue(PropertyName.ENDPOINT, "")); addJsProperty(out, PropertyName.ENDPOINT, endPoint, indent, context.isFirstInList()); context.setIsFirstInList(false); String pluginId = buildJsStringValue(compType.tryGetAttributeValue(PropertyName.PLUGIN_ID, "")); addJsProperty(out, PropertyName.PLUGIN_ID, pluginId, indent, false); String stepName = dataSourceComp.tryGetPropertyValueByName(PropertyName.KETTLE_OUTPUT_STEP_NAME, "OUTPUT"); addJsProperty(out, PropertyName.KETTLE_OUTPUT_STEP_NAME, buildJsStringValue(stepName), indent, false); String kettleOutput = dataSourceComp.tryGetPropertyValueByName(PropertyName.KETTLE_OUTPUT_FORMAT, "Infered"); addJsProperty(out, PropertyName.KETTLE_OUTPUT_FORMAT, buildJsStringValue(kettleOutput), indent, false); addJsProperty(out, PropertyName.QUERY_TYPE, JsonUtils.toJsString(PropertyValue.CPK_QUERY_TYPE), indent, false); } protected void renderDatasource(StringBuilder out, CdfRunJsDashboardWriteContext context, DataSourceComponent dataSourceComp) { String indent = context.getIndent(); String jndi = buildJsStringValue(dataSourceComp.tryGetPropertyValue(PropertyName.JNDI, "")); addJsProperty(out, PropertyName.JNDI, jndi, indent, context.isFirstInList()); context.setIsFirstInList(false); String catalog = buildJsStringValue(dataSourceComp.tryGetPropertyValue(PropertyName.CATALOG, "")); addJsProperty(out, PropertyName.CATALOG, catalog, indent, false); String cube = buildJsStringValue(dataSourceComp.tryGetPropertyValue(PropertyName.CUBE, "")); addJsProperty(out, PropertyName.CUBE, cube, indent, false); String query = dataSourceComp.tryGetPropertyValue(PropertyName.MDX_QUERY, null); String queryType; if (query != null) { queryType = PropertyValue.MDX_QUERY_TYPE; } else { queryType = PropertyValue.SQL_QUERY_TYPE; query = dataSourceComp.tryGetPropertyValue(PropertyName.SQL_QUERY, null); } if (query != null) { query = writeFunction(query); } addJsProperty(out, PropertyName.QUERY, replaceParameters(query), indent, false); addJsProperty(out, PropertyName.QUERY_TYPE, JsonUtils.toJsString(queryType), indent, false); } }