com.vladmihalcea.hibernate.type.util.Configuration Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hibernate-types-60 Show documentation
Show all versions of hibernate-types-60 Show documentation
Hibernate ORM 6.0 extra Types
package com.vladmihalcea.hibernate.type.util;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.vladmihalcea.hibernate.util.ClassLoaderUtils;
import com.vladmihalcea.hibernate.util.ReflectionUtils;
import com.vladmihalcea.hibernate.util.StringUtils;
import jakarta.persistence.EntityManagerFactory;
import org.hibernate.cfg.Environment;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;
import java.util.Properties;
import java.util.function.Supplier;
import static com.vladmihalcea.hibernate.util.LogUtils.LOGGER;
/**
* Configuration
- It allows declarative configuration through the hibernate.properties
file
* or the hibernate-types.properties
file.
*
* The properties from hibernate-types.properties
can override the ones from the hibernate.properties
file.
*
* It loads the {@link Properties} configuration file and makes them available to other components.
*
* @author Vlad Mihalcea
* @since 2.1.0
*/
public class Configuration implements Serializable {
public static final Configuration INSTANCE = new Configuration();
public static final String PROPERTIES_FILE_PATH = "hibernate-types.properties.path";
public static final String PROPERTIES_FILE_NAME = "hibernate-types.properties";
public static final String APPLICATION_PROPERTIES_FILE_NAME = "application.properties";
/**
* Each Property has a well-defined key.
*/
public enum PropertyKey {
JACKSON_OBJECT_MAPPER("hibernate.types.jackson.object.mapper"),
JSON_SERIALIZER("hibernate.types.json.serializer"),
PRINT_BANNER("hibernate.types.print.banner");
private final String key;
PropertyKey(String key) {
this.key = key;
}
public String getKey() {
return key;
}
}
private final Properties properties = Environment.getProperties();
private Configuration() {
load();
}
public Configuration(Map settings) {
load();
properties.putAll(settings);
}
/**
* Load {@link Properties} from the resolved {@link InputStream}
*/
private void load() {
String[] propertiesFilePaths = new String[] {
APPLICATION_PROPERTIES_FILE_NAME,
PROPERTIES_FILE_NAME,
System.getProperty(PROPERTIES_FILE_NAME),
};
for (String propertiesFilePath : propertiesFilePaths) {
if (propertiesFilePath != null) {
InputStream propertiesInputStream = null;
try {
propertiesInputStream = propertiesInputStream(propertiesFilePath);
if (propertiesInputStream != null) {
properties.load(propertiesInputStream);
}
} catch (IOException e) {
LOGGER.error("Can't load properties", e);
} finally {
try {
if (propertiesInputStream != null) {
propertiesInputStream.close();
}
} catch (IOException e) {
LOGGER.error("Can't close the properties InputStream", e);
}
}
}
}
}
/**
* Get {@link Properties} file {@link InputStream}
*
* @param propertiesFilePath properties file path
* @return {@link Properties} file {@link InputStream}
* @throws IOException the file couldn't be loaded properly
*/
private InputStream propertiesInputStream(String propertiesFilePath) throws IOException {
if (propertiesFilePath != null) {
URL propertiesFileUrl;
try {
propertiesFileUrl = new URL(propertiesFilePath);
} catch (MalformedURLException ignore) {
propertiesFileUrl = ClassLoaderUtils.getResource(propertiesFilePath);
if (propertiesFileUrl == null) {
File f = new File(propertiesFilePath);
if (f.exists() && f.isFile()) {
try {
propertiesFileUrl = f.toURI().toURL();
} catch (MalformedURLException e) {
LOGGER.error(
"The property " + propertiesFilePath + " can't be resolved to either a URL, " +
"a classpath resource or a File"
);
}
}
}
}
if (propertiesFileUrl != null) {
return propertiesFileUrl.openStream();
}
}
return ClassLoaderUtils.getResourceAsStream(propertiesFilePath);
}
/**
* Get all properties.
*
* @return properties.
*/
public Properties getProperties() {
return properties;
}
/**
* Get {@link ObjectMapperWrapper} reference
*
* @return {@link ObjectMapperWrapper} reference
*/
public ObjectMapperWrapper getObjectMapperWrapper() {
Object objectMapperPropertyInstance = instantiateClass(PropertyKey.JACKSON_OBJECT_MAPPER);
ObjectMapperWrapper objectMapperWrapper = new ObjectMapperWrapper();
if (objectMapperPropertyInstance != null) {
if(objectMapperPropertyInstance instanceof ObjectMapperSupplier) {
ObjectMapper objectMapper = ((ObjectMapperSupplier) objectMapperPropertyInstance).get();
if(objectMapper != null) {
objectMapperWrapper = new ObjectMapperWrapper(objectMapper);
}
}
else if (objectMapperPropertyInstance instanceof Supplier) {
Supplier objectMapperSupplier = (Supplier) objectMapperPropertyInstance;
objectMapperWrapper = new ObjectMapperWrapper(objectMapperSupplier.get());
}
else if (objectMapperPropertyInstance instanceof ObjectMapper) {
ObjectMapper objectMapper = (ObjectMapper) objectMapperPropertyInstance;
objectMapperWrapper = new ObjectMapperWrapper(objectMapper);
}
}
Object jsonSerializerPropertyInstance = instantiateClass(PropertyKey.JSON_SERIALIZER);
if (jsonSerializerPropertyInstance != null) {
JsonSerializer jsonSerializer = null;
if(jsonSerializerPropertyInstance instanceof JsonSerializerSupplier) {
jsonSerializer = ((JsonSerializerSupplier) jsonSerializerPropertyInstance).get();
}
else if (jsonSerializerPropertyInstance instanceof Supplier) {
Supplier jsonSerializerSupplier = (Supplier) jsonSerializerPropertyInstance;
jsonSerializer = jsonSerializerSupplier.get();
}
else if (jsonSerializerPropertyInstance instanceof JsonSerializer) {
jsonSerializer = (JsonSerializer) jsonSerializerPropertyInstance;
}
if (jsonSerializer != null) {
objectMapperWrapper.setJsonSerializer(jsonSerializer);
}
}
return objectMapperWrapper;
}
/**
* Get Integer property value
*
* @param propertyKey property key
* @return Integer property value
*/
public Integer integerProperty(PropertyKey propertyKey) {
Integer value = null;
String property = properties.getProperty(propertyKey.getKey());
if (property != null) {
value = Integer.valueOf(property);
}
return value;
}
/**
* Get Long property value
*
* @param propertyKey property key
* @return Long property value
*/
public Long longProperty(PropertyKey propertyKey) {
Long value = null;
String property = properties.getProperty(propertyKey.getKey());
if (property != null) {
value = Long.valueOf(property);
}
return value;
}
/**
* Get Boolean property value
*
* @param propertyKey property key
* @return Boolean property value
*/
public Boolean booleanProperty(PropertyKey propertyKey) {
Boolean value = null;
String property = properties.getProperty(propertyKey.getKey());
if (property != null) {
value = Boolean.valueOf(property);
}
return value;
}
/**
* Get Class property value
*
* @param propertyKey property key
* @param class generic type
* @return Class property value
*/
public Class classProperty(PropertyKey propertyKey) {
Class clazz = null;
String property = properties.getProperty(propertyKey.getKey());
if (property != null) {
try {
return ClassLoaderUtils.loadClass(property);
} catch (ClassNotFoundException e) {
LOGGER.error("Couldn't load the " + property + " class given by the " + propertyKey + " property", e);
}
}
return clazz;
}
/**
* Instantiate class associated to the given property key
*
* @param propertyKey property key
* @param class parameter type
* @return class instance
*/
private T instantiateClass(PropertyKey propertyKey) {
T object = null;
String property = properties.getProperty(propertyKey.getKey());
if (property != null) {
try {
Class clazz = ClassLoaderUtils.loadClass(property);
LOGGER.debug("Instantiate {}", clazz);
object = clazz.newInstance();
} catch (ClassNotFoundException e) {
LOGGER.error("Couldn't load the " + property + " class given by the " + propertyKey + " property", e);
} catch (InstantiationException e) {
LOGGER.error("Couldn't instantiate the " + property + " class given by the " + propertyKey + " property", e);
} catch (IllegalAccessException e) {
LOGGER.error("Couldn't access the " + property + " class given by the " + propertyKey + " property", e);
}
}
return object;
}
}