blob: 7c97778b10d796c38ae657a5072be399ce35a1ec [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.apache.calcite.avatica;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* Driver version information.
*
* <p>Each driver implementation must provide an instance of this class, in
* order to implement {@link UnregisteredDriver#createDriverVersion()}.</p>
*
* <p>There are two typical ways for a driver to instantiate its version
* information:</p>
*
* <ul>
*
* <li>A driver might create a subclass in a with a constructor that provides
* all of the arguments for the base class. The instance is held in a separate
* file, so that that version information can be generated.</li>
*
* <li>A driver might store the version information in a .properties file and
* load it using {@link #load}.</li>
*
* </ul>
*/
public class DriverVersion {
public final int majorVersion;
public final int minorVersion;
public final String name;
public final String versionString;
public final String productName;
public final String productVersion;
public final boolean jdbcCompliant;
public final int databaseMajorVersion;
public final int databaseMinorVersion;
/** Creates a DriverVersion. */
public DriverVersion(
String name,
String versionString,
String productName,
String productVersion,
boolean jdbcCompliant,
int majorVersion,
int minorVersion,
int databaseMajorVersion,
int databaseMinorVersion) {
this.majorVersion = majorVersion;
this.minorVersion = minorVersion;
this.name = name;
this.versionString = versionString;
this.productName = productName;
this.productVersion = productVersion;
this.jdbcCompliant = jdbcCompliant;
this.databaseMajorVersion = databaseMajorVersion;
this.databaseMinorVersion = databaseMinorVersion;
}
/** Loads a driver version from a properties file, read from the classpath.
* The arguments provide defaults if the properties cannot be loaded.
*
* @param driverClass Class of driver; used to find resource
* @param resourceName Name of resource file
* @param driverName Fallback name of driver
* @param driverVersion Fallback version of driver
* @param productName Fallback product name
* @param productVersion Fallback product version
* @return A populated driver version object, never null
*/
public static DriverVersion load(
Class<? extends UnregisteredDriver> driverClass,
String resourceName,
String driverName,
String driverVersion,
String productName,
String productVersion) {
boolean jdbcCompliant = true;
int majorVersion = 0;
int minorVersion = 0;
int databaseMajorVersion = 0;
int databaseMinorVersion = 0;
try (final InputStream inStream =
driverClass.getClassLoader().getResourceAsStream(resourceName)) {
if (inStream != null) {
final Properties properties = new Properties();
properties.load(inStream);
driverName = properties.getProperty("driver.name");
driverVersion = properties.getProperty("driver.version");
productName = properties.getProperty("product.name");
productVersion = properties.getProperty("product.version");
jdbcCompliant =
Boolean.valueOf(properties.getProperty("jdbc.compliant"));
String[] s = driverVersion.replaceAll("-.*$", "").split("\\.");
final int major = Integer.parseInt(s[0]);
final int minor = Integer.parseInt(s[1]);
try {
majorVersion =
Integer.parseInt(properties.getProperty("driver.version.major"));
} catch (NumberFormatException e) {
majorVersion = major;
}
try {
minorVersion =
Integer.parseInt(properties.getProperty("driver.version.minor"));
} catch (NumberFormatException e) {
minorVersion = minor;
}
try {
databaseMajorVersion =
Integer.parseInt(properties.getProperty("database.version.major"));
} catch (NumberFormatException e) {
databaseMajorVersion = major;
}
try {
databaseMinorVersion =
Integer.parseInt(properties.getProperty("database.version.minor"));
} catch (NumberFormatException e) {
databaseMinorVersion = minor;
}
}
} catch (IOException e) {
e.printStackTrace();
}
return new DriverVersion(
driverName, driverVersion, productName, productVersion,
jdbcCompliant, majorVersion, minorVersion, databaseMajorVersion,
databaseMinorVersion);
}
}
// End DriverVersion.java