|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||
java.lang.Objectorg.faktorips.runtime.internal.AbstractRuntimeRepository
org.faktorips.runtime.internal.AbstractCachingRuntimeRepository
public abstract class AbstractCachingRuntimeRepository
This abstract runtime repository handles the caching for already loaded instances. The caching have to be thread safe for every cache instance that we do not load an object twice. That means, the regular way we load an object is to have a look in the cache if it is already there if not we call the getNotCached... method.
To be performant and thread safe we use the double checking ideom as it is discribed by doug lea.
Since we use Java 5 there is a threadsafe way to do so:
First of all we have a not synchronized look in the cache. As we assume that the cache itself is
implemented with a ConcurrentHashMap this lookup would see the real state of the map. If
there is no object yet we have to enter a synchronized block. This block is synchronized for
every cache instance so we could handle calls for different objects at same time. In this
synchonized block it is important to check again if there is an cached object now because another
thread may created one meantime (double-check). Again this only works for
ConcurrentHashMap. If there still is no object cached we create a new one. As long we are
in the synchronized block, every other thread is blocked. After the new object is created we put
it in the cache and the ConcurrentHashMap ensures that it is stored completely
initialized before another thread would get access.
There is still potentially more performance by synchronizing for different keys instead of blocking for every cache instance. This would be more complicated and should be well-considered.
| Constructor Summary | |
|---|---|
AbstractCachingRuntimeRepository(String name,
ICacheFactory cacheFactory,
ClassLoader cl)
|
|
| Method Summary | ||
|---|---|---|
protected List<XmlAdapter<?,?>> |
getAllInternalEnumXmlAdapters(IRuntimeRepository repository)
Returns all enumeration XmlAdapters available in this repository that generated by Faktor-IPS. |
|
protected
|
getCustomRuntimeObjectInternal(Class<T> type,
String ipsObjectQualifiedName)
Same as getCustomRuntimeObject(Class |
|
protected
|
getEnumValuesInternal(Class<T> clazz)
Returns the list of enumeration values of the enumeration type that is identified by its class which is provided to it. |
|
protected abstract
|
getNotCachedCustomObject(Class<T> type,
String ipsObjectQualifiedName)
|
|
protected abstract
|
getNotCachedEnumValues(Class<T> clazz)
|
|
protected abstract List<XmlAdapter<?,?>> |
getNotCachedEnumXmlAdapter(IRuntimeRepository repository)
|
|
protected abstract IProductComponent |
getNotCachedProductComponent(String id)
|
|
protected abstract IProductComponentGeneration |
getNotCachedProductComponentGeneration(GenerationId generationId)
|
|
protected abstract ITable |
getNotCachedTable(String qualifiedTableName)
|
|
protected IProductComponentGeneration |
getProductComponentGenerationInternal(String id,
DateTime validFrom)
|
|
protected IProductComponent |
getProductComponentInternal(String id)
Same as getProductComponent(String id) but searches only in this repository and not the ones, this repository depends on. |
|
protected ITable |
getTableInternal(String qualifiedTableName)
Same as AbstractRuntimeRepository.getTable(String)) but searches only in this repository and not the ones,
this repository depends on. |
|
protected void |
initCaches(ClassLoader cl)
|
|
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
| Methods inherited from interface org.faktorips.runtime.IRuntimeRepository |
|---|
isModifiable |
| Constructor Detail |
|---|
public AbstractCachingRuntimeRepository(String name,
ICacheFactory cacheFactory,
ClassLoader cl)
| Method Detail |
|---|
protected void initCaches(ClassLoader cl)
protected IProductComponent getProductComponentInternal(String id)
AbstractRuntimeRepository
getProductComponentInternal in class AbstractRuntimeRepositoryprotected abstract IProductComponent getNotCachedProductComponent(String id)
protected IProductComponentGeneration getProductComponentGenerationInternal(String id,
DateTime validFrom)
protected abstract IProductComponentGeneration getNotCachedProductComponentGeneration(GenerationId generationId)
protected <T> List<T> getEnumValuesInternal(Class<T> clazz)
AbstractRuntimeRepository
getEnumValuesInternal in class AbstractRuntimeRepositoryprotected abstract <T> List<T> getNotCachedEnumValues(Class<T> clazz)
protected ITable getTableInternal(String qualifiedTableName)
AbstractRuntimeRepositoryAbstractRuntimeRepository.getTable(String)) but searches only in this repository and not the ones,
this repository depends on.
getTableInternal in class AbstractRuntimeRepositoryprotected abstract ITable getNotCachedTable(String qualifiedTableName)
protected List<XmlAdapter<?,?>> getAllInternalEnumXmlAdapters(IRuntimeRepository repository)
AbstractRuntimeRepository
getAllInternalEnumXmlAdapters in class AbstractRuntimeRepositoryrepository - the runtime repository that needs to be used by the XmlAdapters that are
returned by this methodprotected abstract List<XmlAdapter<?,?>> getNotCachedEnumXmlAdapter(IRuntimeRepository repository)
protected <T> T getCustomRuntimeObjectInternal(Class<T> type,
String ipsObjectQualifiedName)
AbstractRuntimeRepository
getCustomRuntimeObjectInternal in class AbstractRuntimeRepository
protected abstract <T> T getNotCachedCustomObject(Class<T> type,
String ipsObjectQualifiedName)
|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||