Package net.sf.basedb.core
Class BasicBatcher<D extends BatchableData>
- java.lang.Object
-
- net.sf.basedb.core.AbstractBatcher
-
- net.sf.basedb.core.BasicBatcher<D>
-
- All Implemented Interfaces:
AutoCloseable
,AccessControlled
,Batcher
- Direct Known Subclasses:
FeatureBatcher
,RawDataBatcher
,ReporterBatcher
public abstract class BasicBatcher<D extends BatchableData> extends AbstractBatcher implements AccessControlled
This is an abstract class for batching functionallity. Add all objects and then callflush
to send the batch to the database.BasicBatcher
can also have a limit on the batch size, when the batch is fullBasicBatcher
will automatically callflush
to send the current batch to the database.- Version:
- 2.0
- Author:
- Samuel, Nicklas
- Last modified
- $Date: 2014-06-10 13:27:02 +0200 (ti, 10 jun 2014) $
-
-
Field Summary
Fields Modifier and Type Field Description private Class<D>
dataClass
The class of data objects accepted by this batcher.protected static boolean
debugEnabled
So we don't always have to call logParam.debug()private int
deleteCount
private String
deleteSql
private PreparedStatement
deleteStatement
private String
entityName
The entity name as known to Hibernate.private String
idPropertyName
The name of the ID property.private int
insertCount
private int
insertCountTotal
Counts the number of inserts done by the batcher.private List<BatchedPropertyInfo>
insertPropertyOrder
private String
insertSql
private PreparedStatement
insertStatement
protected static org.slf4j.Logger
logParam
Log all parameter bindings to prepared statement.private org.hibernate.metadata.ClassMetadata
metaData
Hibernate metadata for the batchable object.private int
permissions
The logged in user's permission to this item.private org.hibernate.mapping.Table
table
The table where items of this type are stored.private int
totalCount
private int
updateCount
private List<BatchedPropertyInfo>
updatePropertyOrder
private String
updateSql
private PreparedStatement
updateStatement
-
Fields inherited from class net.sf.basedb.core.AbstractBatcher
debugSqlEnabled, logSql
-
-
Constructor Summary
Constructors Constructor Description BasicBatcher(org.hibernate.Session session, Class<D> dataClass, String entityName)
Constructor that initiate everything.
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description private void
addToBatch(D data, PreparedStatement ps, List<BatchedPropertyInfo> propertyOrder)
Add the data object to the batch represented by the prepared statementvoid
checkPermission(Permission permission)
Checks if the logged in user has the specified permission on this item.void
delete(int id)
Delete a data object by id.void
delete(D data)
Delete a data object.void
flush()
Flush the batcher and send all remaining items in memory to the database.void
flushDelete()
Flush the SQL delete command buffer.void
flushInsert()
Flush the SQL insert command buffer.void
flushUpdate()
Flush the SQL insert command buffer.Set<Permission>
getPermissions()
Get the logged in user's permissions on the item.(package private) PluginPermission
getPluginPermissions()
(package private) Object
getPropertyValue(D data, String propertyName)
Get the value of a protected property value on a data object using Hibernate built-in reflection methods.int
getTotalInsertCount()
Gets the total number of inserts done by the batcherabstract Item
getType()
Get the type of item supported by the batcher.boolean
hasPermission(Permission permission)
Checks if the logged in user has the specified permission on this item.(package private) void
initPermissions(int granted, int denied)
Initialise the logged in user's permissions for this batcher.void
insert(D data)
Insert a data object.(package private) void
onBeforeClose()
Close all open SQL statements.(package private) void
onBeforeCommit(D data, Transactional.Action action)
Called after the object has been validated just before the SQL is added to the batch queue.(package private) void
setPropertyValue(D data, String propertyName, Object value)
Set a protected property value on a data object using Hibernate built-in reflection methods.void
update(D data)
Update a data object.abstract void
validate(D data)
Validate the data, since no validation is possible in set methods of the data object.-
Methods inherited from class net.sf.basedb.core.AbstractBatcher
analyzeTable, close, getBatchSize, getDbControl, getSessionControl, isClosed, setBatchSize, setDbControl, updateLastAccess
-
-
-
-
Field Detail
-
logParam
protected static final org.slf4j.Logger logParam
Log all parameter bindings to prepared statement.
-
debugEnabled
protected static final boolean debugEnabled
So we don't always have to call logParam.debug()
-
insertCountTotal
private int insertCountTotal
Counts the number of inserts done by the batcher.
-
dataClass
private final Class<D extends BatchableData> dataClass
The class of data objects accepted by this batcher.
-
entityName
private final String entityName
The entity name as known to Hibernate.
-
permissions
private int permissions
The logged in user's permission to this item. Calculated by theinitPermissions(int, int)
method.
-
metaData
private final org.hibernate.metadata.ClassMetadata metaData
Hibernate metadata for the batchable object.
-
table
private final org.hibernate.mapping.Table table
The table where items of this type are stored.
-
idPropertyName
private final String idPropertyName
The name of the ID property. Usually this is 'id'.
-
insertStatement
private final PreparedStatement insertStatement
-
updateStatement
private final PreparedStatement updateStatement
-
deleteStatement
private final PreparedStatement deleteStatement
-
insertSql
private final String insertSql
-
updateSql
private final String updateSql
-
deleteSql
private final String deleteSql
-
insertPropertyOrder
private final List<BatchedPropertyInfo> insertPropertyOrder
-
updatePropertyOrder
private final List<BatchedPropertyInfo> updatePropertyOrder
-
insertCount
private int insertCount
-
updateCount
private int updateCount
-
deleteCount
private int deleteCount
-
totalCount
private int totalCount
-
-
Constructor Detail
-
BasicBatcher
BasicBatcher(org.hibernate.Session session, Class<D> dataClass, String entityName) throws BaseException
Constructor that initiate everything.- Parameters:
dataClass
- The class of the data objects that are accepted by this batcherentityName
- The entity name of the data as known by Hibernate, use null to use the dataClass as the entity name- Throws:
BaseException
- If there is an error
-
-
Method Detail
-
hasPermission
public final boolean hasPermission(Permission permission)
Checks if the logged in user has the specified permission on this item. The default implementation only checks the role keys for permissions. A subclass may not override this method since it would make it possible to bypass security checks.Subclasses that needs to check other keys, should override the
initPermissions(int,int)
method instead.- Specified by:
hasPermission
in interfaceAccessControlled
- Parameters:
permission
- A value from thePermission
class- Returns:
TRUE
if the user has the permission,FALSE
otherwise
-
checkPermission
public final void checkPermission(Permission permission) throws PermissionDeniedException
Checks if the logged in user has the specified permission on this item. If not, aPermissionDeniedException
is thrown.- Specified by:
checkPermission
in interfaceAccessControlled
- Parameters:
permission
- A value from thePermission
class- Throws:
PermissionDeniedException
- If the logged in user doesn't have the requested permission
-
getPermissions
public final Set<Permission> getPermissions()
Description copied from interface:AccessControlled
Get the logged in user's permissions on the item.- Specified by:
getPermissions
in interfaceAccessControlled
-
flush
public void flush() throws BaseException
Description copied from interface:Batcher
Flush the batcher and send all remaining items in memory to the database.- Specified by:
flush
in interfaceBatcher
- Throws:
BaseException
- If there is an error- See Also:
Batcher.close()
-
onBeforeClose
void onBeforeClose() throws BaseException
Close all open SQL statements.- Overrides:
onBeforeClose
in classAbstractBatcher
- Throws:
BaseException
-
initPermissions
void initPermissions(int granted, int denied) throws BaseException
Initialise the logged in user's permissions for this batcher. The default implementation checks the role keys.Subclasses that needs to check other keys or properties, such as the
RawDataBatcher
should override this method. The subclass should calculate additional permissions to be granted or denied, and combine those with whatever was passed as parameters. Use the binary OR operator ( | ) to combine the permissions. Finally the subclass must callsuper.initPermissions(granted, denied)
.- Parameters:
granted
- Permissions that have been granted by the subclassdenied
- Permissions that have been denied by the subclass- Throws:
BaseException
- If the permissions couldn't be initialised
-
getPluginPermissions
PluginPermission getPluginPermissions()
-
insert
public void insert(D data) throws InvalidDataException, PermissionDeniedException, BaseException
Insert a data object. The data object will not be synchronized with the database. The object values may be modified.- Parameters:
data
- Data object to be inserted- Throws:
InvalidDataException
- If the data is null or it doesn't validate against thevalidate(BatchableData)
methodPermissionDeniedException
- If the logged in user doesn't have create permissionBaseException
- If there is another error
-
update
public void update(D data) throws InvalidDataException, PermissionDeniedException, BaseException
Update a data object. The data object will not be synchronized with the database. The object values may be modified.- Parameters:
data
- Data object to be updated- Throws:
InvalidDataException
- If the data is null or it doesn't validate against thevalidate(BatchableData)
methodPermissionDeniedException
- If the logged in user doesn't have write permissionBaseException
- If there is another error
-
delete
public void delete(D data) throws InvalidDataException, PermissionDeniedException, BaseException
Delete a data object.- Parameters:
data
- Data object to be deleted- Throws:
InvalidDataException
- If the data is nullPermissionDeniedException
- If the logged in user doesn't have delete permissionBaseException
- If there is another error
-
delete
public void delete(int id) throws PermissionDeniedException, BaseException
Delete a data object by id.- Parameters:
id
- Id of the object to be deleted- Throws:
PermissionDeniedException
- If the logged in user doesn't have delete permissionBaseException
- If there is another error
-
flushInsert
public void flushInsert() throws BaseException
Flush the SQL insert command buffer. Sends the remaining SQL commands in the batch to the database for execution.- Throws:
BaseException
- Thrown if there is a database error.
-
flushUpdate
public void flushUpdate() throws BaseException
Flush the SQL insert command buffer. Sends the remaining SQL commands in the batch to the database for execution.- Throws:
BaseException
- Thrown if there is a database error.
-
flushDelete
public void flushDelete() throws BaseException
Flush the SQL delete command buffer. Sends the remaining SQL commands in the batch to the database for execution.- Throws:
BaseException
- Thrown if there is a database error.
-
addToBatch
private void addToBatch(D data, PreparedStatement ps, List<BatchedPropertyInfo> propertyOrder) throws DatabaseException
Add the data object to the batch represented by the prepared statement- Parameters:
data
- Data object to get property values fromps
- The prepared statement to add the data object topropertyOrder
- The property names of the parameter order in the prepared statement- Throws:
DatabaseException
- If there is an error
-
setPropertyValue
void setPropertyValue(D data, String propertyName, Object value)
Set a protected property value on a data object using Hibernate built-in reflection methods.- Parameters:
data
- The data object to set the property onpropertyName
- The name of the property, ie. same asgetXxx
method name minus theget
partvalue
- The value to give to the property
-
getPropertyValue
Object getPropertyValue(D data, String propertyName)
Get the value of a protected property value on a data object using Hibernate built-in reflection methods.- Parameters:
data
- The data object to set the property onpropertyName
- The name of the property, ie. same asgetXxx
method name minus theget
part- Returns:
- The value of the property
-
onBeforeCommit
void onBeforeCommit(D data, Transactional.Action action) throws BaseException
Called after the object has been validated just before the SQL is added to the batch queue.- Parameters:
data
- Object to updateaction
- The action- Throws:
BaseException
-
validate
public abstract void validate(D data) throws InvalidDataException
Validate the data, since no validation is possible in set methods of the data object. Ie. this is very similar to case 2 validation for items.- Parameters:
data
- Data object to validate- Throws:
InvalidDataException
- If the data object is invalid
-
getType
public abstract Item getType()
Get the type of item supported by the batcher. The returned value is one of the values defined in theItem
enumeration.- Returns:
- A value indicating the type of item
- See Also:
Item
-
getTotalInsertCount
public int getTotalInsertCount()
Gets the total number of inserts done by the batcher
-
-