public void removeProperty(PropertyDescriptorEntity propertyDescriptor, ResourceEntity resourceEntity) { ResourceContextEntity resourceContext = resourceEntity.getOrCreateContext(globalContext); try { descriptorService.deletePropertyDescriptorByOwnerInResourceContext(propertyDescriptor, resourceContext, resourceEntity.getId()); } catch (AMWException e) { throw new AMWRuntimeException("Failed to delete property " + propertyDescriptor.getPropertyDescriptorDisplayName() + " which has still assigned values"); } }
@Test public void deletePropertyDescriptorByOwnerWhenDeletingOwnerIsOwnerOfDescriptorAndNoPropertiesShouldDeletePropertyDescriptor() throws AMWException { // given ForeignableOwner deletingOwner = ForeignableOwner.AMW; AbstractContext abstractContextMock = mock(AbstractContext.class); PropertyDescriptorEntity descriptor = new PropertyDescriptorEntityBuilder().withOwner(deletingOwner).withId(1).build(); Assert.assertEquals(deletingOwner, descriptor.getOwner()); TypedQuery<PropertyDescriptorEntity> queryMock = mock(TypedQuery.class); when(entityManagerMock.createQuery("from PropertyDescriptorEntity d left join fetch d.propertyTags where d.id = :propertyDescriptorId ", PropertyDescriptorEntity.class)).thenReturn(queryMock); when(queryMock.getSingleResult()).thenReturn(descriptor); // when service.deletePropertyDescriptorByOwnerInResourceContext(descriptor, abstractContextMock, dummyResourceId); // then verify(entityManagerMock).remove(descriptor); }
/** * Checks Permissions and deletes the given property descriptor from database for resource */ public void deletePropertyDescriptorForResource(ForeignableOwner deletingOwner, Integer resourceId, PropertyDescriptorEntity descriptor, boolean forceDelete) throws AMWException, ForeignableOwnerViolationException { if (descriptor != null && descriptor.getId() != null) { ResourceEntity attachedResource = entityManager.find(ResourceEntity.class, resourceId); ResourceContextEntity resourceContext = attachedResource.getOrCreateContext(contextService.getGlobalResourceContextEntity()); permissionBoundary.checkPermissionAndFireException(Permission.RESOURCE, null, Action.UPDATE, attachedResource.getResourceGroup(), null, null); foreignableService.verifyDeletableByOwner(deletingOwner, descriptor); if (forceDelete) { propertyDescriptorService.deletePropertyDescriptorByOwnerIncludingPropertyValues(descriptor, resourceContext, attachedResource); } else { propertyDescriptorService.deletePropertyDescriptorByOwnerInResourceContext(descriptor, resourceContext, resourceId); } } }
@Test(expected = AMWException.class) public void deletePropertyDescriptorByOwnerWhenDeletingOwnerIsOwnerOfDescriptorButHasPropertiesShouldThrowException() throws AMWException { // given ForeignableOwner deletingOwner = ForeignableOwner.AMW; AbstractContext abstractContextMock = mock(AbstractContext.class); Set<PropertyEntity> properties = new HashSet<>(); properties.add(new PropertyEntity()); PropertyDescriptorEntity descriptor = new PropertyDescriptorEntityBuilder().withOwner(deletingOwner).withId(1).withProperties(properties).build(); Assert.assertEquals(deletingOwner, descriptor.getOwner()); TypedQuery<PropertyDescriptorEntity> queryMock = mock(TypedQuery.class); when(entityManagerMock.createQuery("from PropertyDescriptorEntity d left join fetch d.propertyTags where d.id = :propertyDescriptorId ", PropertyDescriptorEntity.class)).thenReturn(queryMock); when(queryMock.getSingleResult()).thenReturn(descriptor); // when service.deletePropertyDescriptorByOwnerInResourceContext(descriptor, abstractContextMock, dummyResourceId); }
@Test public void deletePropertyDescriptorByOwnerWhenDeletingOwnerIsOwnerOfDescriptorWithTagsAndNoPropertiesShouldDeleteAllTags() throws AMWException { // given ForeignableOwner deletingOwner = ForeignableOwner.AMW; AbstractContext abstractContextMock = mock(AbstractContext.class); PropertyTagEntity tag1 = new PropertyTagEntity(); tag1.setId(1); PropertyTagEntity tag2 = new PropertyTagEntity(); tag1.setId(2); PropertyDescriptorEntity descriptor = new PropertyDescriptorEntityBuilder().withOwner(deletingOwner).withTags(tag1, tag2).withId(1).build(); Assert.assertEquals(deletingOwner, descriptor.getOwner()); TypedQuery<PropertyDescriptorEntity> queryMock = mock(TypedQuery.class); when(entityManagerMock.createQuery("from PropertyDescriptorEntity d left join fetch d.propertyTags where d.id = :propertyDescriptorId ", PropertyDescriptorEntity.class)).thenReturn(queryMock); when(queryMock.getSingleResult()).thenReturn(descriptor); when(entityManagerMock.find(PropertyDescriptorEntity.class, descriptor.getId())).thenReturn(descriptor); when(entityManagerMock.find(PropertyTagEntity.class, tag1.getId())).thenReturn(tag1); when(entityManagerMock.find(PropertyTagEntity.class, tag2.getId())).thenReturn(tag2); // when service.deletePropertyDescriptorByOwnerInResourceContext(descriptor, abstractContextMock, dummyResourceId); // then verify(entityManagerMock).remove(tag1); verify(entityManagerMock).remove(tag2); }
@Test public void shouldStoreResourceIdInThreadLocalForDuringPropertyUpdateInResourceContext() throws AMWException { // given Integer resourceIdForAuditLog = 200; ForeignableOwner deletingOwner = ForeignableOwner.AMW; Set<PropertyEntity> properties = new HashSet<>(); properties.add(new PropertyEntity()); PropertyDescriptorEntity descriptor = new PropertyDescriptorEntityBuilder().withOwner(deletingOwner).withId(1).withProperties(properties).build(); AbstractContext abstractContextMock = mock(AbstractContext.class); doNothing().when(service).removePropertyDescriptorByOwner(eq(descriptor), eq(abstractContextMock), anyBoolean()); doReturn(descriptor).when(service).getPropertyDescriptorWithTags(anyInt()); // when service.deletePropertyDescriptorByOwnerInResourceContext(descriptor, abstractContextMock, resourceIdForAuditLog); // then assertThat("The resourceId Param must be stored as ThreadLocal variable for auditing (envers)", ThreadLocalUtil.getThreadVariable(ThreadLocalUtil.KEY_RESOURCE_ID), is(CoreMatchers.notNullValue())); int resourceId = (int) ThreadLocalUtil.getThreadVariable(ThreadLocalUtil.KEY_RESOURCE_ID); assertThat(resourceId, is(resourceIdForAuditLog)); }