Class AbstractCachingRuntimeRepository
- All Implemented Interfaces:
IRuntimeRepository
- Direct Known Subclasses:
AbstractTocBasedRuntimeRepository
getNotCached... method.
To be performant and thread safe we use the double checking idiom as it is described by Doug Lea.
Since we use Java 5 there is a thread-safe 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
synchronized 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
ConstructorsConstructorDescriptionAbstractCachingRuntimeRepository(String name, ICacheFactory cacheFactory, ClassLoader cl) -
Method Summary
Modifier and TypeMethodDescriptionprotected List<IIpsXmlAdapter<?,?>> getAllInternalEnumXmlAdapters(IRuntimeRepository repository) Returns all enumeration XmlAdapters available in this repository that generated by Faktor-IPS.protected <T> TgetCustomRuntimeObjectInternal(Class<T> type, String ipsObjectQualifiedName) Same asAbstractRuntimeRepository.getCustomRuntimeObject(Class, String)but searches only in this repository and not the ones this repository depends on.<T> org.faktorips.values.InternationalStringgetEnumDescription(Class<T> type) Returns the description for the given enumeration type.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> TgetNotCachedCustomObject(Class<T> type, String ipsObjectQualifiedName) protected abstract <T> IpsEnum<T>getNotCachedEnumValues(Class<T> clazz) protected abstract List<IIpsXmlAdapter<?,?>> getNotCachedEnumXmlAdapter(IRuntimeRepository repository) protected abstract IProductComponentprotected abstract IProductComponentGenerationgetNotCachedProductComponentGeneration(GenerationId generationId) protected abstract ITable<?>getNotCachedTable(String qualifiedTableName) protected IProductComponentGenerationgetProductComponentGenerationInternal(String id, DateTime validFrom) protected IProductComponentSame as getProductComponent(String id) but searches only in this repository and not the ones this repository depends on.protected ITable<?>getTableInternal(String qualifiedTableName) Same asAbstractRuntimeRepository.getTable(String)) but searches only in this repository and not the ones this repository depends on.protected voidMethods inherited from class org.faktorips.runtime.internal.AbstractRuntimeRepository
addAllEnumXmlAdapters, addDirectlyReferencedRepository, addEnumValueLookupService, getAllEnumClasses, getAllEnumClasses, getAllIpsTestCases, getAllIpsTestCases, getAllModelTypeImplementationClasses, getAllModelTypeImplementationClasses, getAllProductComponentIds, getAllProductComponentIds, getAllProductComponents, getAllProductComponents, getAllProductComponents, getAllProductComponents, getAllProductComponents, getAllProductComponentsInternal, getAllReferencedRepositories, getAllTableIds, getAllTableIds, getAllTables, getAllTables, getClassLoader, getCustomRuntimeObject, getDirectlyReferencedRepositories, getEnumValue, getEnumValue, getEnumValueLookupService, getEnumValues, getEnumValuesDefinedInType, getExistingEnumValue, getExistingProductComponent, getExistingProductComponentGeneration, getFormulaEvaluatorFactory, getIpsTest, getIpsTest, getIpsTestCase, getIpsTestCase, getIpsTestCaseInternal, getIpsTestCasesStartingWith, getIpsTestCasesStartingWith, getIpsTestSuite, getIpsTestSuite, getLatestProductComponentGeneration, getLatestProductComponentGenerationInternal, getModelType, getModelType, getModelType, getName, getNextProductComponentGeneration, getNextProductComponentGenerationInternal, getNumberOfProductComponentGenerations, getNumberOfProductComponentGenerationsInternal, getPreviousProductComponentGeneration, getPreviousProductComponentGenerationInternal, getProductComponent, getProductComponent, getProductComponentGeneration, getProductComponentGenerationInternal, getProductComponentGenerations, getProductComponentGenerations, getProductComponentInternal, getRuntimeRepositoryLookup, getTable, getTable, getTableInternal, isMultiContent, newJAXBContext, newJAXBContext, removeEnumValueLookupService, setFormulaEvaluatorFactory, setRuntimeRepositoryLookup, toStringMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface org.faktorips.runtime.IRuntimeRepository
isModifiable
-
Constructor Details
-
AbstractCachingRuntimeRepository
-
-
Method Details
-
initCaches
-
getProductComponentInternal
Description copied from class:AbstractRuntimeRepositorySame as getProductComponent(String id) but searches only in this repository and not the ones this repository depends on.- Specified by:
getProductComponentInternalin classAbstractRuntimeRepository
-
getNotCachedProductComponent
-
getProductComponentGenerationInternal
protected IProductComponentGeneration getProductComponentGenerationInternal(String id, DateTime validFrom) -
getNotCachedProductComponentGeneration
protected abstract IProductComponentGeneration getNotCachedProductComponentGeneration(GenerationId generationId) -
getEnumValuesInternal
Description copied from class:AbstractRuntimeRepositoryReturns the list of enumeration values of the enumeration type that is identified by its class which is provided to it.- Specified by:
getEnumValuesInternalin classAbstractRuntimeRepository
-
getNotCachedEnumValues
-
getTableInternal
Description copied from class:AbstractRuntimeRepositorySame asAbstractRuntimeRepository.getTable(String)) but searches only in this repository and not the ones this repository depends on.- Specified by:
getTableInternalin classAbstractRuntimeRepository
-
getNotCachedTable
-
getAllInternalEnumXmlAdapters
Description copied from class:AbstractRuntimeRepositoryReturns all enumeration XmlAdapters available in this repository that generated by Faktor-IPS.- Specified by:
getAllInternalEnumXmlAdaptersin classAbstractRuntimeRepository- Parameters:
repository- the runtime repository that needs to be used by the XmlAdapters that are returned by this method
-
getNotCachedEnumXmlAdapter
protected abstract List<IIpsXmlAdapter<?,?>> getNotCachedEnumXmlAdapter(IRuntimeRepository repository) -
getCustomRuntimeObjectInternal
Description copied from class:AbstractRuntimeRepositorySame asAbstractRuntimeRepository.getCustomRuntimeObject(Class, String)but searches only in this repository and not the ones this repository depends on.- Specified by:
getCustomRuntimeObjectInternalin classAbstractRuntimeRepository
-
getNotCachedCustomObject
-
getEnumDescription
Description copied from interface:IRuntimeRepositoryReturns the description for the given enumeration type.- Type Parameters:
T- The enum type- Parameters:
type- the enum type's class
-