diff --git a/model/src/main/java/lcsb/mapviewer/model/map/Comment.java b/model/src/main/java/lcsb/mapviewer/model/map/Comment.java index 8747682ed2c6b92c52969cf4b2e2a76ab5f3eebb..6bfd0f17db55b671a201861e6e9f324f561dc773 100644 --- a/model/src/main/java/lcsb/mapviewer/model/map/Comment.java +++ b/model/src/main/java/lcsb/mapviewer/model/map/Comment.java @@ -50,15 +50,9 @@ public class Comment implements Serializable { /** * The model that was commented. */ - @ManyToOne(fetch = FetchType.LAZY) + @ManyToOne(fetch = FetchType.LAZY, optional=false) private ModelData model; - /** - * The model that was commented. - */ - @ManyToOne(fetch = FetchType.LAZY) - private ModelData submodel; - /** * User who gave the feedback (if logged in). */ @@ -314,38 +308,4 @@ public class Comment implements Serializable { this.model = model2; } - /** - * @return the submodel - * @see #submodel - */ - public ModelData getSubmodelData() { - return submodel; - } - - /** - * @param submodel - * the submodel to set - * @see #submodel - */ - public void setSubmodelData(ModelData submodel) { - this.submodel = submodel; - } - - /** - * @return the submodel - * @see #submodel - */ - public Model getSubmodel() { - return this.submodel.getModel(); - } - - /** - * @param submodel - * the submodel to set - * @see #submodel - */ - public void setSubmodel(Model submodel) { - this.submodel = submodel.getModelData(); - } - } diff --git a/model/src/test/java/lcsb/mapviewer/model/map/CommentTest.java b/model/src/test/java/lcsb/mapviewer/model/map/CommentTest.java index b21e990c59062428a580d527b0aed0eac177d6db..5e4044e69d4e5ff96a41b2a2b0094e95538412ff 100644 --- a/model/src/test/java/lcsb/mapviewer/model/map/CommentTest.java +++ b/model/src/test/java/lcsb/mapviewer/model/map/CommentTest.java @@ -64,10 +64,6 @@ public class CommentTest extends ModelTestFunctions { assertEquals(pinned, comment.isPinned()); comment.setRemoveReason(removeReason); assertEquals(removeReason, comment.getRemoveReason()); - comment.setSubmodel(submodel); - assertEquals(submodel, comment.getSubmodel()); - comment.setSubmodelData(submodel.getModelData()); - assertEquals(submodel.getModelData(), comment.getSubmodelData()); comment.setTableId(tableId); assertEquals(tableId, comment.getTableId()); comment.setTableName(tableName); diff --git a/persist/src/main/resources/db/migration/14.0.0~alpha.0/V14.0.0.20190725__comment_submodel_column_is_removed.sql b/persist/src/main/resources/db/migration/14.0.0~alpha.0/V14.0.0.20190725__comment_submodel_column_is_removed.sql new file mode 100644 index 0000000000000000000000000000000000000000..25aa099906e0391bd144399080a5943902ffc554 --- /dev/null +++ b/persist/src/main/resources/db/migration/14.0.0~alpha.0/V14.0.0.20190725__comment_submodel_column_is_removed.sql @@ -0,0 +1,11 @@ +--remove submodel_id column +update comment_table set model_id = submodel_id where submodel_id is not null; +ALTER TABLE comment_table drop COLUMN submodel_id; + +--comment must be attached to a model +delete from comment_table where model_id is null; +ALTER TABLE comment_table ALTER COLUMN model_id SET NOT NULL; + +-- pinned should be not null +update comment_table set pinned = false where pinned is null; +ALTER TABLE comment_table ALTER COLUMN pinned SET NOT NULL; diff --git a/persist/src/test/java/lcsb/mapviewer/persist/dao/graphics/PolylineDataTest.java b/persist/src/test/java/lcsb/mapviewer/persist/dao/graphics/PolylineDataTest.java index c483920daa3f78be2ec3f72e76343fe55a7a3d73..84914165c61694d8139e5fd56aaf7be8ba7efdd4 100644 --- a/persist/src/test/java/lcsb/mapviewer/persist/dao/graphics/PolylineDataTest.java +++ b/persist/src/test/java/lcsb/mapviewer/persist/dao/graphics/PolylineDataTest.java @@ -2,7 +2,7 @@ package lcsb.mapviewer.persist.dao.graphics; import static org.junit.Assert.*; -import java.awt.*; +import java.awt.Color; import java.awt.geom.Point2D; import org.junit.*; @@ -26,40 +26,34 @@ public class PolylineDataTest extends PersistTestFunctions { @Test public void test() { - try { - PolylineData pd = new PolylineData(); - pd.getBeginAtd().setArrowType(ArrowType.BLANK_CROSSBAR); - pd.getBeginAtd().setArrowLineType(LineType.DASHED); - pd.getBeginAtd().setLen(102); - pd.setColor(Color.CYAN); - pd.setType(LineType.SOLID_BOLD); - pd.setWidth(2); - pd.getPoints().add(new Point2D.Double(1, 1)); - pd.getPoints().add(new Point2D.Double(2, 3)); - pd.getPoints().add(new Point2D.Double(10, 11)); - polylineDao.add(pd); - assertNotNull(pd.getId()); - PolylineData pd2 = polylineDao.getById(pd.getId()); - assertNotNull(pd2); - - assertEquals(ArrowType.BLANK_CROSSBAR, pd2.getBeginAtd().getArrowType()); - assertEquals(LineType.DASHED, pd2.getBeginAtd().getArrowLineType()); - assertEquals(102, pd2.getBeginAtd().getLen(), EPSILON); - assertEquals(Color.CYAN, pd2.getColor()); - assertEquals(LineType.SOLID_BOLD, pd2.getType()); - assertEquals(2, pd2.getWidth(), EPSILON); - assertEquals(0, pd2.getPoints().get(0).distance(new Point2D.Double(1, 1)), EPSILON); - assertEquals(0, pd2.getPoints().get(1).distance(new Point2D.Double(2, 3)), EPSILON); - assertEquals(0, pd2.getPoints().get(2).distance(new Point2D.Double(10, 11)), EPSILON); - - polylineDao.delete(pd); - pd2 = polylineDao.getById(pd.getId()); - assertNull(pd2); - - } catch (Exception e) { - e.printStackTrace(); - throw e; - } + PolylineData pd = new PolylineData(); + pd.getBeginAtd().setArrowType(ArrowType.BLANK_CROSSBAR); + pd.getBeginAtd().setArrowLineType(LineType.DASHED); + pd.getBeginAtd().setLen(102); + pd.setColor(Color.CYAN); + pd.setType(LineType.SOLID_BOLD); + pd.setWidth(2); + pd.getPoints().add(new Point2D.Double(1, 1)); + pd.getPoints().add(new Point2D.Double(2, 3)); + pd.getPoints().add(new Point2D.Double(10, 11)); + polylineDao.add(pd); + assertNotNull(pd.getId()); + PolylineData pd2 = polylineDao.getById(pd.getId()); + assertNotNull(pd2); + + assertEquals(ArrowType.BLANK_CROSSBAR, pd2.getBeginAtd().getArrowType()); + assertEquals(LineType.DASHED, pd2.getBeginAtd().getArrowLineType()); + assertEquals(102, pd2.getBeginAtd().getLen(), EPSILON); + assertEquals(Color.CYAN, pd2.getColor()); + assertEquals(LineType.SOLID_BOLD, pd2.getType()); + assertEquals(2, pd2.getWidth(), EPSILON); + assertEquals(0, pd2.getPoints().get(0).distance(new Point2D.Double(1, 1)), EPSILON); + assertEquals(0, pd2.getPoints().get(1).distance(new Point2D.Double(2, 3)), EPSILON); + assertEquals(0, pd2.getPoints().get(2).distance(new Point2D.Double(10, 11)), EPSILON); + + polylineDao.delete(pd); + pd2 = polylineDao.getById(pd.getId()); + assertNull(pd2); } } diff --git a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/CommentDaoTest.java b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/CommentDaoTest.java index 4a0e19615c699f017b3d43bb797e028cc756c74a..1b4f4edd7efd4bac7e5320b19951a686128f547a 100644 --- a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/CommentDaoTest.java +++ b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/CommentDaoTest.java @@ -48,9 +48,15 @@ public class CommentDaoTest extends PersistTestFunctions { @Test public void testGetById() throws Exception { + Model model = createModel(); + project.addModel(model); + modelDao.add(model); + projectDao.update(project); + int counter = (int) commentDao.getCount(); Comment comment = new Comment(); comment.setUser(user); + comment.setModel(model); commentDao.add(comment); int counter2 = (int) commentDao.getCount(); assertEquals(counter + 1, counter2); diff --git a/persist/src/test/java/lcsb/mapviewer/persist/dao/user/UserDaoTest.java b/persist/src/test/java/lcsb/mapviewer/persist/dao/user/UserDaoTest.java index 363cb67214134b3c0516f48ab2a93b5ba39be268..b7192d734458a67690ce1df71c59c22845b7a5a9 100644 --- a/persist/src/test/java/lcsb/mapviewer/persist/dao/user/UserDaoTest.java +++ b/persist/src/test/java/lcsb/mapviewer/persist/dao/user/UserDaoTest.java @@ -38,298 +38,233 @@ public class UserDaoTest extends PersistTestFunctions { @Test public void testAddUpdateDelete() { - try { - User user = userDao.getUserByLogin(testLogin); - assertNull(user); + User user = userDao.getUserByLogin(testLogin); + assertNull(user); - long counter = userDao.getCount(); + long counter = userDao.getCount(); - user = new User(); - user.setCryptedPassword(""); - user.setLogin(testLogin); - user.addPrivilege(new Privilege(PrivilegeType.CAN_CREATE_OVERLAYS)); - userDao.add(user); + user = new User(); + user.setCryptedPassword(""); + user.setLogin(testLogin); + user.addPrivilege(new Privilege(PrivilegeType.CAN_CREATE_OVERLAYS)); + userDao.add(user); - long counter2 = userDao.getCount(); - assertEquals(counter + 1, counter2); + long counter2 = userDao.getCount(); + assertEquals(counter + 1, counter2); - user.setLogin(testLogin2); - userDao.update(user); + user.setLogin(testLogin2); + userDao.update(user); - User user2 = userDao.getUserByLogin(testLogin2); - assertNotNull(user2); + User user2 = userDao.getUserByLogin(testLogin2); + assertNotNull(user2); - userDao.delete(user); + userDao.delete(user); - user2 = userDao.getUserByLogin(testLogin2); - assertNull(user2); - counter2 = userDao.getCount(); - assertEquals(counter, counter2); - - } catch (Exception e) { - e.printStackTrace(); - throw e; - } + user2 = userDao.getUserByLogin(testLogin2); + assertNull(user2); + counter2 = userDao.getCount(); + assertEquals(counter, counter2); } @Test(expected = PropertyValueException.class) public void testTryUserWithNullPassword() { - try { - User user = new User(); - user.setLogin(testLogin); - userDao.add(user); - - } catch (Exception e) { - e.printStackTrace(); - throw e; - } + User user = new User(); + user.setLogin(testLogin); + userDao.add(user); } @Test(expected = PropertyValueException.class) public void testTryUserWithNullLogin() { - try { - User user = new User(); - user.setCryptedPassword("ZX"); - userDao.add(user); - - } catch (Exception e) { - e.printStackTrace(); - throw e; - } + User user = new User(); + user.setCryptedPassword("ZX"); + userDao.add(user); } @Test(expected = ConstraintViolationException.class) public void testTryUserWithExistingLogin() { - try { - User user = new User(); - user.setLogin(testLogin); - user.setCryptedPassword(""); - userDao.add(user); - - User user2 = new User(); - user2.setLogin(testLogin); - user2.setCryptedPassword(""); - userDao.add(user2); - - } catch (Exception e) { - e.printStackTrace(); - throw e; - } + User user = new User(); + user.setLogin(testLogin); + user.setCryptedPassword(""); + userDao.add(user); + + User user2 = new User(); + user2.setLogin(testLogin); + user2.setCryptedPassword(""); + userDao.add(user2); } @Test public void testAddDeleteAdd() { - try { - User user = userDao.getUserByLogin(testLogin); - assertNull(user); - - long counter = userDao.getCount(); + User user = userDao.getUserByLogin(testLogin); + assertNull(user); - user = new User(); - user.setLogin(testLogin); - user.setCryptedPassword(""); - userDao.add(user); + long counter = userDao.getCount(); - long counter2 = userDao.getCount(); - assertEquals(counter + 1, counter2); + user = new User(); + user.setLogin(testLogin); + user.setCryptedPassword(""); + userDao.add(user); - userDao.delete(user); + long counter2 = userDao.getCount(); + assertEquals(counter + 1, counter2); - User user2 = userDao.getUserByLogin(testLogin); - assertNull(user2); + userDao.delete(user); - user2 = new User(); - user2.setCryptedPassword(""); - user2.setLogin(testLogin); - userDao.add(user2); + User user2 = userDao.getUserByLogin(testLogin); + assertNull(user2); - assertNotNull(userDao.getUserByLogin(testLogin)); + user2 = new User(); + user2.setCryptedPassword(""); + user2.setLogin(testLogin); + userDao.add(user2); - userDao.delete(user2); + assertNotNull(userDao.getUserByLogin(testLogin)); - } catch (Exception e) { - e.printStackTrace(); - throw e; - } + userDao.delete(user2); } @Test public void testGetUserByLogin() throws Exception { - try { - User user = new User(); - user.setCryptedPassword(testPasswd); - user.setLogin(testLogin); - userDao.add(user); - User user2 = userDao.getUserByLogin(testLogin); - assertNotNull(user2); - assertEquals(user2.getId(), user.getId()); - assertEquals(user2.getLogin(), user.getLogin()); - assertEquals(user2.getCryptedPassword(), user.getCryptedPassword()); - user2 = userDao.getUserByLogin(testLogin2); - assertNull(user2); - userDao.delete(user); - } catch (Exception e) { - e.printStackTrace(); - throw e; - } + User user = new User(); + user.setCryptedPassword(testPasswd); + user.setLogin(testLogin); + userDao.add(user); + User user2 = userDao.getUserByLogin(testLogin); + assertNotNull(user2); + assertEquals(user2.getId(), user.getId()); + assertEquals(user2.getLogin(), user.getLogin()); + assertEquals(user2.getCryptedPassword(), user.getCryptedPassword()); + user2 = userDao.getUserByLogin(testLogin2); + assertNull(user2); + userDao.delete(user); } @Test public void testGetUserByEmail() throws Exception { - try { - User user = new User(); - user.setCryptedPassword(testPasswd); - user.setLogin(testLogin); - user.setEmail(testEmail); - user.addPrivilege(new Privilege(PrivilegeType.CAN_CREATE_OVERLAYS)); - userDao.add(user); - User user2 = userDao.getUserByEmail(testEmail); - assertNotNull(user2); - assertEquals(user2.getId(), user.getId()); - assertEquals(user2.getLogin(), user.getLogin()); - assertEquals(user2.getCryptedPassword(), user.getCryptedPassword()); - user2 = userDao.getUserByEmail(testEmail + "sadas"); - assertNull(user2); - userDao.delete(user); - } catch (Exception e) { - e.printStackTrace(); - throw e; - } + User user = new User(); + user.setCryptedPassword(testPasswd); + user.setLogin(testLogin); + user.setEmail(testEmail); + user.addPrivilege(new Privilege(PrivilegeType.CAN_CREATE_OVERLAYS)); + userDao.add(user); + User user2 = userDao.getUserByEmail(testEmail); + assertNotNull(user2); + assertEquals(user2.getId(), user.getId()); + assertEquals(user2.getLogin(), user.getLogin()); + assertEquals(user2.getCryptedPassword(), user.getCryptedPassword()); + user2 = userDao.getUserByEmail(testEmail + "sadas"); + assertNull(user2); + userDao.delete(user); } @Test public void testGetAll() throws Exception { - try { - assertTrue(userDao.getAll().size() > 0); - } catch (Exception e) { - e.printStackTrace(); - throw e; - } + assertTrue(userDao.getAll().size() > 0); } @Test public void testUserWithAnnotatorSchema() throws Exception { - try { - User user = new User(); - user.setLogin(testLogin); - user.setCryptedPassword(""); - UserAnnotationSchema uas = new UserAnnotationSchema(); - uas.setValidateMiriamTypes(true); - UserClassAnnotators ca = new UserClassAnnotators(); - ca.setClassName(Species.class); - AnnotatorData annotatorData = new AnnotatorData(String.class); - ca.addAnnotator(annotatorData); - uas.addClassAnnotator(ca); - uas.addClassAnnotator(new UserClassAnnotators(String.class, new ArrayList<>())); - UserClassValidAnnotations cva = new UserClassValidAnnotations(); - cva.setClassName(Reaction.class); - cva.addValidMiriamType(MiriamType.HGNC); - cva.addValidMiriamType(MiriamType.HGNC_SYMBOL); - uas.addClassValidAnnotations(cva); - uas.addClassValidAnnotations(new UserClassValidAnnotations(String.class, new ArrayList<>())); - uas.addClassValidAnnotations(new UserClassValidAnnotations(Integer.class, new ArrayList<>())); - user.setAnnotationSchema(uas); - userDao.add(user); - userDao.evict(user); - User user2 = userDao.getById(user.getId()); - assertNotNull(user2); - UserAnnotationSchema uas2 = user2.getAnnotationSchema(); - assertNotNull(uas2); - assertEquals(2, uas2.getClassAnnotators().size()); - assertEquals(3, uas2.getClassValidAnnotators().size()); - assertEquals(Species.class.getCanonicalName(), uas.getClassAnnotators().get(0).getClassName()); - assertEquals(annotatorData, uas.getClassAnnotators().get(0).getAnnotators().get(0)); - assertEquals(Reaction.class.getCanonicalName(), uas.getClassValidAnnotators().get(0).getClassName()); - assertEquals(MiriamType.HGNC, uas.getClassValidAnnotators().get(0).getValidMiriamTypes().get(0)); - assertEquals(MiriamType.HGNC_SYMBOL, uas.getClassValidAnnotators().get(0).getValidMiriamTypes().get(1)); - - userDao.delete(user2); - } catch (Exception e) { - e.printStackTrace(); - throw e; - } + User user = new User(); + user.setLogin(testLogin); + user.setCryptedPassword(""); + UserAnnotationSchema uas = new UserAnnotationSchema(); + uas.setValidateMiriamTypes(true); + UserClassAnnotators ca = new UserClassAnnotators(); + ca.setClassName(Species.class); + AnnotatorData annotatorData = new AnnotatorData(String.class); + ca.addAnnotator(annotatorData); + uas.addClassAnnotator(ca); + uas.addClassAnnotator(new UserClassAnnotators(String.class, new ArrayList<>())); + UserClassValidAnnotations cva = new UserClassValidAnnotations(); + cva.setClassName(Reaction.class); + cva.addValidMiriamType(MiriamType.HGNC); + cva.addValidMiriamType(MiriamType.HGNC_SYMBOL); + uas.addClassValidAnnotations(cva); + uas.addClassValidAnnotations(new UserClassValidAnnotations(String.class, new ArrayList<>())); + uas.addClassValidAnnotations(new UserClassValidAnnotations(Integer.class, new ArrayList<>())); + user.setAnnotationSchema(uas); + userDao.add(user); + userDao.evict(user); + User user2 = userDao.getById(user.getId()); + assertNotNull(user2); + UserAnnotationSchema uas2 = user2.getAnnotationSchema(); + assertNotNull(uas2); + assertEquals(2, uas2.getClassAnnotators().size()); + assertEquals(3, uas2.getClassValidAnnotators().size()); + assertEquals(Species.class.getCanonicalName(), uas.getClassAnnotators().get(0).getClassName()); + assertEquals(annotatorData, uas.getClassAnnotators().get(0).getAnnotators().get(0)); + assertEquals(Reaction.class.getCanonicalName(), uas.getClassValidAnnotators().get(0).getClassName()); + assertEquals(MiriamType.HGNC, uas.getClassValidAnnotators().get(0).getValidMiriamTypes().get(0)); + assertEquals(MiriamType.HGNC_SYMBOL, uas.getClassValidAnnotators().get(0).getValidMiriamTypes().get(1)); + + userDao.delete(user2); } @Test public void testUserWithAnnotatorSchemaGuiPreferences() throws Exception { - try { - User user = new User(); - user.setLogin(testLogin); - user.setCryptedPassword(""); - UserAnnotationSchema uas = new UserAnnotationSchema(); - user.setAnnotationSchema(uas); - UserGuiPreference option = new UserGuiPreference(); - option.setKey("key"); - option.setValue("val"); - uas.addGuiPreference(option); - userDao.add(user); - userDao.evict(user); - User user2 = userDao.getById(user.getId()); - assertNotNull(user2); - UserAnnotationSchema uas2 = user2.getAnnotationSchema(); - assertNotNull(uas2); - assertEquals(1, uas2.getGuiPreferences().size()); - - userDao.delete(user2); - } catch (Exception e) { - e.printStackTrace(); - throw e; - } + User user = new User(); + user.setLogin(testLogin); + user.setCryptedPassword(""); + UserAnnotationSchema uas = new UserAnnotationSchema(); + user.setAnnotationSchema(uas); + UserGuiPreference option = new UserGuiPreference(); + option.setKey("key"); + option.setValue("val"); + uas.addGuiPreference(option); + userDao.add(user); + userDao.evict(user); + User user2 = userDao.getById(user.getId()); + assertNotNull(user2); + UserAnnotationSchema uas2 = user2.getAnnotationSchema(); + assertNotNull(uas2); + assertEquals(1, uas2.getGuiPreferences().size()); + + userDao.delete(user2); } @Test public void testUserWithAnnotatorSchemaRequiredAnnotations() throws Exception { - try { - User user = new User(); - user.setLogin(testLogin); - user.setCryptedPassword(""); - UserAnnotationSchema uas = new UserAnnotationSchema(); - user.setAnnotationSchema(uas); - uas.addClassRequiredAnnotations( - new UserClassRequiredAnnotations(String.class, new MiriamType[] { MiriamType.WIKIPEDIA })); - userDao.add(user); - userDao.evict(user); - User user2 = userDao.getById(user.getId()); - assertNotNull(user2); - UserAnnotationSchema uas2 = user2.getAnnotationSchema(); - assertNotNull(uas2); - assertEquals(1, uas2.getClassRequiredAnnotators().size()); - - userDao.delete(user2); - } catch (Exception e) { - e.printStackTrace(); - throw e; - } + User user = new User(); + user.setLogin(testLogin); + user.setCryptedPassword(""); + UserAnnotationSchema uas = new UserAnnotationSchema(); + user.setAnnotationSchema(uas); + uas.addClassRequiredAnnotations( + new UserClassRequiredAnnotations(String.class, new MiriamType[] { MiriamType.WIKIPEDIA })); + userDao.add(user); + userDao.evict(user); + User user2 = userDao.getById(user.getId()); + assertNotNull(user2); + UserAnnotationSchema uas2 = user2.getAnnotationSchema(); + assertNotNull(uas2); + assertEquals(1, uas2.getClassRequiredAnnotators().size()); + + userDao.delete(user2); } @Test public void testUserWithAnnotatorParams() throws Exception { - try { - User user = new User(); - user.setLogin(testLogin); - user.setCryptedPassword(""); - UserAnnotationSchema uas = new UserAnnotationSchema(); - user.setAnnotationSchema(uas); - UserClassAnnotators classAnnotators = new UserClassAnnotators(Integer.class); - AnnotatorData annotatorData = new AnnotatorData(String.class); - classAnnotators.addAnnotator(annotatorData); - uas.addClassAnnotator(classAnnotators); - AnnotatorConfigParameter param = new AnnotatorConfigParameter(AnnotatorParamDefinition.KEGG_ORGANISM_IDENTIFIER, - "val"); - annotatorData.addAnnotatorParameter(param); - userDao.add(user); - userDao.evict(user); - User user2 = userDao.getById(user.getId()); - assertNotNull(user2); - UserAnnotationSchema uas2 = user2.getAnnotationSchema(); - assertNotNull(uas2); - assertEquals(1, uas2.getClassAnnotators().get(0).getAnnotators().get(0).getAnnotatorParams().size()); - - userDao.delete(user2); - } catch (Exception e) { - e.printStackTrace(); - throw e; - } + User user = new User(); + user.setLogin(testLogin); + user.setCryptedPassword(""); + UserAnnotationSchema uas = new UserAnnotationSchema(); + user.setAnnotationSchema(uas); + UserClassAnnotators classAnnotators = new UserClassAnnotators(Integer.class); + AnnotatorData annotatorData = new AnnotatorData(String.class); + classAnnotators.addAnnotator(annotatorData); + uas.addClassAnnotator(classAnnotators); + AnnotatorConfigParameter param = new AnnotatorConfigParameter(AnnotatorParamDefinition.KEGG_ORGANISM_IDENTIFIER, + "val"); + annotatorData.addAnnotatorParameter(param); + userDao.add(user); + userDao.evict(user); + User user2 = userDao.getById(user.getId()); + assertNotNull(user2); + UserAnnotationSchema uas2 = user2.getAnnotationSchema(); + assertNotNull(uas2); + assertEquals(1, uas2.getClassAnnotators().get(0).getAnnotators().get(0).getAnnotatorParams().size()); + + userDao.delete(user2); } } diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/comments/CommentRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/comments/CommentRestImpl.java index 5527253a14d4d328ddd33a5ac23ca4757427958a..24dad6f4343cf5e1313f677f2c9d2a25273f674f 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/comments/CommentRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/comments/CommentRestImpl.java @@ -107,7 +107,7 @@ public class CommentRestImpl extends BaseRestImpl { value = getId(comment); break; case "modelid": - value = comment.getSubmodelData().getId(); + value = comment.getModelData().getId(); break; case "title": value = getTitle(comment); @@ -279,7 +279,7 @@ public class CommentRestImpl extends BaseRestImpl { throw new QueryException("Unknown type of commented object: " + elementType); } - Comment comment = commentService.addComment(name, email, content, model, pointCoordinates, commentedObject, pinned, + Comment comment = commentService.addComment(name, email, content, pointCoordinates, commentedObject, pinned, submodel); return preparedComment(comment, createCommentColumnSet("")); diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/CommentService.java b/service/src/main/java/lcsb/mapviewer/services/impl/CommentService.java index 3e4268803ee4c25d8277a52c199794bf7a2a5133..3d17c570b6c3293adcc11ada0f4f74552128433b 100644 --- a/service/src/main/java/lcsb/mapviewer/services/impl/CommentService.java +++ b/service/src/main/java/lcsb/mapviewer/services/impl/CommentService.java @@ -12,13 +12,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import lcsb.mapviewer.common.ObjectUtils; -import lcsb.mapviewer.common.exception.InvalidClassException; import lcsb.mapviewer.model.Project; import lcsb.mapviewer.model.map.Comment; -import lcsb.mapviewer.model.map.model.Model; -import lcsb.mapviewer.model.map.model.ModelData; -import lcsb.mapviewer.model.map.reaction.Reaction; -import lcsb.mapviewer.model.map.species.Element; +import lcsb.mapviewer.model.map.model.*; import lcsb.mapviewer.model.user.User; import lcsb.mapviewer.persist.dao.map.CommentDao; import lcsb.mapviewer.services.interfaces.*; @@ -79,35 +75,37 @@ public class CommentService implements ICommentService { } @Override - public Comment addComment(String name, String email, String content, Model model, Point2D coordinates, Object object, + public Comment addComment(String name, String email, String content, Point2D coordinates, Object object, boolean pinned, Model submodel) { Comment comment = new Comment(); comment.setName(name); comment.setEmail(email); comment.setContent(content); - comment.setModel(model); + comment.setModel(submodel); comment.setCoordinates(coordinates); if (object != null) { comment.setTableName(object.getClass()); comment.setTableId(ObjectUtils.getIdOfObject(object)); - if (object instanceof Element) { - comment.setSubmodel(((Element) object).getModel()); - } else if (object instanceof Reaction) { - comment.setSubmodel(((Reaction) object).getModel()); - } else { - throw new InvalidClassException("Cannot comment on object of class: " + object.getClass()); - } - } else { - comment.setSubmodel(submodel); } comment.setUser(null); comment.setPinned(pinned); commentDao.add(comment); try { + Project project = submodel.getProject(); + if (project == null) { + for (SubmodelConnection sc : submodel.getParentModels()) { + if (sc instanceof ModelSubmodelConnection) { + project = ((ModelSubmodelConnection) sc).getParentModel().getModel().getProject(); + if (project != null) { + break; + } + } + } + } + EmailSender emailSender = new EmailSender(configurationService); - emailSender.sendEmail("New comment appeard in the " + model.getProject().getProjectId(), content, - model.getProject().getNotifyEmail()); + emailSender.sendEmail("New comment appeard in the " + project.getProjectId(), content, project.getNotifyEmail()); } catch (MessagingException e) { logger.error("Problem with sending email.", e); } diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java b/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java index 6d060e5578398e83dc55d225111990676a5acd1d..37f5050da1ccba7a7dafe49278fc3d518bd52777 100644 --- a/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java +++ b/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java @@ -75,24 +75,28 @@ public class UserService implements IUserService { @Override public void grantUserPrivilege(User user, PrivilegeType type) { + user = getUserByLogin(user.getLogin()); user.addPrivilege(privilegeService.getPrivilege(type)); userDao.update(user); } @Override public void grantUserPrivilege(User user, PrivilegeType type, String objectId) { + user = getUserByLogin(user.getLogin()); user.addPrivilege(privilegeService.getPrivilege(type, objectId)); userDao.update(user); } @Override public void revokeUserPrivilege(User user, PrivilegeType type) { + user = getUserByLogin(user.getLogin()); user.removePrivilege(privilegeService.getPrivilege(type)); userDao.update(user); } @Override public void revokeUserPrivilege(User user, PrivilegeType type, String objectId) { + user = getUserByLogin(user.getLogin()); user.removePrivilege(privilegeService.getPrivilege(type, objectId)); userDao.update(user); } diff --git a/service/src/main/java/lcsb/mapviewer/services/interfaces/ICommentService.java b/service/src/main/java/lcsb/mapviewer/services/interfaces/ICommentService.java index 913e4340daa2c7dd827589b6c67b1af82d78a248..1f0b0ee31fc98c472294bde18566dad0c0a8c8d7 100644 --- a/service/src/main/java/lcsb/mapviewer/services/interfaces/ICommentService.java +++ b/service/src/main/java/lcsb/mapviewer/services/interfaces/ICommentService.java @@ -30,8 +30,6 @@ public interface ICommentService { * email of the person that comments * @param content * content of the comment - * @param model - * which map we comment on * @param submodel * on which submodel we comment on * @param coordinates @@ -39,7 +37,7 @@ public interface ICommentService { * * @return comment object created based on the data provided as parameters */ - Comment addComment(String name, String email, String content, Model model, Point2D coordinates, Object object, + Comment addComment(String name, String email, String content, Point2D coordinates, Object object, boolean pinned, Model submodel); /** diff --git a/service/src/main/java/lcsb/mapviewer/services/utils/ColorSchemaReader.java b/service/src/main/java/lcsb/mapviewer/services/utils/ColorSchemaReader.java index 2f5ba0faa2bdd1f03652d5844cbecdb91f837a07..af525309e8582bc2d4dc5f58c798b457c04f3be2 100644 --- a/service/src/main/java/lcsb/mapviewer/services/utils/ColorSchemaReader.java +++ b/service/src/main/java/lcsb/mapviewer/services/utils/ColorSchemaReader.java @@ -820,13 +820,28 @@ public class ColorSchemaReader { } String[] columns = line.split("\t"); if (columns.length > 1) { + ColorSchemaType type = overlay.getColorSchemaType(); + if (type == null) { + Map<String, String> params = TextFileUtils + .getHeaderParametersFromFile(new ByteArrayInputStream(overlay.getInputData().getFileContent())); + String typeString = params.get(ZipEntryFileFactory.LAYOUT_HEADER_PARAM_TYPE); + if (typeString != null) { + type = ColorSchemaType.valueOf(typeString); + } else { + logger.warn("Undefined color schema type for overlay: " + overlay.getId()); + type = ColorSchemaType.GENERIC; + } + } Map<ColorSchemaColumn, Integer> schemaColumns = new HashMap<>(); - parseColumns(columns, schemaColumns, ColorSchemaType.GENERIC); + parseColumns(columns, schemaColumns, type); for (ColorSchemaColumn column : schemaColumns.keySet()) { try { Field f = ColorSchemaColumn.class.getField(column.name()); - if (column.getDepractedColumnName() != null || f.isAnnotationPresent(Deprecated.class)) { + if (f.isAnnotationPresent(Deprecated.class)) { + result.add(column); + } else if (column.getDepractedColumnName() != null + && column.getDepractedColumnName().equalsIgnoreCase(columns[schemaColumns.get(column)])) { result.add(column); } } catch (NoSuchFieldException | SecurityException e) { diff --git a/service/src/test/java/lcsb/mapviewer/services/impl/CommentServiceTest.java b/service/src/test/java/lcsb/mapviewer/services/impl/CommentServiceTest.java index 83363c520ecde7089f58c73fc904db25dfae170d..0e3c1dfd79abe9fe3cd516720a170dbad8204da5 100644 --- a/service/src/test/java/lcsb/mapviewer/services/impl/CommentServiceTest.java +++ b/service/src/test/java/lcsb/mapviewer/services/impl/CommentServiceTest.java @@ -62,16 +62,11 @@ public class CommentServiceTest extends ServiceTestFunctions { @Test public void testGetAgregatedComments() throws Exception { - commentService.addComment("John Doe", "a@a.pl", "Conteneta 1", model, new Point2D.Double(0, 1), alias, false, - model); - commentService.addComment("John Doe", "a@a.pl", "Contenetb 2", model, new Point2D.Double(0, 2), alias, false, - model); - commentService.addComment("John Doe", "a@a.pl", "Contenetc 3", model, new Point2D.Double(0, 3), alias2, false, - model); - commentService.addComment("John Doe", "a@a.pl", "Contenetc 4", model, new Point2D.Double(0, 4), null, false, - model); - commentService.addComment("John Doe", "a@a.pl", "Contenetc 5", model, new Point2D.Double(0, 5), null, false, - model); + commentService.addComment("John Doe", "a@a.pl", "Conteneta 1", new Point2D.Double(0, 1), alias, false, model); + commentService.addComment("John Doe", "a@a.pl", "Contenetb 2", new Point2D.Double(0, 2), alias, false, model); + commentService.addComment("John Doe", "a@a.pl", "Contenetc 3", new Point2D.Double(0, 3), alias2, false, model); + commentService.addComment("John Doe", "a@a.pl", "Contenetc 4", new Point2D.Double(0, 4), null, false, model); + commentService.addComment("John Doe", "a@a.pl", "Contenetc 5", new Point2D.Double(0, 5), null, false, model); CommentService service = new CommentService(null, null, null, null); service.setCommentDao(commentDao); List<List<Comment>> comments = service.getAgregatedComments(model, null); @@ -92,7 +87,7 @@ public class CommentServiceTest extends ServiceTestFunctions { @Test public void testAddComment() throws Exception { long counter = commentService.getCommentCount(); - Comment feedback = commentService.addComment("a", "b", "c", model, new Point2D.Double(0, 0), null, false, model); + Comment feedback = commentService.addComment("a", "b", "c", new Point2D.Double(0, 0), null, false, model); long counter2 = commentService.getCommentCount(); assertEquals(counter + 1, counter2); commentDao.delete(feedback); @@ -101,7 +96,7 @@ public class CommentServiceTest extends ServiceTestFunctions { @Test public void testAddCommentForReaction() throws Exception { long counter = commentService.getCommentCount(); - Comment feedback = commentService.addComment("a", "b", "c", model, new Point2D.Double(0, 0), + Comment feedback = commentService.addComment("a", "b", "c", new Point2D.Double(0, 0), model.getReactions().iterator().next(), false, model); long counter2 = commentService.getCommentCount(); assertEquals(counter + 1, counter2); @@ -112,7 +107,7 @@ public class CommentServiceTest extends ServiceTestFunctions { public void testAddCommentForAlias() throws Exception { Element alias = model.getElementByElementId("sa1"); long counter = commentService.getCommentCount(); - Comment feedback = commentService.addComment("a", "b", "c", model, new Point2D.Double(0, 0), alias, false, model); + Comment feedback = commentService.addComment("a", "b", "c", new Point2D.Double(0, 0), alias, false, model); long counter2 = commentService.getCommentCount(); assertEquals(counter + 1, counter2); commentDao.delete(feedback); diff --git a/service/src/test/java/lcsb/mapviewer/services/utils/ColorSchemaReaderTest.java b/service/src/test/java/lcsb/mapviewer/services/utils/ColorSchemaReaderTest.java index f58cdd4923d1c5f3925ef44e0e9d83d14ae58f22..e97c9420f00cd4570dca48c15b4cc2777135d124 100644 --- a/service/src/test/java/lcsb/mapviewer/services/utils/ColorSchemaReaderTest.java +++ b/service/src/test/java/lcsb/mapviewer/services/utils/ColorSchemaReaderTest.java @@ -15,12 +15,14 @@ import org.junit.*; import lcsb.mapviewer.commands.ColorExtractor; import lcsb.mapviewer.commands.ColorModelCommand; import lcsb.mapviewer.common.TextFileUtils; +import lcsb.mapviewer.converter.zip.ZipEntryFileFactory; import lcsb.mapviewer.model.cache.UploadedFileEntry; import lcsb.mapviewer.model.map.MiriamData; import lcsb.mapviewer.model.map.layout.*; import lcsb.mapviewer.model.map.model.Model; import lcsb.mapviewer.model.map.species.Element; import lcsb.mapviewer.services.ServiceTestFunctions; +import lcsb.mapviewer.services.utils.data.ColorSchemaColumn; public class ColorSchemaReaderTest extends ServiceTestFunctions { Logger logger = LogManager.getLogger(ColorSchemaReaderTest.class); @@ -334,4 +336,35 @@ public class ColorSchemaReaderTest extends ServiceTestFunctions { overlay.setInputData(file); assertEquals(0, reader.getDeprecatedColumns(overlay).size()); } + + @Test + public void testGetDeprecatedColumnsForValidGeneticColumns() throws Exception { + Layout overlay = new Layout(); + overlay.setColorSchemaType(ColorSchemaType.GENETIC_VARIANT); + UploadedFileEntry file = new UploadedFileEntry(); + file.setFileContent((ColorSchemaColumn.POSITION.name() + "\tgene_name\n").getBytes("UTF-8")); + overlay.setInputData(file); + assertEquals(0, reader.getDeprecatedColumns(overlay).size()); + } + + @Test + public void testGetDeprecatedColumnsForDeprecatedGeneticColumns() throws Exception { + Layout overlay = new Layout(); + overlay.setColorSchemaType(ColorSchemaType.GENETIC_VARIANT); + UploadedFileEntry file = new UploadedFileEntry(); + file.setFileContent((ColorSchemaColumn.POSITION.name() + "\tname\n").getBytes("UTF-8")); + overlay.setInputData(file); + assertEquals(1, reader.getDeprecatedColumns(overlay).size()); + } + + @Test + public void testGetDeprecatedColumnsForOverlayWithHeader() throws Exception { + Layout overlay = new Layout(); + UploadedFileEntry file = new UploadedFileEntry(); + String content = "#" + ZipEntryFileFactory.LAYOUT_HEADER_PARAM_TYPE + "=" + ColorSchemaType.GENERIC + "\n" + + ColorSchemaColumn.VALUE.name() + "\tname\n"; + file.setFileContent((content).getBytes("UTF-8")); + overlay.setInputData(file); + assertEquals(0, reader.getDeprecatedColumns(overlay).size()); + } } diff --git a/web/src/test/java/lcsb/mapviewer/web/AllIntegrationTests.java b/web/src/test/java/lcsb/mapviewer/web/AllIntegrationTests.java index 432add8ee7a07f2b3cb912dcc9ba3ffbb8b6727c..a7e43f53026a8724d59ac18b4d12f88e60a7a0b6 100644 --- a/web/src/test/java/lcsb/mapviewer/web/AllIntegrationTests.java +++ b/web/src/test/java/lcsb/mapviewer/web/AllIntegrationTests.java @@ -20,6 +20,7 @@ import org.junit.runners.Suite.SuiteClasses; PluginControllerIntegrationTest.class, ProjectControllerIntegrationTest.class, ProjectControllerIntegrationTestForAsyncCalls.class, + ProjectControllerIntegrationTestWithoutTransaction.class, PublicationsControllerIntegrationTest.class, ReactionControllerIntegrationTest.class, SpringSecurityGeneralIntegrationTest.class, diff --git a/web/src/test/java/lcsb/mapviewer/web/CommentControllerIntegrationTest.java b/web/src/test/java/lcsb/mapviewer/web/CommentControllerIntegrationTest.java index 1fb757ca94e00f52aea0065947afaafe84e7c276..50e40f3869a52fd8077280bb9780cd711272dd0b 100644 --- a/web/src/test/java/lcsb/mapviewer/web/CommentControllerIntegrationTest.java +++ b/web/src/test/java/lcsb/mapviewer/web/CommentControllerIntegrationTest.java @@ -702,7 +702,6 @@ public class CommentControllerIntegrationTest extends ControllerIntegrationTest private Comment createComment() { Comment comment = new Comment(); - comment.setSubmodelData(map); comment.setModel(map); comment.setCoordinates(new Point2D.Double(10, 20)); return comment; diff --git a/web/src/test/java/lcsb/mapviewer/web/ControllerIntegrationTest.java b/web/src/test/java/lcsb/mapviewer/web/ControllerIntegrationTest.java index df0d467a514896a88b06580bb23adf5e97f8df7c..769bfcf888e2a142499d003977ee61c13db8fa77 100644 --- a/web/src/test/java/lcsb/mapviewer/web/ControllerIntegrationTest.java +++ b/web/src/test/java/lcsb/mapviewer/web/ControllerIntegrationTest.java @@ -27,6 +27,7 @@ import org.springframework.web.context.WebApplicationContext; import lcsb.mapviewer.common.MinervaLoggerAppender; import lcsb.mapviewer.common.UnitTestFailedWatcher; import lcsb.mapviewer.model.Project; +import lcsb.mapviewer.model.ProjectStatus; import lcsb.mapviewer.model.cache.UploadedFileEntry; import lcsb.mapviewer.model.graphics.PolylineData; import lcsb.mapviewer.model.map.model.ModelData; @@ -232,4 +233,33 @@ abstract public class ControllerIntegrationTest { }); } + protected UploadedFileEntry createFileInSeparateThread(String content, User user) throws Exception { + return callInSeparateThread(() -> { + return createFile(content, user); + }); + } + + protected void waitForProjectToFinishLoading(String projectId) throws InterruptedException { + Project project; + do { + project = projectDao.getProjectByProjectId(projectId); + projectDao.evict(project); + Thread.sleep(100); + } while (project.getStatus() != ProjectStatus.DONE); + } + + public void removeProjectInSeparateThread(Project project) throws Exception { + removeProjectInSeparateThread(project.getProjectId()); + } + + public void removeProjectInSeparateThread(String projectId) throws Exception { + callInSeparateThread(() -> { + Project project = projectDao.getProjectByProjectId(projectId); + if (project != null) { + projectDao.delete(project); + } + return null; + }); + } + } diff --git a/web/src/test/java/lcsb/mapviewer/web/ProjectControllerIntegrationTestForAsyncCalls.java b/web/src/test/java/lcsb/mapviewer/web/ProjectControllerIntegrationTestForAsyncCalls.java index 607a27e11b64605c7fe5d89ddb0815f0d18219cb..c779a724e2f144891caba5b6aac1747e5c60cfc0 100644 --- a/web/src/test/java/lcsb/mapviewer/web/ProjectControllerIntegrationTestForAsyncCalls.java +++ b/web/src/test/java/lcsb/mapviewer/web/ProjectControllerIntegrationTestForAsyncCalls.java @@ -101,15 +101,6 @@ public class ProjectControllerIntegrationTestForAsyncCalls extends ControllerInt } } - private void waitForProjectToFinishLoading(String projectId) throws InterruptedException { - Project project; - do { - project = projectDao.getProjectByProjectId(projectId); - projectDao.evict(project); - Thread.sleep(100); - } while (project.getStatus() != ProjectStatus.DONE); - } - private void waitForProjectToFinishRemoving(String projectId) throws InterruptedException { Project project; do { @@ -377,11 +368,6 @@ public class ProjectControllerIntegrationTestForAsyncCalls extends ControllerInt } } - private UploadedFileEntry createFileInSeparateThread(String content, User user) throws Exception { - return callInSeparateThread(() -> { - return createFile(content, user); - }); - } private User createCuratorInSeparateThread(String login, String password) throws Exception { return callInSeparateThread(() -> { @@ -401,18 +387,4 @@ public class ProjectControllerIntegrationTestForAsyncCalls extends ControllerInt }); } - private void removeProjectInSeparateThread(Project project) throws Exception { - removeProjectInSeparateThread(project.getProjectId()); - } - - private void removeProjectInSeparateThread(String projectId) throws Exception { - callInSeparateThread(() -> { - Project project = projectDao.getProjectByProjectId(projectId); - if (project != null) { - projectDao.delete(project); - } - return null; - }); - } - } diff --git a/web/src/test/java/lcsb/mapviewer/web/ProjectControllerIntegrationTestWithoutTransaction.java b/web/src/test/java/lcsb/mapviewer/web/ProjectControllerIntegrationTestWithoutTransaction.java new file mode 100644 index 0000000000000000000000000000000000000000..a1f33cbaa925c2109e3bba25c974a688a5d8518f --- /dev/null +++ b/web/src/test/java/lcsb/mapviewer/web/ProjectControllerIntegrationTestWithoutTransaction.java @@ -0,0 +1,77 @@ +package lcsb.mapviewer.web; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Arrays; + +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.web.servlet.RequestBuilder; + +import lcsb.mapviewer.model.cache.UploadedFileEntry; +import lcsb.mapviewer.model.user.User; +import lcsb.mapviewer.services.interfaces.IUserService; + +@RunWith(SpringJUnit4ClassRunner.class) +public class ProjectControllerIntegrationTestWithoutTransaction extends ControllerIntegrationTest { + + private static final String BUILT_IN_ADMIN_PASSWORD = "admin"; + private static final String BUILT_IN_ADMIN_LOGIN = "admin"; + + private static final String TEST_PROJECT = "test_project"; + + Logger logger = LogManager.getLogger(); + @Autowired + private IUserService userService; + + @Before + public void setup() { + } + + @Test + public void addProjectAsCurator() throws Exception { + User admin = userService.getUserByLogin(BUILT_IN_ADMIN_LOGIN); + try { + UploadedFileEntry fileEntry = createFileInSeparateThread( + new String(Files.readAllBytes(Paths.get("./src/test/resources/generic.xml")), "UTF-8"), + admin); + + String body = EntityUtils.toString(new UrlEncodedFormEntity(Arrays.asList( + new BasicNameValuePair("file-id", String.valueOf(fileEntry.getId())), + new BasicNameValuePair("mapCanvasType", "OPEN_LAYERS"), + new BasicNameValuePair("parser", + "lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser")))); + + RequestBuilder request = post("/projects/" + TEST_PROJECT) + .contentType(MediaType.APPLICATION_FORM_URLENCODED) + .content(body) + .session(createSession(BUILT_IN_ADMIN_LOGIN, BUILT_IN_ADMIN_PASSWORD)); + + mockMvc.perform(request).andExpect(status().is2xxSuccessful()); + + } finally { + callInSeparateThread(()->{ + try { + waitForProjectToFinishLoading(TEST_PROJECT); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return null; + }); + removeProjectInSeparateThread(TEST_PROJECT); + } + } + +}