/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.deployers; import static org.junit.Assert.*; import java.util.ArrayList; import org.junit.Test; import org.mockito.Mockito; import org.teiid.adminapi.impl.VDBTranslatorMetaData; import org.teiid.core.TeiidRuntimeException; import org.teiid.logging.LogConstants; import org.teiid.logging.LogManager; import org.teiid.logging.Logger; import org.teiid.logging.MessageLevel; import org.teiid.metadata.Column; import org.teiid.metadata.ExtensionMetadataProperty; import org.teiid.metadata.MetadataFactory; import org.teiid.translator.ExecutionFactory; import org.teiid.translator.MetadataProcessor; import org.teiid.translator.Translator; import org.teiid.translator.TranslatorException; import org.teiid.translator.TranslatorProperty; import org.teiid.translator.TranslatorProperty.PropertyType; @SuppressWarnings("nls") public class TestTranslatorUtil { @Test public void testInitialSetValueExecutionFactory() throws Exception { VDBTranslatorMetaData tm = new VDBTranslatorMetaData(); tm.setExecutionFactoryClass(MyTranslator2.class); MyTranslator2 my = (MyTranslator2)TranslatorUtil.buildExecutionFactory(tm); assertEquals("original-assigned", my.getSomeProperty()); } @Test public void testBuildExecutionFactory() throws Exception { VDBTranslatorMetaData tm = new VDBTranslatorMetaData(); tm.addProperty("MyProperty", "correctly-assigned"); tm.setExecutionFactoryClass(MyTranslator.class); MyTranslator my = (MyTranslator)TranslatorUtil.buildExecutionFactory(tm); assertEquals("correctly-assigned", my.getMyProperty()); assertNull(my.other()); tm.addProperty("other", "foo"); tm.setExecutionFactoryClass(MyTranslator.class); my = (MyTranslator)TranslatorUtil.buildExecutionFactory(tm); assertEquals("foo", my.other()); } @Test public void testImportProperties() throws Exception { VDBTranslatorMetaData tm = new VDBTranslatorMetaData(); tm.setExecutionFactoryClass(MyTranslator.class); tm.addProperty("MyProperty", "correctly-assigned"); MyTranslator my = (MyTranslator)TranslatorUtil.buildExecutionFactory(tm); VDBTranslatorMetaData translator = TranslatorUtil.buildTranslatorMetadata(my, "my-module"); ExtendedPropertyMetadataList props = translator.getAttachment(ExtendedPropertyMetadataList.class); ArrayList<ExtendedPropertyMetadata> importProperties = new ArrayList<ExtendedPropertyMetadata>(); for (ExtendedPropertyMetadata prop:props) { if (prop.category().equals(PropertyType.IMPORT.name())) { importProperties.add(prop); } } assertEquals(1, importProperties.size()); assertEquals("importer.ImportProperty", importProperties.get(0).name); assertEquals("java.lang.String", importProperties.get(0).dataType); assertEquals(false, importProperties.get(0).required); assertEquals(false, importProperties.get(0).advanced); assertEquals("", importProperties.get(0).description); assertEquals("Import Property", importProperties.get(0).displayName); assertEquals(true, importProperties.get(0).editable); assertEquals(false, importProperties.get(0).masked); assertEquals("default-import-property", importProperties.get(0).defaultValue); } @Test public void testInject() throws Exception { VDBTranslatorMetaData tm = new VDBTranslatorMetaData(); tm.setExecutionFactoryClass(MyTranslator.class); tm.addProperty("MyProperty", "correctly-assigned"); MyTranslator my = (MyTranslator)TranslatorUtil.buildExecutionFactory(tm); assertEquals("correctly-assigned", my.getMyProperty()); VDBTranslatorMetaData metadata = TranslatorUtil.buildTranslatorMetadata(my, "my-module"); metadata.addProperty("MyProperty", "correctly-assigned"); Logger logger = Mockito.mock(Logger.class); Mockito.stub(logger.isEnabled(Mockito.anyString(), Mockito.anyInt())).toReturn(true); Mockito.doThrow(new RuntimeException("fail")).when(logger).log(Mockito.eq(MessageLevel.WARNING), Mockito.eq(LogConstants.CTX_RUNTIME), Mockito.anyString()); LogManager.setLogListener(logger); try { TranslatorUtil.buildExecutionFactory(metadata); } finally { LogManager.setLogListener(null); } } @Test public void testExtensionMetadataProperties() throws Exception { VDBTranslatorMetaData tm = new VDBTranslatorMetaData(); tm.setExecutionFactoryClass(MyTranslator.class); tm.addProperty("MyProperty", "correctly-assigned"); MyTranslator my = (MyTranslator)TranslatorUtil.buildExecutionFactory(tm); VDBTranslatorMetaData translator = TranslatorUtil.buildTranslatorMetadata(my, "my-module"); ExtendedPropertyMetadataList props = translator.getAttachment(ExtendedPropertyMetadataList.class); ArrayList<ExtendedPropertyMetadata> importProperties = new ArrayList<ExtendedPropertyMetadata>(); for (ExtendedPropertyMetadata prop:props) { if (prop.category().equals(PropertyType.EXTENSION_METADATA.name())) { importProperties.add(prop); } } assertEquals("{http://teiid.org}/my-extension-property", importProperties.get(0).name()); assertEquals("java.lang.String", importProperties.get(0).datatype()); assertEquals("org.teiid.metadata.Column", importProperties.get(0).owner()); } @Test public void testBuildExecutionFactoryWithDefaults() throws Exception { VDBTranslatorMetaData tm = new VDBTranslatorMetaData(); VDBTranslatorMetaData parent = new VDBTranslatorMetaData(); parent.addProperty("myProperty", "default"); parent.setExecutionFactoryClass(MyTranslator.class); tm.setParent(parent); tm.addProperty("MyProperty", "correctly-assigned"); MyTranslator my = (MyTranslator)TranslatorUtil.buildExecutionFactory(tm); assertEquals("correctly-assigned", my.getMyProperty()); } @Test public void testBuildExecutionFactoryCaseInsensitive() throws Exception { VDBTranslatorMetaData tm = new VDBTranslatorMetaData(); tm.addProperty("myproperty", "correctly-assigned"); tm.setExecutionFactoryClass(MyTranslator.class); MyTranslator my = (MyTranslator)TranslatorUtil.buildExecutionFactory(tm); assertEquals("correctly-assigned", my.getMyProperty()); } @Test public void testBuildExecutionFactory1() throws Exception { VDBTranslatorMetaData tm = new VDBTranslatorMetaData(); tm.addProperty("someproperty", "correctly-assigned"); tm.setExecutionFactoryClass(MyTranslator1.class); MyTranslator1 my = (MyTranslator1)TranslatorUtil.buildExecutionFactory(tm); assertNull(my.getMyProperty()); assertEquals("correctly-assigned", my.getSomeProperty()); } @Test(expected=TeiidRuntimeException.class) public void testReadOnly() throws Exception { TranslatorUtil.buildTranslatorMetadata(new MyTranslatorInvalid(), "x"); } @Translator(name="my-translator") public static class MyTranslator extends ExecutionFactory<Object, Object> { @ExtensionMetadataProperty(applicable=Column.class, datatype=String.class, description="description", required=true) public static final String EXTENSION_PROP = "{http://teiid.org}/my-extension-property"; String mine; String other; @TranslatorProperty(display="my-property", required=true) public String getMyProperty() { return mine; } public void setMyProperty(String value) { this.mine = value; } @TranslatorProperty(display="other") public String other() { return other; } public void setOther(String other) { this.other = other; } @Override public MetadataProcessor<Object> getMetadataProcessor() { return new MetadataProcessor<Object> () { @Override public void process(MetadataFactory metadataFactory,Object connection) throws TranslatorException { } @TranslatorProperty(display="Import Property", category=PropertyType.IMPORT, readOnly=true) public String getImportProperty() { return "default-import-property"; } }; } } public interface SomeProperty { @TranslatorProperty(display="my-property", required=false) String getSomeProperty(); void setSomeProperty(String value); } @Translator(name="my-translator1") public static class MyTranslator1 extends MyTranslator implements SomeProperty { private String someProperty; @Override @TranslatorProperty(display="my-property", required=false) public String getMyProperty() { return super.getMyProperty(); } @Override public String getSomeProperty() { return someProperty; } @Override public void setSomeProperty(String value) { this.someProperty = value; } } @Translator(name="my-translator-invalid") public static class MyTranslatorInvalid extends ExecutionFactory<Object, Object> { @TranslatorProperty(display="my-property") public String getMyProperty() { return "x"; } } @Translator(name="my-translator2") public static class MyTranslator2 extends MyTranslator1{ public MyTranslator2() { setSomeProperty("original-assigned"); } } }