public class

CachingOfBizPropertySet

extends AbstractPropertySet
implements Serializable
java.lang.Object
   ↳ com.opensymphony.module.propertyset.AbstractPropertySet
     ↳ com.atlassian.jira.propertyset.CachingOfBizPropertySet

Class Overview

Reimplementation of OFBizPropertySet that caches property entries and values to provide more efficient access.

Note that JiraCachingPropertySet is just a decorator around an arbitrary supplied property set and thus has uncertain behaviour both in a clustered environment and when there are multiple instances of the caching property set, as the individual caches have no way to share state.

CachingOfBizPropertySet is different. It is a flyweight around the OfBizPropertyEntryStore, which caches the operations that it can (such as the existence, type, and value of an entry) and delegates those it can't cache to the database directly. The implementation deviates from that of OFBizPropertySet only in ways that make it more fault-tolerant, such as by not throwing an exception when removing a nonexistent property and not throwing an exception when setting a property to a new type without removing it first.

The only known disadvantage to using this class is that it will eagerly load the value on a cache miss. This seems to be an acceptable loss, because the main reasons why code would bother to call exists(String) or getType(String) seem to be

  1. To know whether or not the property exists and/or the appropriate getter type to use, both of which suggest that the value will eventually be retrieved anyway and that loading it eagerly is not wasteful.
  2. To guard against the exception that OFBizPropertySet throws if you attempt to remove a property that does not exist of change the type of an existing property. This implementation silently ignores a spurious remove and gracefully updates the type if it is changed, so these guards are not necessary.
  3. To use the existence or absence of the key as a boolean value, where the actual stored value is a meaningless sentinel. This is a strange thing to do, and it makes more sense to store an actual boolean value for the property, instead.

This class is thread-safe, in spite of the difficulties that the PropertySet contract imposes upon it. Its only mutable state is the entity definition provided through init(Map, Map). This is stored in an immutable holder class whose reference is marked as volatile to ensure safe publishing.

Although OFBizPropertySet itself allows for multiple generic delegators to be used, this implementation ignores this setting. JIRA always uses the "default" delegator.

Summary

[Expand]
Inherited Constants
From interface com.opensymphony.module.propertyset.PropertySet
[Expand]
Inherited Fields
From class com.opensymphony.module.propertyset.AbstractPropertySet
Public Constructors
CachingOfBizPropertySet()
CachingOfBizPropertySet(String entityName, Long entityId)
CachingOfBizPropertySet(OfBizPropertyEntryStore entryStore, String entityName, Long entityId)
Public Methods
boolean equals(Object o)
boolean exists(String key)
List<String> getKeys(String prefix, int type)
List<String> getKeys(int type)
List<String> getKeys(String prefix)
List<String> getKeys()
int getType(String key)
int hashCode()
void init(Map config, Map args)
void remove()
void remove(String key)
Implementation note: Unlike OFBizPropertySet, this implementation will not throw an exception if the property does not exist.
boolean supportsType(int type)
Protected Methods
@Nullable Object get(int type, String key)
void setImpl(int type, String key, Object obj)
[Expand]
Inherited Methods
From class com.opensymphony.module.propertyset.AbstractPropertySet
From class java.lang.Object
From interface com.opensymphony.module.propertyset.PropertySet

Public Constructors

public CachingOfBizPropertySet ()

public CachingOfBizPropertySet (String entityName, Long entityId)

public CachingOfBizPropertySet (OfBizPropertyEntryStore entryStore, String entityName, Long entityId)

Public Methods

public boolean equals (Object o)

public boolean exists (String key)

public List<String> getKeys (String prefix, int type)

public List<String> getKeys (int type)

public List<String> getKeys (String prefix)

public List<String> getKeys ()

public int getType (String key)

public int hashCode ()

public void init (Map config, Map args)

public void remove ()

public void remove (String key)

Implementation note: Unlike OFBizPropertySet, this implementation will not throw an exception if the property does not exist.

Parameters
key the key of the property to be removed
Throws
PropertyException if the attempt to remove an existing property fails at the persistence layer

public boolean supportsType (int type)

Protected Methods

@Nullable protected Object get (int type, String key)

protected void setImpl (int type, String key, Object obj)