http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/ccfa64fe/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/internal/CXSGraphQLProviderImpl.java ---------------------------------------------------------------------- diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/internal/CXSGraphQLProviderImpl.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/internal/CXSGraphQLProviderImpl.java index a0596cc..a3c299d 100644 --- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/internal/CXSGraphQLProviderImpl.java +++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/internal/CXSGraphQLProviderImpl.java @@ -23,339 +23,83 @@ import graphql.servlet.GraphQLMutationProvider; import graphql.servlet.GraphQLQueryProvider; import graphql.servlet.GraphQLTypesProvider; import org.apache.unomi.graphql.*; -import org.osgi.framework.BundleContext; -import org.osgi.service.component.ComponentContext; -import org.osgi.service.component.annotations.Deactivate; +import org.apache.unomi.graphql.builders.CXSEventBuilders; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.*; -import static graphql.Scalars.*; +import static graphql.Scalars.GraphQLInt; +import static graphql.Scalars.GraphQLString; import static graphql.schema.GraphQLArgument.newArgument; import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition; -import static graphql.schema.GraphQLInputObjectField.newInputObjectField; -import static graphql.schema.GraphQLInputObjectType.newInputObject; import static graphql.schema.GraphQLObjectType.newObject; public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryProvider, GraphQLTypesProvider, GraphQLMutationProvider { private static final Logger logger = LoggerFactory.getLogger(CXSGraphQLProviderImpl.class.getName()); - private Map<String,GraphQLOutputType> registeredOutputTypes = new TreeMap<>(); - private Map<String,GraphQLInputType> registeredInputTypes = new TreeMap<>(); private CXSProviderManager cxsProviderManager; private GraphQLAnnotationsComponent annotationsComponent; private ProcessingElementsContainer container; + private CXSEventBuilders cxsEventBuilders; + private Map<String,GraphQLType> typeRegistry; private Map<String,CXSEventType> eventTypes = new TreeMap<>(); public CXSGraphQLProviderImpl(GraphQLAnnotationsComponent annotationsComponent) { this.annotationsComponent = annotationsComponent; container = annotationsComponent.createContainer(); + typeRegistry = container.getTypeRegistry(); + cxsEventBuilders = new CXSEventBuilders(annotationsComponent, container, eventTypes); updateGraphQLTypes(); } - private void updateGraphQLTypes() { - - registeredOutputTypes.put(PageInfo.class.getName(), annotationsComponent.getOutputTypeProcessor().getOutputTypeOrRef(PageInfo.class, container)); - - registeredOutputTypes.put(CXSGeoPoint.class.getName(), annotationsComponent.getOutputTypeProcessor().getOutputTypeOrRef(CXSGeoPoint.class, container)); - registeredOutputTypes.put(CXSSetPropertyType.class.getName(),annotationsComponent.getOutputTypeProcessor().getOutputTypeOrRef(CXSSetPropertyType.class, container)); - registeredOutputTypes.put(CXSEventType.class.getName(), annotationsComponent.getOutputTypeProcessor().getOutputTypeOrRef(CXSEventType.class, container)); - - registeredInputTypes.put(CXSGeoDistanceInput.class.getName(), annotationsComponent.getInputTypeProcessor().getInputTypeOrRef(CXSGeoDistanceInput.class, container)); - registeredInputTypes.put(CXSDateFilterInput.class.getName(), annotationsComponent.getInputTypeProcessor().getInputTypeOrRef(CXSDateFilterInput.class, container)); - registeredInputTypes.put(CXSEventTypeInput.class.getName(), annotationsComponent.getInputTypeProcessor().getInputTypeOrRef(CXSEventTypeInput.class, container)); - registeredInputTypes.put(CXSOrderByInput.class.getName(), annotationsComponent.getInputTypeProcessor().getInputTypeOrRef(CXSOrderByInput.class, container)); - registeredInputTypes.put("CXS_EventInput", buildCXSEventInputType()); - registeredInputTypes.put(CXSEventOccurrenceFilterInput.class.getName(), annotationsComponent.getInputTypeProcessor().getInputTypeOrRef(CXSEventOccurrenceFilterInput.class, container)); - registeredInputTypes.put("CXS_EventPropertiesFilterInput", buildCXSEventPropertiesFilterInput()); - registeredInputTypes.put("CXS_EventFilterInput", buildCXSEventFilterInputType()); - - registeredOutputTypes.put("CXS_EventProperties", buildCXSEventPropertiesOutputType()); - - registeredOutputTypes.put("CXS_Event", buildCXSEventOutputType()); - registeredOutputTypes.put("CXS_EventEdge", buildCXSEventEdgeOutputType()); - registeredOutputTypes.put("CXS_EventConnection", buildCXSEventConnectionOutputType()); - registeredOutputTypes.put("CXS_Query", buildCXSQueryOutputType()); - registeredOutputTypes.put("CXS_Mutation", buildCXSMutationOutputType()); - } - - private GraphQLOutputType buildCXSEventEdgeOutputType() { - return newObject() - .name("CXS_EventEdge") - .description("The Relay edge type for the CXS_Event output type") - .field(newFieldDefinition() - .name("node") - .type(registeredOutputTypes.get("CXS_Event")) - ) - .field(newFieldDefinition() - .name("cursor") - .type(GraphQLString) - ) - .build(); - } - - private GraphQLOutputType buildCXSEventConnectionOutputType() { - return newObject() - .name("CXS_EventConnection") - .description("The Relay connection type for the CXS_Event output type") - .field(newFieldDefinition() - .name("edges") - .type(new GraphQLList(registeredOutputTypes.get("CXS_EventEdge"))) - ) - .field(newFieldDefinition() - .name("pageInfo") - .type(new GraphQLList(registeredOutputTypes.get(PageInfo.class.getName()))) - ) - .build(); - } - - private GraphQLInputType buildCXSEventPropertiesFilterInput() { - GraphQLInputObjectType.Builder cxsEventPropertiesFilterInput = newInputObject() - .name("CXS_EventPropertiesFilterInput") - .description("Filter conditions for each event types and built-in properties"); - - generateEventPropertiesFilters(cxsEventPropertiesFilterInput); - generateEventTypesFilters(cxsEventPropertiesFilterInput); - - return cxsEventPropertiesFilterInput.build(); - } - - - private void generateEventPropertiesFilters(GraphQLInputObjectType.Builder cxsEventPropertiesFilterInput) { - addIdentityFilters("id", cxsEventPropertiesFilterInput); - addIdentityFilters("sourceId", cxsEventPropertiesFilterInput); - addIdentityFilters("clientId", cxsEventPropertiesFilterInput); - addIdentityFilters("profileId", cxsEventPropertiesFilterInput); - addDistanceFilters("location", cxsEventPropertiesFilterInput); - addDateFilters("timestamp", cxsEventPropertiesFilterInput); - } - - private void generateEventTypesFilters(GraphQLInputObjectType.Builder cxsEventPropertiesFilterInput) { - for (Map.Entry<String,CXSEventType> eventTypeEntry : eventTypes.entrySet()) { - addSetFilters(eventTypeEntry.getKey(), eventTypeEntry.getValue().properties, cxsEventPropertiesFilterInput); - } + @Override + public Map<String, CXSEventType> getEventTypes() { + return eventTypes; } - private void addSetFilters(String eventTypeName, List<CXSPropertyType> properties, GraphQLInputObjectType.Builder inputTypeBuilder) { - GraphQLInputObjectType.Builder eventTypeFilterInput = newInputObject() - .name(eventTypeName + "FilterInput") - .description("Auto-generated filter input type for event type " + eventTypeName); - - for (CXSPropertyType cxsPropertyType : properties) { - if (cxsPropertyType instanceof CXSIdentifierPropertyType) { - addIdentityFilters(cxsPropertyType.name, eventTypeFilterInput); - } else if (cxsPropertyType instanceof CXSStringPropertyType) { - addStringFilters(cxsPropertyType.name, eventTypeFilterInput); - } else if (cxsPropertyType instanceof CXSBooleanPropertyType) { - addBooleanFilters(cxsPropertyType.name, eventTypeFilterInput); - } else if (cxsPropertyType instanceof CXSIntPropertyType) { - addIntegerFilters(cxsPropertyType.name, eventTypeFilterInput); - } else if (cxsPropertyType instanceof CXSFloatPropertyType) { - addFloatFilters(cxsPropertyType.name, eventTypeFilterInput); - } else if (cxsPropertyType instanceof CXSGeoPointPropertyType) { - addDistanceFilters(cxsPropertyType.name, eventTypeFilterInput); - } else if (cxsPropertyType instanceof CXSDatePropertyType) { - addDateFilters(cxsPropertyType.name, eventTypeFilterInput); - } else if (cxsPropertyType instanceof CXSSetPropertyType) { - addSetFilters(cxsPropertyType.name, ((CXSSetPropertyType) cxsPropertyType).properties, eventTypeFilterInput); - } - } - - registeredInputTypes.put(eventTypeName + "FilterInput", eventTypeFilterInput.build()); - - inputTypeBuilder.field(newInputObjectField() - .name(eventTypeName) - .type(registeredInputTypes.get(eventTypeName + "FilterInput")) - ); - + public CXSProviderManager getCxsProviderManager() { + return cxsProviderManager; } - private void addIdentityFilters(String propertyName, GraphQLInputObjectType.Builder inputTypeBuilder) { - inputTypeBuilder.field(newInputObjectField() - .name(propertyName + "_equals") - .type(GraphQLString) - ); - } + public void updateGraphQLTypes() { - private void addStringFilters(String propertyName, GraphQLInputObjectType.Builder inputTypeBuilder) { - inputTypeBuilder.field(newInputObjectField() - .name(propertyName + "_equals") - .type(GraphQLString) - ); - inputTypeBuilder.field(newInputObjectField() - .name(propertyName + "_regexp") - .type(GraphQLString) - ); - inputTypeBuilder.field(newInputObjectField() - .name(propertyName + "_startsWith") - .type(GraphQLString) - ); - inputTypeBuilder.field(newInputObjectField() - .name(propertyName + "_contains") - .type(new GraphQLList(GraphQLString)) - ); - } + Map<String,GraphQLType> typeRegistry = container.getTypeRegistry(); - private void addBooleanFilters(String propertyName, GraphQLInputObjectType.Builder inputTypeBuilder) { - inputTypeBuilder.field(newInputObjectField() - .name(propertyName + "_equals") - .type(GraphQLBoolean) - ); - } + typeRegistry.put(PageInfo.class.getName(), annotationsComponent.getOutputTypeProcessor().getOutputTypeOrRef(PageInfo.class, container)); - private void addIntegerFilters(String propertyName, GraphQLInputObjectType.Builder inputTypeBuilder) { - inputTypeBuilder.field(newInputObjectField() - .name(propertyName + "_equals") - .type(GraphQLInt) - ); - inputTypeBuilder.field(newInputObjectField() - .name(propertyName + "_gt") - .type(GraphQLInt) - ); - inputTypeBuilder.field(newInputObjectField() - .name(propertyName + "_gte") - .type(GraphQLInt) - ); - inputTypeBuilder.field(newInputObjectField() - .name(propertyName + "_lt") - .type(GraphQLInt) - ); - inputTypeBuilder.field(newInputObjectField() - .name(propertyName + "_lte") - .type(GraphQLInt) - ); - } + typeRegistry.put(CXSGeoPoint.class.getName(), annotationsComponent.getOutputTypeProcessor().getOutputTypeOrRef(CXSGeoPoint.class, container)); + typeRegistry.put(CXSSetPropertyType.class.getName(),annotationsComponent.getOutputTypeProcessor().getOutputTypeOrRef(CXSSetPropertyType.class, container)); + typeRegistry.put(CXSEventType.class.getName(), annotationsComponent.getOutputTypeProcessor().getOutputTypeOrRef(CXSEventType.class, container)); - private void addFloatFilters(String propertyName, GraphQLInputObjectType.Builder inputTypeBuilder) { - inputTypeBuilder.field(newInputObjectField() - .name(propertyName + "_equals") - .type(GraphQLFloat) - ); - inputTypeBuilder.field(newInputObjectField() - .name(propertyName + "_gt") - .type(GraphQLFloat) - ); - inputTypeBuilder.field(newInputObjectField() - .name(propertyName + "_gte") - .type(GraphQLFloat) - ); - inputTypeBuilder.field(newInputObjectField() - .name(propertyName + "_lt") - .type(GraphQLFloat) - ); - inputTypeBuilder.field(newInputObjectField() - .name(propertyName + "_lte") - .type(GraphQLFloat) - ); - } + typeRegistry.put(CXSGeoDistanceInput.class.getName(), annotationsComponent.getInputTypeProcessor().getInputTypeOrRef(CXSGeoDistanceInput.class, container)); + typeRegistry.put(CXSDateFilterInput.class.getName(), annotationsComponent.getInputTypeProcessor().getInputTypeOrRef(CXSDateFilterInput.class, container)); + typeRegistry.put(CXSEventTypeInput.class.getName(), annotationsComponent.getInputTypeProcessor().getInputTypeOrRef(CXSEventTypeInput.class, container)); + typeRegistry.put(CXSOrderByInput.class.getName(), annotationsComponent.getInputTypeProcessor().getInputTypeOrRef(CXSOrderByInput.class, container)); - private void addDistanceFilters(String propertyName, GraphQLInputObjectType.Builder inputTypeBuilder) { - inputTypeBuilder.field(newInputObjectField() - .name(propertyName + "_distance") - .type(registeredInputTypes.get(CXSGeoDistanceInput.class.getName())) - ); - } + typeRegistry.put("CXS_Query", annotationsComponent.getOutputTypeProcessor().getOutputTypeOrRef(CXSQuery.class, container)); + typeRegistry.put("CXS_Mutation", annotationsComponent.getOutputTypeProcessor().getOutputTypeOrRef(CXSMutation.class, container)); + // typeRegistry.put("CXS_Query", buildCXSQueryOutputType()); + // typeRegistry.put("CXS_Mutation", buildCXSMutationOutputType()); - private void addDateFilters(String propertyName, GraphQLInputObjectType.Builder inputTypeBuilder) { - inputTypeBuilder.field(newInputObjectField() - .name(propertyName + "_between") - .type(registeredInputTypes.get(CXSDateFilterInput.class.getName())) - ); - } + cxsEventBuilders.updateTypes(); - private GraphQLInputType buildCXSEventFilterInputType() { - GraphQLInputObjectType.Builder cxsEventFilterInputType = newInputObject() - .name("CXS_EventFilterInput") - .description("Filter conditions for each event types and built-in properties") - .field(newInputObjectField() - .name("and") - .type(new GraphQLList(new GraphQLTypeReference("CXS_EventFilterInput"))) - ) - .field(newInputObjectField() - .name("or") - .type(new GraphQLList(new GraphQLTypeReference("CXS_EventFilterInput"))) - ) - .field(newInputObjectField() - .name("properties") - .type(registeredInputTypes.get("CXS_EventPropertiesFilterInput")) - ) - .field(newInputObjectField() - .name("properties_or") - .type(registeredInputTypes.get("CXS_EventPropertiesFilterInput")) - ) - .field(newInputObjectField() - .name("eventOccurrence") - .type(registeredInputTypes.get(CXSEventOccurrenceFilterInput.class.getName())) - ); - return cxsEventFilterInputType.build(); } - private GraphQLInputType buildCXSEventInputType() { - GraphQLInputObjectType.Builder cxsEventInputType = newInputObject() - .name("CXS_EventInput") - .description("The event input object to send events to the Context Server") - .field(newInputObjectField() - .name("id") - .type(GraphQLID) - ); - - for (Map.Entry<String,CXSEventType> cxsEventTypeEntry : eventTypes.entrySet()) { - CXSEventType cxsEventType = cxsEventTypeEntry.getValue(); - cxsEventInputType.field(newInputObjectField() - .name(cxsEventTypeEntry.getKey()) - .type(buildCXSEventTypeInputProperty(cxsEventType.typeName, cxsEventType.properties)) - ); - } - - return cxsEventInputType.build(); - + private GraphQLObjectType.Builder getBuilderFromAnnotatedClass(Class annotatedClass) { + return GraphQLObjectType.newObject() + .name(annotatedClass.getName()) + .fields(((GraphQLObjectType) annotationsComponent.getOutputTypeProcessor().getOutputTypeOrRef(annotatedClass, container)).getFieldDefinitions()); } - private GraphQLInputType buildCXSEventTypeInputProperty(String typeName, List<CXSPropertyType> propertyTypes) { - String eventTypeName = typeName.substring(0, 1).toUpperCase() + typeName.substring(1) + "EventTypeInput"; - GraphQLInputObjectType.Builder eventInputType = newInputObject() - .name(eventTypeName) - .description("Event type object for event type " + typeName); - - for (CXSPropertyType cxsEventPropertyType : propertyTypes) { - GraphQLInputType eventPropertyInputType = null; - if (cxsEventPropertyType instanceof CXSIdentifierPropertyType) { - eventPropertyInputType = GraphQLID; - } else if (cxsEventPropertyType instanceof CXSStringPropertyType) { - eventPropertyInputType = GraphQLString; - } else if (cxsEventPropertyType instanceof CXSIntPropertyType) { - eventPropertyInputType = GraphQLInt; - } else if (cxsEventPropertyType instanceof CXSFloatPropertyType) { - eventPropertyInputType = GraphQLFloat; - } else if (cxsEventPropertyType instanceof CXSBooleanPropertyType) { - eventPropertyInputType = GraphQLBoolean; - } else if (cxsEventPropertyType instanceof CXSDatePropertyType) { - eventPropertyInputType = GraphQLString; - } else if (cxsEventPropertyType instanceof CXSGeoPointPropertyType) { - eventPropertyInputType = registeredInputTypes.get(CXSGeoPoint.class.getName()); - } else if (cxsEventPropertyType instanceof CXSSetPropertyType) { - eventPropertyInputType = buildCXSEventTypeInputProperty(cxsEventPropertyType.name, ((CXSSetPropertyType)cxsEventPropertyType).properties); - } - eventInputType - .field(newInputObjectField() - .type(eventPropertyInputType) - .name(cxsEventPropertyType.name) - ); - } - - return eventInputType.build(); + private GraphQLOutputType getOutputTypeFromRegistry(String typeName) { + return (GraphQLOutputType) typeRegistry.get(typeName); } - @Deactivate - void deactivate( - ComponentContext cc, - BundleContext bc, - Map<String,Object> config) { - - registeredOutputTypes.clear(); + private GraphQLInputObjectType getInputTypeFromRegistry(String typeName) { + return (GraphQLInputObjectType) typeRegistry.get(typeName); } public void setCxsProviderManager(CXSProviderManager cxsProviderManager) { @@ -366,7 +110,7 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP public Collection<GraphQLFieldDefinition> getQueries() { List<GraphQLFieldDefinition> fieldDefinitions = new ArrayList<GraphQLFieldDefinition>(); fieldDefinitions.add(newFieldDefinition() - .type(registeredOutputTypes.get("CXS_Query")) + .type(getOutputTypeFromRegistry("CXS_Query")) .name("cxs") .description("Root field for all CXS queries") .dataFetcher(new DataFetcher() { @@ -387,9 +131,9 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP public Collection<GraphQLFieldDefinition> getMutations() { List<GraphQLFieldDefinition> fieldDefinitions = new ArrayList<GraphQLFieldDefinition>(); fieldDefinitions.add(newFieldDefinition() - .type(registeredOutputTypes.get("CXS_Mutation")) + .type(getOutputTypeFromRegistry("CXS_Mutation")) .name("cxs") - .description("Root field for all CXS mutation") + .description("Root field for all CXS mutations") .dataFetcher(new DataFetcher<Object>() { @Override public Object get(DataFetchingEnvironment environment) { @@ -405,25 +149,25 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP .name("CXS_Query") .description("Root CXS query type") .field(newFieldDefinition() - .type(new GraphQLList(registeredOutputTypes.get(CXSEventType.class.getName()))) + .type(new GraphQLList(getOutputTypeFromRegistry(CXSEventType.class.getName()))) .name("getEventTypes") .description("Retrieves the list of all the declared CXS event types in the Apache Unomi server") ) .field(newFieldDefinition() - .type(new GraphQLList(registeredOutputTypes.get("CXS_Event"))) + .type(new GraphQLList(getOutputTypeFromRegistry("CXS_Event"))) .name("getEvent") .description("Retrieves a specific event") ) .field(newFieldDefinition() - .type(new GraphQLList(registeredOutputTypes.get("CXS_EventConnection"))) + .type(new GraphQLList(getOutputTypeFromRegistry("CXS_EventConnection"))) .name("findEvents") .argument(newArgument() .name("filter") - .type(registeredInputTypes.get("CXS_EventFilterInput")) + .type(getInputTypeFromRegistry("CXS_EventFilterInput")) ) .argument(newArgument() .name("orderBy") - .type(registeredInputTypes.get(CXSOrderByInput.class.getName())) + .type(getInputTypeFromRegistry(CXSOrderByInput.class.getName())) ) .argument(newArgument() .name("first") @@ -447,6 +191,15 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP ) .description("Retrieves the events that match the specified filters") ) + .field(newFieldDefinition() + .type(getOutputTypeFromRegistry("CXS_Segment")) + .name("getSegment") + .argument(newArgument() + .name("segmentId") + .type(GraphQLString) + .description("Unique identifier for the segment") + ) + ) /* .field(newFieldDefinition() .type(new GraphQLList(registeredOutputTypes.get("CXS_ProfileConnection"))) @@ -490,11 +243,11 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP .name("CXS_Mutation") .description("Root CXS mutation type") .field(newFieldDefinition() - .type(registeredOutputTypes.get(CXSEventType.class.getName())) + .type(getOutputTypeFromRegistry(CXSEventType.class.getName())) .name("createOrUpdateEventType") .argument(newArgument() .name("eventType") - .type(registeredInputTypes.get(CXSEventTypeInput.class.getName())) + .type(getInputTypeFromRegistry(CXSEventTypeInput.class.getName())) ) .description("Create or updates a CXS event type in the Apache Unomi server") .dataFetcher(new DataFetcher<CXSEventType>() { @@ -533,7 +286,7 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP .description("Processes events sent to the Context Server") .argument(newArgument() .name("events") - .type(new GraphQLList(registeredInputTypes.get("CXS_EventInput")))) + .type(new GraphQLList(getInputTypeFromRegistry("CXS_EventInput")))) .type(GraphQLInt) ) .build(); @@ -599,146 +352,5 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP } } - private GraphQLOutputType buildCXSEventOutputType() { - return newObject() - .name("CXS_Event") - .description("An event is generated by user interacting with the Context Server") - .field(newFieldDefinition() - .type(GraphQLID) - .name("id") - .description("A unique identifier for the event") - .dataFetcher(new DataFetcher() { - public Object get(DataFetchingEnvironment environment) { - CXSEvent CXSEvent = environment.getSource(); - return CXSEvent.getId(); - } - }) - ) - .field(newFieldDefinition() - .type(GraphQLString) - .name("eventType") - .description("An identifier for the event type") - .dataFetcher(new DataFetcher() { - public Object get(DataFetchingEnvironment environment) { - CXSEvent CXSEvent = environment.getSource(); - return CXSEvent.getEventType(); - } - }) - ) - .field(newFieldDefinition() - .type(GraphQLLong) - .name("timestamp") - .description("The difference, measured in milliseconds, between the current time and midnight, January 1, 1970 UTC.") - .dataFetcher(new DataFetcher() { - public Object get(DataFetchingEnvironment environment) { - CXSEvent CXSEvent = environment.getSource(); - return CXSEvent.getTimeStamp(); - } - })) - .field(newFieldDefinition() - .type(GraphQLString) - .name("subject") - .description("The entity that has fired the event (using the profile)") - .dataFetcher(new DataFetcher() { - public Object get(DataFetchingEnvironment environment) { - CXSEvent CXSEvent = environment.getSource(); - return CXSEvent.getSubject(); - } - })) - .field(newFieldDefinition() - .type(GraphQLString) - .name("object") - .description("The object on which the event was fired.") - .dataFetcher(new DataFetcher() { - public Object get(DataFetchingEnvironment environment) { - CXSEvent CXSEvent = environment.getSource(); - return CXSEvent.getObject(); - } - }) - ) - .field(newFieldDefinition() - .type(registeredOutputTypes.get(CXSGeoPoint.class.getName())) - .name("location") - .description("The geo-point location where the event was fired.") - .dataFetcher(new DataFetcher() { - public Object get(DataFetchingEnvironment environment) { - CXSEvent CXSEvent = environment.getSource(); - return CXSEvent.getLocation(); - } - }) - ) - .field(newFieldDefinition() - .type(new GraphQLList(registeredOutputTypes.get("CXS_EventProperties"))) - .name("properties") - .description("Generic properties for the event") - .dataFetcher(new DataFetcher() { - public Object get(DataFetchingEnvironment environment) { - CXSEvent CXSEvent = environment.getSource(); - return new ArrayList<Map.Entry<Object,Object>>(CXSEvent.getProperties().entrySet()); - } - }) - ) - .build(); - } - - private GraphQLOutputType buildCXSEventPropertiesOutputType() { - GraphQLObjectType.Builder eventPropertiesOutputType = newObject() - .name("CXS_EventProperties") - .description("All possible properties of an event"); - - // we create a dummy field because GraphQL requires at least one - eventPropertiesOutputType.field(newFieldDefinition() - .type(GraphQLInt) - .name("typeCount") - .description("Total count of different field types") - ); - - for (Map.Entry<String,CXSEventType> cxsEventTypeEntry : eventTypes.entrySet()) { - CXSEventType cxsEventType = cxsEventTypeEntry.getValue(); - eventPropertiesOutputType - .field(newFieldDefinition() - .type(buildEventOutputType(cxsEventType.typeName, cxsEventType.properties)) - .name(cxsEventTypeEntry.getKey()) - ); - } - - return eventPropertiesOutputType.build(); - } - - private GraphQLOutputType buildEventOutputType(String typeName, List<CXSPropertyType> propertyTypes) { - String eventTypeName = typeName.substring(0, 1).toUpperCase() + typeName.substring(1) + "EventType"; - GraphQLObjectType.Builder eventOutputType = newObject() - .name(eventTypeName) - .description("Event type object for event type " + typeName); - - for (CXSPropertyType cxsEventPropertyType : propertyTypes) { - GraphQLOutputType eventPropertyOutputType = null; - if (cxsEventPropertyType instanceof CXSIdentifierPropertyType) { - eventPropertyOutputType = GraphQLID; - } else if (cxsEventPropertyType instanceof CXSStringPropertyType) { - eventPropertyOutputType = GraphQLString; - } else if (cxsEventPropertyType instanceof CXSIntPropertyType) { - eventPropertyOutputType = GraphQLInt; - } else if (cxsEventPropertyType instanceof CXSFloatPropertyType) { - eventPropertyOutputType = GraphQLFloat; - } else if (cxsEventPropertyType instanceof CXSBooleanPropertyType) { - eventPropertyOutputType = GraphQLBoolean; - } else if (cxsEventPropertyType instanceof CXSDatePropertyType) { - eventPropertyOutputType = GraphQLString; - } else if (cxsEventPropertyType instanceof CXSGeoPointPropertyType) { - eventPropertyOutputType = registeredOutputTypes.get(CXSGeoPoint.class.getName()); - } else if (cxsEventPropertyType instanceof CXSSetPropertyType) { - eventPropertyOutputType = buildEventOutputType(cxsEventPropertyType.name, ((CXSSetPropertyType)cxsEventPropertyType).properties); - } - eventOutputType - .field(newFieldDefinition() - .type(eventPropertyOutputType) - .name(cxsEventPropertyType.name) - ); - } - - - return eventOutputType.build(); - } }
http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/ccfa64fe/graphql/karaf-feature/pom.xml ---------------------------------------------------------------------- diff --git a/graphql/karaf-feature/pom.xml b/graphql/karaf-feature/pom.xml index 011e1eb..c61df57 100644 --- a/graphql/karaf-feature/pom.xml +++ b/graphql/karaf-feature/pom.xml @@ -27,6 +27,8 @@ <packaging>feature</packaging> <artifactId>cxs-graphql-feature</artifactId> + <name>Apache Unomi :: GraphQL API :: Karaf Feature</name> + <description>Apache Unomi Context GraphQL API Karaf Feature</description> <dependencies> http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/ccfa64fe/graphql/pom.xml ---------------------------------------------------------------------- diff --git a/graphql/pom.xml b/graphql/pom.xml index bc03766..ea476f6 100644 --- a/graphql/pom.xml +++ b/graphql/pom.xml @@ -27,7 +27,7 @@ <artifactId>unomi-graphql</artifactId> <name>Apache Unomi :: GraphQL API</name> - <description>Apache Unomi Context GraphQL API</description> + <description>Apache Unomi Context GraphQL API Root Project</description> <packaging>pom</packaging> <properties>