blob: 22d9ab5ed45b4b5212d7b1f921a2e1302fbf9f62 [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.modules.data;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.inject.Singleton;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.apache.commons.configuration2.Configuration;
import org.apache.commons.configuration2.ex.ConfigurationException;
import org.apache.james.backends.jpa.JPAConfiguration;
import org.apache.james.utils.PropertiesProvider;
import com.google.common.base.Joiner;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
public class JPAEntityManagerModule extends AbstractModule {
@Provides
@Singleton
public EntityManagerFactory provideEntityManagerFactory(JPAConfiguration jpaConfiguration) {
HashMap<String, String> properties = new HashMap<>();
properties.put(JPAConfiguration.JPA_CONNECTION_DRIVER_NAME, jpaConfiguration.getDriverName());
properties.put(JPAConfiguration.JPA_CONNECTION_URL, jpaConfiguration.getDriverURL());
jpaConfiguration.getCredential()
.ifPresent(credential -> {
properties.put(JPAConfiguration.JPA_CONNECTION_USERNAME, credential.getUsername());
properties.put(JPAConfiguration.JPA_CONNECTION_PASSWORD, credential.getPassword());
});
List<String> connectionProperties = new ArrayList<>();
jpaConfiguration.isTestOnBorrow().ifPresent(testOnBorrow -> connectionProperties.add("TestOnBorrow=" + testOnBorrow));
jpaConfiguration.getValidationQueryTimeoutSec()
.ifPresent(timeoutSecond -> connectionProperties.add("ValidationTimeout=" + timeoutSecond * 1000));
jpaConfiguration.getValidationQuery()
.ifPresent(validationQuery -> connectionProperties.add("ValidationSQL='" + validationQuery + "'"));
jpaConfiguration.getMaxConnections()
.ifPresent(maxConnections -> connectionProperties.add("MaxTotal=" + maxConnections));
connectionProperties.addAll(jpaConfiguration.getCustomDatasourceProperties().entrySet().stream().map(entry -> entry.getKey() + "=" + entry.getValue()).collect(Collectors.toList()));
properties.put(JPAConfiguration.JPA_CONNECTION_PROPERTIES, Joiner.on(",").join(connectionProperties));
properties.putAll(jpaConfiguration.getCustomOpenjpaProperties());
jpaConfiguration.isMultithreaded()
.map(Object::toString)
.ifPresent(value -> properties.put(JPAConfiguration.JPA_MULTITHREADED, value));
jpaConfiguration.isAttachmentStorageEnabled()
.map(Object::toString)
.ifPresent(value -> properties.put(JPAConfiguration.ATTACHMENT_STORAGE, value));
return Persistence.createEntityManagerFactory("Global", properties);
}
@Provides
@Singleton
JPAConfiguration provideConfiguration(PropertiesProvider propertiesProvider) throws FileNotFoundException, ConfigurationException {
Configuration dataSource = propertiesProvider.getConfiguration("james-database");
Map<String, String> openjpaProperties = getKeysForPrefix(dataSource, "openjpa", false);
Map<String, String> datasourceProperties = getKeysForPrefix(dataSource, "datasource", true);
return JPAConfiguration.builder()
.driverName(dataSource.getString("database.driverClassName"))
.driverURL(dataSource.getString("database.url"))
.testOnBorrow(dataSource.getBoolean("datasource.testOnBorrow", false))
.validationQueryTimeoutSec(dataSource.getInteger("datasource.validationQueryTimeoutSec", null))
.validationQuery(dataSource.getString("datasource.validationQuery", null))
.maxConnections(dataSource.getInteger("datasource.maxTotal", null))
.multithreaded(dataSource.getBoolean(JPAConfiguration.JPA_MULTITHREADED, true))
.username(dataSource.getString("database.username"))
.password(dataSource.getString("database.password"))
.setCustomOpenjpaProperties(openjpaProperties)
.setCustomDatasourceProperties(datasourceProperties)
.attachmentStorage(dataSource.getBoolean(JPAConfiguration.ATTACHMENT_STORAGE, false))
.build();
}
private static Map<String, String> getKeysForPrefix(Configuration dataSource, String prefix, boolean stripPrefix) {
Iterator<String> keys = dataSource.getKeys(prefix);
Map<String, String> properties = new HashMap<>();
while (keys.hasNext()) {
String key = keys.next();
String propertyKey = stripPrefix ? key.replace(prefix + ".", "") : key;
properties.put(propertyKey, dataSource.getString(key));
}
return properties;
}
}