Skip to content

Commit

Permalink
Merge branch 'master' into SHIBUI-660
Browse files Browse the repository at this point in the history
  • Loading branch information
Bill Smith committed Aug 14, 2018
2 parents e6f5566 + cf7f219 commit 85bd3c1
Show file tree
Hide file tree
Showing 162 changed files with 3,988 additions and 1,368 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService {
@Autowired
private OpenSamlObjects openSamlObjects

@Autowired
private MetadataResolversPositionOrderContainerService resolversPositionOrderContainerService

// TODO: enhance
@Override
void reloadFilters(String metadataResolverName) {
Expand Down Expand Up @@ -98,8 +101,11 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService {
'xsi:type': 'ChainingMetadataProvider',
'xsi:schemaLocation': 'urn:mace:shibboleth:2.0:metadata http://shibboleth.net/schema/idp/shibboleth-metadata.xsd urn:mace:shibboleth:2.0:resource http://shibboleth.net/schema/idp/shibboleth-resource.xsd urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd urn:oasis:names:tc:SAML:2.0:metadata http://docs.oasis-open.org/security/saml/v2.0/saml-schema-metadata-2.0.xsd urn:oasis:names:tc:SAML:2.0:assertion http://docs.oasis-open.org/security/saml/v2.0/saml-schema-assertion-2.0.xsd'
) {
metadataResolverRepository.findAll().each { edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver mr ->
//TODO: We cannot/do not currently have the code to marshall the internal incommon chaining resolver


resolversPositionOrderContainerService.allMetadataResolversInDefinedOrderOrUnordered.each {
edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver mr ->
//TODO: We do not currently marshall the internal incommon chaining resolver (with BaseMetadataResolver type)
if ((mr.type != 'BaseMetadataResolver') && (mr.enabled)) {
constructXmlNodeForResolver(mr, delegate) {
MetadataFilter(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package edu.internet2.tier.shibboleth.admin.ui.configuration;

import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.EntityIdsSearchResultRepresentation;
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolversPositionOrderContainer;
import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects;
import edu.internet2.tier.shibboleth.admin.ui.repository.EntityDescriptorRepository;
import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository;
import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolversPositionOrderContainerRepository;
import edu.internet2.tier.shibboleth.admin.ui.scheduled.EntityDescriptorFilesScheduledTasks;
import edu.internet2.tier.shibboleth.admin.ui.service.*;
import edu.internet2.tier.shibboleth.admin.util.AttributeUtility;
Expand Down Expand Up @@ -167,4 +170,14 @@ public void addInterceptors(InterceptorRegistry registry) {
}
};
}

@Bean
public MetadataResolversPositionOrderContainerService
metadataResolversPositionOrderContainerService(MetadataResolversPositionOrderContainerRepository
positionOrderContainerRepository,
MetadataResolverRepository resolverRepository) {

return new DefaultMetadataResolversPositionOrderContainerService(positionOrderContainerRepository, resolverRepository);

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository;
import edu.internet2.tier.shibboleth.admin.ui.service.IndexWriterService;
import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverService;
import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolversPositionOrderContainerService;
import lombok.extern.slf4j.Slf4j;
import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
import org.apache.lucene.document.Document;
Expand Down Expand Up @@ -36,6 +37,7 @@
import java.io.IOException;
import java.io.StringWriter;
import java.net.URI;
import java.util.List;

import static edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolverValidator.ValidationResult;

Expand All @@ -53,6 +55,9 @@ public class MetadataResolversController {
@Autowired
MetadataResolverService metadataResolverService;

@Autowired
MetadataResolversPositionOrderContainerService positionOrderContainerService;

@Autowired
IndexWriterService indexWriterService;

Expand All @@ -64,7 +69,7 @@ public ResponseEntity<?> unableToParseJson(Exception ex) {
@GetMapping("/MetadataResolvers")
@Transactional(readOnly = true)
public ResponseEntity<?> getAll() {
Iterable<MetadataResolver> resolvers = resolverRepository.findAll();
List<MetadataResolver> resolvers = positionOrderContainerService.getAllMetadataResolversInDefinedOrderOrUnordered();
resolvers.forEach(MetadataResolver::updateVersion);
return ResponseEntity.ok(resolvers);
}
Expand Down Expand Up @@ -108,6 +113,7 @@ public ResponseEntity<?> create(@RequestBody MetadataResolver newResolver) {

newResolver.convertFiltersFromTransientRepresentationIfNecessary();
MetadataResolver persistedResolver = resolverRepository.save(newResolver);
positionOrderContainerService.appendPositionOrderForNew(persistedResolver);
persistedResolver.updateVersion();

persistedResolver.convertFiltersIntoTransientRepresentationIfNecessary();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package edu.internet2.tier.shibboleth.admin.ui.controller;


import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolversPositionOrderContainer;
import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolversPositionOrderContainerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
* @author Dmitriy Kopylenko
*/
@RestController
@RequestMapping("/api/MetadataResolversPositionOrder")
public class MetadataResolversPositionOrderController {

@Autowired
MetadataResolversPositionOrderContainerService positionOrderContainerService;

@PostMapping
public ResponseEntity<?> createOrUpdate(@RequestBody MetadataResolversPositionOrderContainer metadataResolversPositionOrderContainer) {
positionOrderContainerService.addOrUpdatePositionOrderContainer(metadataResolversPositionOrderContainer);
return ResponseEntity.noContent().build();
}

@GetMapping
public ResponseEntity<?> getPositionOrderContainer() {
return ResponseEntity.ok(positionOrderContainerService.retrieveExistingOrEmpty());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
@EqualsAndHashCode(callSuper = true)
public class EntityAttributesFilterTarget extends AbstractAuditable {
public enum EntityAttributesFilterTargetType {
ENTITY, CONDITION_SCRIPT, CONDITION_REF
ENTITY, CONDITION_SCRIPT, CONDITION_REF, REGEX
}

private static Logger LOGGER = LoggerFactory.getLogger(EntityAttributesFilterTarget.class);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers;

/**
* This is a persistent entity abstraction encapsulating a collection of metadata resolver ids
* for the purpose of maintaining an order of all persistent metadata resolvers which becomes significant during
* generation of XML metadata for the resolvers.
*
* Maintaining this separate entity enables UI layer for example to explicitly manipulate ordering e.g. use REST
* API to reorder resolvers, etc.
*
* @author Dmitriy
*/
public class MetadataResolversOrderContainer {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OrderColumn;
import java.util.ArrayList;
import java.util.List;

/**
* This is a persistent entity abstraction encapsulating a collection of metadata resolver ids
* for the purpose of maintaining an order of all persistent metadata resolvers which becomes significant during
* generation of XML metadata for the resolvers.
*
* Maintaining this separate entity enables UI layer for example to explicitly manipulate ordering e.g. use REST
* API to reorder resolvers, etc.
*
* @author Dmitriy Kopylenko
*/
@Entity
@EqualsAndHashCode
@NoArgsConstructor
@Getter
@Setter
@ToString
public class MetadataResolversPositionOrderContainer {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@JsonIgnore
protected Long id;

@ElementCollection
@CollectionTable(name="METADATA_RESOLVER_POSITION_ORDER", joinColumns=@JoinColumn(name="METADATA_RESOLVER_POSITION_ORDER_CONTAINER_ID"))
@Column(name="METADATA_RESOLVER_RESOURCE_ID")
@OrderColumn
private List<String> resourceIds = new ArrayList<>();
}

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package edu.internet2.tier.shibboleth.admin.ui.repository;

import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolversPositionOrderContainer;
import org.springframework.data.repository.CrudRepository;

/**
* Spring Data Repository API for persistence operations on instances of {@link MetadataResolversPositionOrderContainer}.
*
* @author Dmitriy Kopylenko
*/
public interface MetadataResolversPositionOrderContainerRepository
extends CrudRepository<MetadataResolversPositionOrderContainer, Long> {
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package edu.internet2.tier.shibboleth.admin.ui.service;

import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver;
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolversPositionOrderContainer;
import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository;
import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolversPositionOrderContainerRepository;
import org.springframework.transaction.annotation.Transactional;

import java.util.Iterator;
import java.util.List;
import java.util.Optional;

import static com.google.common.collect.FluentIterable.from;
import static java.util.stream.Collectors.toList;


/**
* Default implementation of {@link MetadataResolversPositionOrderContainer}.
*
* @author Dmitriy Kopylenko
*/
public class DefaultMetadataResolversPositionOrderContainerService implements MetadataResolversPositionOrderContainerService {

private MetadataResolversPositionOrderContainerRepository positionOrderContainerRepository;

private MetadataResolverRepository metadataResolverRepository;

public DefaultMetadataResolversPositionOrderContainerService(MetadataResolversPositionOrderContainerRepository positionOrderRepository,
MetadataResolverRepository metadataResolverRepository) {
this.positionOrderContainerRepository = positionOrderRepository;
this.metadataResolverRepository = metadataResolverRepository;
}

@Override
@Transactional
public void addOrUpdatePositionOrderContainer(MetadataResolversPositionOrderContainer metadataResolversPositionOrderContainer) {
MetadataResolversPositionOrderContainer existingPositionOrder = getPositionOrderContainerIfExists().orElse(null);
if (existingPositionOrder != null) {
existingPositionOrder.setResourceIds(metadataResolversPositionOrderContainer.getResourceIds());
positionOrderContainerRepository.save(existingPositionOrder);
return;
}
positionOrderContainerRepository.save(metadataResolversPositionOrderContainer);
}

@Override
@Transactional(readOnly = true)
public List<MetadataResolver> getAllMetadataResolversInDefinedOrderOrUnordered() {
Optional<MetadataResolversPositionOrderContainer> orderContainer = getPositionOrderContainerIfExists();
if(orderContainer.isPresent()) {
return orderContainer.get().getResourceIds()
.stream()
.map(metadataResolverRepository::findByResourceId)
.collect(toList());
}

return from(metadataResolverRepository.findAll()).toList();
}

@Override
public MetadataResolversPositionOrderContainer retrieveExistingOrEmpty() {
return getPositionOrderContainerIfExists().orElseGet(MetadataResolversPositionOrderContainer::new);
}

@Override
@Transactional
public void appendPositionOrderForNew(MetadataResolver metadataResolver) {
MetadataResolversPositionOrderContainer positionOrderContainer = retrieveExistingOrEmpty();
positionOrderContainer.getResourceIds().add(metadataResolver.getResourceId());
positionOrderContainerRepository.save(positionOrderContainer);
}

private Optional<MetadataResolversPositionOrderContainer> getPositionOrderContainerIfExists() {
Iterator<MetadataResolversPositionOrderContainer> iter = positionOrderContainerRepository.findAll().iterator();
return iter.hasNext() ? Optional.of(iter.next()) : Optional.empty();
}
}
Loading

0 comments on commit 85bd3c1

Please sign in to comment.