/* * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * Copyright (c) 2011 Pentaho Corporation. All rights reserved. * * Created Jan, 2011 * @author jdixon */ package org.saiku.adhoc.providers.impl.pentaho; import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.pentaho.metadata.model.LogicalColumn; import org.pentaho.metadata.model.LogicalModel; import org.pentaho.metadata.model.concept.Concept; import org.pentaho.metadata.model.concept.types.AggregationType; import org.pentaho.metadata.model.concept.types.Alignment; import org.pentaho.metadata.model.concept.types.DataType; import org.pentaho.metadata.model.concept.types.FieldType; import org.pentaho.platform.engine.core.system.PentahoBase; import org.pentaho.platform.util.messages.LocaleHelper; import org.saiku.adhoc.model.metadata.ICategory; import org.saiku.adhoc.model.metadata.IColumn; import org.saiku.adhoc.model.metadata.impl.Category; import org.saiku.adhoc.model.metadata.impl.Column; import org.saiku.adhoc.model.metadata.impl.MetadataModel; public class PentahoMetadataUtil extends PentahoBase { public org.pentaho.metadata.model.Domain getDomain() { return domain; } public void setDomain(org.pentaho.metadata.model.Domain domain) { this.domain = domain; } private static final long serialVersionUID = -123835493828427853L; private Log logger = LogFactory.getLog(PentahoMetadataUtil.class); private org.pentaho.metadata.model.Domain domain; @Override public Log getLogger() { return logger; } /** * Works out what is the most appropriate locale to use given a domain and the user's * current locale * @return */ protected String getLocale( ) { String locale = LocaleHelper.getClosestLocale(LocaleHelper.getLocale().toString(), domain.getLocaleCodes()); return locale; } /** * Creates a lightweight, serializable model object from a logical model * @param m * @param domainId * @return */ public MetadataModel createThinModel(LogicalModel m, String domainId) { // create the model object MetadataModel model = new MetadataModel(); model.setName(m.getName(getLocale())); model.setId(m.getId()); model.setDomainId(domainId); model.setDescription(m.getDescription(getLocale())); // add the categories to the model List<ICategory> categories = new ArrayList<ICategory>(); for (org.pentaho.metadata.model.Category cat : m.getCategories()) { //check visibility if(isVisible(cat)){ categories.add(createCategory(m, cat)); } } model.setCategories(categories.toArray(new Category[categories.size()])); return model; } /** * Creates a lightweight, serializable category objects from a logical model category * @param m * @param c * @return */ private Category createCategory(LogicalModel m, org.pentaho.metadata.model.Category c) { // create a thin category object Category cat = new Category(); cat.setName(c.getName(getLocale())); cat.setId(c.getId()); cat.setDescription(c.getDescription(getLocale())); if(cat.getId().equals(cat.getDescription())) { cat.setDescription(null); } List<IColumn> columns = new ArrayList<IColumn>(); for (LogicalColumn col : c.getLogicalColumns()) { if(isVisible(col)){ columns.add(createColumn(m, col, c)); } } cat.setColumns(columns.toArray(new Column[columns.size()])); return cat; } /** * Creates a lightweight, serializable Column object from a logical model column * @param m * @param c * @return */ private Column createColumn(LogicalModel m, LogicalColumn c, org.pentaho.metadata.model.Category category) { Column col = new Column(); col.setName(c.getName(getLocale())); col.setId(c.getId()); col.setDescription(c.getDescription(getLocale())); if(col.getId().equals(col.getDescription())) { col.setDescription(null); } if( c.getFieldType() != null ) { col.setFieldType(c.getFieldType().name()); } else { col.setFieldType( "UNKNOWN" ); //$NON-NLS-1$ } col.setType(c.getDataType().getName().toUpperCase()); col.setCategory(category.getId()); // set the aggregation fields for the column List<AggregationType> possibleAggs = c.getAggregationList(); List<String> aggTypes = new ArrayList<String>(); if (possibleAggs != null) { for (AggregationType agg : possibleAggs) { aggTypes.add(agg.name()); } } // There might be a default agg, but no agg list. If so, add it to the list. AggregationType defaultAggType = AggregationType.NONE; if (c.getAggregationType() != null) { defaultAggType = c.getAggregationType(); } if (!aggTypes.contains(defaultAggType)) { aggTypes.add(defaultAggType.name()); } col.setAggTypes(aggTypes); col.setDefaultAggType(defaultAggType.name()); col.setSelectedAggType(defaultAggType.name()); // set the alignment DataType dataType = c.getDataType(); FieldType fieldType = c.getFieldType(); Object obj = c.getProperty("alignment"); //$NON-NLS-1$ if(obj instanceof Alignment) { if(obj == Alignment.LEFT) { col.setHorizontalAlignment(Alignment.LEFT.toString()); } else if(obj == Alignment.RIGHT) { col.setHorizontalAlignment(Alignment.RIGHT.toString()); } else if(obj == Alignment.CENTERED) { col.setHorizontalAlignment(Alignment.CENTERED.toString()); } } else if(fieldType == FieldType.FACT) { col.setHorizontalAlignment(Alignment.RIGHT.toString()); } else if(fieldType == FieldType.OTHER && dataType == DataType.NUMERIC) { col.setHorizontalAlignment(Alignment.RIGHT.toString()); } else { col.setHorizontalAlignment(Alignment.LEFT.toString()); } // set the format mask obj = c.getProperty("mask"); //$NON-NLS-1$ if(obj != null) { col.setFormatMask((String)obj); } return col; } public static boolean isVisible(Concept concept) { String context = null; //check visible String vis = (String) concept.getProperty("visible"); if (vis != null) { String[] visibleContexts = vis.split(","); for (String c : visibleContexts) { if (c.equals(context)) { return true; } } return false; } //also check hidden Boolean hidden = (Boolean) concept.getProperty("hidden"); if (hidden != null && hidden.equals(Boolean.TRUE)) { return false; } return true; } }