Package de.hybris.platform.core
Class AbstractTenant
- java.lang.Object
-
- de.hybris.platform.core.AbstractTenant
-
- All Implemented Interfaces:
DataSourceProvider
,Tenant
,java.io.Serializable
- Direct Known Subclasses:
MasterTenant
,SlaveTenant
,TestTenantStub
public abstract class AbstractTenant extends java.lang.Object implements Tenant, java.io.Serializable
- See Also:
- Serialized Form
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description protected static interface
AbstractTenant.CodeWrapper
protected static class
AbstractTenant.DataSourceHolder
protected static class
AbstractTenant.DataSourceSelection
static class
AbstractTenant.ShutDownMode
static class
AbstractTenant.State
class
AbstractTenant.TenantNotYetStartedException
-
Field Summary
Fields Modifier and Type Field Description static java.lang.String
ALT_DATASOURCE
static java.lang.String
MASTER_DATASOURCE_ID
static java.lang.String
SLAVE_DATASOURCE
-
Constructor Summary
Constructors Modifier Constructor Description protected
AbstractTenant(java.lang.String tenantID)
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Deprecated Methods Modifier and Type Method Description protected void
activateAlternativeDataSource(java.lang.String id, boolean asMaster)
void
activateAlternativeMasterDataSource(java.lang.String id)
Switches to a specified (by the id) master data source for the current thread.java.lang.String
activateSlaveDataSource()
Switches to a slave data source for the current thread.void
activateSlaveDataSource(java.lang.String id)
Switches to a specified (by the id) slave data source for the current thread.protected void
assertTenant(JaloSession session)
protected void
assureTypeSystemStructureIsUpToDate()
protected void
backgroundThreadFinished(java.lang.Thread thread, java.lang.Runnable payload)
protected void
backgroundThreadStarted(java.lang.Thread thread, java.lang.Runnable payload)
void
cancelForceMasterMode()
Be careful! This method is intended for internal testing.protected boolean
cannotAccess()
boolean
cannotConnect()
protected boolean
canSwitch(AbstractTenant.DataSourceSelection currentSelection, boolean toMaster)
void
clearConnectionHasBeenBroken()
boolean
connectionHasBeenBroken()
protected HybrisDataSource
createAlternativeDataSource(DataSourceFactory factory, java.lang.String id, java.util.Map<java.lang.String,java.lang.String> params, boolean readOnly)
protected java.util.List<AbstractTenant.DataSourceHolder>
createAlternativeDataSources(DataSourceFactory defaultFactory, ConfigIntf cfg, java.util.Collection<HybrisDataSource> createdForRollback)
java.lang.Thread
createAndRegisterBackgroundThread(java.lang.Runnable payload, java.util.concurrent.ThreadFactory factory)
protected Cache
createCache()
protected DataSourceFactory
createDataSourceFactory(ConfigIntf cfg)
protected DataSourceFactory
createDataSourceFactory(java.lang.String className)
static ThreadPool
createDefaultThreadPool(java.lang.String tenantID, int poolSize)
protected HybrisDataSource
createMasterDataSource(DataSourceFactory factory)
void
deactivateAlternativeDataSource()
After a alternative slave or master data source has been activated for the current thread it's necessary to de-activate it again! After this the base master data source is active (again).void
deactivateSlaveDataSource()
After slave data source has been activated for the current thread it's necessary to de-activate it again! After this the master data source is active (again).protected void
doInitialize()
void
doShutDown()
void
doStartUp()
boolean
equals(java.lang.Object o)
protected void
executeInitsIfNecessary()
Performs calling Init.Init() for all registered init instances and also performsTenantListener.afterTenantStartUp(Tenant)
notification.static java.util.Map<java.lang.String,java.lang.String>
extractCustomDBParams(ConfigIntf cfg)
static java.util.Map<java.lang.String,java.lang.String>
extractCustomDBParams(ConfigIntf cfg, boolean stripPrefix)
static java.util.Map<java.lang.String,java.lang.String>
extractCustomDBParams(java.util.Map<java.lang.String,java.lang.String> map)
static java.util.Map<java.lang.String,java.lang.String>
extractCustomDBParams(java.util.Map<java.lang.String,java.lang.String> map, boolean stripPrefix)
void
forceMasterDataSource()
Enforces the usage of a master data source for all subsequent calls toDataSourceProvider.getDataSource()
no matter if a slave data source has been activated or not.JaloSession
getActiveSession()
java.util.List<SessionContext>
getActiveSessionContextList()
protected java.util.Collection<HybrisDataSource>
getAllAlternativeDataSources(boolean asMaster)
java.util.Set<java.lang.String>
getAllAlternativeMasterDataSourceIDs()
Provides IDs of all available alternative master data sources.java.util.Collection<HybrisDataSource>
getAllAlternativeMasterDataSources()
Returns all known alternative master data sources as Collection.protected java.util.Set<java.lang.String>
getAllAlterntiveDataSourceIDs(boolean asMaster)
java.util.Set<java.lang.String>
getAllDataSourceIDs()
java.util.Set<java.lang.String>
getAllSlaveDataSourceIDs()
Provides IDs of all available slave data sources.java.util.Collection<HybrisDataSource>
getAllSlaveDataSources()
Returns all known slave data sources as Collection.Cache
getCache()
int
getClusterID()
Deprecated.since ages - UseRegistry.getClusterID()
instead.abstract ConfigIntf
getConfig()
static Tenant
getCurrentTenant()
HybrisDataSource
getDataSource()
Returns currently active data source.HybrisDataSource
getDataSource(java.lang.String className)
Returns new data source.long
getDynamicClusterNodeID()
InvalidationManager
getInvalidationManager()
JaloConnection
getJaloConnection()
HybrisDataSource
getMasterDataSource()
Returns master data source no matter which one is currently active.protected AbstractTenant.DataSourceSelection
getNextSlave()
Returns the next availableAbstractTenant.DataSourceSelection
PersistenceManager
getPersistenceManager()
PersistencePool
getPersistencePool()
SerialNumberGenerator
getSerialNumberGenerator()
SingletonCreator
getSingletonCreator()
AbstractTenant.State
getState()
protected java.lang.String
getStateInfo()
SystemEJB
getSystemEJB()
java.lang.String
getTenantID()
long
getTenantRestartMarker()
abstract java.util.List<java.lang.String>
getTenantSpecificExtensionNames()
ThreadPool
getThreadPool()
ThreadPool
getWorkersThreadPool()
int
hashCode()
protected void
initializeCache(HybrisDataSource masterDataSource)
boolean
isAlternativeMasterDataSource()
Tells whether the current active data source is a alternative master data source.boolean
isClusteringEnabled()
checks if clustermode is enabledboolean
isForceMaster()
If on the current data source (slave/master) the methodDataSourceProvider.forceMasterDataSource()
was called then this method returns true.boolean
isNotifiyingListeners()
boolean
isSlaveDataSource()
Tells whether current data source is a slave data source.boolean
isStarting()
boolean
isStopping()
protected java.util.Map<java.lang.String,java.lang.String>
mergeSlaveDataSourceParameter(java.lang.String dsID, java.util.Map<java.lang.String,java.lang.String> tenantSettings, java.lang.String... keys)
protected java.lang.Object
performWithinOwnSystem(AbstractTenant.CodeWrapper wrapper)
MSSQLServerTransactionParameters
readParameters(javax.sql.DataSource dataSource)
Checks READ_COMMITTED_SNAPSHOT and ALLOW_SNAPSHOT_ISOLATION parameters for MS SQL Serverprotected void
relaseAdministrationLockIfNeeded(HybrisDataSource masterDataSource)
Tries to release administration lock if lock was acquired by thisgetClusterID()
node.void
resetTenantRestartMarker()
void
setActiveSessionForCurrentThread(JaloSession session)
protected void
setState(AbstractTenant.State state)
void
setSystemInit(java.lang.Boolean state)
void
setTenantID(java.lang.String id)
abstract void
shutDown()
protected void
shutdownCache(AbstractTenant.ShutDownMode mode)
abstract void
startUp()
java.lang.String
toString()
java.lang.Object
writeReplace()
-
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface de.hybris.platform.core.Tenant
getAllItemLifecycleListeners, getTenantSpecificLocale, getTenantSpecificTimeZone
-
-
-
-
Field Detail
-
SLAVE_DATASOURCE
public static final java.lang.String SLAVE_DATASOURCE
- See Also:
- Constant Field Values
-
ALT_DATASOURCE
public static final java.lang.String ALT_DATASOURCE
- See Also:
- Constant Field Values
-
MASTER_DATASOURCE_ID
public static final java.lang.String MASTER_DATASOURCE_ID
- See Also:
- Constant Field Values
-
-
Method Detail
-
getTenantSpecificExtensionNames
public abstract java.util.List<java.lang.String> getTenantSpecificExtensionNames()
- Specified by:
getTenantSpecificExtensionNames
in interfaceTenant
-
getConfig
public abstract ConfigIntf getConfig()
-
startUp
public abstract void startUp() throws ConsistencyCheckException
- Throws:
ConsistencyCheckException
-
shutDown
public abstract void shutDown()
-
getCurrentTenant
public static Tenant getCurrentTenant()
-
setSystemInit
public void setSystemInit(java.lang.Boolean state)
-
getTenantRestartMarker
public long getTenantRestartMarker()
- Returns:
- a time stamp marker when current tenant was created/restarted for the last time. If no restart occurred points to creation time.
-
doInitialize
protected void doInitialize()
-
relaseAdministrationLockIfNeeded
protected void relaseAdministrationLockIfNeeded(HybrisDataSource masterDataSource)
Tries to release administration lock if lock was acquired by thisgetClusterID()
node.
-
initializeCache
protected void initializeCache(HybrisDataSource masterDataSource)
-
readParameters
public MSSQLServerTransactionParameters readParameters(javax.sql.DataSource dataSource)
Checks READ_COMMITTED_SNAPSHOT and ALLOW_SNAPSHOT_ISOLATION parameters for MS SQL Server
-
doStartUp
public final void doStartUp() throws ConsistencyCheckException
- Throws:
ConsistencyCheckException
-
assureTypeSystemStructureIsUpToDate
protected void assureTypeSystemStructureIsUpToDate()
-
doShutDown
public final void doShutDown()
-
shutdownCache
protected void shutdownCache(AbstractTenant.ShutDownMode mode)
-
executeInitsIfNecessary
protected final void executeInitsIfNecessary()
Performs calling Init.Init() for all registered init instances and also performsTenantListener.afterTenantStartUp(Tenant)
notification. Both is working in a thread-safe non-blocking mode now.
-
cannotAccess
protected final boolean cannotAccess()
-
getStateInfo
protected java.lang.String getStateInfo()
-
getState
public final AbstractTenant.State getState()
-
setState
protected final void setState(AbstractTenant.State state)
-
getTenantID
public java.lang.String getTenantID()
- Specified by:
getTenantID
in interfaceTenant
-
setTenantID
public void setTenantID(java.lang.String id)
-
toString
public java.lang.String toString()
- Overrides:
toString
in classjava.lang.Object
-
getDataSource
public HybrisDataSource getDataSource(java.lang.String className)
Description copied from interface:DataSourceProvider
Returns new data source. (experimental (related to PLA-7861))- Specified by:
getDataSource
in interfaceDataSourceProvider
-
getDataSource
public HybrisDataSource getDataSource()
Description copied from interface:DataSourceProvider
Returns currently active data source.- Specified by:
getDataSource
in interfaceDataSourceProvider
-
cancelForceMasterMode
public void cancelForceMasterMode()
Be careful! This method is intended for internal testing. Generally it's not recommended to cancel forceMaster mode since this would bear the danger of seeing stale data due to switching to slave data source is possible again.
-
forceMasterDataSource
public void forceMasterDataSource()
Description copied from interface:DataSourceProvider
Enforces the usage of a master data source for all subsequent calls toDataSourceProvider.getDataSource()
no matter if a slave data source has been activated or not.Please note that this does not affect chosen alternative master data sources. If you want to switch back to the main master data source use
DataSourceProvider.deactivateAlternativeDataSource()
.- Specified by:
forceMasterDataSource
in interfaceDataSourceProvider
-
createDataSourceFactory
protected DataSourceFactory createDataSourceFactory(java.lang.String className)
-
createDataSourceFactory
protected DataSourceFactory createDataSourceFactory(ConfigIntf cfg)
-
getMasterDataSource
public HybrisDataSource getMasterDataSource()
Description copied from interface:DataSourceProvider
Returns master data source no matter which one is currently active.- Specified by:
getMasterDataSource
in interfaceDataSourceProvider
-
deactivateSlaveDataSource
public void deactivateSlaveDataSource()
Description copied from interface:DataSourceProvider
After slave data source has been activated for the current thread it's necessary to de-activate it again! After this the master data source is active (again).- Specified by:
deactivateSlaveDataSource
in interfaceDataSourceProvider
- See Also:
DataSourceProvider.activateSlaveDataSource()
-
deactivateAlternativeDataSource
public void deactivateAlternativeDataSource()
Description copied from interface:DataSourceProvider
After a alternative slave or master data source has been activated for the current thread it's necessary to de-activate it again! After this the base master data source is active (again).- Specified by:
deactivateAlternativeDataSource
in interfaceDataSourceProvider
- See Also:
DataSourceProvider.activateSlaveDataSource()
,DataSourceProvider.activateAlternativeMasterDataSource(String)
-
getAllSlaveDataSources
public java.util.Collection<HybrisDataSource> getAllSlaveDataSources()
Description copied from interface:DataSourceProvider
Returns all known slave data sources as Collection.- Specified by:
getAllSlaveDataSources
in interfaceDataSourceProvider
- Returns:
- a
Set
withHybrisDataSource
objects
-
getAllAlternativeDataSources
protected java.util.Collection<HybrisDataSource> getAllAlternativeDataSources(boolean asMaster)
-
getAllAlternativeMasterDataSources
public java.util.Collection<HybrisDataSource> getAllAlternativeMasterDataSources()
Description copied from interface:DataSourceProvider
Returns all known alternative master data sources as Collection.- Specified by:
getAllAlternativeMasterDataSources
in interfaceDataSourceProvider
- Returns:
- a
Set
withHybrisDataSource
objects
-
getAllDataSourceIDs
public java.util.Set<java.lang.String> getAllDataSourceIDs()
- Specified by:
getAllDataSourceIDs
in interfaceDataSourceProvider
-
getAllAlterntiveDataSourceIDs
protected java.util.Set<java.lang.String> getAllAlterntiveDataSourceIDs(boolean asMaster)
-
getAllSlaveDataSourceIDs
public java.util.Set<java.lang.String> getAllSlaveDataSourceIDs()
Description copied from interface:DataSourceProvider
Provides IDs of all available slave data sources.- Specified by:
getAllSlaveDataSourceIDs
in interfaceDataSourceProvider
-
getAllAlternativeMasterDataSourceIDs
public java.util.Set<java.lang.String> getAllAlternativeMasterDataSourceIDs()
Description copied from interface:DataSourceProvider
Provides IDs of all available alternative master data sources.- Specified by:
getAllAlternativeMasterDataSourceIDs
in interfaceDataSourceProvider
-
activateSlaveDataSource
public java.lang.String activateSlaveDataSource()
Description copied from interface:DataSourceProvider
Switches to a slave data source for the current thread. If the current data source is already a slave one this has no effect. Use as follows:Tenant t = Registry.getCurrentTenant(); try { t.activateSlaveDataSource(); // ... business logic ... } finally { t.deactivateSlaveSource(); }
- Specified by:
activateSlaveDataSource
in interfaceDataSourceProvider
- See Also:
DataSourceProvider.deactivateAlternativeDataSource()
-
canSwitch
protected boolean canSwitch(AbstractTenant.DataSourceSelection currentSelection, boolean toMaster)
-
activateSlaveDataSource
public void activateSlaveDataSource(java.lang.String id)
Description copied from interface:DataSourceProvider
Switches to a specified (by the id) slave data source for the current thread. If the current data source is already a slave one this has no effect. Use as follows:Tenant t = Registry.getCurrentTenant(); try { t.activateSlaveDataSource("your_slave_id"); // ... business logic ... } finally { t.deactivateSlaveSource(); }
- Specified by:
activateSlaveDataSource
in interfaceDataSourceProvider
- Parameters:
id
- the id string of the slave data source- See Also:
DataSourceProvider.deactivateAlternativeDataSource()
-
activateAlternativeDataSource
protected void activateAlternativeDataSource(java.lang.String id, boolean asMaster)
-
activateAlternativeMasterDataSource
public void activateAlternativeMasterDataSource(java.lang.String id)
Description copied from interface:DataSourceProvider
Switches to a specified (by the id) master data source for the current thread. Use as follows:Tenant t = Registry.getCurrentTenant(); try { t.activateMasterDataSource("your_slave_id"); // ... business logic ... } finally { t.deactivateSlaveSource(); }
- Specified by:
activateAlternativeMasterDataSource
in interfaceDataSourceProvider
- Parameters:
id
- the id string of the slave data source- See Also:
DataSourceProvider.deactivateAlternativeDataSource()
-
isForceMaster
public boolean isForceMaster()
Description copied from interface:DataSourceProvider
If on the current data source (slave/master) the methodDataSourceProvider.forceMasterDataSource()
was called then this method returns true. ADataSourceProvider.deactivateAlternativeDataSource()
will reset this state.- Specified by:
isForceMaster
in interfaceDataSourceProvider
- Returns:
- true if the master data source is forced
-
isSlaveDataSource
public boolean isSlaveDataSource()
Description copied from interface:DataSourceProvider
Tells whether current data source is a slave data source.- Specified by:
isSlaveDataSource
in interfaceDataSourceProvider
- Returns:
- true if the
DataSourceProvider
is a slave data source
-
isAlternativeMasterDataSource
public boolean isAlternativeMasterDataSource()
Description copied from interface:DataSourceProvider
Tells whether the current active data source is a alternative master data source.- Specified by:
isAlternativeMasterDataSource
in interfaceDataSourceProvider
-
getNextSlave
protected AbstractTenant.DataSourceSelection getNextSlave()
Returns the next availableAbstractTenant.DataSourceSelection
- Returns:
- null if no valid slave was found
-
getInvalidationManager
public InvalidationManager getInvalidationManager()
- Specified by:
getInvalidationManager
in interfaceTenant
-
getPersistencePool
public PersistencePool getPersistencePool()
- Specified by:
getPersistencePool
in interfaceTenant
-
getPersistenceManager
public PersistenceManager getPersistenceManager()
- Specified by:
getPersistenceManager
in interfaceTenant
-
getSystemEJB
public SystemEJB getSystemEJB()
- Specified by:
getSystemEJB
in interfaceTenant
-
getThreadPool
public ThreadPool getThreadPool()
- Specified by:
getThreadPool
in interfaceTenant
-
getWorkersThreadPool
public ThreadPool getWorkersThreadPool()
- Specified by:
getWorkersThreadPool
in interfaceTenant
-
getSingletonCreator
public SingletonCreator getSingletonCreator()
- Specified by:
getSingletonCreator
in interfaceTenant
-
getSerialNumberGenerator
public SerialNumberGenerator getSerialNumberGenerator()
- Specified by:
getSerialNumberGenerator
in interfaceTenant
-
createDefaultThreadPool
public static ThreadPool createDefaultThreadPool(java.lang.String tenantID, int poolSize)
-
createMasterDataSource
protected HybrisDataSource createMasterDataSource(DataSourceFactory factory)
-
createAlternativeDataSources
protected java.util.List<AbstractTenant.DataSourceHolder> createAlternativeDataSources(DataSourceFactory defaultFactory, ConfigIntf cfg, java.util.Collection<HybrisDataSource> createdForRollback)
-
createAlternativeDataSource
protected HybrisDataSource createAlternativeDataSource(DataSourceFactory factory, java.lang.String id, java.util.Map<java.lang.String,java.lang.String> params, boolean readOnly)
-
mergeSlaveDataSourceParameter
protected java.util.Map<java.lang.String,java.lang.String> mergeSlaveDataSourceParameter(java.lang.String dsID, java.util.Map<java.lang.String,java.lang.String> tenantSettings, java.lang.String... keys)
-
extractCustomDBParams
public static java.util.Map<java.lang.String,java.lang.String> extractCustomDBParams(ConfigIntf cfg)
-
extractCustomDBParams
public static java.util.Map<java.lang.String,java.lang.String> extractCustomDBParams(ConfigIntf cfg, boolean stripPrefix)
-
extractCustomDBParams
public static java.util.Map<java.lang.String,java.lang.String> extractCustomDBParams(java.util.Map<java.lang.String,java.lang.String> map)
-
extractCustomDBParams
public static java.util.Map<java.lang.String,java.lang.String> extractCustomDBParams(java.util.Map<java.lang.String,java.lang.String> map, boolean stripPrefix)
-
createCache
protected Cache createCache()
-
isClusteringEnabled
public boolean isClusteringEnabled()
checks if clustermode is enabled- Returns:
- 'true' ONLY IF the correspondig property is set to 'true' AND the installed licence file supports this feature, too
- Since:
- 4.0.3
-
getClusterID
@Deprecated public int getClusterID()
Deprecated.since ages - UseRegistry.getClusterID()
instead. The cluster ID is a global setting and therefore not strictly depending on the current tenant.
-
getDynamicClusterNodeID
public long getDynamicClusterNodeID()
-
performWithinOwnSystem
protected java.lang.Object performWithinOwnSystem(AbstractTenant.CodeWrapper wrapper)
-
getActiveSession
public JaloSession getActiveSession()
- Specified by:
getActiveSession
in interfaceTenant
-
setActiveSessionForCurrentThread
public void setActiveSessionForCurrentThread(JaloSession session)
-
assertTenant
protected void assertTenant(JaloSession session)
-
getActiveSessionContextList
public java.util.List<SessionContext> getActiveSessionContextList()
-
getJaloConnection
public JaloConnection getJaloConnection()
- Specified by:
getJaloConnection
in interfaceTenant
-
cannotConnect
public boolean cannotConnect()
-
connectionHasBeenBroken
public boolean connectionHasBeenBroken()
-
clearConnectionHasBeenBroken
public void clearConnectionHasBeenBroken()
-
writeReplace
public java.lang.Object writeReplace() throws java.io.ObjectStreamException
- Throws:
java.io.ObjectStreamException
-
isStarting
public final boolean isStarting()
-
isStopping
public final boolean isStopping()
-
isNotifiyingListeners
public final boolean isNotifiyingListeners()
-
createAndRegisterBackgroundThread
public java.lang.Thread createAndRegisterBackgroundThread(java.lang.Runnable payload, java.util.concurrent.ThreadFactory factory)
- Specified by:
createAndRegisterBackgroundThread
in interfaceTenant
-
backgroundThreadStarted
protected void backgroundThreadStarted(java.lang.Thread thread, java.lang.Runnable payload)
-
backgroundThreadFinished
protected void backgroundThreadFinished(java.lang.Thread thread, java.lang.Runnable payload)
-
resetTenantRestartMarker
public void resetTenantRestartMarker()
- Specified by:
resetTenantRestartMarker
in interfaceTenant
-
equals
public boolean equals(java.lang.Object o)
- Overrides:
equals
in classjava.lang.Object
-
hashCode
public int hashCode()
- Overrides:
hashCode
in classjava.lang.Object
-
-