http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/src/main/java/org/apache/calcite/avatica/AvaticaUtils.java ---------------------------------------------------------------------- diff --git a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaUtils.java b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaUtils.java deleted file mode 100644 index a999f19..0000000 --- a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaUtils.java +++ /dev/null @@ -1,329 +0,0 @@ -/* - * 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 org.apache.calcite.avatica.util.UnsynchronizedBuffer; - -import java.io.IOException; -import java.io.InputStream; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.lang.reflect.Field; -import java.nio.charset.StandardCharsets; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.AbstractList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** Avatica utilities. */ -public class AvaticaUtils { - private static final Map<Class, Class> BOX; - - private static final MethodHandle SET_LARGE_MAX_ROWS = - method(void.class, Statement.class, "setLargeMaxRows", long.class); - private static final MethodHandle GET_LARGE_MAX_ROWS = - method(long.class, Statement.class, "getLargeMaxRows"); - private static final MethodHandle GET_LARGE_UPDATE_COUNT = - method(void.class, Statement.class, "getLargeUpdateCount"); - - private static final Set<String> UNIQUE_STRINGS = new HashSet<>(); - - private static final ThreadLocal<byte[]> PER_THREAD_BUFFER = new ThreadLocal<byte[]>() { - @Override protected byte[] initialValue() { - return new byte[4096]; - } - }; - - private AvaticaUtils() {} - - static { - BOX = new HashMap<>(); - BOX.put(boolean.class, Boolean.class); - BOX.put(byte.class, Byte.class); - BOX.put(char.class, Character.class); - BOX.put(short.class, Short.class); - BOX.put(int.class, Integer.class); - BOX.put(long.class, Long.class); - BOX.put(float.class, Float.class); - BOX.put(double.class, Double.class); - } - - private static MethodHandle method(Class returnType, Class targetType, - String name, Class... argTypes) { - final MethodHandles.Lookup lookup = MethodHandles.lookup(); - try { - return lookup.findVirtual(targetType, name, - MethodType.methodType(returnType, targetType, argTypes)); - } catch (NoSuchMethodException e) { - return null; - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } - } - - /** - * Does nothing with its argument. Call this method when you have a value - * you are not interested in, but you don't want the compiler to warn that - * you are not using it. - */ - public static void discard(Object o) { - if (false) { - discard(o); - } - } - - /** - * Adapts a primitive array into a {@link List}. For example, - * {@code asList(new double[2])} returns a {@code List<Double>}. - */ - public static List<?> primitiveList(final Object array) { - // REVIEW: A per-type list might be more efficient. (Or might not.) - return new AbstractList() { - public Object get(int index) { - return java.lang.reflect.Array.get(array, index); - } - - public int size() { - return java.lang.reflect.Array.getLength(array); - } - }; - } - - /** - * Converts a camelCase name into an upper-case underscore-separated name. - * For example, {@code camelToUpper("myJdbcDriver")} returns - * "MY_JDBC_DRIVER". - */ - public static String camelToUpper(String name) { - StringBuilder buf = new StringBuilder(); - for (int i = 0; i < name.length(); i++) { - char c = name.charAt(i); - if (Character.isUpperCase(c)) { - buf.append('_'); - } else { - c = Character.toUpperCase(c); - } - buf.append(c); - } - return buf.toString(); - } - - /** - * Converts an underscore-separated name into a camelCase name. - * For example, {@code uncamel("MY_JDBC_DRIVER")} returns "myJdbcDriver". - */ - public static String toCamelCase(String name) { - StringBuilder buf = new StringBuilder(); - int nextUpper = -1; - for (int i = 0; i < name.length(); i++) { - char c = name.charAt(i); - if (c == '_') { - nextUpper = i + 1; - continue; - } - if (nextUpper == i) { - c = Character.toUpperCase(c); - } else { - c = Character.toLowerCase(c); - } - buf.append(c); - } - return buf.toString(); - } - - /** Returns the boxed class. For example, {@code box(int.class)} - * returns {@code java.lang.Integer}. */ - public static Class box(Class clazz) { - if (clazz.isPrimitive()) { - return BOX.get(clazz); - } - return clazz; - } - - /** Creates an instance of a plugin class. First looks for a static - * member called INSTANCE, then calls a public default constructor. - * - * <p>If className contains a "#" instead looks for a static field. - * - * @param pluginClass Class (or interface) to instantiate - * @param className Name of implementing class - * @param <T> Class - * @return Plugin instance - */ - public static <T> T instantiatePlugin(Class<T> pluginClass, - String className) { - try { - // Given a static field, say "com.example.MyClass#FOO_INSTANCE", return - // the value of that static field. - if (className.contains("#")) { - try { - int i = className.indexOf('#'); - String left = className.substring(0, i); - String right = className.substring(i + 1); - //noinspection unchecked - final Class<T> clazz = (Class) Class.forName(left); - final Field field; - field = clazz.getField(right); - return pluginClass.cast(field.get(null)); - } catch (NoSuchFieldException e) { - // ignore - } - } - //noinspection unchecked - final Class<T> clazz = (Class) Class.forName(className); - assert pluginClass.isAssignableFrom(clazz); - try { - // We assume that if there is an INSTANCE field it is static and - // has the right type. - final Field field = clazz.getField("INSTANCE"); - return pluginClass.cast(field.get(null)); - } catch (NoSuchFieldException e) { - // ignore - } - return clazz.newInstance(); - } catch (Exception e) { - throw new RuntimeException("Property '" + className - + "' not valid for plugin type " + pluginClass.getName(), e); - } - } - - /** Reads the contents of an input stream and returns as a string. */ - public static String readFully(InputStream inputStream) throws IOException { - return readFully(inputStream, new UnsynchronizedBuffer(1024)); - } - - /** Reads the contents of an input stream and returns as a string. */ - public static String readFully(InputStream inputStream, UnsynchronizedBuffer buffer) - throws IOException { - // Variant that lets us use a pooled Buffer - final byte[] bytes = _readFully(inputStream, buffer); - return new String(bytes, 0, bytes.length, StandardCharsets.UTF_8); - } - - /** Reads the contents of an input stream and returns as a string. */ - public static byte[] readFullyToBytes(InputStream inputStream) throws IOException { - return readFullyToBytes(inputStream, new UnsynchronizedBuffer(1024)); - } - - /** Reads the contents of an input stream and returns as a string. */ - public static byte[] readFullyToBytes(InputStream inputStream, UnsynchronizedBuffer buffer) - throws IOException { - // Variant that lets us use a pooled Buffer - return _readFully(inputStream, buffer); - } - - /** - * Reads the contents of an input stream and returns a byte array. - * - * @param inputStream the input to read from. - * @return A byte array whose length is equal to the number of bytes contained. - */ - static byte[] _readFully(InputStream inputStream, UnsynchronizedBuffer buffer) - throws IOException { - final byte[] bytes = PER_THREAD_BUFFER.get(); - for (;;) { - int count = inputStream.read(bytes, 0, bytes.length); - if (count < 0) { - break; - } - buffer.write(bytes, 0, count); - } - return buffer.toArray(); - } - - /** Invokes {@code Statement#setLargeMaxRows}, falling back on - * {@link Statement#setMaxRows(int)} if the method does not exist (before - * JDK 1.8) or throws {@link UnsupportedOperationException}. */ - public static void setLargeMaxRows(Statement statement, long n) - throws SQLException { - if (SET_LARGE_MAX_ROWS != null) { - try { - // Call Statement.setLargeMaxRows - SET_LARGE_MAX_ROWS.invokeExact(n); - return; - } catch (UnsupportedOperationException e) { - // ignore, and fall through to call Statement.setMaxRows - } catch (Error | RuntimeException | SQLException e) { - throw e; - } catch (Throwable e) { - throw new RuntimeException(e); - } - } - int i = (int) Math.max(Math.min(n, Integer.MAX_VALUE), Integer.MIN_VALUE); - statement.setMaxRows(i); - } - - /** Invokes {@code Statement#getLargeMaxRows}, falling back on - * {@link Statement#getMaxRows()} if the method does not exist (before - * JDK 1.8) or throws {@link UnsupportedOperationException}. */ - public static long getLargeMaxRows(Statement statement) throws SQLException { - if (GET_LARGE_MAX_ROWS != null) { - try { - // Call Statement.getLargeMaxRows - return (long) GET_LARGE_MAX_ROWS.invokeExact(); - } catch (UnsupportedOperationException e) { - // ignore, and fall through to call Statement.getMaxRows - } catch (Error | RuntimeException | SQLException e) { - throw e; - } catch (Throwable e) { - throw new RuntimeException(e); - } - } - return statement.getMaxRows(); - } - - /** Invokes {@code Statement#getLargeUpdateCount}, falling back on - * {@link Statement#getUpdateCount()} if the method does not exist (before - * JDK 1.8) or throws {@link UnsupportedOperationException}. */ - public static long getLargeUpdateCount(Statement statement) - throws SQLException { - if (GET_LARGE_UPDATE_COUNT != null) { - try { - // Call Statement.getLargeUpdateCount - return (long) GET_LARGE_UPDATE_COUNT.invokeExact(); - } catch (UnsupportedOperationException e) { - // ignore, and fall through to call Statement.getUpdateCount - } catch (Error | RuntimeException | SQLException e) { - throw e; - } catch (Throwable e) { - throw new RuntimeException(e); - } - } - return statement.getUpdateCount(); - } - - /** Generates a string that is unique in the execution of the JVM. - * It is used by tests to ensure that they create distinct temporary tables. - * The strings are never thrown away, so don't put too much in there! - * Thread safe. */ - public static String unique(String base) { - synchronized (UNIQUE_STRINGS) { - String s = base; - while (!UNIQUE_STRINGS.add(s)) { - s = base + "_" + UNIQUE_STRINGS.size(); - } - return s; - } - } -} - -// End AvaticaUtils.java
http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/src/main/java/org/apache/calcite/avatica/BuiltInConnectionProperty.java ---------------------------------------------------------------------- diff --git a/avatica/src/main/java/org/apache/calcite/avatica/BuiltInConnectionProperty.java b/avatica/src/main/java/org/apache/calcite/avatica/BuiltInConnectionProperty.java deleted file mode 100644 index 086ae4a..0000000 --- a/avatica/src/main/java/org/apache/calcite/avatica/BuiltInConnectionProperty.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * 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 org.apache.calcite.avatica.remote.AvaticaHttpClientFactoryImpl; - -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; - -import static org.apache.calcite.avatica.ConnectionConfigImpl.PropEnv; -import static org.apache.calcite.avatica.ConnectionConfigImpl.parse; - -/** - * Enumeration of Avatica's built-in connection properties. - */ -public enum BuiltInConnectionProperty implements ConnectionProperty { - /** Factory. */ - FACTORY("factory", Type.PLUGIN, null, false), - - /** Name of initial schema. */ - SCHEMA("schema", Type.STRING, null, false), - - /** Time zone, for example 'gmt-3'. Default is the JVM's time zone. */ - TIME_ZONE("timeZone", Type.STRING, null, false), - - /** Remote URL. */ - URL("url", Type.STRING, null, false), - - /** Serialization used over remote connections */ - SERIALIZATION("serialization", Type.STRING, "json", false), - - /** Factory for constructing http clients. */ - HTTP_CLIENT_FACTORY("httpclient_factory", Type.PLUGIN, - AvaticaHttpClientFactoryImpl.class.getName(), false), - - /** HttpClient implementation class name. */ - HTTP_CLIENT_IMPL("httpclient_impl", Type.STRING, null, false); - - private final String camelName; - private final Type type; - private final Object defaultValue; - private final boolean required; - - /** Deprecated; use {@link #TIME_ZONE}. */ - @Deprecated // to be removed before 2.0 - public static final BuiltInConnectionProperty TIMEZONE = TIME_ZONE; - - private static final Map<String, BuiltInConnectionProperty> NAME_TO_PROPS; - - static { - NAME_TO_PROPS = new HashMap<>(); - for (BuiltInConnectionProperty p : BuiltInConnectionProperty.values()) { - NAME_TO_PROPS.put(p.camelName.toUpperCase(), p); - NAME_TO_PROPS.put(p.name(), p); - } - } - - BuiltInConnectionProperty(String camelName, Type type, Object defaultValue, - boolean required) { - this.camelName = camelName; - this.type = type; - this.defaultValue = defaultValue; - this.required = required; - assert defaultValue == null || type.valid(defaultValue); - } - - public String camelName() { - return camelName; - } - - public Object defaultValue() { - return defaultValue; - } - - public Type type() { - return type; - } - - public boolean required() { - return required; - } - - public PropEnv wrap(Properties properties) { - return new PropEnv(parse(properties, NAME_TO_PROPS), this); - } -} - -// End BuiltInConnectionProperty.java http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/src/main/java/org/apache/calcite/avatica/ColumnMetaData.java ---------------------------------------------------------------------- diff --git a/avatica/src/main/java/org/apache/calcite/avatica/ColumnMetaData.java b/avatica/src/main/java/org/apache/calcite/avatica/ColumnMetaData.java deleted file mode 100644 index bcdc228..0000000 --- a/avatica/src/main/java/org/apache/calcite/avatica/ColumnMetaData.java +++ /dev/null @@ -1,593 +0,0 @@ -/* - * 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 org.apache.calcite.avatica.proto.Common; -import org.apache.calcite.avatica.util.ByteString; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSubTypes; -import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.google.protobuf.Descriptors.FieldDescriptor; - -import java.lang.reflect.Type; -import java.sql.Array; -import java.sql.DatabaseMetaData; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Struct; -import java.sql.Time; -import java.sql.Timestamp; -import java.sql.Types; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -/** - * Metadata for a column. - * - * <p>(Compare with {@link java.sql.ResultSetMetaData}.) - */ -public class ColumnMetaData { - private static final FieldDescriptor CATALOG_NAME_DESCRIPTOR = Common.ColumnMetaData - .getDescriptor().findFieldByNumber(Common.ColumnMetaData.CATALOG_NAME_FIELD_NUMBER); - private static final FieldDescriptor SCHEMA_NAME_DESCRIPTOR = Common.ColumnMetaData - .getDescriptor().findFieldByNumber(Common.ColumnMetaData.SCHEMA_NAME_FIELD_NUMBER); - private static final FieldDescriptor LABEL_DESCRIPTOR = Common.ColumnMetaData - .getDescriptor().findFieldByNumber(Common.ColumnMetaData.LABEL_FIELD_NUMBER); - private static final FieldDescriptor COLUMN_NAME_DESCRIPTOR = Common.ColumnMetaData - .getDescriptor().findFieldByNumber(Common.ColumnMetaData.COLUMN_NAME_FIELD_NUMBER); - private static final FieldDescriptor TABLE_NAME_DESCRIPTOR = Common.ColumnMetaData - .getDescriptor().findFieldByNumber(Common.ColumnMetaData.TABLE_NAME_FIELD_NUMBER); - private static final FieldDescriptor COLUMN_CLASS_NAME_DESCRIPTOR = Common.ColumnMetaData - .getDescriptor().findFieldByNumber(Common.ColumnMetaData.COLUMN_CLASS_NAME_FIELD_NUMBER); - - public final int ordinal; // 0-based - public final boolean autoIncrement; - public final boolean caseSensitive; - public final boolean searchable; - public final boolean currency; - public final int nullable; - public final boolean signed; - public final int displaySize; - public final String label; - public final String columnName; - public final String schemaName; - public final int precision; - public final int scale; - public final String tableName; - public final String catalogName; - public final boolean readOnly; - public final boolean writable; - public final boolean definitelyWritable; - public final String columnClassName; - public final AvaticaType type; - - @JsonCreator - public ColumnMetaData( - @JsonProperty("ordinal") int ordinal, - @JsonProperty("autoIncrement") boolean autoIncrement, - @JsonProperty("caseSensitive") boolean caseSensitive, - @JsonProperty("searchable") boolean searchable, - @JsonProperty("currency") boolean currency, - @JsonProperty("nullable") int nullable, - @JsonProperty("signed") boolean signed, - @JsonProperty("displaySize") int displaySize, - @JsonProperty("label") String label, - @JsonProperty("columnName") String columnName, - @JsonProperty("schemaName") String schemaName, - @JsonProperty("precision") int precision, - @JsonProperty("scale") int scale, - @JsonProperty("tableName") String tableName, - @JsonProperty("catalogName") String catalogName, - @JsonProperty("type") AvaticaType type, - @JsonProperty("readOnly") boolean readOnly, - @JsonProperty("writable") boolean writable, - @JsonProperty("definitelyWritable") boolean definitelyWritable, - @JsonProperty("columnClassName") String columnClassName) { - this.ordinal = ordinal; - this.autoIncrement = autoIncrement; - this.caseSensitive = caseSensitive; - this.searchable = searchable; - this.currency = currency; - this.nullable = nullable; - this.signed = signed; - this.displaySize = displaySize; - this.label = label; - // Per the JDBC spec this should be just columnName. - // For example, the query - // select 1 as x, c as y from t - // should give columns - // (label=x, column=null, table=null) - // (label=y, column=c table=t) - // But DbUnit requires every column to have a name. Duh. - this.columnName = first(columnName, label); - this.schemaName = schemaName; - this.precision = precision; - this.scale = scale; - this.tableName = tableName; - this.catalogName = catalogName; - this.type = type; - this.readOnly = readOnly; - this.writable = writable; - this.definitelyWritable = definitelyWritable; - this.columnClassName = columnClassName; - } - - public Common.ColumnMetaData toProto() { - Common.ColumnMetaData.Builder builder = Common.ColumnMetaData.newBuilder(); - - // Primitive fields (can't be null) - builder.setOrdinal(ordinal) - .setAutoIncrement(autoIncrement) - .setCaseSensitive(caseSensitive) - .setSearchable(searchable) - .setCurrency(currency) - .setNullable(nullable) - .setSigned(signed) - .setDisplaySize(displaySize) - .setPrecision(precision) - .setScale(scale) - .setReadOnly(readOnly) - .setWritable(writable) - .setDefinitelyWritable(definitelyWritable); - - // Potentially null fields - if (null != label) { - builder.setLabel(label); - } - - if (null != columnName) { - builder.setColumnName(columnName); - } - - if (null != schemaName) { - builder.setSchemaName(schemaName); - } - - if (null != tableName) { - builder.setTableName(tableName); - } - - if (null != catalogName) { - builder.setCatalogName(catalogName); - } - - if (null != type) { - builder.setType(type.toProto()); - } - - if (null != columnClassName) { - builder.setColumnClassName(columnClassName); - } - - return builder.build(); - } - - public static ColumnMetaData fromProto(Common.ColumnMetaData proto) { - AvaticaType nestedType = AvaticaType.fromProto(proto.getType()); - - String catalogName = null; - if (proto.hasField(CATALOG_NAME_DESCRIPTOR)) { - catalogName = proto.getCatalogName(); - } - - String schemaName = null; - if (proto.hasField(SCHEMA_NAME_DESCRIPTOR)) { - schemaName = proto.getSchemaName(); - } - - String label = null; - if (proto.hasField(LABEL_DESCRIPTOR)) { - label = proto.getLabel(); - } - - String columnName = null; - if (proto.hasField(COLUMN_NAME_DESCRIPTOR)) { - columnName = proto.getColumnName(); - } - - String tableName = null; - if (proto.hasField(TABLE_NAME_DESCRIPTOR)) { - tableName = proto.getTableName(); - } - - String columnClassName = null; - if (proto.hasField(COLUMN_CLASS_NAME_DESCRIPTOR)) { - columnClassName = proto.getColumnClassName(); - } - - // Recreate the ColumnMetaData - return new ColumnMetaData(proto.getOrdinal(), proto.getAutoIncrement(), - proto.getCaseSensitive(), proto.getSearchable(), proto.getCurrency(), proto.getNullable(), - proto.getSigned(), proto.getDisplaySize(), label, columnName, - schemaName, proto.getPrecision(), proto.getScale(), tableName, - catalogName, nestedType, proto.getReadOnly(), proto.getWritable(), - proto.getDefinitelyWritable(), columnClassName); - } - - @Override public int hashCode() { - return Objects.hash(autoIncrement, caseSensitive, catalogName, - columnClassName, columnName, currency, definitelyWritable, displaySize, - label, nullable, ordinal, precision, readOnly, scale, schemaName, - searchable, signed, tableName, type, writable); - } - - @Override public boolean equals(Object o) { - return o == this - || o instanceof ColumnMetaData - && autoIncrement == ((ColumnMetaData) o).autoIncrement - && caseSensitive == ((ColumnMetaData) o).caseSensitive - && Objects.equals(catalogName, ((ColumnMetaData) o).catalogName) - && Objects.equals(columnClassName, ((ColumnMetaData) o).columnClassName) - && Objects.equals(columnName, ((ColumnMetaData) o).columnName) - && currency == ((ColumnMetaData) o).currency - && definitelyWritable == ((ColumnMetaData) o).definitelyWritable - && displaySize == ((ColumnMetaData) o).displaySize - && Objects.equals(label, ((ColumnMetaData) o).label) - && nullable == ((ColumnMetaData) o).nullable - && ordinal == ((ColumnMetaData) o).ordinal - && precision == ((ColumnMetaData) o).precision - && readOnly == ((ColumnMetaData) o).readOnly - && scale == ((ColumnMetaData) o).scale - && Objects.equals(schemaName, ((ColumnMetaData) o).schemaName) - && searchable == ((ColumnMetaData) o).searchable - && signed == ((ColumnMetaData) o).signed - && Objects.equals(tableName, ((ColumnMetaData) o).tableName) - && Objects.equals(type, ((ColumnMetaData) o).type) - && writable == ((ColumnMetaData) o).writable; - } - - private static <T> T first(T t0, T t1) { - return t0 != null ? t0 : t1; - } - - /** Creates a {@link ScalarType}. */ - public static ScalarType scalar(int type, String typeName, Rep rep) { - return new ScalarType(type, typeName, rep); - } - - /** Creates a {@link StructType}. */ - public static StructType struct(List<ColumnMetaData> columns) { - return new StructType(columns); - } - - /** Creates an {@link ArrayType}. */ - public static ArrayType array(AvaticaType componentType, String typeName, - Rep rep) { - return new ArrayType(Types.ARRAY, typeName, rep, componentType); - } - - /** Creates a ColumnMetaData for result sets that are not based on a struct - * but need to have a single 'field' for purposes of - * {@link java.sql.ResultSetMetaData}. */ - public static ColumnMetaData dummy(AvaticaType type, boolean nullable) { - return new ColumnMetaData( - 0, - false, - true, - false, - false, - nullable - ? DatabaseMetaData.columnNullable - : DatabaseMetaData.columnNoNulls, - true, - -1, - null, - null, - null, - -1, - -1, - null, - null, - type, - true, - false, - false, - type.columnClassName()); - } - - public ColumnMetaData setRep(Rep rep) { - return new ColumnMetaData(ordinal, autoIncrement, caseSensitive, searchable, - currency, nullable, signed, displaySize, label, columnName, schemaName, - precision, scale, tableName, catalogName, type.setRep(rep), readOnly, - writable, definitelyWritable, columnClassName); - } - - /** Description of the type used to internally represent a value. For example, - * a {@link java.sql.Date} might be represented as a {@link #PRIMITIVE_INT} - * if not nullable, or a {@link #JAVA_SQL_DATE}. */ - public enum Rep { - PRIMITIVE_BOOLEAN(boolean.class), - PRIMITIVE_BYTE(byte.class), - PRIMITIVE_CHAR(char.class), - PRIMITIVE_SHORT(short.class), - PRIMITIVE_INT(int.class), - PRIMITIVE_LONG(long.class), - PRIMITIVE_FLOAT(float.class), - PRIMITIVE_DOUBLE(double.class), - BOOLEAN(Boolean.class), - BYTE(Byte.class), - CHARACTER(Character.class), - SHORT(Short.class), - INTEGER(Integer.class), - LONG(Long.class), - FLOAT(Float.class), - DOUBLE(Double.class), - JAVA_SQL_TIME(Time.class), - JAVA_SQL_TIMESTAMP(Timestamp.class), - JAVA_SQL_DATE(java.sql.Date.class), - JAVA_UTIL_DATE(java.util.Date.class), - BYTE_STRING(ByteString.class), - STRING(String.class), - - /** Values are represented as some sub-class of {@link Number}. - * The JSON encoding does this. */ - NUMBER(Number.class), - - ARRAY(Array.class), - MULTISET(List.class), - STRUCT(Struct.class), - - OBJECT(Object.class); - - public final Class clazz; - - public static final Map<Class, Rep> VALUE_MAP; - - static { - Map<Class, Rep> builder = new HashMap<>(); - for (Rep rep : values()) { - builder.put(rep.clazz, rep); - } - VALUE_MAP = Collections.unmodifiableMap(builder); - } - - Rep(Class clazz) { - this.clazz = clazz; - } - - public static Rep of(Type clazz) { - //noinspection SuspiciousMethodCalls - final Rep rep = VALUE_MAP.get(clazz); - return rep != null ? rep : OBJECT; - } - - /** Returns the value of a column of this type from a result set. */ - public Object jdbcGet(ResultSet resultSet, int i) throws SQLException { - switch (this) { - case PRIMITIVE_BOOLEAN: - return resultSet.getBoolean(i); - case PRIMITIVE_BYTE: - return resultSet.getByte(i); - case PRIMITIVE_SHORT: - return resultSet.getShort(i); - case PRIMITIVE_INT: - return resultSet.getInt(i); - case PRIMITIVE_LONG: - return resultSet.getLong(i); - case PRIMITIVE_FLOAT: - return resultSet.getFloat(i); - case PRIMITIVE_DOUBLE: - return resultSet.getDouble(i); - case BOOLEAN: - final boolean aBoolean = resultSet.getBoolean(i); - return resultSet.wasNull() ? null : aBoolean; - case BYTE: - final byte aByte = resultSet.getByte(i); - return resultSet.wasNull() ? null : aByte; - case SHORT: - final short aShort = resultSet.getShort(i); - return resultSet.wasNull() ? null : aShort; - case INTEGER: - final int anInt = resultSet.getInt(i); - return resultSet.wasNull() ? null : anInt; - case LONG: - final long aLong = resultSet.getLong(i); - return resultSet.wasNull() ? null : aLong; - case FLOAT: - final float aFloat = resultSet.getFloat(i); - return resultSet.wasNull() ? null : aFloat; - case DOUBLE: - final double aDouble = resultSet.getDouble(i); - return resultSet.wasNull() ? null : aDouble; - case JAVA_SQL_DATE: - return resultSet.getDate(i); - case JAVA_SQL_TIME: - return resultSet.getTime(i); - case JAVA_SQL_TIMESTAMP: - return resultSet.getTimestamp(i); - case ARRAY: - return resultSet.getArray(i); - case STRUCT: - return resultSet.getObject(i, Struct.class); - default: - return resultSet.getObject(i); - } - } - - public Common.Rep toProto() { - return Common.Rep.valueOf(name()); - } - - public static Rep fromProto(Common.Rep proto) { - return Rep.valueOf(proto.name()); - } - } - - /** Base class for a column type. */ - @JsonTypeInfo( - use = JsonTypeInfo.Id.NAME, - property = "type", - defaultImpl = ScalarType.class) - @JsonSubTypes({ - @JsonSubTypes.Type(value = ScalarType.class, name = "scalar"), - @JsonSubTypes.Type(value = StructType.class, name = "struct"), - @JsonSubTypes.Type(value = ArrayType.class, name = "array") }) - public static class AvaticaType { - public final int id; - public final String name; - - /** The type of the field that holds the value. Not a JDBC property. */ - public final Rep rep; - - public AvaticaType(int id, String name, Rep rep) { - this.id = id; - this.name = Objects.requireNonNull(name); - this.rep = Objects.requireNonNull(rep); - } - - public String columnClassName() { - return SqlType.valueOf(id).boxedClass().getName(); - } - - public AvaticaType setRep(Rep rep) { - throw new UnsupportedOperationException(); - } - - public Common.AvaticaType toProto() { - Common.AvaticaType.Builder builder = Common.AvaticaType.newBuilder(); - - builder.setName(name); - builder.setId(id); - builder.setRep(rep.toProto()); - - return builder.build(); - } - - public static AvaticaType fromProto(Common.AvaticaType proto) { - Common.Rep repProto = proto.getRep(); - Rep rep = Rep.valueOf(repProto.name()); - AvaticaType type; - - if (proto.hasComponent()) { - // ArrayType - // recurse on the type for the array elements - AvaticaType nestedType = AvaticaType.fromProto(proto.getComponent()); - type = ColumnMetaData.array(nestedType, proto.getName(), rep); - } else if (proto.getColumnsCount() > 0) { - // StructType - List<ColumnMetaData> columns = new ArrayList<>(proto.getColumnsCount()); - for (Common.ColumnMetaData protoColumn : proto.getColumnsList()) { - columns.add(ColumnMetaData.fromProto(protoColumn)); - } - type = ColumnMetaData.struct(columns); - } else { - // ScalarType - type = ColumnMetaData.scalar(proto.getId(), proto.getName(), rep); - } - - return type; - } - - @Override public int hashCode() { - return Objects.hash(id, name, rep); - } - - @Override public boolean equals(Object o) { - return o == this - || o instanceof AvaticaType - && id == ((AvaticaType) o).id - && Objects.equals(name, ((AvaticaType) o).name) - && rep == ((AvaticaType) o).rep; - } - } - - /** Scalar type. */ - public static class ScalarType extends AvaticaType { - @JsonCreator - public ScalarType(@JsonProperty("id") int id, - @JsonProperty("name") String name, - @JsonProperty("rep") Rep rep) { - super(id, name, rep); - } - - @Override public AvaticaType setRep(Rep rep) { - return new ScalarType(id, name, rep); - } - } - - /** Record type. */ - public static class StructType extends AvaticaType { - public final List<ColumnMetaData> columns; - - @JsonCreator - public StructType(List<ColumnMetaData> columns) { - super(Types.STRUCT, "STRUCT", ColumnMetaData.Rep.OBJECT); - this.columns = columns; - } - - @Override public Common.AvaticaType toProto() { - Common.AvaticaType.Builder builder = Common.AvaticaType.newBuilder(super.toProto()); - for (ColumnMetaData valueType : columns) { - builder.addColumns(valueType.toProto()); - } - return builder.build(); - } - - @Override public int hashCode() { - return Objects.hash(id, name, rep, columns); - } - - @Override public boolean equals(Object o) { - return o == this - || o instanceof StructType - && super.equals(o) - && Objects.equals(columns, ((StructType) o).columns); - } - } - - /** Array type. */ - public static class ArrayType extends AvaticaType { - public final AvaticaType component; - - /** - * Not for public use. Use {@link ColumnMetaData#array(AvaticaType, String, Rep)}. - */ - @JsonCreator - public ArrayType(@JsonProperty("type") int type, @JsonProperty("name") String typeName, - @JsonProperty("rep") Rep representation, @JsonProperty("component") AvaticaType component) { - super(type, typeName, representation); - this.component = component; - } - - @Override public Common.AvaticaType toProto() { - Common.AvaticaType.Builder builder = Common.AvaticaType.newBuilder(super.toProto()); - - builder.setComponent(component.toProto()); - - return builder.build(); - } - - @Override public int hashCode() { - return Objects.hash(id, name, rep, component); - } - - @Override public boolean equals(Object o) { - return o == this - || o instanceof ArrayType - && super.equals(o) - && Objects.equals(component, ((ArrayType) o).component); - } - } -} - -// End ColumnMetaData.java http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/src/main/java/org/apache/calcite/avatica/ConnectStringParser.java ---------------------------------------------------------------------- diff --git a/avatica/src/main/java/org/apache/calcite/avatica/ConnectStringParser.java b/avatica/src/main/java/org/apache/calcite/avatica/ConnectStringParser.java deleted file mode 100644 index 0145024..0000000 --- a/avatica/src/main/java/org/apache/calcite/avatica/ConnectStringParser.java +++ /dev/null @@ -1,391 +0,0 @@ -/* - * 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.sql.SQLException; -import java.util.Map; -import java.util.Properties; - -/** - * ConnectStringParser is a utility class that parses or creates a JDBC connect - * string according to the - * <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms722656(v=vs.85).aspx"> - * OLE DB Connection String Syntax</a>. - * - * <p>This code was adapted from Mondrian's mondrian.olap.Util class. - * The primary differences between this and its Mondrian progenitor are: - * - * <ul> - * <li>use of regular {@link Properties} for compatibility with the JDBC API - * (replaces Mondrian's use of its own order-preserving and case-insensitive - * PropertyList)</li> - * - * <li>ability to pass to {@link #parse} a pre-existing Properties object into - * which properties are to be parsed, possibly overriding prior values</li> - * - * <li>use of {@link SQLException}s rather than unchecked - * {@link RuntimeException}s</li> - * - * <li>static members for parsing and creating connect strings</li> - * - * </ul> - * - * <p>ConnectStringParser has a private constructor. Callers use the static - * members: - * - * <dl> - * <dt>{@link #parse(String)} - * <dd>Parses the connect string into a new Properties object. - * - * <dt>{@link #parse(String, Properties)} - * <dd>Parses the connect string into an existing Properties object. - * - * <dt>{@link #getParamString(Properties)} - * <dd>Returns a param string, quoted and escaped as needed, to represent the - * supplied name-value pairs. - * </dl> - */ -public class ConnectStringParser { - //~ Instance fields -------------------------------------------------------- - - private final String s; - private final int n; - private int i; - private final StringBuilder nameBuf = new StringBuilder(); - private final StringBuilder valueBuf = new StringBuilder(); - - //~ Constructors ----------------------------------------------------------- - - /** - * Creates a new connect string parser. - * - * @param s connect string to parse - * - * @see #parse(String) - * @see #parse(String, Properties) - */ - private ConnectStringParser(String s) { - this.s = s; - this.i = 0; - this.n = s.length(); - } - - //~ Methods ---------------------------------------------------------------- - - /** - * Parses the connect string into a new Properties object. - * - * @param s connect string to parse - * - * @return properties object with parsed params - * - * @throws SQLException error parsing name-value pairs - */ - public static Properties parse(String s) - throws SQLException { - return new ConnectStringParser(s).parseInternal(null); - } - - /** - * Parses the connect string into an existing Properties object. - * - * @param s connect string to parse - * @param props optional properties object, may be <code>null</code> - * - * @return properties object with parsed params; if an input <code> - * props</code> was supplied, any duplicate properties will have been - * replaced by those from the connect string. - * - * @throws SQLException error parsing name-value pairs - */ - public static Properties parse(String s, Properties props) - throws SQLException { - return new ConnectStringParser(s).parseInternal(props); - } - - /** - * Parses the connect string into a Properties object. Note that the string - * can only be parsed once. Subsequent calls return empty/unchanged - * Properties. - * - * @param props optional properties object, may be <code>null</code> - * - * @return properties object with parsed params; if an input <code> - * props</code> was supplied, any duplicate properties will have been - * replaced by those from the connect string. - * - * @throws SQLException error parsing name-value pairs - */ - Properties parseInternal(Properties props) - throws SQLException { - if (props == null) { - props = new Properties(); - } - while (i < n) { - parsePair(props); - } - return props; - } - - /** - * Reads "name=value;" or "name=value<EOF>". - * - * @throws SQLException error parsing value - */ - void parsePair(Properties props) - throws SQLException { - String name = parseName(); - String value; - if (i >= n) { - value = ""; - } else if (s.charAt(i) == ';') { - i++; - value = ""; - } else { - value = parseValue(); - } - props.put(name, value); - } - - /** - * Reads "name=". Name can contain equals sign if equals sign is doubled. - */ - String parseName() { - nameBuf.setLength(0); - while (true) { - char c = s.charAt(i); - switch (c) { - case '=': - i++; - if ((i < n) && ((c = s.charAt(i)) == '=')) { - // doubled equals sign; take one of them, and carry on - i++; - nameBuf.append(c); - break; - } - String name = nameBuf.toString(); - name = name.trim(); - return name; - case ' ': - if (nameBuf.length() == 0) { - // ignore preceding spaces - i++; - break; - } - // fall through - default: - nameBuf.append(c); - i++; - if (i >= n) { - return nameBuf.toString().trim(); - } - } - } - } - - /** - * Reads "value;" or "value<EOF>" - * - * @throws SQLException if find an unterminated quoted value - */ - String parseValue() - throws SQLException { - char c; - - // skip over leading white space - while ((c = s.charAt(i)) == ' ') { - i++; - if (i >= n) { - return ""; - } - } - if ((c == '"') || (c == '\'')) { - String value = parseQuoted(c); - - // skip over trailing white space - while (i < n && s.charAt(i) == ' ') { - i++; - } - if (i >= n) { - return value; - } else if (s.charAt(i) == ';') { - i++; - return value; - } else { - throw new SQLException( - "quoted value ended too soon, at position " + i - + " in '" + s + "'"); - } - } else { - String value; - int semi = s.indexOf(';', i); - if (semi >= 0) { - value = s.substring(i, semi); - i = semi + 1; - } else { - value = s.substring(i); - i = n; - } - return value.trim(); - } - } - - /** - * Reads a string quoted by a given character. Occurrences of the quoting - * character must be doubled. For example, <code>parseQuoted('"')</code> - * reads <code>"a ""new"" string"</code> and returns <code>a "new" - * string</code>. - * - * @throws SQLException if find an unterminated quoted value - */ - String parseQuoted(char q) - throws SQLException { - char c = s.charAt(i++); - if (c != q) { - throw new AssertionError("c != q: c=" + c + " q=" + q); - } - valueBuf.setLength(0); - while (i < n) { - c = s.charAt(i); - if (c == q) { - i++; - if (i < n) { - c = s.charAt(i); - if (c == q) { - valueBuf.append(c); - i++; - continue; - } - } - return valueBuf.toString(); - } else { - valueBuf.append(c); - i++; - } - } - throw new SQLException( - "Connect string '" + s - + "' contains unterminated quoted value '" - + valueBuf.toString() + "'"); - } - - /** - * Returns a param string, quoted and escaped as needed, to represent the - * supplied name-value pairs. - * - * @param props name-value pairs - * - * @return param string, never <code>null</code> - */ - public static String getParamString(Properties props) { - if (props == null) { - return ""; - } - - StringBuilder buf = new StringBuilder(); - for (Map.Entry<String, String> entry : toMap(props).entrySet()) { - final String name = entry.getKey(); - final String value = entry.getValue(); - String quote = ""; - if (buf.length() > 0) { - buf.append(';'); - } - - // write parameter name - if (name.startsWith(" ") || name.endsWith(" ")) { - quote = "'"; - buf.append(quote); - } - int len = name.length(); - for (int i = 0; i < len; ++i) { - char c = name.charAt(i); - if (c == '=') { - buf.append('='); - } - buf.append(c); - } - - buf.append(quote); // might be empty - quote = ""; - - buf.append('='); - - // write parameter value - len = value.length(); - boolean hasSemi = value.indexOf(';') >= 0; - boolean hasSQ = value.indexOf('\'') >= 0; - boolean hasDQ = value.indexOf('"') >= 0; - if (value.startsWith(" ") || value.endsWith(" ")) { - quote = "'"; - } else if (hasSemi || hasSQ || hasDQ) { - // try to choose the least painful quote - if (value.startsWith("\"")) { - quote = "'"; - } else if (value.startsWith("'")) { - quote = "\""; - } else { - quote = hasSQ ? "\"" : "'"; - } - } - char q; - if (quote.length() > 0) { - buf.append(quote); - q = quote.charAt(0); - } else { - q = '\0'; - } - for (int i = 0; i < len; ++i) { - char c = value.charAt(i); - if (c == q) { - buf.append(q); - } - buf.append(c); - } - buf.append(quote); // might be empty - } - - return buf.toString(); - } - - /** - * Converts a {@link Properties} object to a <code>{@link Map}<String, - * String></code>. - * - * <p>This is necessary because {@link Properties} is a dinosaur class. It - * ought to extend <code>Map<String,String></code>, but instead - * extends <code>{@link java.util.Hashtable}<Object,Object></code>. - * - * <p>Typical usage, to iterate over a {@link Properties}: - * - * <blockquote> - * <code> - * Properties properties;<br> - * for (Map.Entry<String, String> entry = - * Util.toMap(properties).entrySet()) {<br> - * println("key=" + entry.getKey() + ", value=" + entry.getValue());<br> - * } - * </code> - * </blockquote> - */ - public static Map<String, String> toMap( - final Properties properties) { - //noinspection unchecked - return (Map) properties; - } -} - -// End ConnectStringParser.java http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/src/main/java/org/apache/calcite/avatica/ConnectionConfig.java ---------------------------------------------------------------------- diff --git a/avatica/src/main/java/org/apache/calcite/avatica/ConnectionConfig.java b/avatica/src/main/java/org/apache/calcite/avatica/ConnectionConfig.java deleted file mode 100644 index 8e4790c..0000000 --- a/avatica/src/main/java/org/apache/calcite/avatica/ConnectionConfig.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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 org.apache.calcite.avatica.remote.AvaticaHttpClientFactory; -import org.apache.calcite.avatica.remote.Service; - -/** - * Connection configuration. - */ -public interface ConnectionConfig { - /** @see BuiltInConnectionProperty#SCHEMA */ - String schema(); - /** @see BuiltInConnectionProperty#TIME_ZONE */ - String timeZone(); - /** @see BuiltInConnectionProperty#FACTORY */ - Service.Factory factory(); - /** @see BuiltInConnectionProperty#URL */ - String url(); - /** @see BuiltInConnectionProperty#SERIALIZATION */ - String serialization(); - AvaticaHttpClientFactory httpClientFactory(); - String httpClientClass(); -} - -// End ConnectionConfig.java http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/src/main/java/org/apache/calcite/avatica/ConnectionConfigImpl.java ---------------------------------------------------------------------- diff --git a/avatica/src/main/java/org/apache/calcite/avatica/ConnectionConfigImpl.java b/avatica/src/main/java/org/apache/calcite/avatica/ConnectionConfigImpl.java deleted file mode 100644 index bbeefea..0000000 --- a/avatica/src/main/java/org/apache/calcite/avatica/ConnectionConfigImpl.java +++ /dev/null @@ -1,239 +0,0 @@ -/* - * 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 org.apache.calcite.avatica.remote.AvaticaHttpClientFactory; -import org.apache.calcite.avatica.remote.Service; - -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Properties; - -/** Implementation of {@link ConnectionConfig}. */ -public class ConnectionConfigImpl implements ConnectionConfig { - protected final Properties properties; - - public ConnectionConfigImpl(Properties properties) { - this.properties = properties; - } - - public String schema() { - return BuiltInConnectionProperty.SCHEMA.wrap(properties).getString(); - } - - public String timeZone() { - return BuiltInConnectionProperty.TIME_ZONE.wrap(properties).getString(); - } - - public Service.Factory factory() { - return BuiltInConnectionProperty.FACTORY.wrap(properties) - .getPlugin(Service.Factory.class, null); - } - - public String url() { - return BuiltInConnectionProperty.URL.wrap(properties).getString(); - } - - public String serialization() { - return BuiltInConnectionProperty.SERIALIZATION.wrap(properties).getString(); - } - - public AvaticaHttpClientFactory httpClientFactory() { - return BuiltInConnectionProperty.HTTP_CLIENT_FACTORY.wrap(properties) - .getPlugin(AvaticaHttpClientFactory.class, null); - } - - public String httpClientClass() { - return BuiltInConnectionProperty.HTTP_CLIENT_IMPL.wrap(properties).getString(); - } - - /** Converts a {@link Properties} object containing (name, value) - * pairs into a map whose keys are - * {@link org.apache.calcite.avatica.InternalProperty} objects. - * - * <p>Matching is case-insensitive. Throws if a property is not known. - * If a property occurs more than once, takes the last occurrence.</p> - * - * @param properties Properties - * @return Map - * @throws RuntimeException if a property is not known - */ - public static Map<ConnectionProperty, String> parse(Properties properties, - Map<String, ? extends ConnectionProperty> nameToProps) { - final Map<ConnectionProperty, String> map = - new LinkedHashMap<ConnectionProperty, String>(); - for (String name : properties.stringPropertyNames()) { - final ConnectionProperty connectionProperty = - nameToProps.get(name.toUpperCase()); - if (connectionProperty == null) { - // For now, don't throw. It messes up sub-projects. - //throw new RuntimeException("Unknown property '" + name + "'"); - continue; - } - map.put(connectionProperty, properties.getProperty(name)); - } - return map; - } - - /** The combination of a property definition and a map of property values. */ - public static class PropEnv { - final Map<? extends ConnectionProperty, String> map; - private final ConnectionProperty property; - - public PropEnv(Map<? extends ConnectionProperty, String> map, - ConnectionProperty property) { - this.map = map; - this.property = property; - } - - private <T> T get_(Converter<T> converter, String defaultValue) { - final String s = map.get(property); - if (s != null) { - return converter.apply(property, s); - } - return converter.apply(property, defaultValue); - } - - /** Returns the string value of this property, or null if not specified and - * no default. */ - public String getString() { - return getString((String) property.defaultValue()); - } - - /** Returns the string value of this property, or null if not specified and - * no default. */ - public String getString(String defaultValue) { - assert property.type() == ConnectionProperty.Type.STRING; - return get_(IDENTITY_CONVERTER, defaultValue); - } - - /** Returns the boolean value of this property. Throws if not set and no - * default. */ - public boolean getBoolean() { - return getBoolean((Boolean) property.defaultValue()); - } - - /** Returns the boolean value of this property. Throws if not set and no - * default. */ - public boolean getBoolean(boolean defaultValue) { - assert property.type() == ConnectionProperty.Type.BOOLEAN; - return get_(BOOLEAN_CONVERTER, Boolean.toString(defaultValue)); - } - - /** Returns the enum value of this property. Throws if not set and no - * default. */ - public <E extends Enum<E>> E getEnum(Class<E> enumClass) { - //noinspection unchecked - return getEnum(enumClass, (E) property.defaultValue()); - } - - /** Returns the enum value of this property. Throws if not set and no - * default. */ - public <E extends Enum<E>> E getEnum(Class<E> enumClass, E defaultValue) { - assert property.type() == ConnectionProperty.Type.ENUM; - //noinspection unchecked - return get_(enumConverter(enumClass), defaultValue.name()); - } - - /** Returns an instance of a plugin. - * - * <p>Throws if not set and no default. - * Also throws if the class does not implement the required interface, - * or if it does not have a public default constructor or an public static - * field called {@code #INSTANCE}. */ - public <T> T getPlugin(Class<T> pluginClass, T defaultInstance) { - return getPlugin(pluginClass, (String) property.defaultValue(), - defaultInstance); - } - - /** Returns an instance of a plugin, using a given class name if none is - * set. - * - * <p>Throws if not set and no default. - * Also throws if the class does not implement the required interface, - * or if it does not have a public default constructor or an public static - * field called {@code #INSTANCE}. */ - public <T> T getPlugin(Class<T> pluginClass, String defaultClassName, - T defaultInstance) { - assert property.type() == ConnectionProperty.Type.PLUGIN; - return get_(pluginConverter(pluginClass, defaultInstance), - defaultClassName); - } - } - - /** Callback to parse a property from string to its native type. */ - public interface Converter<T> { - T apply(ConnectionProperty connectionProperty, String s); - } - - public static final Converter<Boolean> BOOLEAN_CONVERTER = - new Converter<Boolean>() { - public Boolean apply(ConnectionProperty connectionProperty, String s) { - if (s == null) { - throw new RuntimeException("Required property '" - + connectionProperty.camelName() + "' not specified"); - } - return Boolean.parseBoolean(s); - } - }; - - public static final Converter<String> IDENTITY_CONVERTER = - new Converter<String>() { - public String apply(ConnectionProperty connectionProperty, String s) { - return s; - } - }; - - public static <E extends Enum> Converter<E> enumConverter( - final Class<E> enumClass) { - return new Converter<E>() { - public E apply(ConnectionProperty connectionProperty, String s) { - if (s == null) { - throw new RuntimeException("Required property '" - + connectionProperty.camelName() + "' not specified"); - } - try { - return (E) Enum.valueOf(enumClass, s); - } catch (IllegalArgumentException e) { - throw new RuntimeException("Property '" + s + "' not valid for enum " - + enumClass.getName()); - } - } - }; - } - - public static <T> Converter<T> pluginConverter(final Class<T> pluginClass, - final T defaultInstance) { - return new Converter<T>() { - public T apply(ConnectionProperty connectionProperty, String s) { - if (s == null) { - if (defaultInstance != null) { - return defaultInstance; - } - if (!connectionProperty.required()) { - return null; - } - throw new RuntimeException("Required property '" - + connectionProperty.camelName() + "' not specified"); - } - return AvaticaUtils.instantiatePlugin(pluginClass, s); - } - }; - } -} - -// End ConnectionConfigImpl.java http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/src/main/java/org/apache/calcite/avatica/ConnectionPropertiesImpl.java ---------------------------------------------------------------------- diff --git a/avatica/src/main/java/org/apache/calcite/avatica/ConnectionPropertiesImpl.java b/avatica/src/main/java/org/apache/calcite/avatica/ConnectionPropertiesImpl.java deleted file mode 100644 index c147ecc..0000000 --- a/avatica/src/main/java/org/apache/calcite/avatica/ConnectionPropertiesImpl.java +++ /dev/null @@ -1,279 +0,0 @@ -/* - * 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 org.apache.calcite.avatica.proto.Common; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.google.protobuf.Descriptors.FieldDescriptor; - -import java.sql.Connection; -import java.sql.SQLException; -import java.util.Objects; - -/** Concrete implementation of {@link Meta.ConnectionProperties}. Provides additional state - * tracking to enable {@code RemoteMeta} to lazily push changes up to a query server. - * - * <p>{@code Meta} instances should probably hold authority on the {@code isDirty} - * flag because {@code AvaticaConnection} instances have no way of knowing if they're local or - * remote. - */ -public class ConnectionPropertiesImpl implements Meta.ConnectionProperties { - private static final FieldDescriptor CATALOG_DESCRIPTOR = Common.ConnectionProperties - .getDescriptor().findFieldByNumber(Common.ConnectionProperties.CATALOG_FIELD_NUMBER); - private static final FieldDescriptor SCHEMA_DESCRIPTOR = Common.ConnectionProperties - .getDescriptor().findFieldByNumber(Common.ConnectionProperties.SCHEMA_FIELD_NUMBER); - private static final FieldDescriptor TRANSACTION_ISOLATION_DESCRIPTOR = Common - .ConnectionProperties.getDescriptor().findFieldByNumber( - Common.ConnectionProperties.TRANSACTION_ISOLATION_FIELD_NUMBER); - - private boolean isDirty = false; - private Boolean autoCommit; - private Boolean readOnly; - private Integer transactionIsolation; - private String catalog; - private String schema; - - // TODO: replace with Meta.ConnectionProperties$EMPTY instance? - public ConnectionPropertiesImpl() {} - - public ConnectionPropertiesImpl(Connection conn) throws SQLException { - this(conn.getAutoCommit(), conn.isReadOnly(), conn.getTransactionIsolation(), - conn.getCatalog(), conn.getSchema()); - } - - @JsonCreator - public ConnectionPropertiesImpl( - @JsonProperty("autoCommit") Boolean autoCommit, - @JsonProperty("readOnly") Boolean readOnly, - @JsonProperty("transactionIsolation") Integer transactionIsolation, - @JsonProperty("catalog") String catalog, - @JsonProperty("schema") String schema) { - this.autoCommit = autoCommit; - this.readOnly = readOnly; - this.transactionIsolation = transactionIsolation; - this.catalog = catalog; - this.schema = schema; - } - - public ConnectionPropertiesImpl setDirty(boolean val) { - this.isDirty = val; - return this; - } - - public boolean isDirty() { - return this.isDirty; - } - - @Override public boolean isEmpty() { - return autoCommit == null && readOnly == null && transactionIsolation == null - && catalog == null && schema == null; - } - - /** Overwrites fields in {@code this} with any non-null fields in {@code that}. Sets - * {@code isDirty} if any fields are changed. - * - * @return {@code this} - */ - @Override public ConnectionPropertiesImpl merge(Meta.ConnectionProperties that) { - if (this == that) { - return this; - } - if (that.isAutoCommit() != null && this.autoCommit != that.isAutoCommit()) { - this.autoCommit = that.isAutoCommit(); - this.isDirty = true; - } - if (that.isReadOnly() != null && this.readOnly != that.isReadOnly()) { - this.readOnly = that.isReadOnly(); - this.isDirty = true; - } - if (that.getTransactionIsolation() != null - && !that.getTransactionIsolation().equals(this.transactionIsolation)) { - this.transactionIsolation = that.getTransactionIsolation(); - this.isDirty = true; - } - if (that.getCatalog() != null && !that.getCatalog().equalsIgnoreCase(this.catalog)) { - this.catalog = that.getCatalog(); - this.isDirty = true; - } - if (that.getSchema() != null && !that.getSchema().equalsIgnoreCase(this.schema)) { - this.schema = that.getSchema(); - this.isDirty = true; - } - return this; - } - - /** Sets {@code autoCommit} status and flag as dirty. - * - * @return {@code this} - */ - @Override public Meta.ConnectionProperties setAutoCommit(boolean val) { - this.autoCommit = val; - this.isDirty = true; - return this; - } - - @Override public Boolean isAutoCommit() { - return this.autoCommit; - } - - /** Sets {@code readOnly} status and flag as dirty. - * - * @return {@code this} - */ - @Override public Meta.ConnectionProperties setReadOnly(boolean val) { - this.readOnly = val; - this.isDirty = true; - return this; - } - - @Override public Boolean isReadOnly() { - return this.readOnly; - } - - /** Sets {@code transactionIsolation} status and flag as dirty. - * - * @return {@code this} - */ - @Override public Meta.ConnectionProperties setTransactionIsolation(int val) { - this.transactionIsolation = val; - this.isDirty = true; - return this; - } - - public Integer getTransactionIsolation() { - return this.transactionIsolation; - } - - /** Sets {@code catalog} and flag as dirty. - * - * @return {@code this} - */ - @Override public Meta.ConnectionProperties setCatalog(String val) { - this.catalog = val; - this.isDirty = true; - return this; - } - - @Override public String getCatalog() { - return this.catalog; - } - - /** Sets {@code schema} and flag as dirty. - * - * @return {@code this} - */ - @Override public Meta.ConnectionProperties setSchema(String val) { - this.schema = val; - this.isDirty = true; - return this; - } - - public String getSchema() { - return this.schema; - } - - @Override public int hashCode() { - return Objects.hash(autoCommit, catalog, isDirty, readOnly, schema, - transactionIsolation); - } - - @Override public boolean equals(Object o) { - return o == this - || o instanceof ConnectionPropertiesImpl - && Objects.equals(autoCommit, ((ConnectionPropertiesImpl) o).autoCommit) - && Objects.equals(catalog, ((ConnectionPropertiesImpl) o).catalog) - && isDirty == ((ConnectionPropertiesImpl) o).isDirty - && Objects.equals(readOnly, ((ConnectionPropertiesImpl) o).readOnly) - && Objects.equals(schema, ((ConnectionPropertiesImpl) o).schema) - && Objects.equals(transactionIsolation, - ((ConnectionPropertiesImpl) o).transactionIsolation); - } - - public Common.ConnectionProperties toProto() { - Common.ConnectionProperties.Builder builder = Common.ConnectionProperties.newBuilder(); - - if (null != autoCommit) { - builder.setHasAutoCommit(true); - builder.setAutoCommit(autoCommit.booleanValue()); - } else { - // Be explicit to avoid default value confusion - builder.setHasAutoCommit(false); - } - - if (null != catalog) { - builder.setCatalog(catalog); - } - - builder.setIsDirty(isDirty); - - if (null != readOnly) { - builder.setHasReadOnly(true); - builder.setReadOnly(readOnly.booleanValue()); - } else { - // Be explicit to avoid default value confusion - builder.setHasReadOnly(false); - } - - if (null != schema) { - builder.setSchema(schema); - } - - if (null != transactionIsolation) { - builder.setTransactionIsolation(transactionIsolation.intValue()); - } - - return builder.build(); - } - - public static ConnectionPropertiesImpl fromProto(Common.ConnectionProperties proto) { - String catalog = null; - if (proto.hasField(CATALOG_DESCRIPTOR)) { - catalog = proto.getCatalog(); - } - - String schema = null; - if (proto.hasField(SCHEMA_DESCRIPTOR)) { - schema = proto.getSchema(); - } - - Boolean autoCommit = null; - if (proto.getHasAutoCommit()) { - autoCommit = Boolean.valueOf(proto.getAutoCommit()); - } - - Boolean readOnly = null; - if (proto.getHasReadOnly()) { - readOnly = Boolean.valueOf(proto.getReadOnly()); - } - - Integer transactionIsolation = null; - if (proto.hasField(TRANSACTION_ISOLATION_DESCRIPTOR)) { - transactionIsolation = Integer.valueOf(proto.getTransactionIsolation()); - } - - ConnectionPropertiesImpl impl = new ConnectionPropertiesImpl(autoCommit, readOnly, - transactionIsolation, catalog, schema); - - impl.setDirty(proto.getIsDirty()); - - return impl; - } -} - -// End ConnectionPropertiesImpl.java http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/src/main/java/org/apache/calcite/avatica/ConnectionProperty.java ---------------------------------------------------------------------- diff --git a/avatica/src/main/java/org/apache/calcite/avatica/ConnectionProperty.java b/avatica/src/main/java/org/apache/calcite/avatica/ConnectionProperty.java deleted file mode 100644 index d380d80..0000000 --- a/avatica/src/main/java/org/apache/calcite/avatica/ConnectionProperty.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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.util.Properties; - -/** - * Definition of a property that may be specified on the JDBC connect string. - * {@link BuiltInConnectionProperty} enumerates built-in properties, but - * there may be others; the list is not closed. - */ -public interface ConnectionProperty { - /** The name of this property. (E.g. "MATERIALIZATIONS_ENABLED".) */ - String name(); - - /** The name of this property in camel-case. - * (E.g. "materializationsEnabled".) */ - String camelName(); - - /** Returns the default value of this property. The type must match its data - * type. */ - Object defaultValue(); - - /** Returns the data type of this property. */ - Type type(); - - /** Wraps this property with a properties object from which its value can be - * obtained when needed. */ - ConnectionConfigImpl.PropEnv wrap(Properties properties); - - /** Whether the property is mandatory. */ - boolean required(); - - /** Data type of property. */ - enum Type { - BOOLEAN, - STRING, - ENUM, - PLUGIN; - - public boolean valid(Object defaultValue) { - switch (this) { - case BOOLEAN: - return defaultValue instanceof Boolean; - case STRING: - case PLUGIN: - return defaultValue instanceof String; - default: - return defaultValue instanceof Enum; - } - } - } -} - -// End ConnectionProperty.java http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/src/main/java/org/apache/calcite/avatica/DriverVersion.java ---------------------------------------------------------------------- diff --git a/avatica/src/main/java/org/apache/calcite/avatica/DriverVersion.java b/avatica/src/main/java/org/apache/calcite/avatica/DriverVersion.java deleted file mode 100644 index 15c966a..0000000 --- a/avatica/src/main/java/org/apache/calcite/avatica/DriverVersion.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * 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.valueOf(s[0]); - final int minor = Integer.valueOf(s[1]); - try { - majorVersion = - Integer.valueOf(properties.getProperty("driver.version.major")); - } catch (NumberFormatException e) { - majorVersion = major; - } - try { - minorVersion = - Integer.valueOf(properties.getProperty("driver.version.minor")); - } catch (NumberFormatException e) { - minorVersion = minor; - } - try { - databaseMajorVersion = - Integer.valueOf(properties.getProperty("database.version.major")); - } catch (NumberFormatException e) { - databaseMajorVersion = major; - } - try { - databaseMinorVersion = - Integer.valueOf(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 http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/src/main/java/org/apache/calcite/avatica/Handler.java ---------------------------------------------------------------------- diff --git a/avatica/src/main/java/org/apache/calcite/avatica/Handler.java b/avatica/src/main/java/org/apache/calcite/avatica/Handler.java deleted file mode 100644 index 831e66d..0000000 --- a/avatica/src/main/java/org/apache/calcite/avatica/Handler.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * 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.sql.SQLException; - -/** - * Called at various points in the JDBC lifecycle. - * - * <p>Most drivers will use {@link HandlerImpl}, which provides no-op - * implementations of all methods. You only need to override methods if you - * need to achieve special effects.</p> - */ -public interface Handler { - /** Called by container when a connection is being created. - * - * <p>If the implementation of this method throws, the connection - * will not be created.</p> - * - * @param connection Connection - * @throws SQLException on error - */ - void onConnectionInit(AvaticaConnection connection) throws SQLException; - - /** Called by container when a connection is being closed. - * - * <p>If the implementation of this method throws, the call to - * {@link java.sql.Connection#close} that triggered this method will throw an - * exception, but the connection will still be marked closed.</p> - * - * @param connection Connection - */ - void onConnectionClose(AvaticaConnection connection); - - /** Called by container when a statement is being executed. - * - * <p>If the session would like the statement results stored in a temporary - * table, {@code resultSink} is not null. - * The provider must call its {@link ResultSink#toBeCompleted} - * method at some point during execution (not necessarily before the call to - * this method returns).</p> - * - * @param statement Statement - * @param resultSink Place to put result of query. Null if container does not - * want results stored to a temporary table - * @throws RuntimeException on error - */ - void onStatementExecute( - AvaticaStatement statement, - ResultSink resultSink); - - /** Called by container when a statement is being closed. - * - * <p>This method is called after marking the statement closed, and after - * closing any open {@link java.sql.ResultSet} objects.</p> - * - * <p>If the implementation of this method throws, the call to - * {@link java.sql.Statement#close} that triggered this method will throw an - * exception, but the statement will still be marked closed. - * - * @param statement Statement - * @throws RuntimeException on error - */ - void onStatementClose(AvaticaStatement statement); - - /** Handler for temporary tables. */ - interface ResultSink { - /** Registers a temporary table. */ - void toBeCompleted(); - } -} - -// End Handler.java http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/src/main/java/org/apache/calcite/avatica/HandlerImpl.java ---------------------------------------------------------------------- diff --git a/avatica/src/main/java/org/apache/calcite/avatica/HandlerImpl.java b/avatica/src/main/java/org/apache/calcite/avatica/HandlerImpl.java deleted file mode 100644 index c2e6c1a..0000000 --- a/avatica/src/main/java/org/apache/calcite/avatica/HandlerImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.sql.SQLException; - -/** - * Implementation of {@link Handler} that does nothing for each callback. - * It is recommended implementations of {@code Handler} use this as a base - * class, to ensure forward compatibility. - */ -public class HandlerImpl implements Handler { - public void onConnectionInit(AvaticaConnection connection) - throws SQLException { - // nothing - } - - public void onConnectionClose(AvaticaConnection connection) { - // nothing - } - - public void onStatementExecute( - AvaticaStatement statement, - ResultSink resultSink) { - // nothing - } - - public void onStatementClose(AvaticaStatement statement) { - // nothing - } -} - -// End HandlerImpl.java http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/src/main/java/org/apache/calcite/avatica/Helper.java ---------------------------------------------------------------------- diff --git a/avatica/src/main/java/org/apache/calcite/avatica/Helper.java b/avatica/src/main/java/org/apache/calcite/avatica/Helper.java deleted file mode 100644 index 27c6056..0000000 --- a/avatica/src/main/java/org/apache/calcite/avatica/Helper.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * 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.sql.SQLClientInfoException; -import java.sql.SQLException; -import java.sql.SQLFeatureNotSupportedException; - -/** - * Utility methods, mainly concerning error-handling. - */ -public class Helper { - public static final Helper INSTANCE = new Helper(); - - private Helper() { - } - - public RuntimeException todo() { - return new RuntimeException("todo: implement this method"); - } - - public RuntimeException wrap(String message, Exception e) { - return new RuntimeException(message, e); - } - - public SQLException createException(String message, Exception e) { - return createException(message, null, e); - } - - public SQLException createException(String message, String sql, Exception e) { - if (e instanceof AvaticaClientRuntimeException) { - // The AvaticaClientRuntimeException contains extra information about what/why - // the exception was thrown that we can pass back to the user. - AvaticaClientRuntimeException rte = (AvaticaClientRuntimeException) e; - String serverAddress = null; - if (null != rte.getRpcMetadata()) { - serverAddress = rte.getRpcMetadata().serverAddress; - } - return new AvaticaSqlException(message, rte.getSqlState(), rte.getErrorCode(), - rte.getServerExceptions(), serverAddress); - } - return new SQLException(message, e); - } - - public SQLException createException(String message) { - return new SQLException(message); - } - - public SQLException toSQLException(SQLException exception) { - return exception; - } - - public SQLException unsupported() { - return new SQLFeatureNotSupportedException(); - } - - public SQLClientInfoException clientInfo() { - return new SQLClientInfoException(); - } -} - -// End Helper.java
