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

com.ulisesbocchio.jasyptspringboot.caching.CachingDelegateEncryptablePropertySource Maven / Gradle / Ivy

The newest version!
package com.ulisesbocchio.jasyptspringboot.caching;

import com.ulisesbocchio.jasyptspringboot.EncryptablePropertyFilter;
import com.ulisesbocchio.jasyptspringboot.EncryptablePropertyResolver;
import com.ulisesbocchio.jasyptspringboot.EncryptablePropertySource;

import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;

import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.env.PropertySource;
import org.springframework.util.Assert;

/**
 * 

CachingDelegateEncryptablePropertySource class.

* * @author Sergio.U.Bocchio * @version $Id: $Id */ @Slf4j public class CachingDelegateEncryptablePropertySource extends PropertySource implements EncryptablePropertySource { private final PropertySource delegate; private final EncryptablePropertyResolver resolver; private final EncryptablePropertyFilter filter; private final Map cache; /** *

Constructor for CachingDelegateEncryptablePropertySource.

* * @param delegate a {@link org.springframework.core.env.PropertySource} object * @param resolver a {@link com.ulisesbocchio.jasyptspringboot.EncryptablePropertyResolver} object * @param filter a {@link com.ulisesbocchio.jasyptspringboot.EncryptablePropertyFilter} object */ public CachingDelegateEncryptablePropertySource(PropertySource delegate, EncryptablePropertyResolver resolver, EncryptablePropertyFilter filter) { super(delegate.getName(), delegate.getSource()); Assert.notNull(delegate, "PropertySource delegate cannot be null"); Assert.notNull(resolver, "EncryptablePropertyResolver cannot be null"); Assert.notNull(filter, "EncryptablePropertyFilter cannot be null"); this.delegate = delegate; this.resolver = resolver; this.filter = filter; this.cache = new ConcurrentHashMap<>(); } /** {@inheritDoc} */ @Override public PropertySource getDelegate() { return delegate; } /** {@inheritDoc} */ @Override public Object getProperty(String name) { //The purpose of this cache is to reduce the cost of decryption, // so it's not a bad idea to read the original property every time, it's generally fast. Object originValue = delegate.getProperty(name); if (!(originValue instanceof String)) { //Because we read the original property every time, if it isn't a String, // there's no point in caching it. return originValue; } CachedValue cachedValue = cache.get(name); if (cachedValue != null && Objects.equals(originValue, cachedValue.originValue)) { // If the original property has not changed, it is safe to return the cached result. return cachedValue.resolvedValue; } //originValue must be String here if (filter.shouldInclude(delegate, name)) { String originStringValue = (String) originValue; String resolved = resolver.resolvePropertyValue(originStringValue); CachedValue newCachedValue = new CachedValue(originStringValue, resolved); //If the mapping relationship in the cache changes during // the calculation process, then ignore it directly. if (cachedValue == null) { cache.putIfAbsent(name, newCachedValue); } else { cache.replace(name, cachedValue, newCachedValue); } //return the result calculated this time return resolved; } return originValue; } /** {@inheritDoc} */ @Override public void refresh() { log.info("Property Source {} refreshed", delegate.getName()); cache.clear(); } @AllArgsConstructor private static class CachedValue { private final String originValue; private final String resolvedValue; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy