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/28 18:13:55 UTC

[unomi] 03/25: UNOMI-180 Implement CXS GraphQL API - First implementation of registering event types. Not yet perfect but some parts are working.

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 df20220a8f422d470e2c17f4ebb07c6fac1d2620
Author: Serge Huber <sh...@apache.org>
AuthorDate: Thu May 17 21:33:59 2018 +0200

    UNOMI-180 Implement CXS GraphQL API
    - First implementation of registering event types. Not yet perfect but some parts are working.
    
    Signed-off-by: Serge Huber <sh...@apache.org>
---
 .../unomi/graphql/AbstractPropertyTypeInput.java   |  40 ------
 ...yTypeInput.java => CXSBooleanPropertyType.java} |   4 +-
 ...ertyTypeInput.java => CXSDatePropertyType.java} |   2 +-
 .../org/apache/unomi/graphql/CXSEventType.java     |  13 ++
 ...rtyTypeInput.java => CXSFloatPropertyType.java} |   2 +-
 ...TypeInput.java => CXSGeoPointPropertyType.java} |   2 +-
 .../apache/unomi/graphql/CXSGraphQLProvider.java   |   2 +
 ...peInput.java => CXSIdentifierPropertyType.java} |   2 +-
 ...pertyTypeInput.java => CXSIntPropertyType.java} |   2 +-
 .../org/apache/unomi/graphql/CXSPropertyType.java  |  26 ++--
 .../apache/unomi/graphql/CXSPropertyTypeInput.java |  14 +-
 .../apache/unomi/graphql/CXSProviderManager.java   |  51 +------
 ...pertyTypeInput.java => CXSSetPropertyType.java} |   4 +-
 .../unomi/graphql/CXSSetPropertyTypeInput.java     |   3 +-
 ...tyTypeInput.java => CXSStringPropertyType.java} |   2 +-
 .../graphql/internal/CXSGraphQLProviderImpl.java   | 157 ++++++++++++++++++---
 .../CXSProviderManagerImpl.java}                   |  20 ++-
 17 files changed, 209 insertions(+), 137 deletions(-)

diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/AbstractPropertyTypeInput.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/AbstractPropertyTypeInput.java
deleted file mode 100644
index ad7ae5e..0000000
--- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/AbstractPropertyTypeInput.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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 java.util.List;
-
-public class AbstractPropertyTypeInput {
-
-    @GraphQLField
-    public String id;
-    @GraphQLField
-    public String name;
-    @GraphQLField
-    public int minOccurrences;
-    @GraphQLField
-    public int maxOccurrences;
-    @GraphQLField
-    public List<String> tags;
-    @GraphQLField
-    public List<String> systemTags;
-    @GraphQLField
-    public boolean personalData;
-
-}
diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSBooleanPropertyTypeInput.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSBooleanPropertyType.java
similarity index 89%
rename from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSBooleanPropertyTypeInput.java
rename to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSBooleanPropertyType.java
index 3843f5a..caea959 100644
--- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSBooleanPropertyTypeInput.java
+++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSBooleanPropertyType.java
@@ -19,8 +19,8 @@ package org.apache.unomi.graphql;
 import graphql.annotations.annotationTypes.GraphQLField;
 import graphql.annotations.annotationTypes.GraphQLName;
 
-@GraphQLName("CXSBooleanPropertyTypeInput")
-public class CXSBooleanPropertyTypeInput extends AbstractPropertyTypeInput {
+@GraphQLName("CXSBooleanPropertyType")
+public class CXSBooleanPropertyType extends CXSPropertyType {
 
     @GraphQLField
     public boolean defaultValue;
diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSDatePropertyTypeInput.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSDatePropertyType.java
similarity index 92%
rename from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSDatePropertyTypeInput.java
rename to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSDatePropertyType.java
index e8036aa..362d2bc 100644
--- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSDatePropertyTypeInput.java
+++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSDatePropertyType.java
@@ -18,7 +18,7 @@ package org.apache.unomi.graphql;
 
 import graphql.annotations.annotationTypes.GraphQLField;
 
-public class CXSDatePropertyTypeInput extends AbstractPropertyTypeInput {
+public class CXSDatePropertyType extends CXSPropertyType {
 
     @GraphQLField
     public String defaultValue;
diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventType.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventType.java
index 43f04fb..a7c1c2c 100644
--- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventType.java
+++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSEventType.java
@@ -17,10 +17,23 @@
 package org.apache.unomi.graphql;
 
 import graphql.annotations.annotationTypes.GraphQLField;
+import graphql.annotations.annotationTypes.GraphQLName;
 
+import java.util.List;
+
+@GraphQLName("CXS_EventType")
 public class CXSEventType {
 
     @GraphQLField
     public String id;
 
+    @GraphQLField
+    public String scope;
+
+    @GraphQLField
+    public String typeName;
+
+    @GraphQLField
+    public List<CXSPropertyType> properties;
+
 }
diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSFloatPropertyTypeInput.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSFloatPropertyType.java
similarity index 93%
rename from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSFloatPropertyTypeInput.java
rename to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSFloatPropertyType.java
index 038f4a5..229b8db 100644
--- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSFloatPropertyTypeInput.java
+++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSFloatPropertyType.java
@@ -18,7 +18,7 @@ package org.apache.unomi.graphql;
 
 import graphql.annotations.annotationTypes.GraphQLField;
 
-public class CXSFloatPropertyTypeInput extends AbstractPropertyTypeInput{
+public class CXSFloatPropertyType extends CXSPropertyType {
 
     @GraphQLField
     public float minValue;
diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGeoPointPropertyTypeInput.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGeoPointPropertyType.java
similarity index 92%
rename from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGeoPointPropertyTypeInput.java
rename to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGeoPointPropertyType.java
index c32def1..ce218c8 100644
--- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGeoPointPropertyTypeInput.java
+++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSGeoPointPropertyType.java
@@ -18,7 +18,7 @@ package org.apache.unomi.graphql;
 
 import graphql.annotations.annotationTypes.GraphQLField;
 
-public class CXSGeoPointPropertyTypeInput extends AbstractPropertyTypeInput {
+public class CXSGeoPointPropertyType extends CXSPropertyType {
 
     @GraphQLField
     public String defaultValue;
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 01f2636..ae444b9 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
@@ -18,4 +18,6 @@ package org.apache.unomi.graphql;
 
 public interface CXSGraphQLProvider {
 
+    void setCxsProviderManager(CXSProviderManager cxsProviderManager);
+
 }
diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSStringPropertyTypeInput.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSIdentifierPropertyType.java
similarity index 92%
rename from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSStringPropertyTypeInput.java
rename to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSIdentifierPropertyType.java
index c44496f..11f0742 100644
--- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSStringPropertyTypeInput.java
+++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSIdentifierPropertyType.java
@@ -18,7 +18,7 @@ package org.apache.unomi.graphql;
 
 import graphql.annotations.annotationTypes.GraphQLField;
 
-public class CXSStringPropertyTypeInput extends AbstractPropertyTypeInput {
+public class CXSIdentifierPropertyType extends CXSPropertyType {
 
     @GraphQLField
     public String regexp;
diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSIntPropertyTypeInput.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSIntPropertyType.java
similarity index 93%
rename from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSIntPropertyTypeInput.java
rename to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSIntPropertyType.java
index f2dac72..c7c904f 100644
--- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSIntPropertyTypeInput.java
+++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSIntPropertyType.java
@@ -18,7 +18,7 @@ package org.apache.unomi.graphql;
 
 import graphql.annotations.annotationTypes.GraphQLField;
 
-public class CXSIntPropertyTypeInput extends AbstractPropertyTypeInput {
+public class CXSIntPropertyType extends CXSPropertyType {
 
     @GraphQLField
     public int minValue;
diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSPropertyType.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSPropertyType.java
index a55a04b..641eff4 100644
--- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSPropertyType.java
+++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSPropertyType.java
@@ -16,17 +16,25 @@
  */
 package org.apache.unomi.graphql;
 
-import java.util.LinkedHashSet;
-import java.util.Set;
+import graphql.annotations.annotationTypes.GraphQLField;
+
+import java.util.List;
 
 public class CXSPropertyType {
 
-    private String id;
-    private String name;
-    private int minOccurrences = 0;
-    private int maxOccurrences = 1;
-    private Set<String> tags = new LinkedHashSet<>();
-    private Set<String> systemTags = new LinkedHashSet<>();
-    private boolean personalData = false;
+    @GraphQLField
+    public String id;
+    @GraphQLField
+    public String name;
+    @GraphQLField
+    public int minOccurrences;
+    @GraphQLField
+    public int maxOccurrences;
+    @GraphQLField
+    public List<String> tags;
+    @GraphQLField
+    public List<String> systemTags;
+    @GraphQLField
+    public boolean personalData;
 
 }
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 60a1aa4..900cc4a 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
@@ -24,31 +24,31 @@ public class CXSPropertyTypeInput {
 
     @GraphQLField
     @GraphQLName("identifier")
-    public CXSIdentifierPropertyTypeInput identifierPropertyTypeInput;
+    public CXSIdentifierPropertyType identifierPropertyTypeInput;
 
     @GraphQLField
     @GraphQLName("string")
-    public CXSStringPropertyTypeInput stringPropertyTypeInput;
+    public CXSStringPropertyType stringPropertyTypeInput;
 
     @GraphQLField
     @GraphQLName("int")
-    public CXSIntPropertyTypeInput integer;
+    public CXSIntPropertyType integer;
 
     @GraphQLField
     @GraphQLName("float")
-    public CXSFloatPropertyTypeInput floatPropertyTypeInput;
+    public CXSFloatPropertyType floatPropertyTypeInput;
 
     @GraphQLField
     @GraphQLName("date")
-    public CXSDatePropertyTypeInput datePropertyTypeInput;
+    public CXSDatePropertyType datePropertyTypeInput;
 
     @GraphQLField
     @GraphQLName("boolean")
-    public CXSBooleanPropertyTypeInput booleanPropertyTypeInput;
+    public CXSBooleanPropertyType booleanPropertyTypeInput;
 
     @GraphQLField
     @GraphQLName("geopoint")
-    public CXSGeoPointPropertyTypeInput geoPointPropertyTypeInput;
+    public CXSGeoPointPropertyType geoPointPropertyTypeInput;
 
     @GraphQLField
     @GraphQLName("set")
diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSProviderManager.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSProviderManager.java
index a341a9f..18c7533 100644
--- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSProviderManager.java
+++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSProviderManager.java
@@ -16,55 +16,8 @@
  */
 package org.apache.unomi.graphql;
 
-import graphql.servlet.GraphQLMutationProvider;
-import graphql.servlet.GraphQLQueryProvider;
-import graphql.servlet.GraphQLTypesProvider;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceRegistration;
-import org.osgi.service.component.ComponentContext;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Deactivate;
-import org.osgi.service.component.annotations.Reference;
+public interface CXSProviderManager {
 
-import java.util.Map;
-
-@Component(
-        name="CXSProviderManager",
-        immediate = true
-)
-public class CXSProviderManager {
-
-    @Reference(name = "CXSGraphQLProvider")
-    private CXSGraphQLProvider cxsGraphQLProvider;
-    private ServiceRegistration<?> providerSR;
-    private BundleContext bundleContext;
-
-    @Activate
-    void activate(
-            ComponentContext componentContext,
-            BundleContext bundleContext,
-            Map<String,Object> config) {
-        this.bundleContext = bundleContext;
-    }
-
-    @Deactivate
-    void deactivate(
-            ComponentContext componentContext,
-            BundleContext bundleContext,
-            Map<String,Object> config) {
-    }
-
-    void refreshProviders() {
-        if (providerSR != null) {
-            providerSR.unregister();
-            providerSR = null;
-            providerSR = bundleContext.registerService(new String[] {
-                    GraphQLQueryProvider.class.getName(),
-                    GraphQLTypesProvider.class.getName(),
-                    GraphQLMutationProvider.class.getName()
-            }, cxsGraphQLProvider, null);
-        }
-    }
+    void refreshProviders();
 
 }
diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSSetPropertyTypeInput.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSSetPropertyType.java
similarity index 88%
copy from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSSetPropertyTypeInput.java
copy to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSSetPropertyType.java
index 5db69dd..3c054ae 100644
--- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSSetPropertyTypeInput.java
+++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSSetPropertyType.java
@@ -20,8 +20,8 @@ import graphql.annotations.annotationTypes.GraphQLField;
 
 import java.util.List;
 
-public class CXSSetPropertyTypeInput extends AbstractPropertyTypeInput {
+public class CXSSetPropertyType extends CXSPropertyType {
 
     @GraphQLField
-    public List<CXSPropertyTypeInput> properties;
+    public List<CXSPropertyType> properties;
 }
diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSSetPropertyTypeInput.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSSetPropertyTypeInput.java
index 5db69dd..2f0de04 100644
--- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSSetPropertyTypeInput.java
+++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSSetPropertyTypeInput.java
@@ -20,8 +20,9 @@ import graphql.annotations.annotationTypes.GraphQLField;
 
 import java.util.List;
 
-public class CXSSetPropertyTypeInput extends AbstractPropertyTypeInput {
+public class CXSSetPropertyTypeInput extends CXSPropertyType {
 
     @GraphQLField
     public List<CXSPropertyTypeInput> properties;
+
 }
diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSIdentifierPropertyTypeInput.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSStringPropertyType.java
similarity index 92%
rename from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSIdentifierPropertyTypeInput.java
rename to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSStringPropertyType.java
index 49869bc..2a4ef90 100644
--- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSIdentifierPropertyTypeInput.java
+++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSStringPropertyType.java
@@ -18,7 +18,7 @@ package org.apache.unomi.graphql;
 
 import graphql.annotations.annotationTypes.GraphQLField;
 
-public class CXSIdentifierPropertyTypeInput extends AbstractPropertyTypeInput {
+public class CXSStringPropertyType extends CXSPropertyType {
 
     @GraphQLField
     public String regexp;
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 b9e876a..ea2043d 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
@@ -29,9 +29,9 @@ 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.Activate;
-import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.*;
 
@@ -40,23 +40,24 @@ import static graphql.schema.GraphQLArgument.newArgument;
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 import static graphql.schema.GraphQLObjectType.newObject;
 
-@Component(
-        name = "CXSGraphQLProvider",
-        immediate = true
-)
 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;
 
-    @Activate
-    void activate(
-            ComponentContext cc,
-            BundleContext bc,
-            Map<String,Object> config) {
+    private Map<String,CXSEventType> eventTypes = new TreeMap<>();
 
+    public CXSGraphQLProviderImpl() {
+        updateGraphQLTypes();
+    }
+
+    private void updateGraphQLTypes() {
         registeredOutputTypes.put(CXSGeoPoint.class.getName(), GraphQLAnnotations.object(CXSGeoPoint.class));
-        registeredOutputTypes.put(CXSProperties.class.getName(), GraphQLAnnotations.object(CXSProperties.class));
+        registeredOutputTypes.put(CXSSetPropertyType.class.getName(), GraphQLAnnotations.object(CXSSetPropertyType.class));
+        registeredOutputTypes.put("CXS_EventProperties", buildCXSEventPropertiesOutputType());
         registeredOutputTypes.put(CXSEventType.class.getName(), GraphQLAnnotations.object(CXSEventType.class));
 
         GraphQLObjectInfoRetriever graphQLObjectInfoRetriever = new GraphQLObjectInfoRetriever();
@@ -79,6 +80,10 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP
         registeredOutputTypes.clear();
     }
 
+    public void setCxsProviderManager(CXSProviderManager cxsProviderManager) {
+        this.cxsProviderManager = cxsProviderManager;
+    }
+
     @Override
     public Collection<GraphQLFieldDefinition> getQueries() {
         List<GraphQLFieldDefinition> fieldDefinitions = new ArrayList<GraphQLFieldDefinition>();
@@ -107,10 +112,11 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP
                 .type(registeredOutputTypes.get("CXS_Mutation"))
                 .name("cxs")
                 .description("Root field for all CXS mutation")
-                .dataFetcher(new DataFetcher() {
+                .dataFetcher(new DataFetcher<Object>() {
+                    @Override
                     public Object get(DataFetchingEnvironment environment) {
-                        Map<String,Object> map = environment.getContext();
-                        return map.keySet();
+                        Object contextObject = environment.getContext();
+                        return contextObject;
                     }
                 }).build());
         return fieldDefinitions;
@@ -125,6 +131,11 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP
                         .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")
+                )
                 .build();
     }
 
@@ -140,10 +151,99 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP
                                 .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;
+                            }
+                        })
                 )
                 .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 (propertyTypeMap.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()
@@ -214,7 +314,7 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP
                         })
                 )
                 .field(newFieldDefinition()
-                        .type(new GraphQLList(registeredOutputTypes.get(CXSProperties.class.getName())))
+                        .type(new GraphQLList(registeredOutputTypes.get("CXS_EventProperties")))
                         .name("properties")
                         .description("Generic properties for the event")
                         .dataFetcher(new DataFetcher() {
@@ -226,4 +326,29 @@ public class CXSGraphQLProviderImpl implements CXSGraphQLProvider, GraphQLQueryP
                 )
                 .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(registeredOutputTypes.get(CXSSetPropertyType.class.getName()))
+                            .name(cxsEventTypeEntry.getKey())
+                    );
+        }
+
+        return eventPropertiesOutputType.build();
+    }
+
 }
diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSProviderManager.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/internal/CXSProviderManagerImpl.java
similarity index 74%
copy from graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSProviderManager.java
copy to graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/internal/CXSProviderManagerImpl.java
index a341a9f..8b7b80a 100644
--- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/CXSProviderManager.java
+++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/internal/CXSProviderManagerImpl.java
@@ -14,18 +14,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.unomi.graphql;
+package org.apache.unomi.graphql.internal;
 
 import graphql.servlet.GraphQLMutationProvider;
 import graphql.servlet.GraphQLQueryProvider;
 import graphql.servlet.GraphQLTypesProvider;
+import org.apache.unomi.graphql.CXSGraphQLProvider;
+import org.apache.unomi.graphql.CXSProviderManager;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.component.ComponentContext;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
-import org.osgi.service.component.annotations.Reference;
 
 import java.util.Map;
 
@@ -33,9 +34,8 @@ import java.util.Map;
         name="CXSProviderManager",
         immediate = true
 )
-public class CXSProviderManager {
+public class CXSProviderManagerImpl implements CXSProviderManager {
 
-    @Reference(name = "CXSGraphQLProvider")
     private CXSGraphQLProvider cxsGraphQLProvider;
     private ServiceRegistration<?> providerSR;
     private BundleContext bundleContext;
@@ -46,6 +46,13 @@ public class CXSProviderManager {
             BundleContext bundleContext,
             Map<String,Object> config) {
         this.bundleContext = bundleContext;
+        this.cxsGraphQLProvider = new CXSGraphQLProviderImpl();
+        this.cxsGraphQLProvider.setCxsProviderManager(this);
+        providerSR = bundleContext.registerService(new String[] {
+                GraphQLQueryProvider.class.getName(),
+                GraphQLTypesProvider.class.getName(),
+                GraphQLMutationProvider.class.getName()
+        }, cxsGraphQLProvider, null);
     }
 
     @Deactivate
@@ -53,9 +60,12 @@ public class CXSProviderManager {
             ComponentContext componentContext,
             BundleContext bundleContext,
             Map<String,Object> config) {
+        providerSR.unregister();
+        cxsGraphQLProvider.setCxsProviderManager(null);
+        cxsGraphQLProvider = null;
     }
 
-    void refreshProviders() {
+    public void refreshProviders() {
         if (providerSR != null) {
             providerSR.unregister();
             providerSR = null;