added the field customAttributes to task

Integrated conversion of Map to Blob in MyBatis.
This commit is contained in:
Eberhard Mayer 2017-07-07 15:05:59 +02:00
parent 1278eb2fb3
commit b238768b37
6 changed files with 163 additions and 34 deletions

View File

@ -13,6 +13,7 @@ import org.taskana.TaskService;
import org.taskana.TaskanaEngine; import org.taskana.TaskanaEngine;
import org.taskana.WorkbasketService; import org.taskana.WorkbasketService;
import org.taskana.configuration.TaskanaEngineConfiguration; import org.taskana.configuration.TaskanaEngineConfiguration;
import org.taskana.impl.persistence.MapTypeHandler;
import org.taskana.model.mappings.ClassificationMapper; import org.taskana.model.mappings.ClassificationMapper;
import org.taskana.model.mappings.DistributionTargetMapper; import org.taskana.model.mappings.DistributionTargetMapper;
import org.taskana.model.mappings.ObjectReferenceMapper; import org.taskana.model.mappings.ObjectReferenceMapper;
@ -103,6 +104,7 @@ public class TaskanaEngineImpl implements TaskanaEngine {
configuration.addMapper(ClassificationMapper.class); configuration.addMapper(ClassificationMapper.class);
configuration.addMapper(WorkbasketAccessMapper.class); configuration.addMapper(WorkbasketAccessMapper.class);
configuration.addMapper(ObjectReferenceMapper.class); configuration.addMapper(ObjectReferenceMapper.class);
configuration.getTypeHandlerRegistry().register(MapTypeHandler.class);
return new SqlSessionFactoryBuilder().build(configuration); return new SqlSessionFactoryBuilder().build(configuration);
} }

View File

@ -0,0 +1,95 @@
package org.taskana.impl.persistence;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.sql.Blob;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Map;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This Typehandler will transfer a Map into an xml blob and back.
* @author EH
*/
@SuppressWarnings("rawtypes")
public class MapTypeHandler extends BaseTypeHandler<Map> {
private static final Logger LOGGER = LoggerFactory.getLogger(MapTypeHandler.class);
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Map parameter, JdbcType jdbcType) throws SQLException {
if (parameter != null && parameter.size() > 0) {
LOGGER.debug("Input-Map before serializing: ", parameter);
// Convert Map to byte array
try (ByteArrayOutputStream byteOut = new ByteArrayOutputStream()) {
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(parameter);
ps.setBlob(i, new ByteArrayInputStream(byteOut.toByteArray()));
out.close();
} catch (IOException e) {
LOGGER.error("During serialization of 'customAttributes' an error occured: ", e);
}
} else {
ps.setNull(i, Types.BLOB);
}
}
@Override
public Map getNullableResult(ResultSet rs, String columnName) throws SQLException {
Blob fieldValue = rs.getBlob(columnName);
if (fieldValue != null) {
// Parse byte array to Map
Map result = null;
try (ObjectInputStream in = new ObjectInputStream(fieldValue.getBinaryStream())) {
result = (Map) in.readObject();
} catch (ClassNotFoundException | IOException e) {
LOGGER.error("During deserialization of 'customAttributes' an error occured: ", e);
}
return result;
}
return null;
}
@Override
public Map getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
Blob fieldValue = rs.getBlob(columnIndex);
if (fieldValue != null) {
// Parse byte array to Map
Map result = null;
try (ObjectInputStream in = new ObjectInputStream(fieldValue.getBinaryStream())) {
result = (Map) in.readObject();
} catch (ClassNotFoundException | IOException e) {
LOGGER.error("During deserialization of 'customAttributes' an error occured: ", e);
}
return result;
}
return null;
}
@Override
public Map getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
Blob fieldValue = cs.getBlob(columnIndex);
if (fieldValue != null) {
// Parse byte array to Map
Map result = null;
try (ObjectInputStream in = new ObjectInputStream(fieldValue.getBinaryStream())) {
result = (Map) in.readObject();
} catch (ClassNotFoundException | IOException e) {
LOGGER.error("During deserialization of 'customAttributes' an error occured: ", e);
}
return result;
}
return null;
}
}

View File

@ -1,6 +1,8 @@
package org.taskana.model; package org.taskana.model;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.Collections;
import java.util.Map;
/** /**
* Task entity. * Task entity.
@ -25,6 +27,8 @@ public class Task {
private ObjectReference primaryObjRef; private ObjectReference primaryObjRef;
private boolean isRead; private boolean isRead;
private boolean isTransferred; private boolean isTransferred;
// All objects have to be serializable
private Map<String, Object> customAttributes = Collections.emptyMap();
public String getId() { public String getId() {
return id; return id;
@ -170,6 +174,14 @@ public class Task {
this.isTransferred = isTransferred; this.isTransferred = isTransferred;
} }
public Map<String, Object> getCustomAttributes() {
return customAttributes;
}
public void setCustomAttributes(Map<String, Object> customAttributes) {
this.customAttributes = customAttributes;
}
public String toString() { public String toString() {
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();
sb.append("TASK("); sb.append("TASK(");

View File

@ -2,6 +2,7 @@ package org.taskana.model.mappings;
import java.sql.Date; import java.sql.Date;
import java.util.List; import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Insert;
@ -12,18 +13,24 @@ import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update; import org.apache.ibatis.annotations.Update;
import org.apache.ibatis.type.JdbcType;
import org.taskana.impl.persistence.MapTypeHandler;
import org.taskana.model.DueWorkbasketCounter; import org.taskana.model.DueWorkbasketCounter;
import org.taskana.model.ObjectReference; import org.taskana.model.ObjectReference;
import org.taskana.model.Task; import org.taskana.model.Task;
import org.taskana.model.TaskState; import org.taskana.model.TaskState;
import org.taskana.model.TaskStateCounter; import org.taskana.model.TaskStateCounter;
/** /**
* This class is the mybatis mapping of task. * This class is the mybatis mapping of task.
*/ */
public interface TaskMapper { public interface TaskMapper {
@Select("SELECT ID, TENANT_ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, TYPE, WORKBASKETID, OWNER, PRIMARY_OBJ_REF_ID, IS_READ, IS_TRANSFERRED " String OBJECTREFERENCEMAPPER_FINDBYID = "org.taskana.model.mappings.ObjectReferenceMapper.findById";
+ "FROM TASK " + "WHERE ID = #{id}")
@Select("SELECT ID, TENANT_ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, TYPE, WORKBASKETID, OWNER, PRIMARY_OBJ_REF_ID, IS_READ, IS_TRANSFERRED, CUSTOM_ATTRIBUTES "
+ "FROM TASK "
+ "WHERE ID = #{id}")
@Results(value = { @Results(value = {
@Result(property = "id", column = "ID"), @Result(property = "id", column = "ID"),
@Result(property = "tenantId", column = "TENANT_ID"), @Result(property = "tenantId", column = "TENANT_ID"),
@ -40,13 +47,16 @@ public interface TaskMapper {
@Result(property = "type", column = "TYPE"), @Result(property = "type", column = "TYPE"),
@Result(property = "workbasketId", column = "WORKBASKETID"), @Result(property = "workbasketId", column = "WORKBASKETID"),
@Result(property = "owner", column = "OWNER"), @Result(property = "owner", column = "OWNER"),
@Result(property = "primaryObjRef", column = "PRIMARY_OBJ_REF_ID", javaType = ObjectReference.class, one = @One(select = "org.taskana.model.mappings.ObjectReferenceMapper.findById")), @Result(property = "primaryObjRef", column = "PRIMARY_OBJ_REF_ID", javaType = ObjectReference.class, one = @One(select = OBJECTREFERENCEMAPPER_FINDBYID)),
@Result(property = "isRead", column = "IS_READ"), @Result(property = "isRead", column = "IS_READ"),
@Result(property = "isTransferred", column = "IS_TRANSFERRED") }) @Result(property = "isTransferred", column = "IS_TRANSFERRED"),
@Result(property = "customAttributes", column = "CUSTOM_ATTRIBUTES", jdbcType = JdbcType.BLOB, javaType = Map.class, typeHandler = MapTypeHandler.class) })
Task findById(@Param("id") String id); Task findById(@Param("id") String id);
@Select("SELECT ID, TENANT_ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, TYPE, WORKBASKETID, OWNER, PRIMARY_OBJ_REF_ID, IS_READ, IS_TRANSFERRED " @Select("SELECT ID, TENANT_ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, TYPE, WORKBASKETID, OWNER, PRIMARY_OBJ_REF_ID, IS_READ, IS_TRANSFERRED "
+ "FROM TASK " + "WHERE WORKBASKETID = #{workbasketId} " + "ORDER BY ID") + "FROM TASK "
+ "WHERE WORKBASKETID = #{workbasketId} "
+ "ORDER BY ID")
@Results(value = { @Results(value = {
@Result(property = "id", column = "ID"), @Result(property = "id", column = "ID"),
@Result(property = "tenantId", column = "TENANT_ID"), @Result(property = "tenantId", column = "TENANT_ID"),
@ -63,7 +73,7 @@ public interface TaskMapper {
@Result(property = "type", column = "TYPE"), @Result(property = "type", column = "TYPE"),
@Result(property = "workbasketId", column = "WORKBASKETID"), @Result(property = "workbasketId", column = "WORKBASKETID"),
@Result(property = "owner", column = "OWNER"), @Result(property = "owner", column = "OWNER"),
@Result(property = "primaryObjRef", column = "PRIMARY_OBJ_REF_ID", javaType = ObjectReference.class, one = @One(select = "org.taskana.model.mappings.ObjectReferenceMapper.findById")), @Result(property = "primaryObjRef", column = "PRIMARY_OBJ_REF_ID", javaType = ObjectReference.class, one = @One(select = OBJECTREFERENCEMAPPER_FINDBYID)),
@Result(property = "isRead", column = "IS_READ"), @Result(property = "isRead", column = "IS_READ"),
@Result(property = "isTransferred", column = "IS_TRANSFERRED") }) @Result(property = "isTransferred", column = "IS_TRANSFERRED") })
List<Task> findByWorkBasketId(@Param("workbasketId") String workbasketId); List<Task> findByWorkBasketId(@Param("workbasketId") String workbasketId);
@ -73,7 +83,8 @@ public interface TaskMapper {
+ "FROM TASK " + "FROM TASK "
+ "WHERE WORKBASKETID IN (<foreach item='item' collection='workbasketIds' separator=','>#{item}</foreach>) " + "WHERE WORKBASKETID IN (<foreach item='item' collection='workbasketIds' separator=','>#{item}</foreach>) "
+ "AND STATE IN (<foreach item='item' collection='states' separator=',' >#{item}</foreach>) " + "AND STATE IN (<foreach item='item' collection='states' separator=',' >#{item}</foreach>) "
+ "ORDER BY ID" + "</script>") + "ORDER BY ID"
+ "</script>")
@Results(value = { @Results(value = {
@Result(property = "id", column = "ID"), @Result(property = "id", column = "ID"),
@Result(property = "tenantId", column = "TENANT_ID"), @Result(property = "tenantId", column = "TENANT_ID"),
@ -90,7 +101,7 @@ public interface TaskMapper {
@Result(property = "type", column = "TYPE"), @Result(property = "type", column = "TYPE"),
@Result(property = "workbasketId", column = "WORKBASKETID"), @Result(property = "workbasketId", column = "WORKBASKETID"),
@Result(property = "owner", column = "OWNER"), @Result(property = "owner", column = "OWNER"),
@Result(property = "primaryObjRef", column = "PRIMARY_OBJ_REF_ID", javaType = ObjectReference.class, one = @One(select = "org.taskana.model.mappings.ObjectReferenceMapper.findById")), @Result(property = "primaryObjRef", column = "PRIMARY_OBJ_REF_ID", javaType = ObjectReference.class, one = @One(select = OBJECTREFERENCEMAPPER_FINDBYID)),
@Result(property = "isRead", column = "IS_READ"), @Result(property = "isRead", column = "IS_READ"),
@Result(property = "isTransferred", column = "IS_TRANSFERRED") }) @Result(property = "isTransferred", column = "IS_TRANSFERRED") })
List<Task> findByWorkbasketIdsAndStates(@Param("workbasketIds") List<String> workbasketIds, @Param("states") List<TaskState> states); List<Task> findByWorkbasketIdsAndStates(@Param("workbasketIds") List<String> workbasketIds, @Param("states") List<TaskState> states);
@ -117,22 +128,30 @@ public interface TaskMapper {
@Result(property = "type", column = "TYPE"), @Result(property = "type", column = "TYPE"),
@Result(property = "workbasketId", column = "WORKBASKETID"), @Result(property = "workbasketId", column = "WORKBASKETID"),
@Result(property = "owner", column = "OWNER"), @Result(property = "owner", column = "OWNER"),
@Result(property = "primaryObjRef", column = "PRIMARY_OBJ_REF_ID", javaType = ObjectReference.class, one = @One(select = "org.taskana.model.mappings.ObjectReferenceMapper.findById")), @Result(property = "primaryObjRef", column = "PRIMARY_OBJ_REF_ID", javaType = ObjectReference.class, one = @One(select = OBJECTREFERENCEMAPPER_FINDBYID)),
@Result(property = "isRead", column = "IS_READ"), @Result(property = "isRead", column = "IS_READ"),
@Result(property = "isTransferred", column = "IS_TRANSFERRED") }) @Result(property = "isTransferred", column = "IS_TRANSFERRED") })
List<Task> findByStates(@Param("states") List<TaskState> states); List<Task> findByStates(@Param("states") List<TaskState> states);
@Select("SELECT ID, TENANT_ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, TYPE, WORKBASKETID, OWNER, PRIMARY_OBJ_REF_ID, IS_READ, IS_TRANSFERRED " @Select("SELECT ID, TENANT_ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, TYPE, WORKBASKETID, OWNER, PRIMARY_OBJ_REF_ID, IS_READ, IS_TRANSFERRED "
+ "FROM TASK ") + "FROM TASK ")
@Results(value = { @Result(property = "id", column = "ID"), @Result(property = "tenantId", column = "TENANT_ID"), @Results(value = {
@Result(property = "created", column = "CREATED"), @Result(property = "claimed", column = "CLAIMED"), @Result(property = "id", column = "ID"),
@Result(property = "completed", column = "COMPLETED"), @Result(property = "modified", column = "MODIFIED"), @Result(property = "tenantId", column = "TENANT_ID"),
@Result(property = "planned", column = "PLANNED"), @Result(property = "due", column = "DUE"), @Result(property = "created", column = "CREATED"),
@Result(property = "name", column = "NAME"), @Result(property = "description", column = "DESCRIPTION"), @Result(property = "claimed", column = "CLAIMED"),
@Result(property = "priority", column = "PRIORITY"), @Result(property = "state", column = "STATE"), @Result(property = "completed", column = "COMPLETED"),
@Result(property = "type", column = "TYPE"), @Result(property = "workbasketId", column = "WORKBASKETID"), @Result(property = "modified", column = "MODIFIED"),
@Result(property = "planned", column = "PLANNED"),
@Result(property = "due", column = "DUE"),
@Result(property = "name", column = "NAME"),
@Result(property = "description", column = "DESCRIPTION"),
@Result(property = "priority", column = "PRIORITY"),
@Result(property = "state", column = "STATE"),
@Result(property = "type", column = "TYPE"),
@Result(property = "workbasketId", column = "WORKBASKETID"),
@Result(property = "owner", column = "OWNER"), @Result(property = "owner", column = "OWNER"),
@Result(property = "primaryObjRef", column = "PRIMARY_OBJ_REF_ID", javaType = ObjectReference.class, one = @One(select = "org.taskana.model.mappings.ObjectReferenceMapper.findById")), @Result(property = "primaryObjRef", column = "PRIMARY_OBJ_REF_ID", javaType = ObjectReference.class, one = @One(select = OBJECTREFERENCEMAPPER_FINDBYID)),
@Result(property = "isRead", column = "IS_READ"), @Result(property = "isRead", column = "IS_READ"),
@Result(property = "isTransferred", column = "IS_TRANSFERRED") }) @Result(property = "isTransferred", column = "IS_TRANSFERRED") })
List<Task> findAll(); List<Task> findAll();
@ -167,12 +186,12 @@ public interface TaskMapper {
@Result(column = "counter", property = "taskCounter") }) @Result(column = "counter", property = "taskCounter") })
List<DueWorkbasketCounter> getTaskCountByWorkbasketIdAndDaysInPastAndState(@Param("fromDate") Date fromDate, @Param("status") List<TaskState> states); List<DueWorkbasketCounter> getTaskCountByWorkbasketIdAndDaysInPastAndState(@Param("fromDate") Date fromDate, @Param("status") List<TaskState> states);
@Insert("INSERT INTO TASK(ID, TENANT_ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, TYPE, WORKBASKETID, OWNER, PRIMARY_OBJ_REF_ID, IS_READ, IS_TRANSFERRED) " @Insert("INSERT INTO TASK(ID, TENANT_ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, TYPE, WORKBASKETID, OWNER, PRIMARY_OBJ_REF_ID, IS_READ, IS_TRANSFERRED, CUSTOM_ATTRIBUTES) "
+ "VALUES(#{id}, #{tenantId}, #{created}, #{claimed}, #{completed}, #{modified}, #{planned}, #{due}, #{name}, #{description}, #{priority}, #{state}, #{type}, #{workbasketId}, #{owner}, #{primaryObjRef.id}, #{isRead}, #{isTransferred})") + "VALUES(#{id}, #{tenantId}, #{created}, #{claimed}, #{completed}, #{modified}, #{planned}, #{due}, #{name}, #{description}, #{priority}, #{state}, #{type}, #{workbasketId}, #{owner}, #{primaryObjRef.id}, #{isRead}, #{isTransferred}, #{customAttributes,jdbcType=BLOB,javaType=java.util.Map,typeHandler=org.taskana.impl.persistence.MapTypeHandler})")
@Options(keyProperty = "id", keyColumn = "ID") @Options(keyProperty = "id", keyColumn = "ID")
void insert(Task task); void insert(Task task);
@Update("UPDATE TASK SET TENANT_ID = #{tenantId}, CLAIMED = #{claimed}, COMPLETED = #{completed}, MODIFIED = #{modified}, PLANNED = #{planned}, DUE = #{due}, NAME = #{name}, DESCRIPTION = #{description}, PRIORITY = #{priority}, STATE = #{state}, TYPE = #{type}, WORKBASKETID = #{workbasketId}, OWNER = #{owner}, PRIMARY_OBJ_REF_ID = #{primaryObjRef.id}, IS_READ = #{isRead}, IS_TRANSFERRED = #{isTransferred} WHERE ID = #{id}") @Update("UPDATE TASK SET TENANT_ID = #{tenantId}, CLAIMED = #{claimed}, COMPLETED = #{completed}, MODIFIED = #{modified}, PLANNED = #{planned}, DUE = #{due}, NAME = #{name}, DESCRIPTION = #{description}, PRIORITY = #{priority}, STATE = #{state}, TYPE = #{type}, WORKBASKETID = #{workbasketId}, OWNER = #{owner}, PRIMARY_OBJ_REF_ID = #{primaryObjRef.id}, IS_READ = #{isRead}, IS_TRANSFERRED = #{isTransferred}, CUSTOM_ATTRIBUTES = #{customAttributes,jdbcType=BLOB,javaType=java.util.Map,typeHandler=org.taskana.impl.persistence.MapTypeHandler} WHERE ID = #{id}")
void update(Task task); void update(Task task);
@Delete("DELETE FROM TASK WHERE ID = #{id}") @Delete("DELETE FROM TASK WHERE ID = #{id}")

View File

@ -24,6 +24,7 @@ CREATE TABLE TASK(
PRIMARY_OBJ_REF_ID CHAR(40) NULL, PRIMARY_OBJ_REF_ID CHAR(40) NULL,
IS_READ BOOLEAN NOT NULL, IS_READ BOOLEAN NOT NULL,
IS_TRANSFERRED BOOLEAN NOT NULL, IS_TRANSFERRED BOOLEAN NOT NULL,
CUSTOM_ATTRIBUTES BLOB NULL,
PRIMARY KEY (ID) PRIMARY KEY (ID)
); );

View File

@ -1,17 +1,17 @@
INSERT INTO TASK VALUES('1', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task1', 'Lorem ipsum dolor sit amet.', 1, 'READY', 'Task', '1', 'Stefan', '1', false, false); INSERT INTO TASK VALUES('1', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task1', 'Lorem ipsum dolor sit amet.', 1, 'READY', 'Task', '1', 'Stefan', '1', false, false, null);
INSERT INTO TASK VALUES('2', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task2', 'Lorem ipsum dolor sit amet. ', 1, 'READY', 'Task', '1', 'Frank', '2', false, false); INSERT INTO TASK VALUES('2', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task2', 'Lorem ipsum dolor sit amet. ', 1, 'READY', 'Task', '1', 'Frank', '2', false, false, null);
INSERT INTO TASK VALUES('3', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task3', 'Lorem ipsum dolor sit amet. ', 1, 'CLAIMED', 'Task', '1', 'Stefan', '3', true, false); INSERT INTO TASK VALUES('3', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task3', 'Lorem ipsum dolor sit amet. ', 1, 'CLAIMED', 'Task', '1', 'Stefan', '3', true, false, null);
INSERT INTO TASK VALUES('4', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task4', 'Lorem ipsum dolor sit amet.', 1, 'CLAIMED', 'Task', '1', 'Frank', '1', false, true); INSERT INTO TASK VALUES('4', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task4', 'Lorem ipsum dolor sit amet.', 1, 'CLAIMED', 'Task', '1', 'Frank', '1', false, true, null);
INSERT INTO TASK VALUES('5', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task5', 'Lorem ipsum dolor sit amet. ', 1, 'COMPLETED', 'Task', '1', 'Stefan', '2', false, false); INSERT INTO TASK VALUES('5', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task5', 'Lorem ipsum dolor sit amet. ', 1, 'COMPLETED', 'Task', '1', 'Stefan', '2', false, false, null);
INSERT INTO TASK VALUES('6', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task6', 'Lorem ipsum dolor sit amet.', 1, 'COMPLETED', 'Task', '1', 'Frank', '3', false, false); INSERT INTO TASK VALUES('6', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task6', 'Lorem ipsum dolor sit amet.', 1, 'COMPLETED', 'Task', '1', 'Frank', '3', false, false, null);
INSERT INTO TASK VALUES('7', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task7', 'Lorem ipsum dolor sit amet.', 1, 'READY', 'Task', '2', 'Stefan', '1', false, false); INSERT INTO TASK VALUES('7', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task7', 'Lorem ipsum dolor sit amet.', 1, 'READY', 'Task', '2', 'Stefan', '1', false, false, null);
INSERT INTO TASK VALUES('8', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task8', 'Lorem ipsum dolor sit amet. ', 1, 'READY', 'Task', '2', 'Frank', '2', false, false); INSERT INTO TASK VALUES('8', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task8', 'Lorem ipsum dolor sit amet. ', 1, 'READY', 'Task', '2', 'Frank', '2', false, false, null);
INSERT INTO TASK VALUES('9', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task9', 'Lorem ipsum dolor sit amet. ', 1, 'CLAIMED', 'Task', '2', 'Stefan', '3', true, false); INSERT INTO TASK VALUES('9', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task9', 'Lorem ipsum dolor sit amet. ', 1, 'CLAIMED', 'Task', '2', 'Stefan', '3', true, false, null);
INSERT INTO TASK VALUES('10', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task10', 'Lorem ipsum dolor sit amet.', 1, 'CLAIMED', 'Task', '2', 'Frank', '1', false, false); INSERT INTO TASK VALUES('10', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task10', 'Lorem ipsum dolor sit amet.', 1, 'CLAIMED', 'Task', '2', 'Frank', '1', false, false, null);
INSERT INTO TASK VALUES('11', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task11', 'Lorem ipsum dolor sit amet. ', 1, 'COMPLETED', 'Task', '2', 'Stefan', '2', false, false); INSERT INTO TASK VALUES('11', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task11', 'Lorem ipsum dolor sit amet. ', 1, 'COMPLETED', 'Task', '2', 'Stefan', '2', false, false, null);
INSERT INTO TASK VALUES('12', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task12', 'Lorem ipsum dolor sit amet.', 1, 'COMPLETED', 'Task', '2', 'Frank', '3', false, false); INSERT INTO TASK VALUES('12', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task12', 'Lorem ipsum dolor sit amet.', 1, 'COMPLETED', 'Task', '2', 'Frank', '3', false, false, null);
INSERT INTO TASK VALUES('13', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task12', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus massa turpis, pellentesque ut libero sit amet, malesuada suscipit dolor. Sed volutpat euismod felis sit amet molestie. Fusce ornare purus dui. ', 1, 'READY', 'Task', '2', 'Frank', '1', false, false); INSERT INTO TASK VALUES('13', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task12', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus massa turpis, pellentesque ut libero sit amet, malesuada suscipit dolor. Sed volutpat euismod felis sit amet molestie. Fusce ornare purus dui. ', 1, 'READY', 'Task', '2', 'Frank', '1', false, false, null);
INSERT INTO TASK VALUES('14', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task6', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis vulputate nibh ut malesuada. Etiam ac dictum tellus, nec cursus nunc. Curabitur velit eros, feugiat volutpat laoreet vitae, cursus eu dui. Nulla ut purus sem. Vivamus aliquet odio vitae erat cursus, vitae mattis urna mollis. Nam quam tellus, auctor id volutpat congue, viverra vitae ante. Duis nisi dolor, elementum et mattis at, maximus id velit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis eu condimentum risus. Praesent libero velit, facilisis sit amet maximus non, scelerisque ullamcorper leo. Ut sit amet iaculis eros. Mauris sagittis nibh lacus, at facilisis magna suscipit at. Aliquam finibus tempor odio id commodo. Vivamus aliquam, justo id porta imperdiet, mi.', 1, 'READY', 'Task', '1', 'Frank', '2', false, false); INSERT INTO TASK VALUES('14', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task6', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis vulputate nibh ut malesuada. Etiam ac dictum tellus, nec cursus nunc. Curabitur velit eros, feugiat volutpat laoreet vitae, cursus eu dui. Nulla ut purus sem. Vivamus aliquet odio vitae erat cursus, vitae mattis urna mollis. Nam quam tellus, auctor id volutpat congue, viverra vitae ante. Duis nisi dolor, elementum et mattis at, maximus id velit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis eu condimentum risus. Praesent libero velit, facilisis sit amet maximus non, scelerisque ullamcorper leo. Ut sit amet iaculis eros. Mauris sagittis nibh lacus, at facilisis magna suscipit at. Aliquam finibus tempor odio id commodo. Vivamus aliquam, justo id porta imperdiet, mi.', 1, 'READY', 'Task', '1', 'Frank', '2', false, false, null);