// ============================================================================ // // Copyright (C) 2006-2012 Talend Inc. - www.talend.com // // This source code is available under agreement available at // %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt // // You should have received a copy of the agreement // along with this program; if not, write to Talend SA // 9 rue Pages 92150 Suresnes, France // // ============================================================================ package org.talend.core.model.metadata; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.collections.MultiMap; import org.apache.commons.collections.map.MultiValueMap; import org.apache.log4j.Logger; import org.eclipse.jface.preference.IPreferenceStore; import org.talend.core.model.metadata.types.DBTypeUtil; import org.talend.core.model.metadata.types.JavaTypesManager; import org.talend.core.prefs.ITalendCorePrefConstants; import org.talend.core.runtime.CoreRuntimePlugin; /** * DOC amaumont class global comment. Detailled comment <br/> * * $Id$ * */ public class MappingTypeRetriever { private static Logger log = Logger.getLogger(MappingTypeRetriever.class); private Dbms dbms; private MultiMap mapDbToTalendTypes = new MultiValueMap(); private MultiMap mapTalendToDbTypes = new MultiValueMap(); private Map<MappingType, MappingType> defaultMappings = new HashMap<MappingType, MappingType>(); private MappingType mappingTypeKey = new MappingType(); /** * DOC amaumont MappingTypeHelper constructor comment. * * @param dbms */ public MappingTypeRetriever(Dbms dbms) { super(); this.dbms = dbms; init(dbms); } /** * DOC amaumont Comment method "init". */ private void init(Dbms dbms) { Set<MappingType> mappingTypes = dbms.getTalendToDbTypes(); defaultMappings.clear(); mapTalendToDbTypes.clear(); for (MappingType mappingType : mappingTypes) { MappingType mapTalendToDbKey = new MappingType(); mapTalendToDbKey.setTalendType(mappingType.getTalendType()); mapTalendToDbTypes.put(mapTalendToDbKey, mappingType); if (mappingType.getDefaultSelected()) { mapTalendToDbKey = new MappingType(); mapTalendToDbKey.setTalendType(mappingType.getTalendType()); mapTalendToDbKey.setDefaultSelected(mappingType.getDefaultSelected()); defaultMappings.put(mapTalendToDbKey, mappingType); } } mappingTypes = dbms.getDbToTalendTypes(); mapDbToTalendTypes.clear(); for (MappingType mappingType : mappingTypes) { MappingType mapDbToTalendKey = new MappingType(); mapDbToTalendKey.setDbType(mappingType.getDbType()); mapDbToTalendTypes.put(mapDbToTalendKey, mappingType); if (mappingType.getDefaultSelected()) { mapDbToTalendKey = new MappingType(); mapDbToTalendKey.setDbType(mappingType.getDbType().toUpperCase()); mapDbToTalendKey.setDefaultSelected(mappingType.getDefaultSelected()); defaultMappings.put(mapDbToTalendKey, mappingType); } } } /** * Returns adviced mappings for a given db type. * * @param dbType * @return a list of MappingType or null if not found */ public List<MappingType> getAdvicedDbToTalendTypes(String dbType) { mappingTypeKey.setDbType(dbType.toUpperCase()); mappingTypeKey.setTalendType(null); mappingTypeKey.setDefaultSelected(null); mapDbToTalendTypes.get(mappingTypeKey); return (List<MappingType>) mapDbToTalendTypes.get(mappingTypeKey); } /** * Returns adviced mappings for a given Talend type. * * @param talendType * @return a list of MappingType or null if not found */ public List<MappingType> getAdvicedTalendToDbTypes(String talendType) { mappingTypeKey.setDbType(null); mappingTypeKey.setTalendType(talendType); mappingTypeKey.setDefaultSelected(null); mapTalendToDbTypes.get(mappingTypeKey); return (List<MappingType>) mapTalendToDbTypes.get(mappingTypeKey); } public boolean isAdvicedTalendToDbType(String talendType, String dbType) { List<MappingType> advicedTalendToDbTypes = getAdvicedTalendToDbTypes(talendType); if (advicedTalendToDbTypes == null) { return false; } int advicedTalendToDbTypesListSize = advicedTalendToDbTypes.size(); for (int i = 0; i < advicedTalendToDbTypesListSize; i++) { MappingType type = advicedTalendToDbTypes.get(i); if (type.getDbType().equals(dbType)) { return true; } } return false; } public boolean isAdvicedDBToTalendType(String dbType, String talendType) { List<MappingType> advicedDbToTalendTypes = getAdvicedDbToTalendTypes(dbType); if (advicedDbToTalendTypes == null) { return false; } int advicedDbToTalendTypesListSize = advicedDbToTalendTypes.size(); for (int i = 0; i < advicedDbToTalendTypesListSize; i++) { MappingType type = advicedDbToTalendTypes.get(i); if (type.getDbType().equals(dbType)) { return true; } } return false; } private boolean isExtensionLengthIgnored(String dbmsId, String dbType) { Map<String, Map<String, List<DBTypeUtil>>> javaTypeMappingFromExtension = JavaTypesManager .getJavaTypeMappingFromExtension(); for (String id : javaTypeMappingFromExtension.keySet()) { for (String mappingId : javaTypeMappingFromExtension.get(id).keySet()) { if (dbmsId.equals(mappingId)) { for (DBTypeUtil dbTypeUtil : javaTypeMappingFromExtension.get(id).get(mappingId)) { if (dbTypeUtil.getDbTypeName().equals(dbType)) { return dbTypeUtil.isIgnoreLength(); } } } } } return false; } public boolean isLengthIgnored(String dbmsId, String dbType) { if (isExtensionLengthIgnored(dbmsId, dbType)) { return true; } Dbms dbms = MetadataTalendType.getDbms(dbmsId); List ignoreLP = dbms.getIgnoreLengthPrecision(); String ignore = new String(""); //$NON-NLS-1$ for (int i = 0; i < ignoreLP.size(); i++) { DbIgnoreLengthAndPrecision dbIgnore = (DbIgnoreLengthAndPrecision) ignoreLP.get(i); if (dbIgnore.getDbType().equalsIgnoreCase(dbType)) { ignore = dbIgnore.getIgnoreLength(); if (ignore == null) { return false; } else if (ignore.equals("true")) { //$NON-NLS-1$ return true; } else { return false; } }// end if }// end for return false; } private boolean isExtensionPrecisionIgnored(String dbmsId, String dbType) { Map<String, Map<String, List<DBTypeUtil>>> javaTypeMappingFromExtension = JavaTypesManager .getJavaTypeMappingFromExtension(); for (String id : javaTypeMappingFromExtension.keySet()) { for (String mappingId : javaTypeMappingFromExtension.get(id).keySet()) { if (dbmsId.equals(mappingId)) { for (DBTypeUtil dbTypeUtil : javaTypeMappingFromExtension.get(id).get(mappingId)) { if (dbTypeUtil.getDbTypeName().equals(dbType)) { return dbTypeUtil.isIgnorePrecision(); } } } } } return false; } public boolean isPrecisionIgnored(String dbmsId, String dbType) { if (isExtensionPrecisionIgnored(dbmsId, dbType)) { return true; } Dbms dbms = MetadataTalendType.getDbms(dbmsId); List ignoreLP = dbms.getIgnoreLengthPrecision(); String ignore = new String(""); //$NON-NLS-1$ for (int i = 0; i < ignoreLP.size(); i++) { DbIgnoreLengthAndPrecision dbIgnore = (DbIgnoreLengthAndPrecision) ignoreLP.get(i); if (dbIgnore.getDbType().equalsIgnoreCase(dbType)) { ignore = dbIgnore.getIgnorePrecision(); if (ignore == null) { return false; } else if (ignore.equals("true")) { //$NON-NLS-1$ return true; } else { return false; } }// end if }// end for return false; } public boolean isPreBeforeLength(String dbmsId, String dbType) { Dbms dbms = MetadataTalendType.getDbms(dbmsId); List preBeforeLen = dbms.getPrebeforelength(); String before = new String(""); //$NON-NLS-1$ for (int i = 0; i < preBeforeLen.size(); i++) { DbPreBeforeLength dbPBL = (DbPreBeforeLength) preBeforeLen.get(i); if (dbPBL.getDbType().equals(dbType)) { before = dbPBL.getPreBeforeLen(); if (before == null) return false; if (before.equals("true")) //$NON-NLS-1$ return true; else return false; } } return false; } /** * * Search and return the Db type which matches with the given parameters. If the Db type is not found, a new search * is done with inverse of given <code>nullable</code> * * @param dbmsType * @param nullable * @return */ public String getDefaultSelectedTalendType(String dbmsType) { if (dbmsType == null) { return MetadataTalendType.getDefaultTalendType(); } mappingTypeKey.setDbType(dbmsType.toUpperCase()); mappingTypeKey.setTalendType(null); mappingTypeKey.setDefaultSelected(Boolean.TRUE); MappingType mappingType = defaultMappings.get(mappingTypeKey); if (mappingType == null) { mappingTypeKey.setDefaultSelected(Boolean.FALSE); mappingType = defaultMappings.get(mappingTypeKey); if (mappingType == null) { return MetadataTalendType.getDefaultTalendType(); } } return mappingType.getTalendType(); } public String getDefaultSelectedTalendType(String dbmsType, int length, int precison) { if (dbmsType == null) { return MetadataTalendType.getDefaultTalendType(); } mappingTypeKey.setDbType(dbmsType.toUpperCase()); mappingTypeKey.setTalendType(null); List<MappingType> listMappingtype = new ArrayList<MappingType>(); listMappingtype = (List<MappingType>) mapDbToTalendTypes.get(mappingTypeKey); mappingTypeKey.setDefaultSelected(Boolean.TRUE); MappingType mappingTypeOrigin = defaultMappings.get(mappingTypeKey); if (mappingTypeOrigin == null) { mappingTypeKey.setDefaultSelected(Boolean.FALSE); mappingTypeOrigin = defaultMappings.get(mappingTypeKey); if (mappingTypeOrigin == null) { return MetadataTalendType.getDefaultTalendType(); } } IPreferenceStore preferenceStore = CoreRuntimePlugin.getInstance().getPreferenceStore(); if (preferenceStore != null && !preferenceStore.getBoolean(ITalendCorePrefConstants.FORBIDDEN_MAPPING_LENGTH_PREC_LOGIC)) { TalendTypePreLenRetriever talendTypePre = new TalendTypePreLenRetriever(mappingTypeOrigin, length, precison); String mappingType = talendTypePre.getMappingType(); if (listMappingtype.size() != 0) { for (MappingType type : listMappingtype) { if (type.getTalendType().equals(mappingType)) { return type.getTalendType(); } } } } return mappingTypeOrigin.getTalendType(); } /** * * Search and return the Db type which matches with the given parameters. If the Db type is not found, a new search * is done with inverse of given <code>nullable</code> * * @param talendType * @param nullable * @return */ public String getDefaultSelectedDbType(String talendType) { mappingTypeKey.setDbType(null); mappingTypeKey.setTalendType(talendType); mappingTypeKey.setDefaultSelected(Boolean.TRUE); MappingType mappingType = defaultMappings.get(mappingTypeKey); if (mappingType == null) { return dbms.getDefaultDbType(); } return mappingType.getDbType(); } /** * Getter for the current loaded dbms. * * @return the dbms */ public Dbms getDbms() { return this.dbms; } /** * Sets the dbms. * * @param dbms the dbms to set */ public void setDbms(Dbms dbms) { this.dbms = dbms; init(dbms); } }