diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/CustomEntityAttributesDefinitionsController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/CustomEntityAttributesDefinitionsController.java index fa83d2b45..a51ea77c8 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/CustomEntityAttributesDefinitionsController.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/CustomEntityAttributesDefinitionsController.java @@ -70,34 +70,34 @@ public ResponseEntity getAll() { return ResponseEntity.ok(caService.getAllDefinitions()); } - @GetMapping("/attribute/{name}") + @GetMapping("/attribute/{resourceId}") @Transactional(readOnly = true) - public ResponseEntity getOne(@PathVariable String name) { - CustomEntityAttributeDefinition cad = caService.find(name); + public ResponseEntity getOne(@PathVariable String resourceId) { + CustomEntityAttributeDefinition cad = caService.find(resourceId); if (cad == null) { HttpHeaders headers = new HttpHeaders(); headers.setLocation( - ServletUriComponentsBuilder.fromCurrentServletMapping().path("/api/custom/entity/attribute/" + name).build().toUri()); + ServletUriComponentsBuilder.fromCurrentServletMapping().path("/api/custom/entity/attribute/" + resourceId).build().toUri()); return ResponseEntity.status(HttpStatus.NOT_FOUND).headers(headers) .body(new ErrorResponse(String.valueOf(HttpStatus.NOT_FOUND.value()), - String.format("The custom attribute definition with name: [%s] does not already exist.", name))); + String.format("The custom attribute definition with resource id: [%s] does not already exist.", resourceId))); } return ResponseEntity.ok(cad); } - @DeleteMapping("/attribute/{name}") + @DeleteMapping("/attribute/{resourceId}") @Transactional - public ResponseEntity delete(@PathVariable String name) { - CustomEntityAttributeDefinition cad = caService.find(name); + public ResponseEntity delete(@PathVariable String resourceId) { + CustomEntityAttributeDefinition cad = caService.find(resourceId); if (cad == null) { HttpHeaders headers = new HttpHeaders(); headers.setLocation( - ServletUriComponentsBuilder.fromCurrentServletMapping().path("/api/custom/entity/attribute/" + name).build().toUri()); + ServletUriComponentsBuilder.fromCurrentServletMapping().path("/api/custom/entity/attribute/" + resourceId).build().toUri()); return ResponseEntity.status(HttpStatus.NOT_FOUND).headers(headers) .body(new ErrorResponse(String.valueOf(HttpStatus.NOT_FOUND.value()), - String.format("The custom attribute definition with name: [%s] does not already exist.", name))); + String.format("The custom attribute definition with resource id: [%s] does not already exist.", resourceId))); } caService.deleteDefinition(cad); return ResponseEntity.noContent().build(); diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/CustomEntityAttributeDefinition.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/CustomEntityAttributeDefinition.java index f4d5d1054..c06492ce8 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/CustomEntityAttributeDefinition.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/CustomEntityAttributeDefinition.java @@ -2,15 +2,14 @@ import java.util.HashSet; import java.util.Set; +import java.util.UUID; import javax.persistence.CollectionTable; import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Entity; -import javax.persistence.EntityListeners; import javax.persistence.Id; import javax.persistence.JoinColumn; -import javax.persistence.PostLoad; import javax.persistence.Transient; import org.hibernate.annotations.Fetch; @@ -53,7 +52,6 @@ public class CustomEntityAttributeDefinition implements IRelyingPartyOverridePro @Column(name = "invert", nullable = true) String invert; - @Id @Column(nullable = false) String name; @@ -62,6 +60,10 @@ public class CustomEntityAttributeDefinition implements IRelyingPartyOverridePro @Column(name = "persist_value", nullable = true) String persistValue; + + @Id + @Column(name = "resource_id", nullable = false) + String resourceId = UUID.randomUUID().toString(); @Override public String getAttributeName() { diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/repository/CustomEntityAttributeDefinitionRepository.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/repository/CustomEntityAttributeDefinitionRepository.java index 677d7cf87..db3724ea5 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/repository/CustomEntityAttributeDefinitionRepository.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/repository/CustomEntityAttributeDefinitionRepository.java @@ -15,6 +15,8 @@ public interface CustomEntityAttributeDefinitionRepository extends JpaRepository CustomEntityAttributeDefinition findByName(String name); + CustomEntityAttributeDefinition findByResourceId(String resourceId); + @SuppressWarnings("unchecked") CustomEntityAttributeDefinition save(CustomEntityAttributeDefinition attribute); } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/CustomEntityAttributesDefinitionService.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/CustomEntityAttributesDefinitionService.java index 4087ad221..f4539a15e 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/CustomEntityAttributesDefinitionService.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/CustomEntityAttributesDefinitionService.java @@ -10,7 +10,7 @@ public interface CustomEntityAttributesDefinitionService { void deleteDefinition(CustomEntityAttributeDefinition definition); - CustomEntityAttributeDefinition find(String name); + CustomEntityAttributeDefinition find(String resourceId); List getAllDefinitions(); diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/CustomEntityAttributesDefinitionServiceImpl.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/CustomEntityAttributesDefinitionServiceImpl.java index a7d1c46dc..6fe0a8c25 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/CustomEntityAttributesDefinitionServiceImpl.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/CustomEntityAttributesDefinitionServiceImpl.java @@ -35,14 +35,14 @@ public CustomEntityAttributeDefinition createOrUpdateDefinition(CustomEntityAttr @Override @Transactional public void deleteDefinition(CustomEntityAttributeDefinition definition) { - CustomEntityAttributeDefinition entityToRemove = repository.findByName(definition.getName()); + CustomEntityAttributeDefinition entityToRemove = repository.findByResourceId(definition.getResourceId()); repository.delete(entityToRemove); notifyListeners(); } @Override - public CustomEntityAttributeDefinition find(String name) { - return repository.findByName(name); + public CustomEntityAttributeDefinition find(String resourceId) { + return repository.findByResourceId(resourceId); } @Override diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/CustomEntityAttributeDefinitionRepositoryTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/CustomEntityAttributeDefinitionRepositoryTests.groovy index 2601d4d42..5c7f8cf8e 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/CustomEntityAttributeDefinitionRepositoryTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/CustomEntityAttributeDefinitionRepositoryTests.groovy @@ -142,11 +142,7 @@ class CustomEntityAttributeDefinitionRepositoryTests extends Specification { // delete tests when: - def delByName = new CustomEntityAttributeDefinition().with { - it.name = "ca-name" - it - } - repo.delete(delByName) + repo.delete(caFromDb1) entityManager.flush() entityManager.clear() @@ -159,24 +155,12 @@ class CustomEntityAttributeDefinitionRepositoryTests extends Specification { def setItems2 = new HashSet(["val2", "val1"]) def setItems3 = new HashSet(["val1", "val2", "val3"]) def setItems4 = new HashSet(["val1", "val2", "val3", "val4"]) - def ca2 = new CustomEntityAttributeDefinition().with { - it.name = "ca-name" - it.attributeType = "SELECTION_LIST" - it.customAttrListDefinitions = setItems2 - it - } def ca3 = new CustomEntityAttributeDefinition().with { it.name = "ca-name" it.attributeType = "SELECTION_LIST" it.customAttrListDefinitions = setItems3 it } - def ca4 = new CustomEntityAttributeDefinition().with { - it.name = "ca-name" - it.attributeType = "SELECTION_LIST" - it.customAttrListDefinitions = setItems4 - it - } when: repo.save(ca3) @@ -186,31 +170,39 @@ class CustomEntityAttributeDefinitionRepositoryTests extends Specification { then: def cas = repo.findAll() cas.size() == 1 - def caFromDb = cas.get(0).asType(CustomEntityAttributeDefinition) - caFromDb.equals(ca3) == true + def ca3FromDb = cas.get(0).asType(CustomEntityAttributeDefinition) + ca3FromDb.equals(ca3) == true // now update the attribute list items - caFromDb.with { + ca3FromDb.with { it.customAttrListDefinitions = setItems4 it } - repo.save(caFromDb) + repo.save(ca3FromDb) entityManager.flush() entityManager.clear() def caFromDb4 = repo.findAll().get(0).asType(CustomEntityAttributeDefinition) + def ca4 = new CustomEntityAttributeDefinition().with { + it.name = "ca-name" + it.attributeType = "SELECTION_LIST" + it.customAttrListDefinitions = setItems4 + it.resourceId = ca3FromDb.resourceId + it + } caFromDb4.equals(ca4) == true // now remove items - caFromDb.with { + ca3FromDb.with { it.customAttrListDefinitions = setItems2 it } - repo.save(caFromDb) + repo.save(ca3FromDb) entityManager.flush() entityManager.clear() def caFromDb2 = repo.findAll().get(0).asType(CustomEntityAttributeDefinition) - caFromDb2.equals(ca2) == true + ca3FromDb.resourceId == caFromDb2.resourceId + ca3FromDb.customAttrListDefinitions.equals(caFromDb2.customAttrListDefinitions) } } \ No newline at end of file