You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2021/05/28 06:46:37 UTC

[celix] branch feature/use_ser_hander_in_psa updated: Adds backwardsCompatible argument to serializer provider ctor

This is an automated email from the ASF dual-hosted git repository.

pnoltes pushed a commit to branch feature/use_ser_hander_in_psa
in repository https://gitbox.apache.org/repos/asf/celix.git


The following commit(s) were added to refs/heads/feature/use_ser_hander_in_psa by this push:
     new 28f4e47  Adds backwardsCompatible argument to serializer provider ctor
28f4e47 is described below

commit 28f4e479a4f49efd181140d8f7eb6a33253fa309
Author: Pepijn Noltes <pe...@gmail.com>
AuthorDate: Fri May 28 08:46:27 2021 +0200

    Adds backwardsCompatible argument to serializer provider ctor
---
 .../src/pubsub_avrobin_serialization_provider.c    |  2 +-
 .../src/pubsub_json_serialization_provider.c       |  2 +-
 .../include/pubsub_serialization_provider.h        | 15 ++++--
 .../include/pubsub_serializer_provider.h           | 54 ----------------------
 .../src/pubsub_serialization_provider.c            |  5 ++
 5 files changed, 18 insertions(+), 60 deletions(-)

diff --git a/bundles/pubsub/pubsub_serializer_avrobin/src/pubsub_avrobin_serialization_provider.c b/bundles/pubsub/pubsub_serializer_avrobin/src/pubsub_avrobin_serialization_provider.c
index 9c81e05..2008613 100644
--- a/bundles/pubsub/pubsub_serializer_avrobin/src/pubsub_avrobin_serialization_provider.c
+++ b/bundles/pubsub/pubsub_serializer_avrobin/src/pubsub_avrobin_serialization_provider.c
@@ -110,7 +110,7 @@ void pubsub_avrobinSerializationProvider_freeDeserializeMsg(pubsub_serialization
 }
 
 pubsub_serialization_provider_t* pubsub_avrobinSerializationProvider_create(celix_bundle_context_t* ctx)  {
-    pubsub_serialization_provider_t* provider = pubsub_serializationProvider_create(ctx, "avrobin", 0, pubsub_avrobinSerializationProvider_serialize, pubsub_avrobinSerializationProvider_freeSerializeMsg, pubsub_avrobinSerializationProvider_deserialize, pubsub_avrobinSerializationProvider_freeDeserializeMsg);
+    pubsub_serialization_provider_t* provider = pubsub_serializationProvider_create(ctx, "avrobin", false, 0, pubsub_avrobinSerializationProvider_serialize, pubsub_avrobinSerializationProvider_freeSerializeMsg, pubsub_avrobinSerializationProvider_deserialize, pubsub_avrobinSerializationProvider_freeDeserializeMsg);
     avrobinSerializer_logSetup(dfi_log, pubsub_serializationProvider_getLogHelper(provider), 1);
     return provider;
 }
diff --git a/bundles/pubsub/pubsub_serializer_json/src/pubsub_json_serialization_provider.c b/bundles/pubsub/pubsub_serializer_json/src/pubsub_json_serialization_provider.c
index 605d108..a43f6b5 100644
--- a/bundles/pubsub/pubsub_serializer_json/src/pubsub_json_serialization_provider.c
+++ b/bundles/pubsub/pubsub_serializer_json/src/pubsub_json_serialization_provider.c
@@ -106,7 +106,7 @@ static void pubsub_jsonSerializationProvider_freeDeserializeMsg(pubsub_serializa
 }
 
 pubsub_serialization_provider_t* pubsub_jsonSerializationProvider_create(celix_bundle_context_t* ctx)  {
-    pubsub_serialization_provider_t* provider = pubsub_serializationProvider_create(ctx, "json", 0, pubsub_jsonSerializationProvider_serialize, pubsub_jsonSerializationProvider_freeSerializeMsg, pubsub_jsonSerializationProvider_deserialize, pubsub_jsonSerializationProvider_freeDeserializeMsg);
+    pubsub_serialization_provider_t* provider = pubsub_serializationProvider_create(ctx, "json", true, 0, pubsub_jsonSerializationProvider_serialize, pubsub_jsonSerializationProvider_freeSerializeMsg, pubsub_jsonSerializationProvider_deserialize, pubsub_jsonSerializationProvider_freeDeserializeMsg);
     jsonSerializer_logSetup(dfi_log, pubsub_serializationProvider_getLogHelper(provider), 1);;
     return provider;
 }
diff --git a/bundles/pubsub/pubsub_utils/include/pubsub_serialization_provider.h b/bundles/pubsub/pubsub_utils/include/pubsub_serialization_provider.h
index 030c0bb..c5bfab2 100644
--- a/bundles/pubsub/pubsub_utils/include/pubsub_serialization_provider.h
+++ b/bundles/pubsub/pubsub_utils/include/pubsub_serialization_provider.h
@@ -49,10 +49,14 @@ typedef struct {
 
     bool valid;
     const char* invalidReason;
+
+    //custom user data, will initialized to NULL. If freeUserData is set during destruction of the entry, this will be called.
+    void* userData;
+    void (*freeUserData)(void* userData);
 } pubsub_serialization_entry_t;
 
 /**
- * Creates A (descriptor based) Serialization Provider.
+ * @brief Creates A (descriptor based) Serialization Provider.
  *
  * The provider monitors bundles and creates pubsub message serialization services for every unique descriptor found.
  *
@@ -73,6 +77,8 @@ typedef struct {
  *
  * @param ctx                           The bundle context
  * @param serializationType             The serialization type (e.g. 'json')
+ * @param backwardsCompatible           Whether the serializer can deserialize data if the minor version is higher. (note true for JSON)
+ *                                      Will be used to set the 'serialization.backwards.compatible' service property for the pusbub_message_serialization_marker
  * @param serializationServiceRanking   The service raking used for the serialization marker service.
  * @param serialize                     The serialize function to use
  * @param freeSerializeMsg              The freeSerializeMsg function to use
@@ -84,6 +90,7 @@ typedef struct {
 pubsub_serialization_provider_t *pubsub_serializationProvider_create(
         celix_bundle_context_t *ctx,
         const char* serializationType,
+        bool backwardsCompatible,
         long serializationServiceRanking,
         celix_status_t (*serialize)(pubsub_serialization_entry_t* entry, const void* msg, struct iovec** output, size_t* outputIovLen),
         void (*freeSerializeMsg)(pubsub_serialization_entry_t* entry, struct iovec* input, size_t inputIovLen),
@@ -97,17 +104,17 @@ void pubsub_serializationProvider_destroy(pubsub_serialization_provider_t *provi
 
 
 /**
- * Returns the number of valid entries.
+ * @brief Returns the number of valid entries.
  */
 size_t pubsub_serializationProvider_nrOfEntries(pubsub_serialization_provider_t *provider);
 
 /**
- * Returns the number of invalid entries.
+ * @brief Returns the number of invalid entries.
  */
 size_t pubsub_serializationProvider_nrOfInvalidEntries(pubsub_serialization_provider_t *provider);
 
 /**
- * Returns the log helper of the serialization provider.
+ * @brief Returns the log helper of the serialization provider.
  */
 celix_log_helper_t* pubsub_serializationProvider_getLogHelper(pubsub_serialization_provider_t *provider);
 
diff --git a/bundles/pubsub/pubsub_utils/include/pubsub_serializer_provider.h b/bundles/pubsub/pubsub_utils/include/pubsub_serializer_provider.h
deleted file mode 100644
index 034547f..0000000
--- a/bundles/pubsub/pubsub_utils/include/pubsub_serializer_provider.h
+++ /dev/null
@@ -1,54 +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.
- */
-
-#ifndef CELIX_PUBSUB_SERIALIZER_PROVIDER_H
-#define CELIX_PUBSUB_SERIALIZER_PROVIDER_H
-
-typedef struct pubsub_serializer_provider pubsub_serializer_provider_t; //opaque type
-
- /**
-  *
-  * Creates a handler which track bundles and registers pubsub_custom_msg_serialization_service
-  * for every descriptor file found for json serialization.
-  *
-  * Added properties:
-  * serialization.type=json
-  * targeted.msg.fqn=<descriptor fqn>
-  * targeted.msg.id=<msg fqn hash or msg id annotated in the descriptor>
-  * targeted.msg.version=<msg version in descriptor if present> (optional)
-  * service.ranking=0
-  *
-  * For descriptor found multiple times (same fqn and version) only the first one is registered
-  *
-  * @param ctx
-  * @param serializerType
-  * @param backwardsCompatible
-  * @return
-  */
-pubsub_serializer_provider_t* pubsub_providerHandler_create(celix_bundle_context_t* ctx, const char *serializerType /* i.e. json */, bool backwardsCompatible);
-
-void pubsub_providerHandler_destroy(pubsub_serializer_provider_t* handler);
-
-void pubsub_providerHandler_addBundle(pubsub_serializer_provider_t* handler, const celix_bundle_t *bnd);
-void pubsub_providerHandler_removeBundle(pubsub_serializer_provider_t* handler, const celix_bundle_t *bnd);
-
-//note can be used for shell commands
-void pubsub_providerHandler_printRegisteredSerializer(pubsub_serializer_provider_t* handler, FILE *stream);
-
-#endif //CELIX_PUBSUB_SERIALIZER_PROVIDER_H
diff --git a/bundles/pubsub/pubsub_utils/src/pubsub_serialization_provider.c b/bundles/pubsub/pubsub_utils/src/pubsub_serialization_provider.c
index ebba555..b8b8503 100644
--- a/bundles/pubsub/pubsub_utils/src/pubsub_serialization_provider.c
+++ b/bundles/pubsub/pubsub_utils/src/pubsub_serialization_provider.c
@@ -590,6 +590,7 @@ void pubsub_serializationProvider_onInstalledBundle(void *handle, const celix_bu
 pubsub_serialization_provider_t *pubsub_serializationProvider_create(
         celix_bundle_context_t *ctx,
         const char* serializationType,
+        bool backwardsCompatible,
         long serializationServiceRanking,
         celix_status_t (*serialize)(pubsub_serialization_entry_t* entry, const void* msg, struct iovec** output, size_t* outputIovLen),
         void (*freeSerializeMsg)(pubsub_serialization_entry_t* entry, struct iovec* input, size_t inputIovLen),
@@ -651,6 +652,7 @@ pubsub_serialization_provider_t *pubsub_serializationProvider_create(
         celix_properties_t* props = celix_properties_create();
         provider->markerSvc.handle = provider;
         celix_properties_set(props, PUBSUB_MESSAGE_SERIALIZATION_MARKER_SERIALIZATION_TYPE_PROPERTY, provider->serializationType);
+        celix_properties_setBool(props, PUBSUB_MESSAGE_SERIALIZATION_MARKER_SERIALIZATION_BACKWARDS_COMPATIBLE, backwardsCompatible);
         celix_service_registration_options_t opts = CELIX_EMPTY_SERVICE_REGISTRATION_OPTIONS;
         opts.svc = &provider->markerSvc;
         opts.serviceName = PUBSUB_MESSAGE_SERIALIZATION_MARKER_NAME;
@@ -673,6 +675,9 @@ void pubsub_serializationProvider_destroy(pubsub_serialization_provider_t* provi
         for (int i = 0; i < celix_arrayList_size(provider->serializationSvcEntries); ++i) {
             pubsub_serialization_entry_t *entry = celix_arrayList_get(provider->serializationSvcEntries, i);
             celix_bundleContext_unregisterService(provider->ctx, entry->svcId);
+            if (entry->freeUserData) {
+                entry->freeUserData(entry->userData);
+            }
             free(entry->descriptorContent);
             free(entry->readFromEntryPath);
             free(entry->msgVersionStr);