org.faktorips.runtime.internal
Class AbstractCachingRuntimeRepository

java.lang.Object
  extended by org.faktorips.runtime.internal.AbstractRuntimeRepository
      extended by org.faktorips.runtime.internal.AbstractCachingRuntimeRepository
All Implemented Interfaces:
IRuntimeRepository
Direct Known Subclasses:
AbstractTocBasedRuntimeRepository

public abstract class AbstractCachingRuntimeRepository
extends AbstractRuntimeRepository

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.

Author:
dirmeier

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
<T> T
getCustomRuntimeObjectInternal(Class<T> type, String ipsObjectQualifiedName)
          Same as getCustomRuntimeObject(Class type, String id) but searches only in this repository and not the ones this repository depends on.
protected
<T> List<T>
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
<T> T
getNotCachedCustomObject(Class<T> type, String ipsObjectQualifiedName)
           
protected abstract
<T> List<T>
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 org.faktorips.runtime.internal.AbstractRuntimeRepository
addDirectlyReferencedRepository, addEnumValueLookupService, getAllIpsTestCases, getAllIpsTestCases, getAllModelTypeImplementationClasses, getAllModelTypeImplementationClasses, getAllProductComponentIds, getAllProductComponentIds, getAllProductComponents, getAllProductComponents, getAllProductComponents, getAllProductComponents, getAllProductComponents, getAllProductComponentsInternal, getAllReferencedRepositories, getAllTables, getAllTables, getClassLoader, getCustomRuntimeObject, getDirectlyReferencedRepositories, getEnumValue, getEnumValue, getEnumValueLookupService, getEnumValues, getEnumValuesDefinedInType, getExistingProductComponent, getExistingProductComponentGeneration, getFormulaEvaluatorFactory, getIpsTest, getIpsTest, getIpsTestCase, getIpsTestCase, getIpsTestCaseInternal, getIpsTestCasesStartingWith, getIpsTestCasesStartingWith, getIpsTestSuite, getIpsTestSuite, getLatestProductComponentGeneration, getLatestProductComponentGenerationInternal, getModelType, getModelType, getModelType, getModelType, getName, getNextProductComponentGeneration, getNextProductComponentGenerationInternal, getNumberOfProductComponentGenerations, getNumberOfProductComponentGenerationsInternal, getPreviousProductComponentGeneration, getPreviousProductComponentGenerationInternal, getProductComponent, getProductComponent, getProductComponentGeneration, getProductComponentGenerationInternal, getProductComponentGenerations, getProductComponentGenerations, getProductComponentInternal, getRuntimeRepositoryLookup, getTable, getTable, getTableInternal, newJAXBContext, newJAXBContext, removeEnumValueLookupService, setFormulaEvaluatorFactory, setRuntimeRepositoryLookup, toString
 
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

AbstractCachingRuntimeRepository

public AbstractCachingRuntimeRepository(String name,
                                        ICacheFactory cacheFactory,
                                        ClassLoader cl)
Method Detail

initCaches

protected void initCaches(ClassLoader cl)

getProductComponentInternal

protected IProductComponent getProductComponentInternal(String id)
Description copied from class: AbstractRuntimeRepository
Same as getProductComponent(String id) but searches only in this repository and not the ones, this repository depends on.

Specified by:
getProductComponentInternal in class AbstractRuntimeRepository

getNotCachedProductComponent

protected abstract IProductComponent getNotCachedProductComponent(String id)

getProductComponentGenerationInternal

protected IProductComponentGeneration getProductComponentGenerationInternal(String id,
                                                                            DateTime validFrom)

getNotCachedProductComponentGeneration

protected abstract IProductComponentGeneration getNotCachedProductComponentGeneration(GenerationId generationId)

getEnumValuesInternal

protected <T> List<T> getEnumValuesInternal(Class<T> clazz)
Description copied from class: AbstractRuntimeRepository
Returns the list of enumeration values of the enumeration type that is identified by its class which is provided to it.

Specified by:
getEnumValuesInternal in class AbstractRuntimeRepository

getNotCachedEnumValues

protected abstract <T> List<T> getNotCachedEnumValues(Class<T> clazz)

getTableInternal

protected ITable getTableInternal(String qualifiedTableName)
Description copied from class: AbstractRuntimeRepository
Same as AbstractRuntimeRepository.getTable(String)) but searches only in this repository and not the ones, this repository depends on.

Specified by:
getTableInternal in class AbstractRuntimeRepository

getNotCachedTable

protected abstract ITable getNotCachedTable(String qualifiedTableName)

getAllInternalEnumXmlAdapters

protected List<XmlAdapter<?,?>> getAllInternalEnumXmlAdapters(IRuntimeRepository repository)
Description copied from class: AbstractRuntimeRepository
Returns all enumeration XmlAdapters available in this repository that generated by Faktor-IPS.

Specified by:
getAllInternalEnumXmlAdapters in class AbstractRuntimeRepository
Parameters:
repository - the runtime repository that needs to be used by the XmlAdapters that are returned by this method

getNotCachedEnumXmlAdapter

protected abstract List<XmlAdapter<?,?>> getNotCachedEnumXmlAdapter(IRuntimeRepository repository)

getCustomRuntimeObjectInternal

protected <T> T getCustomRuntimeObjectInternal(Class<T> type,
                                               String ipsObjectQualifiedName)
Description copied from class: AbstractRuntimeRepository
Same as getCustomRuntimeObject(Class type, String id) but searches only in this repository and not the ones this repository depends on.

Specified by:
getCustomRuntimeObjectInternal in class AbstractRuntimeRepository

getNotCachedCustomObject

protected abstract <T> T getNotCachedCustomObject(Class<T> type,
                                                  String ipsObjectQualifiedName)


Copyright © 2015. All rights reserved.