package org.teiid.designer.runtime.connection; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Properties; import org.eclipse.core.runtime.IStatus; import org.teiid.core.designer.properties.PropertyDefinition; import org.teiid.core.designer.util.StringConstants; import org.teiid.core.designer.util.StringUtilities; import org.teiid.designer.core.translators.TranslatorOverride; import org.teiid.designer.core.translators.TranslatorOverrideProperty; import org.teiid.designer.core.translators.TranslatorProperty; import org.teiid.designer.core.translators.TranslatorPropertyDefinition; import org.teiid.designer.runtime.DqpPlugin; import org.teiid.designer.runtime.spi.ITeiidServer; import org.teiid.designer.runtime.spi.ITeiidTranslator; import org.teiid.designer.runtime.spi.TeiidPropertyDefinition; import org.teiid.designer.runtime.version.spi.TeiidServerVersion.Version; public class TranslatorUtils { public static ITeiidServer getDefaultServer() { return DqpPlugin.getInstance().getServerManager().getDefaultServer(); } public static PropertyDefinition[] getTranslatorPropertyDefinitions( String translatorName, ITeiidTranslator.TranslatorPropertyType type) { if (StringUtilities.isEmpty(translatorName)) { throw new IllegalArgumentException(); } ITeiidServer defaultServer = getDefaultServer(); if ((defaultServer != null) && defaultServer.isConnected()) { try { ITeiidTranslator translator = defaultServer.getTranslator(translatorName); if (translator != null) { if( type == ITeiidTranslator.TranslatorPropertyType.OVERRIDE ) { return getOverrideDefinitions(defaultServer, translator); } else if( type == ITeiidTranslator.TranslatorPropertyType.IMPORT ) { return getImportDefinitions(defaultServer, translator); } else if( type == ITeiidTranslator.TranslatorPropertyType.EXTENSION_METADATA ) { return getExtensionDefinitions(defaultServer, translator); } return new PropertyDefinition[0]; } } catch (Exception e) { DqpPlugin.Util.log(IStatus.ERROR, e, DqpPlugin.Util.getString("errorObtainingTranslatorProperties", //$NON-NLS-1$ translatorName, defaultServer.getHost())); } } return null; } private static PropertyDefinition[] getOverrideDefinitions(ITeiidServer defaultServer, ITeiidTranslator translator ) { Collection<PropertyDefinition> props = new ArrayList<PropertyDefinition>(); // NOTE: For server versions prior to 8.6, translator.getPropertyDefinitions() will only return property definitions for // the resource-adapter properties and NOT the translator. // So added the check and ignore getting translator properties if version < 8.6 if( defaultServer.getServerVersion().isGreaterThanOrEqualTo(Version.TEIID_8_6)) { for (TeiidPropertyDefinition propDefn : translator.getPropertyDefinitions()) { TranslatorProperty prop = new TranslatorProperty(propDefn.getPropertyTypeClassName()); prop.setAdvanced(propDefn.isAdvanced()); prop.setDescription( propDefn.getDescription()); prop.setDisplayName( propDefn.getDisplayName()); prop.setId( propDefn.getName()); prop.setMasked( propDefn.isMasked()); prop.setModifiable( propDefn.isModifiable()); prop.setRequired( propDefn.isRequired()); prop.setDefaultValue((propDefn.getDefaultValue() == null) ? StringConstants.EMPTY_STRING : propDefn.getDefaultValue().toString()); if (propDefn.isConstrainedToAllowedValues()) { Collection<?> values = propDefn.getAllowedValues(); prop.setAllowedValues(new String[values.size()]); int i = 0; for (Object value : values) { prop.getAllowedValues()[i++] = value.toString(); } } else { // if boolean type turn into allowed values String type = propDefn.getPropertyTypeClassName(); if (Boolean.class.getName().equals(type) || Boolean.TYPE.getName().equals(type)) { prop.setAllowedValues(new String[] { Boolean.TRUE.toString(), Boolean.FALSE.toString() }); } } props.add(prop); } } return props.toArray(new PropertyDefinition[props.size()]); } private static PropertyDefinition[] getImportDefinitions(ITeiidServer defaultServer, ITeiidTranslator translator ) { Collection<PropertyDefinition> props = new ArrayList<PropertyDefinition>(); // NOTE: For server versions prior to 8.6, translator.getPropertyDefinitions() will only return property definitions for // the resource-adapter properties and NOT the translator. // So added the check and ignore getting translator properties if version < 8.6 if( defaultServer.getServerVersion().isGreaterThanOrEqualTo(Version.TEIID_8_6)) { for (TeiidPropertyDefinition propDefn : translator.getImportPropertyDefinitions()) { TranslatorProperty prop = new TranslatorProperty(propDefn.getPropertyTypeClassName()); prop.setAdvanced(propDefn.isAdvanced()); prop.setDescription( propDefn.getDescription()); prop.setDisplayName( propDefn.getDisplayName()); prop.setId( propDefn.getName()); prop.setMasked( propDefn.isMasked()); prop.setModifiable( propDefn.isModifiable()); prop.setRequired( propDefn.isRequired()); prop.setDefaultValue((propDefn.getDefaultValue() == null) ? StringConstants.EMPTY_STRING : propDefn.getDefaultValue().toString()); if (propDefn.isConstrainedToAllowedValues()) { Collection<?> values = propDefn.getAllowedValues(); prop.setAllowedValues(new String[values.size()]); int i = 0; for (Object value : values) { prop.getAllowedValues()[i++] = value.toString(); } } else { // if boolean type turn into allowed values String type = propDefn.getPropertyTypeClassName(); if (Boolean.class.getName().equals(type) || Boolean.TYPE.getName().equals(type)) { prop.setAllowedValues(new String[] { Boolean.TRUE.toString(), Boolean.FALSE.toString() }); } } props.add(prop); } } return props.toArray(new PropertyDefinition[props.size()]); } private static PropertyDefinition[] getExtensionDefinitions(ITeiidServer defaultServer, ITeiidTranslator translator ) { Collection<PropertyDefinition> props = new ArrayList<PropertyDefinition>(); // NOTE: For server versions prior to 8.6, translator.getPropertyDefinitions() will only return property definitions for // the resource-adapter properties and NOT the translator. // So added the check and ignore getting translator properties if version < 8.6 if( defaultServer.getServerVersion().isGreaterThanOrEqualTo(Version.TEIID_8_6)) { for (TeiidPropertyDefinition propDefn : translator.getExtensionPropertyDefinitions()) { TranslatorProperty prop = new TranslatorProperty(propDefn.getPropertyTypeClassName()); prop.setAdvanced(propDefn.isAdvanced()); prop.setDescription( propDefn.getDescription()); prop.setDisplayName( propDefn.getDisplayName()); prop.setId( propDefn.getName()); prop.setMasked( propDefn.isMasked()); prop.setModifiable( propDefn.isModifiable()); prop.setRequired( propDefn.isRequired()); prop.setDefaultValue((propDefn.getDefaultValue() == null) ? StringConstants.EMPTY_STRING : propDefn.getDefaultValue().toString()); if (propDefn.isConstrainedToAllowedValues()) { Collection<?> values = propDefn.getAllowedValues(); prop.setAllowedValues(new String[values.size()]); int i = 0; for (Object value : values) { prop.getAllowedValues()[i++] = value.toString(); } } else { // if boolean type turn into allowed values String type = propDefn.getPropertyTypeClassName(); if (Boolean.class.getName().equals(type) || Boolean.TYPE.getName().equals(type)) { prop.setAllowedValues(new String[] { Boolean.TRUE.toString(), Boolean.FALSE.toString() }); } } props.add(prop); } } return props.toArray(new PropertyDefinition[props.size()]); } public static TranslatorOverride createOverride(String type, Properties properties, ITeiidTranslator.TranslatorPropertyType defType) { TranslatorOverride override = new TranslatorOverride(type, properties); PropertyDefinition[] propertyDefinitionsFromServer = getTranslatorPropertyDefinitions(type, defType); if (propertyDefinitionsFromServer != null) { List<PropertyDefinition> newServerProps = new ArrayList<PropertyDefinition>(); // assume all server properties are new for (PropertyDefinition propDefn : propertyDefinitionsFromServer) { //System.out.println("propDefn ID = " + propDefn.getId() + " Display Name = " + propDefn.getDisplayName()); newServerProps.add(propDefn); } if (!properties.isEmpty()) { // translator properties already exist, match with server props for (Object key : properties.keySet()) { String keyStr = (String)key; String value = (String)properties.get(key); PropertyDefinition serverPropDefn = null; // see if property definitions from server already exist in overridden translator for (PropertyDefinition propDefn : propertyDefinitionsFromServer) { // found a matching one if (keyStr.equals(propDefn.getId())) { serverPropDefn = propDefn; newServerProps.remove(serverPropDefn); // Remove it from cached list break; } } if (serverPropDefn != null) { TranslatorOverrideProperty newProp = new TranslatorOverrideProperty(new TranslatorPropertyDefinition(serverPropDefn), value); // found existing property so update defn and use value from old defn override.addProperty(newProp); } } } for (PropertyDefinition propDefn : newServerProps) { override.addProperty(new TranslatorOverrideProperty(new TranslatorPropertyDefinition(propDefn), null)); } } return override; } public static Collection<ITeiidTranslator> getTranslators() { Collection<ITeiidTranslator> translators = Collections.emptyList(); ITeiidServer defaultServer = getDefaultServer(); if ((defaultServer != null) && defaultServer.isConnected()) { try { translators = defaultServer.getTranslators(); } catch (Exception e) { DqpPlugin.Util.log(IStatus.ERROR, e, "Error retrieving translators for the server: " + defaultServer.getDisplayName()); } } return translators; } }