@Override public List<Property<?>> getProperties(ProjectEntity entity) { // With all the existing properties... return getPropertyTypes().stream() // ... filters them by entity .filter(type -> type.getSupportedEntityTypes().contains(entity.getProjectEntityType())) // ... filters them by access right .filter(type -> type.canView(entity, securityService)) // ... loads them from the store .map(type -> getProperty(type, entity)) // .. flags with editionrights .map(prop -> prop.editable(prop.getType().canEdit(entity, securityService))) // ... and returns them .collect(Collectors.toList()); }
protected <T> void doCopyProperty(ProjectEntity sourceEntity, Property<T> property, ProjectEntity targetEntity, Function<String, String> replacementFn) { if (!property.isEmpty() && property.getType().canEdit(targetEntity, securityService)) { // Copy of the property propertyService.copyProperty( sourceEntity, property, targetEntity, replacementFn ); } }
protected <T> Form getPropertyEditionForm(ProjectEntity entity, PropertyType<T> propertyType) { // Checks for edition if (!propertyType.canEdit(entity, securityService)) { throw new AccessDeniedException("Property is not opened for edition."); } // Gets the value for this property T value = getPropertyValue(propertyType, entity); // Gets the form return propertyType.getEditionForm(entity, value); } }
private <T> Ack editProperty(ProjectEntity entity, PropertyType<T> propertyType, T value) { // Checks for edition if (!propertyType.canEdit(entity, securityService)) { throw new AccessDeniedException("Property is not opened for edition."); } // Gets the JSON for the storage JsonNode storage = propertyType.forStorage(value); // Stores the property propertyRepository.saveProperty( propertyType.getClass().getName(), entity.getProjectEntityType(), entity.getId(), storage ); // Property change event eventPostService.post(eventFactory.propertyChange(entity, propertyType)); // Listener propertyType.onPropertyChanged(entity, value); // OK return Ack.OK; }
private <T> Ack deleteProperty(ProjectEntity entity, PropertyType<T> propertyType) { // Checks for edition if (!propertyType.canEdit(entity, securityService)) { throw new AccessDeniedException("Property is not opened for viewing."); } // Gets the existing value T value = getPropertyValue(propertyType, entity); // If existing, deletes it if (value != null) { Ack ack = propertyRepository.deleteProperty(propertyType.getClass().getName(), entity.getProjectEntityType(), entity.getId()); if (ack.isSuccess()) { // Property deletion event eventPostService.post(eventFactory.propertyDelete(entity, propertyType)); // Listener propertyType.onPropertyDeleted(entity, value); } // OK return ack; } else { return Ack.NOK; } }