/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.vdb.dynamic; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.StringWriter; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Properties; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.MultiStatus; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.teiid.core.designer.EclipseMock; import org.teiid.core.util.TestUtilities; import org.teiid.designer.core.ModelWorkspaceMock; import org.teiid.designer.core.workspace.MockFileBuilder; import org.teiid.designer.roles.DataRole; import org.teiid.designer.roles.Permission; import org.teiid.designer.runtime.spi.ITeiidVdb; import org.teiid.designer.vdb.TranslatorOverride; import org.teiid.designer.vdb.Vdb; import org.teiid.designer.vdb.VdbConstants; import org.teiid.designer.vdb.VdbImportVdbEntry; import org.teiid.designer.vdb.VdbModelEntry; import org.teiid.designer.vdb.VdbSource; import org.teiid.designer.vdb.VdbSourceInfo; import org.teiid.designer.vdb.VdbTestUtils; import org.teiid.designer.vdb.manifest.EntryElement; import org.w3c.dom.Document; @SuppressWarnings( "javadoc" ) public class TestDynamicVdbExport implements VdbConstants { private EclipseMock eclipseMock; private ModelWorkspaceMock modelWorkspaceMock; @Before public void before() throws Exception { eclipseMock = new EclipseMock(); modelWorkspaceMock = new ModelWorkspaceMock(eclipseMock); TestUtilities.setDefaultTeiidVersion(); } @After public void after() throws Exception { // Disposes the eclipse mock as well modelWorkspaceMock.dispose(); modelWorkspaceMock = null; eclipseMock = null; TestUtilities.unregisterTeiidServerManager(); } @Test public void testWriteDynamicVdb() throws Exception { DynamicVdb vdb = VdbTestUtils.mockPortfolioDynamicVdb(modelWorkspaceMock); StringWriter destination = new StringWriter(); vdb.write(destination); Document vdbDoc = VdbTestUtils.readDocument(destination.toString()); assertNotNull(vdbDoc); Document controlDoc = VdbTestUtils.readDocument(VdbTestUtils.PORTFOLIO_VDB_FILE); assertNotNull(controlDoc); VdbTestUtils.compareDocuments(controlDoc, vdbDoc); } @Test public void convertXmiVdbToDynamicVdb_BOOKS() throws Exception { Vdb booksVdb = VdbTestUtils.mockBooksVdb(modelWorkspaceMock); File destFile = File.createTempFile(booksVdb.getName(), ITeiidVdb.DYNAMIC_VDB_SUFFIX); MockFileBuilder destination = new MockFileBuilder(destFile); DynamicVdb dynVdb = booksVdb.convert(DynamicVdb.class, destination.getResourceFile(), new Properties()); assertNotNull(dynVdb); assertEquals(booksVdb.getName(), dynVdb.getName()); assertEquals(booksVdb.getDescription(), dynVdb.getDescription()); for (Map.Entry<Object, Object> entry : booksVdb.getProperties().entrySet()) { assertEquals(entry.getValue(), dynVdb.getProperties().getProperty(entry.getKey().toString())); } assertEquals(destination.getResourceFile(), dynVdb.getSourceFile()); assertEquals(booksVdb.getVersion(), dynVdb.getVersion()); assertEquals(booksVdb.getConnectionType(), dynVdb.getConnectionType()); assertEquals(booksVdb.isPreview(), dynVdb.isPreview()); assertEquals(booksVdb.getQueryTimeout(), dynVdb.getQueryTimeout()); assertEquals(booksVdb.getAllowedLanguages().size(), dynVdb.getAllowedLanguages().size()); List<String> dynLanguageValues = Arrays.asList(dynVdb.getAllowedLanguages().getAllowedLanguageValues()); for (String language : booksVdb.getAllowedLanguages().getAllowedLanguageValues()) { assertTrue(dynLanguageValues.contains(language)); } assertEquals(booksVdb.getSecurityDomain(), dynVdb.getSecurityDomain()); assertEquals(booksVdb.getGssPattern(), dynVdb.getGssPattern()); assertEquals(booksVdb.getPasswordPattern(), dynVdb.getPasswordPattern()); assertEquals(booksVdb.getAuthenticationType(), dynVdb.getAuthenticationType()); assertEquals(booksVdb.isAutoGenerateRESTWar(), dynVdb.isAutoGenerateRESTWar()); assertEquals(booksVdb.getImports().size(), dynVdb.getImports().size()); for (VdbImportVdbEntry entry : booksVdb.getImports()) { assertTrue(dynVdb.getImports().contains(entry)); } assertEquals(booksVdb.getTranslators().size(), dynVdb.getTranslators().size()); for (TranslatorOverride translator : booksVdb.getTranslators()) { assertTrue(dynVdb.getTranslators().contains(translator)); } assertEquals(booksVdb.getDataRoles().size(), dynVdb.getDataRoles().size()); for (DataRole role : booksVdb.getDataRoles()) { assertTrue(dynVdb.getDataRoles().contains(role)); } // Should contain all relational model entries. Any model entries that are // non-relational should be excluded and a warning placed in the status for (VdbModelEntry entry : booksVdb.getModelEntries()) { String entryName = entry.getName(); // Check that the entry model has not been warned about // so not exported boolean nonRelational = false; IStatus status = dynVdb.getStatus(); if (! status.isOK()) { if (status instanceof MultiStatus) { IStatus[] children = status.getChildren(); for (IStatus child : children) { String notIncMsg = " is not a relational model and was not included in the generated dynamic VDB"; if (! child.isOK() && child.getMessage().contains(entryName + notIncMsg)) { // Model should NOT be included nonRelational = true; } } } } if (nonRelational) continue; VdbSourceInfo sourceInfo = entry.getSourceInfo(); DynamicModel dynModel = null; Collection<DynamicModel> dynamicModels = dynVdb.getDynamicModels(); for (DynamicModel model : dynamicModels) { if (model.getName().equals(entry.getName())) { dynModel = model; break; } } assertNotNull(dynModel); assertEquals(entry.getDescription(), dynModel.getDescription()); for (Map.Entry<Object, Object> prop : entry.getProperties().entrySet()) { if (EntryElement.INDEX_NAME.equals(prop.getKey())) { assertFalse(dynModel.getProperties().containsKey(EntryElement.INDEX_NAME)); continue; } if (EntryElement.CHECKSUM.equals(prop.getKey())) { assertFalse(dynModel.getProperties().containsKey(EntryElement.CHECKSUM)); continue; } assertEquals(prop.getValue(), dynModel.getProperties().getProperty(prop.getKey().toString())); } assertEquals(entry.getType(), dynModel.getModelType().toString()); assertEquals(sourceInfo.isMultiSource(), dynModel.isMultiSource()); assertEquals(sourceInfo.isAddColumn(), dynModel.doAddColumn()); assertEquals(sourceInfo.getColumnAlias(), dynModel.getColumnAlias()); assertEquals(sourceInfo.getSources().size(), dynModel.getSources().length); List<VdbSource> dynSources = Arrays.asList(dynModel.getSources()); for (VdbSource source : sourceInfo.getSources()) { assertTrue(dynSources.contains(source)); } // // TODO // Separate unit tests for testing the generator. Assume its done its job correctly. // if (dynModel.getName().equals(VdbTestUtils.BOOKS_MODEL)) { Metadata metadata = dynModel.getMetadata(); assertEquals(Metadata.Type.DDL, metadata.getType()); assertEquals(VdbTestUtils.BOOKS_MODEL_DDL, metadata.getSchemaText()); } } } @Test public void convertXmiVdbToDynamicVdb_CUSTOMERS() throws Exception { Vdb mockVdb = VdbTestUtils.mockCustomersVdb(modelWorkspaceMock); File destFile = File.createTempFile(mockVdb.getName(), ITeiidVdb.DYNAMIC_VDB_SUFFIX); MockFileBuilder destination = new MockFileBuilder(destFile); DynamicVdb dynVdb = mockVdb.convert(DynamicVdb.class, destination.getResourceFile(), new Properties()); assertNotNull(dynVdb); assertEquals(mockVdb.getName(), dynVdb.getName()); assertEquals(mockVdb.getDescription(), dynVdb.getDescription()); for (Map.Entry<Object, Object> entry : mockVdb.getProperties().entrySet()) { assertEquals(entry.getValue(), dynVdb.getProperties().getProperty(entry.getKey().toString())); if( ((String)entry.getKey()).equals("allowed-languages") ) { assertEquals("cobol, java", dynVdb.getProperties().getProperty(entry.getKey().toString())); } } assertEquals(destination.getResourceFile(), dynVdb.getSourceFile()); assertEquals(mockVdb.getVersion(), dynVdb.getVersion()); assertEquals(mockVdb.getConnectionType(), dynVdb.getConnectionType()); assertEquals(mockVdb.isPreview(), dynVdb.isPreview()); assertEquals(mockVdb.getQueryTimeout(), dynVdb.getQueryTimeout()); assertEquals(mockVdb.getAllowedLanguages().size(), dynVdb.getAllowedLanguages().size()); List<String> dynLanguageValues = Arrays.asList(dynVdb.getAllowedLanguages().getAllowedLanguageValues()); for (String language : mockVdb.getAllowedLanguages().getAllowedLanguageValues()) { assertTrue(dynLanguageValues.contains(language)); } assertEquals(mockVdb.getSecurityDomain(), dynVdb.getSecurityDomain()); assertEquals(mockVdb.getGssPattern(), dynVdb.getGssPattern()); assertEquals(mockVdb.getPasswordPattern(), dynVdb.getPasswordPattern()); assertEquals(mockVdb.getAuthenticationType(), dynVdb.getAuthenticationType()); assertEquals(mockVdb.isAutoGenerateRESTWar(), dynVdb.isAutoGenerateRESTWar()); assertEquals(mockVdb.getImports().size(), dynVdb.getImports().size()); for (VdbImportVdbEntry entry : mockVdb.getImports()) { assertTrue(dynVdb.getImports().contains(entry)); } assertEquals(mockVdb.getTranslators().size(), dynVdb.getTranslators().size()); for (TranslatorOverride translator : mockVdb.getTranslators()) { assertTrue(dynVdb.getTranslators().contains(translator)); } assertEquals(mockVdb.getDataRoles().size(), dynVdb.getDataRoles().size()); for (DataRole role : mockVdb.getDataRoles()) { DataRole dynDataRole = null; Collection<DataRole> dataRoles = dynVdb.getDataRoles(); for (DataRole dataRole : dataRoles) { if (dataRole.getName().equals(role.getName())) { dynDataRole = dataRole; } } assertNotNull(dynDataRole); if (dynDataRole.getName().equals(role.getName())) { assertEquals(role.getRoleNames().size(), dynDataRole.getRoleNames().size()); assertEquals(role.getPermissions().size(), dynDataRole.getPermissions().size()); Collection<Permission> permissions = role.getPermissions(); for (Permission perm : permissions) { Permission dynPermission = dynDataRole.getPermission(perm.getName()); assertNotNull(dynPermission); assertEquals(perm.getCondition(), dynPermission.getCondition()); assertEquals(perm.isConstraint(), dynPermission.isConstraint()); assertEquals(perm.getMask(), dynPermission.getMask()); assertEquals(perm.getOrder(), dynPermission.getOrder()); } } if( role.getName().equals(VdbTestUtils.CUSTOMER_SUPPORT_DATA_ROLE) ) { // Check permissions; assertEquals(role.getPermissions().size(), dynDataRole.getPermissions().size()); assertEquals(VdbTestUtils.CUSTOMER_SUPPORT_DATA_ROLE_DESCRIPTION, dynDataRole.getDescription()); Permission permission = role.getPermission("CustomerAccounts.CUSTOMER"); assertNotNull(permission); Permission dynPermission = dynDataRole.getPermission("CustomerAccounts.CUSTOMER"); assertNotNull(dynPermission); assertEquals("CUSTID > 10000", dynPermission.getCondition()); assertEquals(false, dynPermission.isConstraint()); /* <permission> <resource-name>CustomerAccounts.CUSTOMER.CUSTID</resource-name> <condition constraint="false">CUSTID = 12345</condition> <mask order="2">CUSTID = 0</mask> </permission> */ permission = role.getPermission("CustomerAccounts.CUSTOMER.CUSTID"); assertNotNull(permission); dynPermission = dynDataRole.getPermission("CustomerAccounts.CUSTOMER.CUSTID"); assertNotNull(dynPermission); assertEquals("CUSTID = 12345", dynPermission.getCondition()); assertEquals(false, dynPermission.isConstraint()); assertEquals("CUSTID = 0", dynPermission.getMask()); assertEquals(2, dynPermission.getOrder()); } } assertEquals(mockVdb.getModelEntries().size(), dynVdb.getDynamicModels().size()); for (VdbModelEntry entry : mockVdb.getModelEntries()) { VdbSourceInfo sourceInfo = entry.getSourceInfo(); DynamicModel dynModel = null; Collection<DynamicModel> dynamicModels = dynVdb.getDynamicModels(); for (DynamicModel model : dynamicModels) { if (model.getName().equals(entry.getName())) dynModel = model; } assertNotNull(dynModel); assertEquals(entry.getDescription(), dynModel.getDescription()); for (Map.Entry<Object, Object> prop : entry.getProperties().entrySet()) { if (EntryElement.INDEX_NAME.equals(prop.getKey())) { assertFalse(dynModel.getProperties().containsKey(EntryElement.INDEX_NAME)); continue; } if (EntryElement.CHECKSUM.equals(prop.getKey())) { assertFalse(dynModel.getProperties().containsKey(EntryElement.CHECKSUM)); continue; } assertEquals(prop.getValue(), dynModel.getProperties().getProperty(prop.getKey().toString())); } assertEquals(entry.getType(), dynModel.getModelType().toString()); assertEquals(sourceInfo.isMultiSource(), dynModel.isMultiSource()); assertEquals(sourceInfo.isAddColumn(), dynModel.doAddColumn()); assertEquals(sourceInfo.getColumnAlias(), dynModel.getColumnAlias()); assertEquals(sourceInfo.getSources().size(), dynModel.getSources().length); List<VdbSource> dynSources = Arrays.asList(dynModel.getSources()); for (VdbSource source : sourceInfo.getSources()) { assertTrue(dynSources.contains(source)); } // // TODO // Separate unit tests for testing the generator. Assume its done its job correctly. // if (dynModel.getName().equals(VdbTestUtils.CUSTOMER_ACCOUNTS_MODEL)) { Metadata metadata = dynModel.getMetadata(); assertEquals(Metadata.Type.DDL, metadata.getType()); } } } }