/*
* Licensed to Crate under one or more contributor license agreements.
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership. Crate 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.
*
* However, if you have executed another commercial license agreement
* with Crate these terms will supersede the license and you may use the
* software solely pursuant to the terms of the relevant commercial
* agreement.
*/
package io.crate.analyze.repositories;
import com.google.common.collect.ImmutableMap;
import io.crate.metadata.settings.*;
import io.crate.sql.tree.Expression;
import io.crate.sql.tree.GenericProperties;
import io.crate.sql.tree.GenericProperty;
import org.elasticsearch.common.inject.AbstractModule;
import org.elasticsearch.common.inject.multibindings.MapBinder;
import java.util.Collections;
import java.util.Map;
import java.util.Optional;
public class RepositorySettingsModule extends AbstractModule {
private static final String FS = "fs";
private static final String URL = "url";
private static final String HDFS = "hdfs";
private static final String S3 = "s3";
private static final TypeSettings FS_SETTINGS = new TypeSettings(
ImmutableMap.<String, SettingsApplier>of("location", new SettingsAppliers.StringSettingsApplier(new StringSetting("location"))),
ImmutableMap.<String, SettingsApplier>of(
"compress", new SettingsAppliers.BooleanSettingsApplier(new BoolSetting("compress", true)),
"chunk_size", new SettingsAppliers.ByteSizeSettingsApplier(new ByteSizeSetting("chunk_size", null))
));
private static final TypeSettings URL_SETTINGS = new TypeSettings(
ImmutableMap.<String, SettingsApplier>of("url", new SettingsAppliers.StringSettingsApplier(new StringSetting("url"))),
Collections.<String, SettingsApplier>emptyMap());
private static final TypeSettings HDFS_SETTINGS = new TypeSettings(
Collections.<String, SettingsApplier>emptyMap(),
ImmutableMap.<String, SettingsApplier>builder()
.put("uri", new SettingsAppliers.StringSettingsApplier(new StringSetting("uri")))
.put("user", new SettingsAppliers.StringSettingsApplier(new StringSetting("user")))
.put("path", new SettingsAppliers.StringSettingsApplier(new StringSetting("path")))
.put("load_defaults", new SettingsAppliers.BooleanSettingsApplier(new BoolSetting("load_defaults", true)))
.put("conf_location", new SettingsAppliers.StringSettingsApplier(new StringSetting("conf_location")))
.put("concurrent_streams", new SettingsAppliers.IntSettingsApplier(new IntSetting("concurrent_streams", 5)))
.put("compress", new SettingsAppliers.BooleanSettingsApplier(new BoolSetting("compress", true)))
.put("chunk_size", new SettingsAppliers.ByteSizeSettingsApplier(new ByteSizeSetting("chunk_size", null)))
.build()) {
@Override
public Optional<GenericProperties> dynamicProperties(Optional<GenericProperties> genericProperties) {
if (!genericProperties.isPresent()) {
return genericProperties;
}
GenericProperties dynamicProperties = null;
Map<String, Expression> properties = genericProperties.get().properties();
for (Map.Entry<String, Expression> entry : properties.entrySet()) {
String key = entry.getKey();
if (key.startsWith("conf.")) {
if (dynamicProperties == null) {
dynamicProperties = new GenericProperties();
}
dynamicProperties.add(new GenericProperty(key, entry.getValue()));
}
}
return Optional.ofNullable(dynamicProperties);
}
};
private static final TypeSettings S3_SETTINGS = new TypeSettings(Collections.<String, SettingsApplier>emptyMap(),
ImmutableMap.<String, SettingsApplier>builder()
.put("access_key", new SettingsAppliers.StringSettingsApplier(new StringSetting("access_key", null)))
.put("base_path", new SettingsAppliers.StringSettingsApplier(new StringSetting("base_path", null)))
.put("bucket", new SettingsAppliers.StringSettingsApplier(new StringSetting("bucket", null)))
.put("buffer_size", new SettingsAppliers.ByteSizeSettingsApplier(new ByteSizeSetting("buffer_size", null)))
.put("canned_acl", new SettingsAppliers.StringSettingsApplier(new StringSetting("canned_acl", null)))
.put("chunk_size", new SettingsAppliers.ByteSizeSettingsApplier(new ByteSizeSetting("chunk_size", null)))
.put("compress", new SettingsAppliers.BooleanSettingsApplier(new BoolSetting("compress", true)))
.put("concurrent_streams", new SettingsAppliers.IntSettingsApplier(new IntSetting("concurrent_streams", null)))
.put("endpoint", new SettingsAppliers.StringSettingsApplier(new StringSetting("endpoint", null)))
.put("max_retries", new SettingsAppliers.IntSettingsApplier(new IntSetting("max_retries", null)))
.put("protocol", new SettingsAppliers.StringSettingsApplier(new StringSetting("protocol", null)))
.put("region", new SettingsAppliers.StringSettingsApplier(new StringSetting("region", null)))
.put("secret_key", new SettingsAppliers.StringSettingsApplier(new StringSetting("secret_key", null)))
.put("server_side_encryption", new SettingsAppliers.BooleanSettingsApplier(new BoolSetting("server_side_encryption", false))).build());
@Override
protected void configure() {
MapBinder<String, TypeSettings> typeSettingsBinder = MapBinder.newMapBinder(
binder(),
String.class,
TypeSettings.class);
typeSettingsBinder.addBinding(FS).toInstance(FS_SETTINGS);
typeSettingsBinder.addBinding(URL).toInstance(URL_SETTINGS);
typeSettingsBinder.addBinding(HDFS).toInstance(HDFS_SETTINGS);
typeSettingsBinder.addBinding(S3).toInstance(S3_SETTINGS);
}
}