/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
*
* Licensed 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.jkiss.dbeaver.ext.oracle.oci;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCClientHome;
import org.jkiss.utils.CommonUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class OracleHomeDescriptor extends JDBCClientHome
{
private static final Log log = Log.getLog(OracleHomeDescriptor.class);
/*
private static final String JAR_OJDBC6 = "ojdbc6.jar";
private static final String JAR_OJDBC5 = "ojdbc5.jar";
private static final String JAR_OJDBC4 = "ojdbc14.jar";
private static final String JAR_OJDBC2 = "classes12.zip";
private static final String JAR_OJDBC2_ZIP = "classes12.jar";
*/
private Integer oraVersion; // short version (9, 10, 11...)
private String fullOraVersion;
private boolean isInstantClient;
private String displayName;
private List<String> tnsNames;
public OracleHomeDescriptor(String oraHome)
{
super(CommonUtils.removeTrailingSlash(oraHome), oraHome);
this.isInstantClient = OCIUtils.isInstantClient(oraHome);
this.oraVersion = getOracleVersion();
if (oraVersion == null) {
log.debug("Unrecognized Oracle client version at " + oraHome);
}
this.displayName = OCIUtils.readWinRegistry(oraHome, OCIUtils.WIN_REG_ORA_HOME_NAME);
}
private Integer getOracleVersion()
{
File oraHome = getHomePath();
File folder = isInstantClient ? oraHome : new File(oraHome, "bin");
if (!folder.exists()) {
return null;
}
for (int counter = 7; counter <= 15; counter++) {
String dllName = System.mapLibraryName("ocijdbc" + counter);
File ociLibFile = new File(folder, dllName);
if (ociLibFile.exists()) {
return counter;
}
}
return null;
}
public Integer getOraVersion()
{
return oraVersion;
}
@Override
public String getProductName()
{
return "Oracle" + (oraVersion == null ? "" : " " + oraVersion);
}
@Override
public String getProductVersion()
{
if (fullOraVersion == null) {
this.fullOraVersion = OCIUtils.getFullOraVersion(getHomeId(), isInstantClient);
if (fullOraVersion == null) {
fullOraVersion = "Unknown";
}
}
return fullOraVersion;
}
public boolean isInstantClient()
{
return isInstantClient;
}
@Override
public String getDisplayName()
{
if (displayName != null) {
return displayName;
}
else {
return getHomeId();
}
}
public Collection<String> getOraServiceNames()
{
if (tnsNames == null) {
tnsNames = new ArrayList<>(OCIUtils.readTnsNames(getHomePath(), true).keySet());
}
return tnsNames;
}
/*
private Collection<File> getRequiredJars()
{
List<File> list = new ArrayList<File>();
FileFilter jarFilter = new FileFilter() {
@Override
public boolean accept(File pathname)
{
final String name = pathname.getName();
return name.endsWith(".jar") || name.endsWith(".zip");
}
};
File oraHome = getHomePath();
list.addAll(CommonUtils.safeArray(oraHome.listFiles(jarFilter)));
File jdbcPath = new File(oraHome, "jdbc/lib");
if (jdbcPath.exists()) {
list.addAll(CommonUtils.safeArray(jdbcPath.listFiles(jarFilter)));
}
File libPath = new File(oraHome, "lib");
if (libPath.exists()) {
list.addAll(CommonUtils.safeArray(libPath.listFiles(jarFilter)));
}
Map<String, File> libMap = new TreeMap<String, File>();
for (File lib : list) {
libMap.put(lib.getName(), lib);
}
removeExtraLibraies(libMap, "_g");
removeExtraLibraies(libMap, "dms");
if (libMap.containsKey(JAR_OJDBC2)) {
libMap.remove(JAR_OJDBC2_ZIP);
}
if (libMap.containsKey(JAR_OJDBC4)) {
libMap.remove(JAR_OJDBC2);
libMap.remove(JAR_OJDBC2_ZIP);
}
if (libMap.containsKey(JAR_OJDBC5)) {
libMap.remove(JAR_OJDBC4);
libMap.remove(JAR_OJDBC2);
libMap.remove(JAR_OJDBC2_ZIP);
}
if (libMap.containsKey(JAR_OJDBC6)) {
libMap.remove(JAR_OJDBC5);
libMap.remove(JAR_OJDBC4);
libMap.remove(JAR_OJDBC2);
libMap.remove(JAR_OJDBC2_ZIP);
}
return libMap.values();
}
private void removeExtraLibraies(Map<String, File> libMap, String suffix)
{
for (Iterator<String> nameIter = libMap.keySet().iterator(); nameIter.hasNext(); ) {
String libName = nameIter.next();
if (libName.endsWith(suffix + ".jar")) {
if (libMap.containsKey(libName.substring(0, libName.length() - (suffix.length() + 4)) + ".jar")) {
nameIter.remove();
}
}
}
}
/**
* Returns an array of urls of jar-libraries required for the driver.
*
public URL[] getLibraries()
{
Collection<File> libraries = getRequiredJars();
int i = 0;
URL[] urls = new URL[libraries.size()];
for (File file : libraries) {
try {
urls[i++] = file.toURI().toURL();
} catch (MalformedURLException e) {
log.warn("File '" + file.getAbsolutePath() + "' can't be converted to url.");
}
}
return urls;
}
*/
}