All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hazelcast.org.apache.calcite.avatica.ConnectionConfigImpl Maven / Gradle / Ivy

There is a newer version: 5.4.0
Show newest version
/*
 * 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 com.hazelcast.com.liance with
 * the License.  You may obtain a copy of the License at
 *
 * http://www.apache.com.hazelcast.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 com.hazelcast.org.apache.calcite.avatica;

import com.hazelcast.org.apache.calcite.avatica.remote.AvaticaHttpClientFactory;
import com.hazelcast.org.apache.calcite.avatica.remote.HostnameVerificationConfigurable.HostnameVerification;
import com.hazelcast.org.apache.calcite.avatica.remote.Service;

import java.io.File;
import java.math.BigDecimal;
import java.util.LinkedHashMap;
import java.util.Locale;
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 String authentication() {
    return BuiltInConnectionProperty.AUTHENTICATION.wrap(properties).getString();
  }

  public String avaticaUser() {
    return BuiltInConnectionProperty.AVATICA_USER.wrap(properties).getString();
  }

  public String avaticaPassword() {
    return BuiltInConnectionProperty.AVATICA_PASSWORD.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();
  }

  public String kerberosPrincipal() {
    return BuiltInConnectionProperty.PRINCIPAL.wrap(properties).getString();
  }

  public File kerberosKeytab() {
    String keytabPath = BuiltInConnectionProperty.KEYTAB.wrap(properties).getString();
    if (null == keytabPath) {
      return null;
    }
    File keytab = new File(keytabPath);
    if (!keytab.exists() || !keytab.isFile()) {
      throw new RuntimeException("The " + BuiltInConnectionProperty.KEYTAB.name() + " does not "
          + " reference a normal, existent file: " + keytabPath);
    }
    return keytab;
  }

  public File truststore() {
    String filename = BuiltInConnectionProperty.TRUSTSTORE.wrap(properties).getString();
    if (null == filename) {
      return null;
    }
    return new File(filename);
  }

  public String truststorePassword() {
    return BuiltInConnectionProperty.TRUSTSTORE_PASSWORD.wrap(properties).getString();
  }

  public File keystore() {
    String filename = BuiltInConnectionProperty.KEYSTORE.wrap(properties).getString();
    if (null == filename) {
      return null;
    }
    return new File(filename);
  }

  public String keystorePassword() {
    return BuiltInConnectionProperty.KEYSTORE_PASSWORD.wrap(properties).getString();
  }

  public String keyPassword() {
    return BuiltInConnectionProperty.KEY_PASSWORD.wrap(properties).getString();

  }

  public HostnameVerification hostnameVerification() {
    return BuiltInConnectionProperty.HOSTNAME_VERIFICATION.wrap(properties)
        .getEnum(HostnameVerification.class);
  }

  /** Converts a {@link Properties} object containing (name, value)
   * pairs into a map whose keys are
   * {@link com.hazelcast.org.apache.calcite.avatica.InternalProperty} objects.
   *
   * 

Matching is case-insensitive. Throws if a property is not known. * If a property occurs more than once, takes the last occurrence.

* * @param properties Properties * @return Map * @throws RuntimeException if a property is not known */ public static Map parse(Properties properties, Map nameToProps) { final Map map = new LinkedHashMap(); for (String name : properties.stringPropertyNames()) { final ConnectionProperty connectionProperty = nameToProps.get(name.toUpperCase(Locale.ROOT)); 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 com.hazelcast.com.ination of a property definition and a map of property values. */ public static class PropEnv { final Map map; private final ConnectionProperty property; public PropEnv(Map map, ConnectionProperty property) { this.map = map; this.property = property; } private T get_(Converter converter, String defaultValue) { final String s = map.get(property); if (s != null) { return converter.apply(property, s); } return converter.apply(property, defaultValue); } private T getDefaultNull(Converter converter) { final String s = map.get(property); if (s != null) { return converter.apply(property, s); } return null; } /** 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 int value of this property. Throws if not set and no * default. */ public int getInt() { return getInt((Number) property.defaultValue()); } /** Returns the int value of this property. Throws if not set and no * default. */ public int getInt(Number defaultValue) { assert property.type() == ConnectionProperty.Type.NUMBER; return get_(NUMBER_CONVERTER, defaultValue.toString()).intValue(); } /** Returns the long value of this property. Throws if not set and no * default. */ public long getLong() { return getLong((Number) property.defaultValue()); } /** Returns the long value of this property. Throws if not set and no * default. */ public long getLong(Number defaultValue) { assert property.type() == ConnectionProperty.Type.NUMBER; return get_(NUMBER_CONVERTER, defaultValue.toString()).longValue(); } /** Returns the double value of this property. Throws if not set and no * default. */ public double getDouble() { return getDouble((Number) property.defaultValue()); } /** Returns the double value of this property. Throws if not set and no * default. */ public double getDouble(Number defaultValue) { assert property.type() == ConnectionProperty.Type.NUMBER; return get_(NUMBER_CONVERTER, defaultValue.toString()).doubleValue(); } /** 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 getEnum(Class 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 getEnum(Class enumClass, E defaultValue) { if (property.type() != ConnectionProperty.Type.ENUM) { throw new AssertionError("not an enum"); } if (enumClass != property.valueClass()) { throw new AssertionError("wrong value class; expected " + property.valueClass()); } if (defaultValue == null) { return getDefaultNull(enumConverter(enumClass)); } else { return get_(enumConverter(enumClass), defaultValue.name()); } } /** Returns an instance of a plugin. * *

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 getPlugin(Class 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. * *

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 getPlugin(Class 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. * @param the native type */ public interface Converter { T apply(ConnectionProperty connectionProperty, String s); } public static final Converter BOOLEAN_CONVERTER = new Converter() { public Boolean apply(ConnectionProperty connectionProperty, String s) { if (s == null) { throw new RuntimeException("Required property '" + connectionProperty.camelName() + "' not specified"); } return Boolean.parseBoolean(s); } }; static final Map MULTIPLIER_MAP = new LinkedHashMap<>(); static { MULTIPLIER_MAP.put("k", new BigDecimal(1024)); MULTIPLIER_MAP.put("K", new BigDecimal(1024)); MULTIPLIER_MAP.put("m", new BigDecimal(1024 * 1024)); MULTIPLIER_MAP.put("M", new BigDecimal(1024 * 1024)); MULTIPLIER_MAP.put("g", new BigDecimal(1024 * 1024 * 1024)); MULTIPLIER_MAP.put("G", new BigDecimal(1024 * 1024 * 1024)); } public static final Converter NUMBER_CONVERTER = new Converter() { public Number apply(ConnectionProperty connectionProperty, String s) { if (s == null) { throw new RuntimeException("Required property '" + connectionProperty.camelName() + "' not specified"); } BigDecimal multiplier = BigDecimal.ONE; for (Map.Entry e : MULTIPLIER_MAP.entrySet()) { if (s.endsWith(e.getKey())) { multiplier = e.getValue(); s = s.substring(0, s.length() - e.getKey().length()); } } return new BigDecimal(s).multiply(multiplier); } }; public static final Converter IDENTITY_CONVERTER = new Converter() { public String apply(ConnectionProperty connectionProperty, String s) { return s; } }; public static Converter enumConverter( final Class enumClass) { return new Converter() { 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) { // Case insensitive match is OK too. for (E c : enumClass.getEnumConstants()) { if (c.name().equalsIgnoreCase(s)) { return c; } } throw new RuntimeException("Property '" + s + "' not valid for enum " + enumClass.getName()); } } }; } public static Converter pluginConverter(final Class pluginClass, final T defaultInstance) { return new Converter() { 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





© 2015 - 2024 Weber Informatics LLC | Privacy Policy