blob: 3ddf985e9eb5cf0cbbbc40d72c75fca2ffb85e2d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.netbeans.modules.payara.jakartaee.db;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
/**
* Collect all the vendor name manipulation in one place. Refactor it ASAP.
*
* @author Peter Williams
*/
public class VendorNameMgr {
private final static char BLANK = ' ';
private final static char DOT = '.';
private final static char [] ILLEGAL_FILENAME_CHARS = {'/', '\\', ':', '*', '?', '"', '<', '>', '|', ',', '=', ';' };
private final static String ILLEGAL_CHARS_PATTERN = "[/\\:*\"<>|,=; \\.]"; // NOI18N
private final static String REPLACEMENT_PATTERN = "_"; // NOI18N
/**
* Determine the proper vendor name for the database url passed in. If
* no vendor name can be determined, generate something valid from the url.
*
* @param url database url for a datasource
* @return vendor name (or filename legal string) for the database vendor
* associated with that url.
*/
public static String vendorNameFromDbUrl(String url) {
url = stripExtraDBInfo(url);
String vendorName = getDatabaseVendorName(url);
if(vendorName != null) {
if(vendorName.length() > 0) { // NOI18N
if(!isFriendlyFilename(vendorName)) {
vendorName = makeLegalFilename(vendorName);
}
} else {
vendorName = makeShorterLegalFilename(url);
}
}
return vendorName;
}
/**
* Determine the standard datasource classname for this vendor
*
* @param vendorName vendor name to lookup
* @return standard datasource classname for this vendor, or null if unknown.
*/
public static String dsClassNameFromVendorName(String vendorName) {
return vendorName != null ? vendorNameToDscnMap.get(vendorName) : null;
}
private static boolean isLegalFilename(String filename) {
for(int i = 0; i < ILLEGAL_FILENAME_CHARS.length; i++) {
if(filename.indexOf(ILLEGAL_FILENAME_CHARS[i]) >= 0) {
return false;
}
}
return true;
}
private static boolean isFriendlyFilename(String filename) {
if(filename.indexOf(BLANK) >= 0 || filename.indexOf(DOT) >= 0) {
return false;
}
return isLegalFilename(filename);
}
private static String makeLegalFilename(String filename) {
return filename.replaceAll(ILLEGAL_CHARS_PATTERN, REPLACEMENT_PATTERN);
}
private static String makeShorterLegalFilename(String filename) {
//To clean up the default generation a little
int separatorIndex = filename.indexOf("://"); // NOI18N
if(separatorIndex != -1) { // NOI18N
filename = filename.substring(0, separatorIndex) +
"_" + // NOI18N
filename.substring(separatorIndex + 3);
}
separatorIndex = filename.indexOf("//"); // NOI18N
if(separatorIndex != -1) { // NOI18N
filename = filename.substring(0, separatorIndex) +
"_" + // NOI18N
filename.substring(separatorIndex + 2);
}
filename = makeLegalFilename(filename);
return filename;
}
static String stripExtraDBInfo(String dbConnectionString) {
int bracketIndex = dbConnectionString.indexOf("["); // NOI18N
if(bracketIndex != -1) {
dbConnectionString = dbConnectionString.substring(0, bracketIndex).trim();
}
return dbConnectionString;
}
private static String getDatabaseVendorName(String url) {
String vendorName = "";
for(Entry<String, String> entry : vendorNameToUrlMap.entrySet()) {
if(url.indexOf(entry.getValue()) != -1){
vendorName = entry.getKey();
break;
}
}
return vendorName;
}
// vendor name -> datasource classname mapping.
// XXX From CPWizard.xml until that can be refactored
// XXX Using linked hashmap due to order dependency between derby urls & reverse lookup.
//
private static Map<String, String> vendorNameToDscnMap = new LinkedHashMap<String, String>();
static {
vendorNameToDscnMap.put("oracle-thin", "oracle.jdbc.pool.OracleDataSource");
vendorNameToDscnMap.put("derby_net", "org.apache.derby.jdbc.ClientDataSource");
vendorNameToDscnMap.put("sun_db2", "com.sun.sql.jdbcx.db2.DB2DataSource");
vendorNameToDscnMap.put("sun_msftsql", "com.sun.sql.jdbcx.sqlserver.SQLServerDataSource");
vendorNameToDscnMap.put("sun_oracle", "com.sun.sql.jdbcx.oracle.OracleDataSource");
vendorNameToDscnMap.put("sun_sybase", "com.sun.sql.jdbcx.sybase.SybaseDataSource");
vendorNameToDscnMap.put("post-gre-sql", "org.postgresql.ds.PGSimpleDataSource");
vendorNameToDscnMap.put("microsoft_sql", "com.microsoft.sqlserver.jdbc.SQLServerDataSource");
vendorNameToDscnMap.put("jtds_sql", "net.sourceforge.jtds.jdbcx.JtdsDataSource");
vendorNameToDscnMap.put("jtds_sybase", "net.sourceforge.jtds.jdbcx.JtdsDataSource");
vendorNameToDscnMap.put("oracle", "oracle.jdbc.pool.OracleDataSource");
vendorNameToDscnMap.put("db2", "com.ibm.db2.jcc.DB2DataSource");
vendorNameToDscnMap.put("datadirect_sql", "com.ddtek.jdbcx.sqlserver.SQLServerDataSource");
vendorNameToDscnMap.put("datadirect_oracle", "com.ddtek.jdbcx.oracle.OracleDataSource");
vendorNameToDscnMap.put("datadirect_db2", "com.ddtek.jdbcx.db2.DB2DataSource");
vendorNameToDscnMap.put("datadirect_informix", "com.ddtek.jdbcx.informix.InformixDataSource");
vendorNameToDscnMap.put("datadirect_sybase", "com.ddtek.jdbcx.sybase.SybaseDataSource");
vendorNameToDscnMap.put("sybase2", "com.sybase.jdbc2.jdbc.SybDataSource");
vendorNameToDscnMap.put("pointbase", "com.pointbase.jdbc.jdbcDataSource");
vendorNameToDscnMap.put("cloudscape", "com.cloudscape.core.BasicDataSource");
vendorNameToDscnMap.put("informix", "com.informix.jdbcx.IfxDataSource");
vendorNameToDscnMap.put("mysql", "com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
vendorNameToDscnMap.put("jdbc-odbc-bridge", "sun.jdbc.odbc.JdbcOdbcDriver");
vendorNameToDscnMap.put("sql-server", "weblogic.jdbc.mssqlserver4.Driver");
}
// Url fragment -> vendor name mapping.
// XXX From CPWizard.xml until that can be refactored
// XXX Using linked hashmap due to order dependency between derby urls & reverse lookup.
//
private static Map<String, String> vendorNameToUrlMap = new LinkedHashMap<String, String>();
static {
vendorNameToUrlMap.put("oracle-thin", "jdbc:oracle:thin");
vendorNameToUrlMap.put("derby_net", "jdbc:derby://");
vendorNameToUrlMap.put("derby_embedded", "jdbc:derby:");
vendorNameToUrlMap.put("sun_db2", "jdbc:sun:db2:");
vendorNameToUrlMap.put("sun_msftsql", "jdbc:sun:sqlserver:");
vendorNameToUrlMap.put("sun_oracle", "jdbc:sun:oracle:");
vendorNameToUrlMap.put("sun_sybase", "jdbc:sun:sybase:");
vendorNameToUrlMap.put("post-gre-sql", "jdbc:postgresql:");
vendorNameToUrlMap.put("microsoft_sql", "jdbc:sqlserver:");
vendorNameToUrlMap.put("jtds_sql", "jdbc:jtds:sqlserver:");
vendorNameToUrlMap.put("jtds_sybase", "jdbc:jtds:sybase:");
vendorNameToUrlMap.put("oracle", "jdbc:oracle:oci8:");
vendorNameToUrlMap.put("db2", "jdbc:db2:");
vendorNameToUrlMap.put("jdbc-odbc-bridge", "jdbc:odbc:");
vendorNameToUrlMap.put("sql-server", "jdbc:weblogic:mssqlserver4:");
vendorNameToUrlMap.put("sybase2", "jdbc:sybase:Tds:");
vendorNameToUrlMap.put("cloudscape", "jdbc:cloudscape:");
vendorNameToUrlMap.put("informix", "jdbc:informix-sqli:");
vendorNameToUrlMap.put("mysql", "jdbc:mysql:");
vendorNameToUrlMap.put("pointbase", "jdbc:pointbase:");
vendorNameToUrlMap.put("datadirect_sql", "jdbc:datadirect:sqlserver:");
vendorNameToUrlMap.put("datadirect_oracle", "jdbc:datadirect:oracle:");
vendorNameToUrlMap.put("datadirect_db2", "jdbc:datadirect:db2:");
vendorNameToUrlMap.put("datadirect_informix", "jdbc:datadirect:informix:");
vendorNameToUrlMap.put("datadirect_sybase", "jdbc:datadirect:sybase:");
vendorNameToUrlMap.put("as400", "jdbc:as400:");
}
}