From 4285d0bb16c32c7a8ce68765e3b62a62a6bdb728 Mon Sep 17 00:00:00 2001 From: Mauro Bartolomeoli Date: Mon, 19 Mar 2018 17:39:26 +0100 Subject: [PATCH] Fixes #173: transactional resource insert --- .../services/ResourceServiceImpl.java | 64 ++++++++++--------- .../services/ResourceServiceImplTest.java | 25 ++++++++ .../geostore/services/ServiceTestBase.java | 27 ++++++++ 3 files changed, 87 insertions(+), 29 deletions(-) diff --git a/src/core/services-impl/src/main/java/it/geosolutions/geostore/services/ResourceServiceImpl.java b/src/core/services-impl/src/main/java/it/geosolutions/geostore/services/ResourceServiceImpl.java index 776b3a84..9939e88b 100644 --- a/src/core/services-impl/src/main/java/it/geosolutions/geostore/services/ResourceServiceImpl.java +++ b/src/core/services-impl/src/main/java/it/geosolutions/geostore/services/ResourceServiceImpl.java @@ -192,41 +192,47 @@ public long insert(Resource resource) throws BadRequestServiceEx, NotFoundServic } catch (DataIntegrityViolationException exc) { throw new BadRequestServiceEx(exc.getLocalizedMessage()); } - - // - // Persisting Attributes - // - List attributes = resource.getAttribute(); - if (attributes != null) { - for (Attribute a : attributes) { - a.setResource(r); - attributeDAO.persist(a); + try { + // + // Persisting Attributes + // + List attributes = resource.getAttribute(); + if (attributes != null) { + for (Attribute a : attributes) { + a.setResource(r); + attributeDAO.persist(a); + } } - } - // - // Persisting StoredData - // - StoredData data = resource.getData(); - if (data != null) { - data.setId(r.getId()); - data.setResource(r); - storedDataDAO.persist(data); - } + // + // Persisting StoredData + // + StoredData data = resource.getData(); + if (data != null) { + data.setId(r.getId()); + data.setResource(r); + storedDataDAO.persist(data); + } - // - // Persisting SecurityRule - // - List rules = resource.getSecurity(); + // + // Persisting SecurityRule + // + List rules = resource.getSecurity(); - if (rules != null) { - for (SecurityRule rule : rules) { - rule.setResource(r); - securityDAO.persist(rule); + if (rules != null) { + for (SecurityRule rule : rules) { + rule.setResource(r); + securityDAO.persist(rule); + } } - } - return r.getId(); + return r.getId(); + } catch(Exception e) { + // remove resource if we cannot persist other objects bound to the resource + // (attributes, data, etc.) + delete(r.getId()); + throw e; + } } /* diff --git a/src/core/services-impl/src/test/java/it/geosolutions/geostore/services/ResourceServiceImplTest.java b/src/core/services-impl/src/test/java/it/geosolutions/geostore/services/ResourceServiceImplTest.java index 90370ed8..abd6b29b 100644 --- a/src/core/services-impl/src/test/java/it/geosolutions/geostore/services/ResourceServiceImplTest.java +++ b/src/core/services-impl/src/test/java/it/geosolutions/geostore/services/ResourceServiceImplTest.java @@ -270,6 +270,31 @@ public void testUpdateSecurityRules() throws Exception { assertEquals(3, writtenRules.size()); } + @Test + public void testInsertTooBigResource() throws Exception { + final String ORIG_RES_NAME = "testRes"; + final String DESCRIPTION = "description"; + final String CATEGORY_NAME = "MAP"; + String bigData = createDataSize(10000000); + boolean error = false; + assertEquals(0, resourceService.getCount(null)); + try { + createResource(ORIG_RES_NAME, DESCRIPTION, CATEGORY_NAME, bigData); + } catch(Exception e) { + error = true; + } + assertEquals(0, resourceService.getCount(null)); + assertTrue(error); + } + + private static String createDataSize(int msgSize) { + StringBuilder sb = new StringBuilder(msgSize); + for (int i = 0; i < msgSize; i++) { + sb.append('a'); + } + return sb.toString(); + } + @Test public void testInsertUpdateDuplicatedResource() throws Exception { final String ORIG_RES_NAME = "testRes"; diff --git a/src/core/services-impl/src/test/java/it/geosolutions/geostore/services/ServiceTestBase.java b/src/core/services-impl/src/test/java/it/geosolutions/geostore/services/ServiceTestBase.java index c586e102..f2ad8ba2 100644 --- a/src/core/services-impl/src/test/java/it/geosolutions/geostore/services/ServiceTestBase.java +++ b/src/core/services-impl/src/test/java/it/geosolutions/geostore/services/ServiceTestBase.java @@ -228,6 +228,33 @@ protected long createResource(String name, String description, String catName) t return resourceService.insert(resource); } + /** + * @param name + * @param creation + * @param description + * @param data + * + * @return long + * @throws Exception + */ + protected long createResource(String name, String description, String catName, String data) throws Exception { + + Category category = new Category(); + category.setName(catName); + + categoryService.insert(category); + + Resource resource = new Resource(); + resource.setName(name); + resource.setDescription(description); + resource.setCategory(category); + StoredData storedData = new StoredData(); + storedData.setData(data); + resource.setData(storedData); + + return resourceService.insert(resource); + } + /** * @param name * @param creation