This is an automated email from the ASF dual-hosted git repository. shuber pushed a commit to branch UNOMI-180-CXS-GRAPHQLAPI in repository https://gitbox.apache.org/repos/asf/unomi.git
commit 0dacbe916f75380f453a8c2cebf96a65b3a74730 Author: Serge Huber <[email protected]> AuthorDate: Fri Jul 13 15:22:34 2018 +0200 UNOMI-180 Implement CXS GraphQL API Big refactoring, will now use a mixture of annotations and manually declared fields to build dynamic fields in schema. Because of these changes all the previous functionality is a bit broken for the moment but should be restored in a future commmit. Signed-off-by: Serge Huber <[email protected]> --- graphql/cxs-impl/pom.xml | 2 + .../java/org/apache/unomi/graphql/CXSEvent.java | 14 +- ...raphQLProvider.java => CXSEventConnection.java} | 11 +- .../{CXSGraphQLProvider.java => CXSEventEdge.java} | 9 +- ...CXSGraphQLProvider.java => CXSEventFilter.java} | 11 +- ...aphQLProvider.java => CXSEventFilterInput.java} | 15 +- .../graphql/{CXSEvent.java => CXSEventInput.java} | 16 +- ...Provider.java => CXSEventOccurrenceFilter.java} | 15 +- ...raphQLProvider.java => CXSEventProperties.java} | 14 +- ...Provider.java => CXSEventPropertiesFilter.java} | 5 +- .../apache/unomi/graphql/CXSGraphQLProvider.java | 5 + .../java/org/apache/unomi/graphql/CXSMutation.java | 113 +++++ ...ovider.java => CXSProfilePropertiesFilter.java} | 15 +- .../apache/unomi/graphql/CXSPropertyTypeInput.java | 2 +- .../{CXSPropertyTypeInput.java => CXSQuery.java} | 46 +- .../{CXSGraphQLProvider.java => CXSSegment.java} | 15 +- ...aphQLProvider.java => CXSSegmentCondition.java} | 13 +- .../{CXSGraphQLProvider.java => CXSView.java} | 7 +- .../CXSBuilder.java} | 6 +- .../CXSEventBuilders.java} | 347 ++------------ .../graphql/internal/CXSGraphQLProviderImpl.java | 498 +++------------------ graphql/karaf-feature/pom.xml | 2 + graphql/pom.xml | 2 +- 23 files changed, 368 insertions(+), 815 deletions(-) diff --git a/graphql/cxs-impl/pom.xml b/graphql/cxs-impl/pom.xml index ac3123d..3e29f66 100644 --- a/graphql/cxs-impl/pom.xml +++ b/graphql/cxs-impl/pom.xml @@ -26,6 +26,8 @@ <modelVersion>4.0.0</modelVersion> <artifactId>cxs-graphql-api-impl</artifactId> + <name>Apache Unomi :: GraphQL API :: CXS Implementation</name> + <description>Apache Unomi Context GraphQL API CXS Implementation</description> <packaging>bundle</packaging> <dependencies> diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEvent.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEvent.java index c278678..123dd87 100644 --- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEvent.java +++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEvent.java @@ -16,8 +16,7 @@ */ package org.apache.unomi.graphql; -import java.util.LinkedHashMap; -import java.util.Map; +import graphql.annotations.annotationTypes.GraphQLField; public class CXSEvent { @@ -26,33 +25,40 @@ public class CXSEvent { private long timeStamp; private String subject; private String object; - private Map<Object,Object> properties = new LinkedHashMap<>(); + private CXSEventProperties properties = new CXSEventProperties(); private CXSGeoPoint location; + @GraphQLField public String getId() { return id; } + @GraphQLField public String getEventType() { return eventType; } + @GraphQLField public long getTimeStamp() { return timeStamp; } + @GraphQLField public String getSubject() { return subject; } + @GraphQLField public String getObject() { return object; } - public Map<Object, Object> getProperties() { + @GraphQLField + public CXSEventProperties getProperties() { return properties; } + @GraphQLField public CXSGeoPoint getLocation() { return location; } diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventConnection.java similarity index 79% copy from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java copy to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventConnection.java index ae444b9..04c208c 100644 --- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java +++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventConnection.java @@ -16,8 +16,15 @@ */ package org.apache.unomi.graphql; -public interface CXSGraphQLProvider { +import graphql.annotations.annotationTypes.GraphQLField; - void setCxsProviderManager(CXSProviderManager cxsProviderManager); +import java.util.List; + +public class CXSEventConnection { + + @GraphQLField + public List<CXSEventEdge> edges; + @GraphQLField + public PageInfo pageInfo; } diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventEdge.java similarity index 82% copy from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java copy to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventEdge.java index ae444b9..e58d422 100644 --- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java +++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventEdge.java @@ -16,8 +16,13 @@ */ package org.apache.unomi.graphql; -public interface CXSGraphQLProvider { +import graphql.annotations.annotationTypes.GraphQLField; - void setCxsProviderManager(CXSProviderManager cxsProviderManager); +public class CXSEventEdge { + + @GraphQLField + public CXSEvent node; + @GraphQLField + public String cursor; } diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventFilter.java similarity index 78% copy from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java copy to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventFilter.java index ae444b9..9e4ebe8 100644 --- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java +++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventFilter.java @@ -16,8 +16,15 @@ */ package org.apache.unomi.graphql; -public interface CXSGraphQLProvider { +import graphql.annotations.annotationTypes.GraphQLField; - void setCxsProviderManager(CXSProviderManager cxsProviderManager); +import java.util.List; + +public class CXSEventFilter { + + @GraphQLField + public List<CXSEventFilter> andFilters; + @GraphQLField + public List<CXSEventFilter> orFilters; } diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventFilterInput.java similarity index 70% copy from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java copy to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventFilterInput.java index ae444b9..1e46e60 100644 --- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java +++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventFilterInput.java @@ -16,8 +16,19 @@ */ package org.apache.unomi.graphql; -public interface CXSGraphQLProvider { +import graphql.annotations.annotationTypes.GraphQLField; +import graphql.annotations.annotationTypes.GraphQLName; - void setCxsProviderManager(CXSProviderManager cxsProviderManager); +import java.util.List; + +public class CXSEventFilterInput { + + @GraphQLField + @GraphQLName("and") + public List<CXSEventFilterInput> andFilters; + + @GraphQLField + @GraphQLName("or") + public List<CXSEventFilterInput> orFilters; } diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEvent.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventInput.java similarity index 84% copy from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEvent.java copy to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventInput.java index c278678..9b7b752 100644 --- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEvent.java +++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventInput.java @@ -16,35 +16,41 @@ */ package org.apache.unomi.graphql; +import graphql.annotations.annotationTypes.GraphQLField; + import java.util.LinkedHashMap; import java.util.Map; -public class CXSEvent { - +public class CXSEventInput { private String id; private String eventType; private long timeStamp; private String subject; private String object; private Map<Object,Object> properties = new LinkedHashMap<>(); - private CXSGeoPoint location; + private CXSGeoPointInput location; + @GraphQLField public String getId() { return id; } + @GraphQLField public String getEventType() { return eventType; } + @GraphQLField public long getTimeStamp() { return timeStamp; } + @GraphQLField public String getSubject() { return subject; } + @GraphQLField public String getObject() { return object; } @@ -53,7 +59,9 @@ public class CXSEvent { return properties; } - public CXSGeoPoint getLocation() { + @GraphQLField + public CXSGeoPointInput getLocation() { return location; } + } diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventOccurrenceFilter.java similarity index 69% copy from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java copy to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventOccurrenceFilter.java index ae444b9..a80fb0f 100644 --- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java +++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventOccurrenceFilter.java @@ -16,8 +16,19 @@ */ package org.apache.unomi.graphql; -public interface CXSGraphQLProvider { +import graphql.annotations.annotationTypes.GraphQLField; - void setCxsProviderManager(CXSProviderManager cxsProviderManager); +public class CXSEventOccurrenceFilter { + @GraphQLField + public String eventType; + @GraphQLField + public String beforeTime; + @GraphQLField + public String afterTime; + @GraphQLField + public String betweenTime; + @GraphQLField + public int count; + public CXSEventFilter eventFilter; } diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventProperties.java similarity index 71% copy from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java copy to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventProperties.java index ae444b9..7b072b9 100644 --- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java +++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventProperties.java @@ -16,8 +16,18 @@ */ package org.apache.unomi.graphql; -public interface CXSGraphQLProvider { +import graphql.annotations.annotationTypes.GraphQLField; - void setCxsProviderManager(CXSProviderManager cxsProviderManager); +import java.util.LinkedHashMap; +import java.util.Map; +public class CXSEventProperties { + @GraphQLField + public int nbProperties; + + Map<Object,Object> properties = new LinkedHashMap<>(); + + public Map<Object, Object> getProperties() { + return properties; + } } diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventPropertiesFilter.java similarity index 88% copy from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java copy to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventPropertiesFilter.java index ae444b9..c24664f 100644 --- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java +++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventPropertiesFilter.java @@ -16,8 +16,5 @@ */ package org.apache.unomi.graphql; -public interface CXSGraphQLProvider { - - void setCxsProviderManager(CXSProviderManager cxsProviderManager); - +public class CXSEventPropertiesFilter { } diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java index ae444b9..1636402 100644 --- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java +++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java @@ -16,8 +16,13 @@ */ package org.apache.unomi.graphql; +import java.util.Map; + public interface CXSGraphQLProvider { + Map<String,CXSEventType> getEventTypes(); + CXSProviderManager getCxsProviderManager(); + void updateGraphQLTypes(); void setCxsProviderManager(CXSProviderManager cxsProviderManager); } diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSMutation.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSMutation.java new file mode 100644 index 0000000..e3a4dce --- /dev/null +++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSMutation.java @@ -0,0 +1,113 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.unomi.graphql; + +import graphql.annotations.annotationTypes.GraphQLField; +import graphql.annotations.annotationTypes.GraphQLName; +import graphql.schema.DataFetchingEnvironment; + +import java.util.ArrayList; +import java.util.List; + +@GraphQLName("CXS_Mutation") +public class CXSMutation { + + @GraphQLField + public CXSEventType createOrUpdateEventType(DataFetchingEnvironment env, @GraphQLName("eventType") CXSEventTypeInput cxsEventTypeInput) { + + CXSGraphQLProvider cxsGraphQLProvider = null; + CXSEventType cxsEventType = new CXSEventType(); + cxsEventType.id = cxsEventTypeInput.id; + cxsEventType.typeName = cxsEventTypeInput.scope; + cxsEventType.properties = new ArrayList<>(); + for (CXSPropertyTypeInput propertyTypeInput : cxsEventTypeInput.properties) { + CXSPropertyType propertyType = getPropertyType(propertyTypeInput); + cxsEventType.properties.add(propertyType); + } + cxsGraphQLProvider.getEventTypes().put(cxsEventType.typeName, cxsEventType); + cxsGraphQLProvider.updateGraphQLTypes(); + if (cxsGraphQLProvider.getCxsProviderManager() != null) { + cxsGraphQLProvider.getCxsProviderManager().refreshProviders(); + } + return cxsEventType; + + } + + @GraphQLField + public int processEvents(DataFetchingEnvironment env, @GraphQLName("events") List<CXSEventInput> events) { + return 0; + } + + private CXSPropertyType getPropertyType(CXSPropertyTypeInput cxsPropertyTypeInput) { + CXSPropertyType propertyType = null; + if (cxsPropertyTypeInput.identifierPropertyTypeInput != null) { + propertyType = getIdentifierPropertyType(cxsPropertyTypeInput.identifierPropertyTypeInput); + } else if (cxsPropertyTypeInput.stringPropertyTypeInput != null) { + propertyType = getStringPropertyType(cxsPropertyTypeInput.stringPropertyTypeInput); + } else if (cxsPropertyTypeInput.setPropertyTypeInput != null) { + propertyType = getSetPropertyType(cxsPropertyTypeInput.setPropertyTypeInput); + } + return propertyType; + } + + private CXSPropertyType getSetPropertyType(CXSSetPropertyTypeInput cxsSetPropertyTypeInput) { + CXSSetPropertyType cxsSetPropertyType = new CXSSetPropertyType(); + + populateCommonProperties(cxsSetPropertyTypeInput, cxsSetPropertyType); + if (cxsSetPropertyTypeInput.properties != null) { + List<CXSPropertyType> setProperties = new ArrayList<>(); + for (CXSPropertyTypeInput setProperty : cxsSetPropertyTypeInput.properties) { + CXSPropertyType subPropertyType = getPropertyType(setProperty); + if (subPropertyType != null) { + setProperties.add(subPropertyType); + } + } + cxsSetPropertyType.properties = setProperties; + } + return cxsSetPropertyType; + } + + private CXSPropertyType getStringPropertyType(CXSStringPropertyType stringPropertyType) { + CXSStringPropertyType cxsStringPropertyType = new CXSStringPropertyType(); + populateCommonProperties(stringPropertyType, cxsStringPropertyType); + cxsStringPropertyType.defaultValue = stringPropertyType.defaultValue; + cxsStringPropertyType.regexp = stringPropertyType.regexp; + return cxsStringPropertyType; + } + + private CXSPropertyType getIdentifierPropertyType(CXSIdentifierPropertyType identifierPropertyType) { + CXSIdentifierPropertyType cxsIdentifierPropertyType = new CXSIdentifierPropertyType(); + populateCommonProperties(identifierPropertyType, cxsIdentifierPropertyType); + cxsIdentifierPropertyType.defaultValue = identifierPropertyType.defaultValue; + cxsIdentifierPropertyType.regexp = identifierPropertyType.regexp; + return cxsIdentifierPropertyType; + } + + private void populateCommonProperties(CXSPropertyType source, CXSPropertyType destination) { + if (source == null) { + return; + } + destination.id = source.id; + destination.name = source.name; + destination.personalData = source.personalData; + destination.systemTags = source.systemTags; + destination.tags = source.tags; + destination.minOccurrences = source.minOccurrences; + destination.maxOccurrences = source.maxOccurrences; + } + +} diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSProfilePropertiesFilter.java similarity index 69% copy from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java copy to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSProfilePropertiesFilter.java index ae444b9..c1eae63 100644 --- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java +++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSProfilePropertiesFilter.java @@ -16,8 +16,19 @@ */ package org.apache.unomi.graphql; -public interface CXSGraphQLProvider { +import graphql.annotations.annotationTypes.GraphQLField; +import graphql.annotations.annotationTypes.GraphQLName; - void setCxsProviderManager(CXSProviderManager cxsProviderManager); +import java.util.List; + +public class CXSProfilePropertiesFilter { + + @GraphQLField + @GraphQLName("and") + public List<CXSProfilePropertiesFilter> andFilters; + + @GraphQLField + @GraphQLName("or") + public List<CXSProfilePropertiesFilter> orFilters; } diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSPropertyTypeInput.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSPropertyTypeInput.java index 900cc4a..48eadec 100644 --- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSPropertyTypeInput.java +++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSPropertyTypeInput.java @@ -32,7 +32,7 @@ public class CXSPropertyTypeInput { @GraphQLField @GraphQLName("int") - public CXSIntPropertyType integer; + public CXSIntPropertyType integerPropertyTypeInput; @GraphQLField @GraphQLName("float") diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSPropertyTypeInput.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSQuery.java similarity index 55% copy from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSPropertyTypeInput.java copy to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSQuery.java index 900cc4a..24d11ff 100644 --- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSPropertyTypeInput.java +++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSQuery.java @@ -18,39 +18,35 @@ package org.apache.unomi.graphql; import graphql.annotations.annotationTypes.GraphQLField; import graphql.annotations.annotationTypes.GraphQLName; +import graphql.schema.DataFetchingEnvironment; -@GraphQLName("CXSPropertyTypeInput") -public class CXSPropertyTypeInput { +import java.util.ArrayList; +import java.util.List; - @GraphQLField - @GraphQLName("identifier") - public CXSIdentifierPropertyType identifierPropertyTypeInput; - - @GraphQLField - @GraphQLName("string") - public CXSStringPropertyType stringPropertyTypeInput; - - @GraphQLField - @GraphQLName("int") - public CXSIntPropertyType integer; - - @GraphQLField - @GraphQLName("float") - public CXSFloatPropertyType floatPropertyTypeInput; +@GraphQLName("CXS_Query") +public class CXSQuery { @GraphQLField - @GraphQLName("date") - public CXSDatePropertyType datePropertyTypeInput; + public List<CXSEventType> getEventTypes() { + return new ArrayList<>(); + } @GraphQLField - @GraphQLName("boolean") - public CXSBooleanPropertyType booleanPropertyTypeInput; + public CXSEvent getEvent(@GraphQLName("id") String id) { + return new CXSEvent(); + } @GraphQLField - @GraphQLName("geopoint") - public CXSGeoPointPropertyType geoPointPropertyTypeInput; + public CXSEventConnection findEvents(@GraphQLName("filter") CXSEventFilterInput filter, + @GraphQLName("orderBy") CXSOrderByInput orderBy, + DataFetchingEnvironment env) { + env.getArgument("first"); + env.getArgument("after"); + return new CXSEventConnection(); + } @GraphQLField - @GraphQLName("set") - public CXSSetPropertyTypeInput setPropertyTypeInput; + public CXSSegment getSegment(@GraphQLName("segmentId") String segmentId) { + return new CXSSegment(); + } } diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSSegment.java similarity index 70% copy from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java copy to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSSegment.java index ae444b9..4d81f90 100644 --- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java +++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSSegment.java @@ -16,8 +16,17 @@ */ package org.apache.unomi.graphql; -public interface CXSGraphQLProvider { - - void setCxsProviderManager(CXSProviderManager cxsProviderManager); +import graphql.annotations.annotationTypes.GraphQLField; +import graphql.annotations.annotationTypes.GraphQLName; +@GraphQLName("CXS_Segment") +public class CXSSegment { + @GraphQLField + public String id; + @GraphQLField + public CXSView view; + @GraphQLField + public String name; + @GraphQLField + public CXSSegmentCondition condition; } diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSSegmentCondition.java similarity index 66% copy from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java copy to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSSegmentCondition.java index ae444b9..37d3311 100644 --- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java +++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSSegmentCondition.java @@ -16,8 +16,17 @@ */ package org.apache.unomi.graphql; -public interface CXSGraphQLProvider { +import graphql.annotations.annotationTypes.GraphQLField; +import graphql.annotations.annotationTypes.GraphQLName; - void setCxsProviderManager(CXSProviderManager cxsProviderManager); +import java.util.List; +@GraphQLName("CXS_SegmentCondition") +public class CXSSegmentCondition { + @GraphQLField + public CXSProfilePropertiesFilter profilePropertiesFilter; + @GraphQLField + public List<String> grantedConsents; + @GraphQLField + public CXSEventOccurrenceFilter eventOccurrenceFilter; } diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSView.java similarity index 87% copy from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java copy to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSView.java index ae444b9..ddc74b6 100644 --- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java +++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSView.java @@ -16,8 +16,9 @@ */ package org.apache.unomi.graphql; -public interface CXSGraphQLProvider { - - void setCxsProviderManager(CXSProviderManager cxsProviderManager); +import graphql.annotations.annotationTypes.GraphQLField; +public class CXSView { + @GraphQLField + public String name; } diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/builders/CXSBuilder.java similarity index 84% copy from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java copy to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/builders/CXSBuilder.java index ae444b9..83c7a85 100644 --- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGraphQLProvider.java +++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/builders/CXSBuilder.java @@ -14,10 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.unomi.graphql; +package org.apache.unomi.graphql.builders; -public interface CXSGraphQLProvider { +public interface CXSBuilder { - void setCxsProviderManager(CXSProviderManager cxsProviderManager); + void updateTypes(); } 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/builders/CXSEventBuilders.java similarity index 53% copy from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/internal/CXSGraphQLProviderImpl.java copy to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/builders/CXSEventBuilders.java index a0596cc..bc1d4f7 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/builders/CXSEventBuilders.java @@ -14,72 +14,53 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.unomi.graphql.internal; +package org.apache.unomi.graphql.builders; import graphql.annotations.processor.GraphQLAnnotationsComponent; import graphql.annotations.processor.ProcessingElementsContainer; import graphql.schema.*; -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.slf4j.Logger; -import org.slf4j.LoggerFactory; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; import static graphql.Scalars.*; -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 { +public class CXSEventBuilders implements CXSBuilder { - 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 Map<String,CXSEventType> eventTypes; + private Map<String,GraphQLType> typeRegistry; - private Map<String,CXSEventType> eventTypes = new TreeMap<>(); - - public CXSGraphQLProviderImpl(GraphQLAnnotationsComponent annotationsComponent) { + public CXSEventBuilders(GraphQLAnnotationsComponent annotationsComponent, + ProcessingElementsContainer container, + Map<String, CXSEventType> eventTypes) { this.annotationsComponent = annotationsComponent; - container = annotationsComponent.createContainer(); - updateGraphQLTypes(); + this.container = container; + this.eventTypes = eventTypes; + this.typeRegistry = container.getTypeRegistry(); } - 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)); + @Override + public void updateTypes() { + Map<String,GraphQLType> typeRegistry = container.getTypeRegistry(); + typeRegistry.put("CXS_EventInput", buildCXSEventInputType()); + typeRegistry.put(CXSEventOccurrenceFilterInput.class.getName(), annotationsComponent.getInputTypeProcessor().getInputTypeOrRef(CXSEventOccurrenceFilterInput.class, container)); + typeRegistry.put("CXS_EventPropertiesFilterInput", buildCXSEventPropertiesFilterInput()); + typeRegistry.put("CXS_EventFilterInput", buildCXSEventFilterInputType()); - 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()); + typeRegistry.put("CXS_EventProperties", buildCXSEventPropertiesOutputType()); - registeredOutputTypes.put("CXS_EventProperties", buildCXSEventPropertiesOutputType()); + typeRegistry.put("CXS_Event", buildCXSEventOutputType()); + typeRegistry.put("CXS_EventEdge", buildCXSEventEdgeOutputType()); + typeRegistry.put("CXS_EventConnection", buildCXSEventConnectionOutputType()); - 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() { @@ -88,7 +69,7 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP .description("The Relay edge type for the CXS_Event output type") .field(newFieldDefinition() .name("node") - .type(registeredOutputTypes.get("CXS_Event")) + .type((GraphQLOutputType) typeRegistry.get("CXS_Event")) ) .field(newFieldDefinition() .name("cursor") @@ -103,11 +84,11 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP .description("The Relay connection type for the CXS_Event output type") .field(newFieldDefinition() .name("edges") - .type(new GraphQLList(registeredOutputTypes.get("CXS_EventEdge"))) + .type(new GraphQLList(typeRegistry.get("CXS_EventEdge"))) ) .field(newFieldDefinition() .name("pageInfo") - .type(new GraphQLList(registeredOutputTypes.get(PageInfo.class.getName()))) + .type(new GraphQLList(typeRegistry.get(PageInfo.class.getName()))) ) .build(); } @@ -164,11 +145,11 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP } } - registeredInputTypes.put(eventTypeName + "FilterInput", eventTypeFilterInput.build()); + typeRegistry.put(eventTypeName + "FilterInput", eventTypeFilterInput.build()); inputTypeBuilder.field(newInputObjectField() .name(eventTypeName) - .type(registeredInputTypes.get(eventTypeName + "FilterInput")) + .type((GraphQLInputType) typeRegistry.get(eventTypeName + "FilterInput")) ); } @@ -255,14 +236,14 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP private void addDistanceFilters(String propertyName, GraphQLInputObjectType.Builder inputTypeBuilder) { inputTypeBuilder.field(newInputObjectField() .name(propertyName + "_distance") - .type(registeredInputTypes.get(CXSGeoDistanceInput.class.getName())) + .type((GraphQLInputType) typeRegistry.get(CXSGeoDistanceInput.class.getName())) ); } private void addDateFilters(String propertyName, GraphQLInputObjectType.Builder inputTypeBuilder) { inputTypeBuilder.field(newInputObjectField() .name(propertyName + "_between") - .type(registeredInputTypes.get(CXSDateFilterInput.class.getName())) + .type((GraphQLInputType) typeRegistry.get(CXSDateFilterInput.class.getName())) ); } @@ -280,15 +261,15 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP ) .field(newInputObjectField() .name("properties") - .type(registeredInputTypes.get("CXS_EventPropertiesFilterInput")) + .type((GraphQLInputType) typeRegistry.get("CXS_EventPropertiesFilterInput")) ) .field(newInputObjectField() .name("properties_or") - .type(registeredInputTypes.get("CXS_EventPropertiesFilterInput")) + .type((GraphQLInputType) typeRegistry.get("CXS_EventPropertiesFilterInput")) ) .field(newInputObjectField() .name("eventOccurrence") - .type(registeredInputTypes.get(CXSEventOccurrenceFilterInput.class.getName())) + .type((GraphQLInputType) typeRegistry.get(CXSEventOccurrenceFilterInput.class.getName())) ); return cxsEventFilterInputType.build(); } @@ -335,7 +316,7 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP } else if (cxsEventPropertyType instanceof CXSDatePropertyType) { eventPropertyInputType = GraphQLString; } else if (cxsEventPropertyType instanceof CXSGeoPointPropertyType) { - eventPropertyInputType = registeredInputTypes.get(CXSGeoPoint.class.getName()); + eventPropertyInputType = (GraphQLInputType) typeRegistry.get(CXSGeoPoint.class.getName()); } else if (cxsEventPropertyType instanceof CXSSetPropertyType) { eventPropertyInputType = buildCXSEventTypeInputProperty(cxsEventPropertyType.name, ((CXSSetPropertyType)cxsEventPropertyType).properties); } @@ -349,256 +330,6 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP return eventInputType.build(); } - @Deactivate - void deactivate( - ComponentContext cc, - BundleContext bc, - Map<String,Object> config) { - - registeredOutputTypes.clear(); - } - - public void setCxsProviderManager(CXSProviderManager cxsProviderManager) { - this.cxsProviderManager = cxsProviderManager; - } - - @Override - public Collection<GraphQLFieldDefinition> getQueries() { - List<GraphQLFieldDefinition> fieldDefinitions = new ArrayList<GraphQLFieldDefinition>(); - fieldDefinitions.add(newFieldDefinition() - .type(registeredOutputTypes.get("CXS_Query")) - .name("cxs") - .description("Root field for all CXS queries") - .dataFetcher(new DataFetcher() { - public Object get(DataFetchingEnvironment environment) { - Map<String,Object> map = environment.getContext(); - return map.keySet(); - } - }).build()); - return fieldDefinitions; - } - - @Override - public Collection<GraphQLType> getTypes() { - return new ArrayList<>(); - } - - @Override - public Collection<GraphQLFieldDefinition> getMutations() { - List<GraphQLFieldDefinition> fieldDefinitions = new ArrayList<GraphQLFieldDefinition>(); - fieldDefinitions.add(newFieldDefinition() - .type(registeredOutputTypes.get("CXS_Mutation")) - .name("cxs") - .description("Root field for all CXS mutation") - .dataFetcher(new DataFetcher<Object>() { - @Override - public Object get(DataFetchingEnvironment environment) { - Object contextObject = environment.getContext(); - return contextObject; - } - }).build()); - return fieldDefinitions; - } - - private GraphQLOutputType buildCXSQueryOutputType() { - return newObject() - .name("CXS_Query") - .description("Root CXS query type") - .field(newFieldDefinition() - .type(new GraphQLList(registeredOutputTypes.get(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"))) - .name("getEvent") - .description("Retrieves a specific event") - ) - .field(newFieldDefinition() - .type(new GraphQLList(registeredOutputTypes.get("CXS_EventConnection"))) - .name("findEvents") - .argument(newArgument() - .name("filter") - .type(registeredInputTypes.get("CXS_EventFilterInput")) - ) - .argument(newArgument() - .name("orderBy") - .type(registeredInputTypes.get(CXSOrderByInput.class.getName())) - ) - .argument(newArgument() - .name("first") - .type(GraphQLInt) - .description("Number of objects to retrieve starting at the after cursor position") - ) - .argument(newArgument() - .name("after") - .type(GraphQLString) - .description("Starting cursor location to retrieve the object from") - ) - .argument(newArgument() - .name("last") - .type(GraphQLInt) - .description("Number of objects to retrieve end at the before cursor position") - ) - .argument(newArgument() - .name("before") - .type(GraphQLString) - .description("End cursor location to retrieve the object from") - ) - .description("Retrieves the events that match the specified filters") - ) - /* - .field(newFieldDefinition() - .type(new GraphQLList(registeredOutputTypes.get("CXS_ProfileConnection"))) - .name("findProfiles") - .argument(newArgument() - .name("filter") - .type(registeredInputTypes.get("CXS_ProfileFilterInput")) - ) - .argument(newArgument() - .name("orderBy") - .type(registeredInputTypes.get(CXSOrderByInput.class.getName())) - ) - .argument(newArgument() - .name("first") - .type(GraphQLInt) - .description("Number of objects to retrieve starting at the after cursor position") - ) - .argument(newArgument() - .name("after") - .type(GraphQLString) - .description("Starting cursor location to retrieve the object from") - ) - .argument(newArgument() - .name("last") - .type(GraphQLInt) - .description("Number of objects to retrieve end at the before cursor position") - ) - .argument(newArgument() - .name("before") - .type(GraphQLString) - .description("End cursor location to retrieve the object from") - ) - .description("Retrieves the profiles that match the specified profiles") - ) - */ - .build(); - } - - private GraphQLOutputType buildCXSMutationOutputType() { - return newObject() - .name("CXS_Mutation") - .description("Root CXS mutation type") - .field(newFieldDefinition() - .type(registeredOutputTypes.get(CXSEventType.class.getName())) - .name("createOrUpdateEventType") - .argument(newArgument() - .name("eventType") - .type(registeredInputTypes.get(CXSEventTypeInput.class.getName())) - ) - .description("Create or updates a CXS event type in the Apache Unomi server") - .dataFetcher(new DataFetcher<CXSEventType>() { - @Override - public CXSEventType get(DataFetchingEnvironment environment) { - Map<String,Object> arguments = environment.getArguments(); - CXSEventType cxsEventType = new CXSEventType(); - if (arguments.containsKey("eventType")) { - Map<String,Object> eventTypeArguments = (Map<String,Object>) arguments.get("eventType"); - if (eventTypeArguments.containsKey("typeName")) { - cxsEventType.id = (String) eventTypeArguments.get("typeName"); - cxsEventType.typeName = (String) eventTypeArguments.get("typeName"); - } - cxsEventType.properties = new ArrayList<>(); - if (eventTypeArguments.containsKey("properties")) { - List<Map<String, Object>> properties = (List<Map<String, Object>>) eventTypeArguments.get("properties"); - for (Map<String, Object> propertyTypeMap : properties) { - CXSPropertyType cxsPropertyType = getPropertyType(propertyTypeMap); - if (cxsPropertyType != null) { - cxsEventType.properties.add(cxsPropertyType); - } - } - } - } - eventTypes.put(cxsEventType.typeName, cxsEventType); - updateGraphQLTypes(); - if (cxsProviderManager != null) { - cxsProviderManager.refreshProviders(); - } - return cxsEventType; - } - }) - ) - .field(newFieldDefinition() - .name("processEvents") - .description("Processes events sent to the Context Server") - .argument(newArgument() - .name("events") - .type(new GraphQLList(registeredInputTypes.get("CXS_EventInput")))) - .type(GraphQLInt) - ) - .build(); - } - - private CXSPropertyType getPropertyType(Map<String, Object> propertyTypeMap) { - if (propertyTypeMap.size() > 1) { - logger.error("Only one property type is allowed for each property !"); - return null; - } - CXSPropertyType propertyType = null; - if (propertyTypeMap.containsKey("identifier")) { - propertyType = getIdentifierPropertyType(propertyTypeMap); - } else if (propertyTypeMap.containsKey("string")) { - propertyType = getStringPropertyType(propertyTypeMap); - } else if (propertyTypeMap.containsKey("set")) { - propertyType = getSetPropertyType(propertyTypeMap); - } - return propertyType; - } - - private CXSPropertyType getSetPropertyType(Map<String, Object> propertyTypeMap) { - CXSSetPropertyType cxsSetPropertyType = new CXSSetPropertyType(); - Map<String,Object> setPropertyTypeMap = (Map<String,Object>) propertyTypeMap.get("set"); - populateCommonProperties(setPropertyTypeMap, cxsSetPropertyType); - if (setPropertyTypeMap.containsKey("properties")) { - List<Map<String,Object>> propertyList = (List<Map<String,Object>>) setPropertyTypeMap.get("properties"); - List<CXSPropertyType> setProperties = new ArrayList<>(); - for (Map<String,Object> setProperty : propertyList) { - CXSPropertyType subPropertyType = getPropertyType(setProperty); - if (subPropertyType != null) { - setProperties.add(subPropertyType); - } - } - cxsSetPropertyType.properties = setProperties; - } - return cxsSetPropertyType; - } - - private CXSPropertyType getStringPropertyType(Map<String, Object> propertyTypeMap) { - CXSStringPropertyType cxsStringPropertyType = new CXSStringPropertyType(); - Map<String,Object> stringPropertyTypeMap = (Map<String,Object>) propertyTypeMap.get("string"); - populateCommonProperties(stringPropertyTypeMap, cxsStringPropertyType); - return cxsStringPropertyType; - } - - private CXSPropertyType getIdentifierPropertyType(Map<String, Object> propertyTypeMap) { - CXSIdentifierPropertyType cxsIdentifierPropertyType = new CXSIdentifierPropertyType(); - Map<String,Object> identifierPropertyTypeMap = (Map<String,Object>) propertyTypeMap.get("identifier"); - populateCommonProperties(identifierPropertyTypeMap, cxsIdentifierPropertyType); - return cxsIdentifierPropertyType; - } - - private void populateCommonProperties(Map<String, Object> propertyTypeMap, CXSPropertyType cxsPropertyType) { - if (propertyTypeMap == null || propertyTypeMap.size() == 0) { - return; - } - if (propertyTypeMap.containsKey("id")) { - cxsPropertyType.id = (String) propertyTypeMap.get("id"); - } - if (propertyTypeMap.containsKey("name")) { - cxsPropertyType.name = (String) propertyTypeMap.get("name"); - } - } - private GraphQLOutputType buildCXSEventOutputType() { return newObject() .name("CXS_Event") @@ -657,7 +388,7 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP }) ) .field(newFieldDefinition() - .type(registeredOutputTypes.get(CXSGeoPoint.class.getName())) + .type((GraphQLOutputType) typeRegistry.get(CXSGeoPoint.class.getName())) .name("location") .description("The geo-point location where the event was fired.") .dataFetcher(new DataFetcher() { @@ -668,13 +399,13 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP }) ) .field(newFieldDefinition() - .type(new GraphQLList(registeredOutputTypes.get("CXS_EventProperties"))) + .type(new GraphQLList(typeRegistry.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()); + return new ArrayList<Map.Entry<Object,Object>>(CXSEvent.getProperties().getProperties().entrySet()); } }) ) @@ -726,7 +457,7 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP } else if (cxsEventPropertyType instanceof CXSDatePropertyType) { eventPropertyOutputType = GraphQLString; } else if (cxsEventPropertyType instanceof CXSGeoPointPropertyType) { - eventPropertyOutputType = registeredOutputTypes.get(CXSGeoPoint.class.getName()); + eventPropertyOutputType = (GraphQLOutputType) typeRegistry.get(CXSGeoPoint.class.getName()); } else if (cxsEventPropertyType instanceof CXSSetPropertyType) { eventPropertyOutputType = buildEventOutputType(cxsEventPropertyType.name, ((CXSSetPropertyType)cxsEventPropertyType).properties); } 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(); - } } 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> 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>
