/*!
* Copyright 2010 - 2015 Pentaho Corporation. All rights reserved.
*
* 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.repository.pur.metastore;
import java.util.List;
import junit.framework.TestCase;
import org.junit.Ignore;
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.MetaStoreDependenciesExistsException;
import org.pentaho.metastore.api.exceptions.MetaStoreElementTypeExistsException;
import org.pentaho.metastore.api.exceptions.MetaStoreException;
import org.pentaho.metastore.api.security.IMetaStoreElementOwner;
import org.pentaho.metastore.api.security.MetaStoreElementOwnerType;
import org.pentaho.metastore.api.security.MetaStoreObjectPermission;
import org.pentaho.metastore.api.security.MetaStoreOwnerPermissions;
import org.pentaho.metastore.util.PentahoDefaults;
@Ignore
public class MetaStoreTestBase extends TestCase {
// Namespace: Pentaho
//
protected static String namespace = PentahoDefaults.NAMESPACE;
// Element type: Shared Dimension
//
protected static final String SHARED_DIMENSION_NAME = "Shared Dimension";
protected static final String SHARED_DIMENSION_DESCRIPTION = "Star modeler shared dimension";
// Element: customer dimension
//
protected static final String CUSTOMER_DIMENSION_NAME = "Customer dimension";
public void testFunctionality( IMetaStore metaStore ) throws MetaStoreException {
if ( !metaStore.namespaceExists( namespace ) ) {
metaStore.createNamespace( namespace );
}
List<String> namespaces = metaStore.getNamespaces();
assertEquals( 1, namespaces.size() );
IMetaStoreElementType elementType = metaStore.newElementType( namespace );
elementType.setName( SHARED_DIMENSION_NAME );
elementType.setDescription( SHARED_DIMENSION_DESCRIPTION );
metaStore.createElementType( namespace, elementType );
assertNotNull( elementType.getId() );
List<IMetaStoreElementType> elementTypes = metaStore.getElementTypes( namespace );
assertEquals( 1, elementTypes.size() );
try {
metaStore.createElementType( namespace, elementType );
fail( "Duplicate creation error expected!" );
} catch ( MetaStoreElementTypeExistsException e ) {
// OK!
} catch ( MetaStoreException e ) {
e.printStackTrace();
fail( "Create exception needs to be MetaStoreDataTypesExistException" );
}
// Try to delete the namespace, should error out
//
try {
metaStore.deleteNamespace( namespace );
fail( "Expected error while deleting namespace with content!" );
} catch ( MetaStoreDependenciesExistsException e ) {
// OK!
List<String> dependencies = e.getDependencies();
assertNotNull( dependencies );
assertEquals( 1, dependencies.size() );
assertEquals( elementType.getId(), dependencies.get( 0 ) );
}
IMetaStoreElement customerDimension = generateCustomerDimensionElement( metaStore, elementType );
IMetaStoreElementOwner elementOwner = customerDimension.getOwner();
assertNotNull( elementOwner );
assertEquals( "joe", elementOwner.getName() );
assertEquals( MetaStoreElementOwnerType.USER, elementOwner.getOwnerType() );
metaStore.createElement( namespace, elementType, customerDimension );
assertNotNull( customerDimension.getId() );
List<IMetaStoreElement> elements = metaStore.getElements( namespace, elementType );
assertEquals( 1, elements.size() );
assertNotNull( elements.get( 0 ) );
assertEquals( CUSTOMER_DIMENSION_NAME, elements.get( 0 ).getName() );
// Try to delete the data type, should error out
//
try {
metaStore.deleteElementType( namespace, elementType );
fail( "Expected error while deleting data type with content!" );
} catch ( MetaStoreDependenciesExistsException e ) {
// OK!
List<String> dependencies = e.getDependencies();
assertNotNull( dependencies );
assertEquals( 1, dependencies.size() );
assertEquals( customerDimension.getId(), dependencies.get( 0 ) );
}
// Some lookup-by-name tests...
//
assertNotNull( metaStore.getElementTypeByName( namespace, SHARED_DIMENSION_NAME ) );
assertNotNull( metaStore.getElementByName( namespace, elementType, CUSTOMER_DIMENSION_NAME ) );
// Clean up shop!
//
metaStore.deleteElement( namespace, elementType, customerDimension.getId() );
elements = metaStore.getElements( namespace, elementType );
assertEquals( 0, elements.size() );
metaStore.deleteElementType( namespace, elementType );
elementTypes = metaStore.getElementTypes( namespace );
assertEquals( 0, elementTypes.size() );
metaStore.deleteNamespace( namespace );
namespaces = metaStore.getNamespaces();
assertEquals( 0, namespaces.size() );
}
private IMetaStoreElement generateCustomerDimensionElement( IMetaStore metaStore, IMetaStoreElementType elementType )
throws MetaStoreException {
IMetaStoreElement element = metaStore.newElement();
element.setElementType( elementType );
element.setName( CUSTOMER_DIMENSION_NAME );
element.addChild( metaStore.newAttribute( "description", "This is the shared customer dimension" ) );
element.addChild( metaStore.newAttribute( "physical_table", "DIM_CUSTOMER" ) );
IMetaStoreAttribute fieldsElement = metaStore.newAttribute( "fields", null );
element.addChild( fieldsElement );
// A technical key
//
IMetaStoreAttribute fieldElement = metaStore.newAttribute( "field_0", null );
fieldsElement.addChild( fieldElement );
fieldElement.addChild( metaStore.newAttribute( "field_name", "Customer TK" ) );
fieldElement.addChild( metaStore.newAttribute( "field_description", "Customer Technical key" ) );
fieldElement.addChild( metaStore.newAttribute( "field_phyiscal_name", "customer_tk" ) );
fieldElement.addChild( metaStore.newAttribute( "field_kettle_type", "Integer" ) );
// A version field
//
fieldElement = metaStore.newAttribute( "field_1", null );
fieldsElement.addChild( fieldElement );
fieldElement.addChild( metaStore.newAttribute( "field_name", "version field" ) );
fieldElement.addChild( metaStore.newAttribute( "field_description", "dimension version field (1..N)" ) );
fieldElement.addChild( metaStore.newAttribute( "field_phyiscal_name", "version" ) );
fieldElement.addChild( metaStore.newAttribute( "field_kettle_type", "Integer" ) );
// Natural key
//
fieldElement = metaStore.newAttribute( "field_2", null );
fieldsElement.addChild( fieldElement );
fieldElement.addChild( metaStore.newAttribute( "field_name", "Customer ID" ) );
fieldElement.addChild( metaStore.newAttribute( "field_description",
"Customer ID as a natural key of this dimension" ) );
fieldElement.addChild( metaStore.newAttribute( "field_phyiscal_name", "customer_id" ) );
fieldElement.addChild( metaStore.newAttribute( "field_kettle_type", "Integer" ) );
// Start date
//
fieldElement = metaStore.newAttribute( "field_3", null );
fieldsElement.addChild( fieldElement );
fieldElement.addChild( metaStore.newAttribute( "field_name", "Start date" ) );
fieldElement.addChild( metaStore.newAttribute( "field_description", "Start of validity of this dimension entry" ) );
fieldElement.addChild( metaStore.newAttribute( "field_phyiscal_name", "start_date" ) );
fieldElement.addChild( metaStore.newAttribute( "field_kettle_type", "Date" ) );
// End date
//
fieldElement = metaStore.newAttribute( "field_4", null );
fieldsElement.addChild( fieldElement );
fieldElement.addChild( metaStore.newAttribute( "field_name", "End date" ) );
fieldElement.addChild( metaStore.newAttribute( "field_description", "End of validity of this dimension entry" ) );
fieldElement.addChild( metaStore.newAttribute( "field_phyiscal_name", "end_date" ) );
fieldElement.addChild( metaStore.newAttribute( "field_kettle_type", "Date" ) );
// A few columns...
//
for ( int i = 5; i <= 10; i++ ) {
fieldElement = metaStore.newAttribute( "field_" + i, null );
fieldsElement.addChild( fieldElement );
fieldElement.addChild( metaStore.newAttribute( "field_name", "Field name " + i ) );
fieldElement.addChild( metaStore.newAttribute( "field_description", "Field description " + i ) );
fieldElement.addChild( metaStore.newAttribute( "field_phyiscal_name", "physical_name_" + i ) );
fieldElement.addChild( metaStore.newAttribute( "field_kettle_type", "String" ) );
}
// Some security
//
element.setOwner( metaStore.newElementOwner( "joe", MetaStoreElementOwnerType.USER ) );
// The "users" role has read/write permissions
//
IMetaStoreElementOwner usersRole = metaStore.newElementOwner( "users", MetaStoreElementOwnerType.ROLE );
MetaStoreOwnerPermissions usersRoleOwnerPermissions =
new MetaStoreOwnerPermissions( usersRole, MetaStoreObjectPermission.READ, MetaStoreObjectPermission.UPDATE );
element.getOwnerPermissionsList().add( usersRoleOwnerPermissions );
return element;
}
}