blob: 6a9006abf5b95e16ede366fb5f61d1681e77b526 [file] [log] [blame]
/****************************************************************
* Licensed to the Apache Software Foundation (ASF) under one *
* or more contributor license agreements. See the NOTICE file *
* distributed with this work for additional information *
* regarding copyright ownership. The ASF licenses this file *
* to you under the Apache License, Version 2.0 (the *
* "License"); you may not use this file except in compliance *
* with the License. You may obtain a copy of the License at *
* *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, *
* software distributed under the License is distributed on an *
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
* KIND, either express or implied. See the License for the *
* specific language governing permissions and limitations *
* under the License. *
****************************************************************/
package org.apache.james;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Optional;
import org.apache.commons.configuration2.ex.ConfigurationException;
import org.apache.james.data.UsersRepositoryModuleChooser;
import org.apache.james.filesystem.api.FileSystem;
import org.apache.james.filesystem.api.JamesDirectoriesProvider;
import org.apache.james.jmap.JMAPModule;
import org.apache.james.server.core.JamesServerResourceLoader;
import org.apache.james.server.core.MissingArgumentException;
import org.apache.james.server.core.configuration.Configuration;
import org.apache.james.server.core.configuration.FileConfigurationProvider;
import org.apache.james.server.core.filesystem.FileSystemImpl;
import org.apache.james.utils.PropertiesProvider;
import org.apache.james.vault.VaultConfiguration;
import com.github.fge.lambdas.Throwing;
/**
* See https://issues.apache.org/jira/browse/JAMES-3767
*
* Cassandra APP will be removed after 3.8.0 release.
*
* Please migrate to the distributed APP.
*/
@Deprecated(forRemoval = true)
public class CassandraJamesServerConfiguration implements Configuration {
public static class Builder {
private Optional<SearchConfiguration> searchConfiguration;
private Optional<String> rootDirectory;
private Optional<ConfigurationPath> configurationPath;
private Optional<BlobStoreConfiguration> blobStoreConfiguration;
private Optional<UsersRepositoryModuleChooser.Implementation> usersRepositoryImplementation;
private Optional<VaultConfiguration> vaultConfiguration;
private Optional<Boolean> jmapEnabled;
private Optional<Boolean> quotaCompatibilityMode;
private Builder() {
rootDirectory = Optional.empty();
configurationPath = Optional.empty();
searchConfiguration = Optional.empty();
usersRepositoryImplementation = Optional.empty();
blobStoreConfiguration = Optional.empty();
vaultConfiguration = Optional.empty();
jmapEnabled = Optional.empty();
quotaCompatibilityMode = Optional.empty();
}
public Builder workingDirectory(String path) {
rootDirectory = Optional.of(path);
return this;
}
public Builder workingDirectory(File file) {
rootDirectory = Optional.of(file.getAbsolutePath());
return this;
}
public Builder useWorkingDirectoryEnvProperty() {
rootDirectory = Optional.ofNullable(System.getProperty(WORKING_DIRECTORY));
if (!rootDirectory.isPresent()) {
throw new MissingArgumentException("Server needs a working.directory env entry");
}
return this;
}
public Builder configurationPath(ConfigurationPath path) {
configurationPath = Optional.of(path);
return this;
}
public Builder configurationFromClasspath() {
configurationPath = Optional.of(new ConfigurationPath(FileSystem.CLASSPATH_PROTOCOL));
return this;
}
public Builder blobStore(BlobStoreConfiguration blobStoreConfiguration) {
this.blobStoreConfiguration = Optional.of(blobStoreConfiguration);
return this;
}
public Builder searchConfiguration(SearchConfiguration searchConfiguration) {
this.searchConfiguration = Optional.of(searchConfiguration);
return this;
}
public Builder usersRepository(UsersRepositoryModuleChooser.Implementation implementation) {
this.usersRepositoryImplementation = Optional.of(implementation);
return this;
}
public Builder vaultConfiguration(VaultConfiguration vaultConfiguration) {
this.vaultConfiguration = Optional.of(vaultConfiguration);
return this;
}
public Builder quotaCompatibilityModeEnabled(boolean value) {
this.quotaCompatibilityMode = Optional.of(value);
return this;
}
public CassandraJamesServerConfiguration build() {
ConfigurationPath configurationPath = this.configurationPath.orElse(new ConfigurationPath(FileSystem.FILE_PROTOCOL_AND_CONF));
JamesServerResourceLoader directories = new JamesServerResourceLoader(rootDirectory
.orElseThrow(() -> new MissingArgumentException("Server needs a working.directory env entry")));
FileSystemImpl fileSystem = new FileSystemImpl(directories);
PropertiesProvider propertiesProvider = new PropertiesProvider(fileSystem, configurationPath);
SearchConfiguration searchConfiguration = this.searchConfiguration.orElseGet(Throwing.supplier(
() -> SearchConfiguration.parse(propertiesProvider)));
BlobStoreConfiguration blobStoreConfiguration = this.blobStoreConfiguration.orElseGet(Throwing.supplier(
() -> BlobStoreConfiguration.parse(propertiesProvider)));
FileConfigurationProvider configurationProvider = new FileConfigurationProvider(fileSystem, Basic.builder()
.configurationPath(configurationPath)
.workingDirectory(directories.getRootDirectory())
.build());
UsersRepositoryModuleChooser.Implementation usersRepositoryChoice = usersRepositoryImplementation.orElseGet(
() -> UsersRepositoryModuleChooser.Implementation.parse(configurationProvider));
VaultConfiguration vaultConfiguration = this.vaultConfiguration.orElseGet(() -> {
try {
return VaultConfiguration.from(propertiesProvider.getConfiguration("deletedMessageVault"));
} catch (FileNotFoundException e) {
return VaultConfiguration.DEFAULT;
} catch (ConfigurationException e) {
throw new RuntimeException(e);
}
});
boolean quotaCompatibilityMode = this.quotaCompatibilityMode.orElseGet(() -> {
try {
return propertiesProvider.getConfiguration("cassandra").getBoolean("quota.compatibility.mode", false);
} catch (FileNotFoundException e) {
return false;
} catch (ConfigurationException e) {
throw new RuntimeException(e);
}
});
boolean jmapEnabled = this.jmapEnabled.orElseGet(() -> {
try {
return JMAPModule.parseConfiguration(propertiesProvider).isEnabled();
} catch (FileNotFoundException e) {
return false;
} catch (ConfigurationException e) {
throw new RuntimeException(e);
}
});
return new CassandraJamesServerConfiguration(configurationPath, directories, searchConfiguration, blobStoreConfiguration, usersRepositoryChoice, vaultConfiguration, jmapEnabled, quotaCompatibilityMode);
}
}
public static CassandraJamesServerConfiguration.Builder builder() {
return new Builder();
}
private final ConfigurationPath configurationPath;
private final JamesDirectoriesProvider directories;
private final SearchConfiguration searchConfiguration;
private final BlobStoreConfiguration blobStoreConfiguration;
private final UsersRepositoryModuleChooser.Implementation usersRepositoryImplementation;
private final VaultConfiguration vaultConfiguration;
private final boolean jmapEnabled;
private final boolean quotaCompatibilityMode;
private CassandraJamesServerConfiguration(ConfigurationPath configurationPath, JamesDirectoriesProvider directories,
SearchConfiguration searchConfiguration, BlobStoreConfiguration blobStoreConfiguration,
UsersRepositoryModuleChooser.Implementation usersRepositoryImplementation,
VaultConfiguration vaultConfiguration, boolean jmapEnabled, boolean quotaCompatibilityMode) {
this.configurationPath = configurationPath;
this.directories = directories;
this.searchConfiguration = searchConfiguration;
this.blobStoreConfiguration = blobStoreConfiguration;
this.usersRepositoryImplementation = usersRepositoryImplementation;
this.vaultConfiguration = vaultConfiguration;
this.jmapEnabled = jmapEnabled;
this.quotaCompatibilityMode = quotaCompatibilityMode;
}
@Override
public ConfigurationPath configurationPath() {
return configurationPath;
}
@Override
public JamesDirectoriesProvider directories() {
return directories;
}
public SearchConfiguration searchConfiguration() {
return searchConfiguration;
}
public VaultConfiguration getVaultConfiguration() {
return vaultConfiguration;
}
public UsersRepositoryModuleChooser.Implementation getUsersRepositoryImplementation() {
return usersRepositoryImplementation;
}
public BlobStoreConfiguration getBlobStoreConfiguration() {
return blobStoreConfiguration;
}
public boolean isJmapEnabled() {
return jmapEnabled;
}
public boolean isQuotaCompatibilityMode() {
return quotaCompatibilityMode;
}
}