/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2013 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ******************************************************************************/ package org.pentaho.di.starmodeler.metastore; import org.pentaho.di.i18n.LanguageChoice; import org.pentaho.metadata.model.LogicalModel; import org.pentaho.metadata.model.LogicalTable; import org.pentaho.metadata.model.concept.types.LocalizedString; import org.pentaho.metastore.api.IMetaStore; import org.pentaho.metastore.api.IMetaStoreAttribute; import org.pentaho.metastore.api.IMetaStoreElement; import org.pentaho.metastore.api.IMetaStoreElementType; import org.pentaho.metastore.api.exceptions.MetaStoreException; import org.pentaho.metastore.util.MetaStoreUtil; import org.pentaho.metastore.util.PentahoDefaults; /** * Some utility methods to serialize to/from the metastore * @author matt * */ public class ModelMetaStoreUtil extends MetaStoreUtil { public static final String METASTORE_STAR_MODEL_TYPE_NAME = "Logical star model"; public static final String METASTORE_STAR_MODEL_TYPE_DESCRIPTION = "This contains a logical star model with references to logical columns"; public static final String METASTORE_LOGICAL_TABLE_TYPE_NAME = "Logical table"; public static final String METASTORE_LOGICAL_TABLE_TYPE_DESCRIPTION = "This contains a logical table with logical columns in them"; public enum Attribute { ID_MODEL_DESCRIPTION("model_description"), ID_LOGICAL_TABLES("logical_tables"), ID_LOGICAL_TABLE("logical_table"), ID_LOGICAL_TABLE_ID("logical_table_id"), ID_LOGICAL_TABLE_NAME("logical_table_name"), ; public String id; private Attribute(String id) { this.id = id; } } private static String defaultLocale = LanguageChoice.getInstance().getDefaultLocale().toString(); public static IMetaStoreElementType getLogicalModelElementType(IMetaStore metaStore) throws MetaStoreException { verifyNamespaceCreated(metaStore, PentahoDefaults.NAMESPACE); IMetaStoreElementType elementType = metaStore.getElementTypeByName(PentahoDefaults.NAMESPACE, METASTORE_STAR_MODEL_TYPE_NAME); if (elementType==null) { // create the type // elementType = metaStore.newElementType(PentahoDefaults.NAMESPACE); elementType.setName(METASTORE_STAR_MODEL_TYPE_NAME); elementType.setDescription(METASTORE_STAR_MODEL_TYPE_DESCRIPTION); metaStore.createElementType(PentahoDefaults.NAMESPACE, elementType); } return elementType; } public static IMetaStoreElementType getLogicalTableElementType(IMetaStore metaStore) throws MetaStoreException { verifyNamespaceCreated(metaStore, PentahoDefaults.NAMESPACE); IMetaStoreElementType elementType = metaStore.getElementTypeByName(PentahoDefaults.NAMESPACE, METASTORE_LOGICAL_TABLE_TYPE_NAME); if (elementType==null) { // create the type // elementType = metaStore.newElementType(PentahoDefaults.NAMESPACE); elementType.setName(METASTORE_LOGICAL_TABLE_TYPE_NAME); elementType.setDescription(METASTORE_LOGICAL_TABLE_TYPE_DESCRIPTION); metaStore.createElementType(PentahoDefaults.NAMESPACE, elementType); } return elementType; } /** * Inflate a logical model from a metastore element. * * @param metaStore The metastore to read from * @param element The element to read from * @return The Logical Model * @throws MetaStoreException in case something goes wrong */ public static LogicalModel buildLogicalModel(IMetaStore metaStore, IMetaStoreElement element) throws MetaStoreException { try { LogicalModel model = new LogicalModel(); model.setName(new LocalizedString(defaultLocale, element.getName())); model.setDescription(new LocalizedString(defaultLocale, getChildString(element, Attribute.ID_MODEL_DESCRIPTION.id))); return model; } catch(Exception e) { throw new MetaStoreException("Unable to inflate logical model from metastore element", e); } } public static IMetaStoreElement saveLogicalModel(IMetaStore metaStore, LogicalModel model) throws MetaStoreException { IMetaStoreElementType elementType = getLogicalModelElementType(metaStore); IMetaStoreElement oldElement = metaStore.getElementByName(PentahoDefaults.NAMESPACE, elementType, model.getName(defaultLocale)); if (oldElement==null) { // populate and create... // IMetaStoreElement newElement = populateElement(metaStore, model); metaStore.createElement(PentahoDefaults.NAMESPACE, elementType, newElement); return newElement; } else { // The element exists, update... // IMetaStoreElement newElement = populateElement(metaStore, model); metaStore.updateElement(PentahoDefaults.NAMESPACE, elementType, oldElement.getId(), newElement); return newElement; } } private static IMetaStoreElement populateElement(IMetaStore metaStore, LogicalModel model) throws MetaStoreException { try { IMetaStoreElement element = metaStore.newElement(); element.setName(model.getName(defaultLocale)); element.addChild( metaStore.newAttribute(Attribute.ID_MODEL_DESCRIPTION.id, model.getDescription(defaultLocale)) ); IMetaStoreAttribute logicalTablesAttribute = metaStore.newAttribute(Attribute.ID_LOGICAL_TABLES.id, model.getDescription(defaultLocale)); element.addChild(logicalTablesAttribute); for (LogicalTable logicalTable : model.getLogicalTables()) { IMetaStoreAttribute logicalTableAttribute = metaStore.newAttribute(Attribute.ID_LOGICAL_TABLE.id, model.getDescription(defaultLocale)); logicalTablesAttribute.addChild(logicalTableAttribute); // // Save the ID as well as the name (for safety) // logicalTableAttribute.addChild(metaStore.newAttribute(Attribute.ID_LOGICAL_TABLE_ID.id, logicalTable.getId())); logicalTableAttribute.addChild(metaStore.newAttribute(Attribute.ID_LOGICAL_TABLE_NAME.id, logicalTable.getName())); } return element; } catch(Exception e) { throw new MetaStoreException("Unable to populate metastore element from logical model", e); } } }