Skip to content

Commit

Permalink
SHIBUI-522: filter controller refactoring WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
dima767 committed Jun 13, 2018
1 parent e6fab20 commit c6723e4
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 25 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
package edu.internet2.tier.shibboleth.admin.ui;

import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Profile;
import org.springframework.context.event.EventListener;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Component;

@SpringBootApplication
@EntityScan(basePackages = "edu.internet2.tier.shibboleth.admin.ui.domain")
Expand All @@ -23,4 +29,18 @@ public static void main(String... args) {
SpringApplication.run(ShibbolethUiApplication.class, args);
}

@Component
@Profile("dev")
public static class MetadataResolversResourceIdEmitter {

@Autowired
MetadataResolverRepository metadataResolverRepository;

@EventListener
void showMetadataResolversResourceIds(ApplicationStartedEvent e) {
metadataResolverRepository.findAll()
.forEach(it -> System.out.println(String.format("MetadataResolver [%s: %s]", it.getName(), it.getResourceId())));
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -37,32 +37,36 @@ public class MetadataFiltersController {
@Autowired
private MetadataResolverRepository repository;

@Autowired
private FilterService filterService;

@Autowired
private MetadataResolverService metadataResolverService;

@GetMapping("/Filters")
@Transactional(readOnly = true)
public Iterable<MetadataFilter> getAll(@PathVariable String metadataResolverId) {
// TODO: implement lookup based on metadataResolverId once we have more than one
return repository.findAll().iterator().next().getMetadataFilters();
public ResponseEntity<?> getAll(@PathVariable String metadataResolverId) {
MetadataResolver resolver = repository.findByResourceId(metadataResolverId);
if(resolver == null) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok(resolver.getMetadataFilters());
}

@GetMapping("/Filters/{resourceId}")
public ResponseEntity<?> getOne(@PathVariable String metadataResolverId, @PathVariable String resourceId) {
// TODO: implement lookup based on metadataResolverId once we have more than one
// TODO: should we check that we found exactly one filter (as in the update method below)? If not, error?
return ResponseEntity.ok(repository.findAll().iterator().next().getMetadataFilters().stream()
MetadataResolver resolver = repository.findByResourceId(metadataResolverId);
if(resolver == null) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok(resolver.getMetadataFilters().stream()
.filter(f -> f.getResourceId().equals(resourceId))
.collect(Collectors.toList()).get(0));
}

@PostMapping("/Filters")
public ResponseEntity<?> create(@PathVariable String metadataResolverId, @RequestBody MetadataFilter createdFilter) {
//TODO: replace with get by metadataResolverId once we have more than one
MetadataResolver metadataResolver = repository.findAll().iterator().next();
MetadataResolver metadataResolver = repository.findByResourceId(metadataResolverId);
if(metadataResolver == null) {
return ResponseEntity.notFound().build();
}
metadataResolver.getMetadataFilters().add(createdFilter);

//convert before saving into database
Expand All @@ -88,8 +92,14 @@ public ResponseEntity<?> update(@PathVariable String metadataResolverId,
@PathVariable String resourceId,
@RequestBody MetadataFilter updatedFilter) {

//TODO: replace with get by metadataResolverId once we have more than one
MetadataResolver metadataResolver = repository.findAll().iterator().next();
MetadataResolver metadataResolver = repository.findByResourceId(metadataResolverId);
if(metadataResolver == null) {
return ResponseEntity.notFound().build();
}

if (!resourceId.equals(updatedFilter.getResourceId())) {
return new ResponseEntity<Void>(HttpStatus.CONFLICT);
}

List<MetadataFilter> filters =
metadataResolver.getMetadataFilters().stream()
Expand Down Expand Up @@ -121,9 +131,12 @@ public ResponseEntity<?> update(@PathVariable String metadataResolverId,

metadataResolverService.reloadFilters(persistedMr.getName());

int version = updatedFilter.getVersion();
MetadataFilter persistedFilter =
convertIntoTransientRepresentationIfNecessary(persistedMr.getMetadataFilters().stream(), updatedFilter.getResourceId());

int persitedVersion = persistedFilter.getVersion();

return ResponseEntity.ok().body(persistedFilter);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
import javax.persistence.PreUpdate;
import javax.persistence.Transient;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import static edu.internet2.tier.shibboleth.admin.util.ModelRepresentationConversions.getAttributeListFromAttributeReleaseList;
Expand Down Expand Up @@ -60,11 +62,18 @@ public void intoTransientRepresentation() {
@PrePersist
@PreUpdate
public void fromTransientRepresentation() {
this.attributes.clear();
List<org.opensaml.saml.saml2.core.Attribute> attributeList = new ArrayList<>();
attributeList.addAll(getAttributeListFromAttributeReleaseList(this.attributeRelease));
attributeList.addAll(getAttributeListFromRelyingPartyOverridesRepresentation(this.relyingPartyOverrides));

this.attributes.addAll((List<edu.internet2.tier.shibboleth.admin.ui.domain.Attribute>)(List<? extends org.opensaml.saml.saml2.core.Attribute>)attributeList);
if(!attributeList.isEmpty()) {
//attributeList.sort(Comparator.comparing(org.opensaml.saml.saml2.core.Attribute::getName));
this.attributes = (List<edu.internet2.tier.shibboleth.admin.ui.domain.Attribute>) (List<? extends org.opensaml.saml.saml2.core.Attribute>) attributeList;
}

/*if(!attributeList.isEmpty()) {
this.attributes.clear();
this.attributes.addAll((List<edu.internet2.tier.shibboleth.admin.ui.domain.Attribute>)(List<? extends org.opensaml.saml.saml2.core.Attribute>)attributeList);
}*/
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,8 @@
* Repository to manage {@link MetadataResolver} instances.
*/
public interface MetadataResolverRepository extends CrudRepository<MetadataResolver, Long> {

MetadataResolver findByName(String name);

MetadataResolver findByResourceId(String resourceId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@ class MetadataFiltersControllerTests extends Specification {

controller = new MetadataFiltersController (
repository: metadataResolverRepository,
filterService: filterService,
metadataResolverService: new MetadataResolverService() {
@Override
void reloadFilters(String metadataResolverName) {
Expand All @@ -88,8 +87,7 @@ class MetadataFiltersControllerTests extends Specification {
def metadataResolver = new MetadataResolver()
List<MetadataFilter> expectedContent = testObjectGenerator.buildAllTypesOfFilterList()
metadataResolver.setMetadataFilters(expectedContent)
List<MetadataResolver> metadataResolverList = [metadataResolver]
1 * metadataResolverRepository.findAll() >> metadataResolverList
1 * metadataResolverRepository.findByResourceId(_) >> metadataResolver

def expectedHttpResponseStatus = status().isOk()
def expectedResponseContentType = APPLICATION_JSON_UTF8
Expand All @@ -109,7 +107,7 @@ class MetadataFiltersControllerTests extends Specification {
def metadataResolver = new MetadataResolver()
def expectedFilter = testObjectGenerator.entityAttributesFilter()
metadataResolver.metadataFilters = [expectedFilter]
1 * metadataResolverRepository.findAll() >> [metadataResolver]
1 * metadataResolverRepository.findByResourceId(_) >> metadataResolver

def expectedResourceId = expectedFilter.resourceId
def expectedHttpResponseStatus = status().isOk()
Expand All @@ -127,8 +125,6 @@ class MetadataFiltersControllerTests extends Specification {

def "FilterController.create creates the desired filter"() {
given:
controller.filterService = mockFilterService // so we can control ids

def randomFilter = testObjectGenerator.entityAttributesFilter()
def metadataResolver = new MetadataResolver()
metadataResolver.setResourceId(randomGenerator.randomId())
Expand All @@ -138,7 +134,7 @@ class MetadataFiltersControllerTests extends Specification {
metadataResolverWithFilter.metadataFilters = metadataResolver.metadataFilters.collect()
metadataResolverWithFilter.getMetadataFilters().add(randomFilter)

1 * metadataResolverRepository.findAll() >> [metadataResolver]
1 * metadataResolverRepository.findByResourceId(_) >> metadataResolver
1 * metadataResolverRepository.save(_) >> metadataResolverWithFilter

def expectedMetadataResolverUUID = metadataResolver.getResourceId()
Expand Down Expand Up @@ -180,7 +176,7 @@ class MetadataFiltersControllerTests extends Specification {
updatedMetadataResolver.setMetadataFilters(originalMetadataResolver.getMetadataFilters().collect())
updatedMetadataResolver.getMetadataFilters().add(updatedFilter)

1 * metadataResolverRepository.findAll() >> [originalMetadataResolver]
1 * metadataResolverRepository.findByResourceId(_) >> originalMetadataResolver
1 * metadataResolverRepository.save(_) >> updatedMetadataResolver

def filterUUID = updatedFilter.getResourceId()
Expand All @@ -193,6 +189,7 @@ class MetadataFiltersControllerTests extends Specification {

then:
def expectedJson = new JsonSlurper().parseText(postedJsonBody)
def hashcode = updatedFilter.hashCode()
expectedJson << [version: updatedFilter.hashCode()]
result.andExpect(status().isOk())
.andExpect(content().json(JsonOutput.toJson(expectedJson), true))
Expand All @@ -210,7 +207,7 @@ class MetadataFiltersControllerTests extends Specification {
originalMetadataResolver.setMetadataFilters(testObjectGenerator.buildAllTypesOfFilterList())
originalMetadataResolver.getMetadataFilters().add(randomFilter)

1 * metadataResolverRepository.findAll() >> [originalMetadataResolver]
1 * metadataResolverRepository.findByResourceId(_) >> originalMetadataResolver

def filterUUID = randomFilter.getResourceId()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ class TestObjectGenerator {
it.name = entityAttributesFilter.name
it.resourceId = entityAttributesFilter.resourceId
it.setEntityAttributesFilterTarget(entityAttributesFilter.entityAttributesFilterTarget)
it.setAttributes(new ArrayList<Attribute>(entityAttributesFilter.attributes))
it.setAttributes(entityAttributesFilter.attributes)
it.intoTransientRepresentation()
it
}
Expand Down

0 comments on commit c6723e4

Please sign in to comment.