Skip to content

Commit

Permalink
Merge pull request #10 from nfl/external_refactor
Browse files Browse the repository at this point in the history
External refactor
  • Loading branch information
nflearl authored Dec 20, 2017
2 parents d576ecb + db5a4fc commit e9335fd
Show file tree
Hide file tree
Showing 8 changed files with 66 additions and 34 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ maven.central.sync=false
sonatype.username=DUMMY_SONATYPE_USER
sonatype.password=DUMMY_SONATYPE_PASSWORD

PROJECT_VERSION=1.0.3
PROJECT_VERSION=1.0.4
PROJECT_GITHUB_REPO_URL=https://github.com/nfl/gold
PROJECT_LICENSE_URL=https://github.com/nfl/gold/blob/master/LICENSE
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public GraphQLOutputType buildInstanceOutputType(InstanceFieldBuilderContext ins
Map<String, GraphQLObjectType> buildPossibleTypeMap(List<String> possibleTypes, InstanceFieldBuilderContext instanceFieldBuilderContext, InstanceOutputTypeService instanceOutputTypeService) {
Map<String, GraphQLObjectType> retMap = new HashMap<>(89);
possibleTypes.forEach(possible -> retMap.put(possible,
(GraphQLObjectType) instanceOutputTypeService.buildMediator().retrieveOutputDescription(possible)));
(GraphQLObjectType) instanceOutputTypeService.deriveFromExternalTypeName(possible)));
return retMap;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package com.nfl.dm.shield.dynamic.repository;

import com.nfl.graphql.mediator.GraphQLMediator;
import graphql.language.SelectionSet;
import graphql.schema.GraphQLOutputType;

import java.util.Map;

public interface ExternalReferenceRepository {

GraphQLMediator buildMediator(String authHeader);
GraphQLOutputType deriveFromExternalTypeName(String typeName, String authHeader);

Map<String, Object> findById(SelectionSet selections, Map<String, String> id, String authHeader);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import graphql.language.InlineFragment;
import graphql.language.Selection;
import graphql.language.SelectionSet;
import graphql.schema.GraphQLOutputType;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
Expand Down Expand Up @@ -44,7 +45,12 @@ public ExternalReferenceRepositoryImpl(
this.baseURLTemplate = baseURLTemplate;
}

public GraphQLMediator buildMediator(String authHeader) {
@Override
public GraphQLOutputType deriveFromExternalTypeName(String typeName, String authHeader) {
return buildMediator(authHeader).retrieveOutputDescription(typeName);
}

private GraphQLMediator buildMediator(String authHeader) {
if (mediator != null) {
return mediator;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,36 +1,44 @@
package com.nfl.dm.shield.dynamic.repository;

import com.nfl.graphql.mediator.GraphQLMediator;
import graphql.language.SelectionSet;
import graphql.schema.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

import static com.nfl.dm.shield.dynamic.domain.schema.instancefield.AbstractReferenceType.REFERENCE_ID;
import static com.nfl.dm.shield.dynamic.domain.schema.instancefield.AbstractReferenceType.REFERENCE_TYPE;
import static graphql.Scalars.GraphQLID;
import static graphql.Scalars.GraphQLString;
import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;

@SuppressWarnings("unused")
@Service("stubbedExternal")
@Primary
public class StubbedExternalReferenceRepository implements ExternalReferenceRepository {

private final GraphQLMediator mediator;

private final Map<String, Map<String, Map<String, Object>>> externalInstances
= new ConcurrentHashMap<>(89);

@Autowired
public StubbedExternalReferenceRepository(GraphQLMediator mediator) {
this.mediator = mediator;
private final Map<String, GraphQLOutputType> outputTypeMap = new ConcurrentHashMap<>(89);

private final GraphQLOutputType emptyType = buildType("empty", Collections.emptyMap());

public StubbedExternalReferenceRepository()
{
}

@Override
public GraphQLMediator buildMediator(String authHeader) {
return mediator;
public GraphQLOutputType deriveFromExternalTypeName(String typeName, String authHeader) {
GraphQLOutputType retType = outputTypeMap.get(typeName);
if (retType != null) {
return retType;
}

return emptyType;
}

@Override
Expand All @@ -49,6 +57,36 @@ public void loadExternalInstance(String typeName, String id, Map<String, Object>
externalInstances.put(typeName, new HashMap<>(89));
}
externalInstances.get(typeName).put(id, instance);

if (outputTypeMap.containsKey(typeName)) {
return; // Type already there
}

outputTypeMap.put(typeName, buildType(typeName, instance));
}

private GraphQLObjectType buildType(String typeName, Map<String, Object> instance) {
List<GraphQLFieldDefinition> schemaDefFields = new LinkedList<>();
GraphQLFieldDefinition idField = newFieldDefinition()
.type(GraphQLID)
.name("id")
.build();
schemaDefFields.add(idField);
instance.keySet().stream().filter(key -> !"id".equals(key)).forEach(key -> buildField(key, schemaDefFields));

return GraphQLObjectType.newObject()
.name(typeName)
.description("Example External: " + typeName)
.fields(schemaDefFields)
.build();
}

private void buildField(String key, List<GraphQLFieldDefinition> schemaDefFields) {
GraphQLFieldDefinition currentField = newFieldDefinition()
.type(GraphQLString)
.name(key)
.build();
schemaDefFields.add(currentField);
}

public void clearForExternalTesting() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,13 @@
import com.nfl.dm.shield.dynamic.domain.instance.SchemaInstanceKey;
import com.nfl.dm.shield.dynamic.domain.schema.SchemaDescription;
import com.nfl.dm.shield.dynamic.domain.schema.SchemaKey;
import com.nfl.graphql.mediator.GraphQLMediator;
import graphql.schema.GraphQLOutputType;

import java.util.List;
import java.util.Map;

public interface InstanceOutputTypeService {

List<SchemaDescription> findRelatedSchemas(SchemaDescription schemaDescription);

SchemaDescription findSchemaDescriptionByName(SchemaKey schemaKey);

SchemaInstance findSchemaInstance(SchemaInstanceKey schemaInstanceKey, String id);
Expand All @@ -21,7 +19,7 @@ public interface InstanceOutputTypeService {

SchemaInstance findMultiTypeById(SchemaInstanceKey schemaInstanceKey, Map<String, Object> id);

GraphQLMediator buildMediator();
GraphQLOutputType deriveFromExternalTypeName(String typeName);

DataFetcherFactory getDataFetcherFactory();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import com.nfl.dm.shield.dynamic.repository.ExternalReferenceRepository;
import com.nfl.dm.shield.dynamic.repository.SchemaInstanceRepository;
import com.nfl.dm.shield.dynamic.repository.SchemaRepository;
import com.nfl.graphql.mediator.GraphQLMediator;
import graphql.schema.GraphQLOutputType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

Expand Down Expand Up @@ -86,11 +86,6 @@ private InstanceOutputTypeServiceImpl(String authHeader,
this.schemaDefinitionPreloadCache = schemaDefinitionPreloadCache;
}

@Override
public List<SchemaDescription> findRelatedSchemas(SchemaDescription schemaDescription) {
return schemaService.findDirectRelatedSchemas(schemaDescription);
}

@Override
public SchemaDescription findSchemaDescriptionByName(SchemaKey schemaKey) {
return schemaDefinitionPreloadCache.computeIfAbsent(
Expand Down Expand Up @@ -124,8 +119,8 @@ public SchemaInstance findMultiTypeById(SchemaInstanceKey schemaInstanceKey, Map
}

@Override
public GraphQLMediator buildMediator() {
return externalReferenceRepository.buildMediator(authHeader);
public GraphQLOutputType deriveFromExternalTypeName(String typeName) {
return externalReferenceRepository.deriveFromExternalTypeName(typeName, authHeader);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import com.nfl.dm.shield.dynamic.domain.schema.SchemaKey;
import com.nfl.dm.shield.dynamic.service.DataFetcherFactory;
import com.nfl.dm.shield.dynamic.service.InstanceOutputTypeService;
import com.nfl.graphql.mediator.GraphQLMediator;
import graphql.schema.GraphQLOutputType;
import org.testng.annotations.Test;

import java.util.HashMap;
Expand Down Expand Up @@ -57,11 +57,6 @@ public void missingValueDef() {
private InstanceOutputTypeService buildEmptyInstanceLookupHelper() {
return new InstanceOutputTypeService() {

@Override
public List<SchemaDescription> findRelatedSchemas(SchemaDescription schemaDescription) {
return null;
}

@Override
public SchemaDescription findSchemaDescriptionByName(SchemaKey schemaKey) {
return null;
Expand All @@ -83,7 +78,7 @@ public SchemaInstance findMultiTypeById(SchemaInstanceKey schemaInstanceKey, Map
}

@Override
public GraphQLMediator buildMediator() {
public GraphQLOutputType deriveFromExternalTypeName(String typeName) {
throw new UnsupportedOperationException();
}

Expand Down

0 comments on commit e9335fd

Please sign in to comment.