You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@unomi.apache.org by sh...@apache.org on 2019/10/10 13:51:15 UTC
[unomi] 07/26: 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.
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 7ebeabc7e879c9fe4989f8d7015e68fbc511f63c
Author: Serge Huber <sh...@apache.org>
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 <sh...@apache.org>
---
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>