in commons-jcs3-jcache/src/main/java/org/apache/commons/jcs3/jcache/JCSCache.java [684:761]
public void put(final K key, final V rawValue)
{
assertNotClosed();
assertNotNull(key, "key");
assertNotNull(rawValue, "value");
final ICacheElement<K, V> oldElt = delegate.get(key);
final V old = oldElt != null ? oldElt.getVal() : null;
final boolean storeByValue = config.isStoreByValue();
final V value = storeByValue ? copy(serializer, manager.getClassLoader(), rawValue) : rawValue;
final boolean created = old == null;
final Duration duration = created ? expiryPolicy.getExpiryForCreation() : expiryPolicy.getExpiryForUpdate();
if (isNotZero(duration))
{
final boolean statisticsEnabled = config.isStatisticsEnabled();
final long start = Times.now(false);
final K jcsKey = storeByValue ? copy(serializer, manager.getClassLoader(), key) : key;
final ICacheElement<K, V> element = updateElement( // reuse it to create basic structure
jcsKey, value, created ? null : duration,
oldElt != null ? oldElt.getElementAttributes() : delegate.getElementAttributes().clone());
if (created && duration != null) { // set maxLife
final IElementAttributes copy = element.getElementAttributes();
copy.setTimeFactorForMilliseconds(1);
final boolean eternal = duration.isEternal();
copy.setIsEternal(eternal);
if (ElementAttributes.class.isInstance(copy)) {
ElementAttributes.class.cast(copy).setCreateTime();
}
if (!eternal)
{
copy.setIsEternal(false);
if (duration == expiryPolicy.getExpiryForAccess())
{
element.getElementAttributes().setIdleTime(duration.getTimeUnit().toMillis(duration.getDurationAmount()));
}
else
{
element.getElementAttributes().setMaxLife(duration.getTimeUnit().toMillis(duration.getDurationAmount()));
}
}
element.setElementAttributes(copy);
}
writer.write(new JCSEntry<>(jcsKey, value));
try
{
delegate.update(element);
}
catch (final IOException e)
{
throw new CacheException(e);
}
for (final JCSListener<K, V> listener : listeners.values())
{
if (created)
{
listener.onCreated(Collections.singletonList(new JCSCacheEntryEvent<>(this,
EventType.CREATED, null, key, value)));
}
else
{
listener.onUpdated(Collections.singletonList(new JCSCacheEntryEvent<>(this,
EventType.UPDATED, old, key, value)));
}
}
if (statisticsEnabled)
{
statistics.increasePuts(1);
statistics.addPutTime(Times.now(false) - start);
}
} else if (!created)
{
forceExpires(key);
}
}