Skip to content

Commit

Permalink
Merged in shibui-296 (pull request #26)
Browse files Browse the repository at this point in the history
Mock implementation of entity ids search API

* Mock implementation of entity ids search API

* Clean up of schema generation -> move to a script

Approved-by: Jonathan Johnson <jj@scaldingspoon.com>
  • Loading branch information
dima767 authored and Jonathan Johnson committed Mar 23, 2018
1 parent f733806 commit 95d9884
Show file tree
Hide file tree
Showing 8 changed files with 128 additions and 25 deletions.
6 changes: 5 additions & 1 deletion backend/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ targetCompatibility = 1.8
repositories {
maven { url 'https://build.shibboleth.net/nexus/content/groups/public' }
mavenCentral()
jcenter()
}

processResources.dependsOn(':ui:npm_run_buildProd')
Expand Down Expand Up @@ -61,6 +62,9 @@ dependencies {
compile "org.liquibase:liquibase-core"
compile group: 'org.jadira.usertype', name: 'usertype.core', version: '6.0.1.GA'

//For easy data mocking capabilities
compile 'net.andreinc.mockneat:mockneat:0.1.4'

//So it works on Java 9 without explicitly requiring to load that module (needed by Hibernate)
runtimeOnly 'javax.xml.bind:jaxb-api:2.3.0'

Expand All @@ -76,7 +80,7 @@ dependencies {
testRuntime 'cglib:cglib-nodep:3.2.5'

//JSON schema generator
testCompile 'com.kjetland:mbknor-jackson-jsonschema_2.12:1.0.28'
testCompile 'com.kjetland:mbknor-jackson-jsonschema_2.12:1.0.29'
testCompile 'javax.validation:validation-api:2.0.1.Final'
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
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.opensaml.OpenSamlObjects;
import edu.internet2.tier.shibboleth.admin.ui.repository.EntityDescriptorRepository;
import edu.internet2.tier.shibboleth.admin.ui.scheduled.EntityDescriptorFilesScheduledTasks;
import edu.internet2.tier.shibboleth.admin.ui.service.EntityDescriptorService;
import edu.internet2.tier.shibboleth.admin.ui.service.EntityIdsSearchService;
import edu.internet2.tier.shibboleth.admin.ui.service.JPAEntityDescriptorServiceImpl;
import net.andreinc.mockneat.MockNeat;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;

@Configuration
public class CoreShibUiConfiguration {

Expand All @@ -30,4 +35,15 @@ public EntityDescriptorService jpaEntityDescriptorService() {
public EntityDescriptorFilesScheduledTasks entityDescriptorFilesScheduledTasks(EntityDescriptorRepository entityDescriptorRepository) {
return new EntityDescriptorFilesScheduledTasks(this.metadataDir, entityDescriptorRepository, openSamlObjects());
}

@Bean
public EntityIdsSearchService entityIdsSearchService() {
//TODO: replace with real data store implementation when ready
return (term, limit) -> {
MockNeat m = MockNeat.threadLocal();
// Just simulate returning 100 results for no-limit query
List<String> simulatedEntityIds = limit > 0 ? m.urls().list(limit).val() : m.urls().list(100).val();
return new EntityIdsSearchResultRepresentation(simulatedEntityIds);
};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package edu.internet2.tier.shibboleth.admin.ui.controller;

import edu.internet2.tier.shibboleth.admin.ui.service.EntityIdsSearchService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping("/api/EntityIds/search")
public class EntityIdsSearchController {

EntityIdsSearchService entityIdsSearchService;

public EntityIdsSearchController(EntityIdsSearchService entityIdsSearchService) {
this.entityIdsSearchService = entityIdsSearchService;
}

@GetMapping
ResponseEntity<?> search(@RequestParam String term, @RequestParam(required = false) Integer limit) {
//Zero indicates no-limit
final int resultLimit = (limit != null ? limit : 0);
return ResponseEntity.ok(this.entityIdsSearchService.findBySearchTermAndOptionalLimit(term, resultLimit));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package edu.internet2.tier.shibboleth.admin.ui.domain.frontend;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class EntityIdsSearchResultRepresentation implements Serializable {

private static final long serialVersionUID = 8150816733364873026L;

private List<String> entityIds = new ArrayList<>();

public EntityIdsSearchResultRepresentation(List<String> entityIds) {
this.entityIds = entityIds;
}

public List<String> getEntityIds() {
return Collections.unmodifiableList(entityIds);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package edu.internet2.tier.shibboleth.admin.ui.service;

import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.EntityIdsSearchResultRepresentation;
import net.andreinc.mockneat.MockNeat;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
* API component responsible for entity ids search.
*/
@FunctionalInterface
public interface EntityIdsSearchService {

/**
* Find a list of entity ids
* @param searchTerm for the query
* @param limit optional limit of query results to return. Zero or less value indicates no limit.
* @return EntityIdsSearchResultRepresentation
*/
EntityIdsSearchResultRepresentation findBySearchTermAndOptionalLimit(String searchTerm, int limit);
}

This file was deleted.

14 changes: 14 additions & 0 deletions backend/src/test/resources/entity-ids-search-json-schema.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "Entity Ids Search Result Representation",
"type": "object",
"additionalProperties": false,
"properties": {
"entityIds": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
22 changes: 22 additions & 0 deletions backend/src/test/scripts/generate-json-schema.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import com.fasterxml.jackson.databind.ObjectMapper
import com.kjetland.jackson.jsonSchema.JsonSchemaGenerator
import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.EntityDescriptorRepresentation
import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.EntityIdsSearchResultRepresentation

import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT

TARGET_DIRECTORY = "../resources"

def generateSchemaFor(Class clazz, String outputFileName) {
def om = new ObjectMapper().with { it.enable(INDENT_OUTPUT); it }
def schemaGenerator = new JsonSchemaGenerator(om)
def jsonSchema = schemaGenerator.generateJsonSchema(clazz)

def jsonSchemaOutputFile = new File("$TARGET_DIRECTORY/$outputFileName")
jsonSchemaOutputFile.delete()
jsonSchemaOutputFile.withWriter('UTF-8') {
it.write(jsonSchema.toString())
}
}

generateSchemaFor(EntityIdsSearchResultRepresentation, "entity-ids-search-json-schema.json")

0 comments on commit 95d9884

Please sign in to comment.