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/05/12 14:44:45 UTC

[unomi] 07/15: 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 165b532cf2963b7437daf6ba0ef47b85802aa59e
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>