Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ TEST_F(PubSubSerializationProviderTestSuite, FindSerializationServices) {
size_t nrEntries = pubsub_serializationProvider_nrOfEntries(provider);
EXPECT_EQ(5, nrEntries);
size_t nrOfInvalidEntries = pubsub_serializationProvider_nrOfInvalidEntries(provider);
EXPECT_EQ(3, nrOfInvalidEntries); //note 4 invalid, because garbage.descriptor is never added (cannot extract msgFqn)
EXPECT_EQ(3, nrOfInvalidEntries); //note 3 invalid, because garbage.descriptor is never added (cannot extract msgFqn)

auto* services = celix_bundleContext_findServices(ctx.get(), PUBSUB_MESSAGE_SERIALIZATION_SERVICE_NAME);
EXPECT_EQ(5, celix_arrayList_size(services)); //3 valid, 5 invalid
Expand Down
24 changes: 24 additions & 0 deletions bundles/pubsub/pubsub_utils/src/pubsub_serialization_provider.c
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,21 @@ static dyn_message_type* pubsub_serializationProvider_parseDfiDescriptor(pubsub_
//}
//}

/**
* Check if a pubsub serialization entry is already present (exact path)
*
* @return true if the entry is a already present
*/
static bool pubsub_serializationProvider_alreadyAddedEntry(pubsub_serialization_provider_t* provider, pubsub_serialization_entry_t* entry) {
for (int i = 0; i < celix_arrayList_size(provider->serializationSvcEntries); ++i) {
pubsub_serialization_entry_t *visit = celix_arrayList_get(provider->serializationSvcEntries, i);
if (celix_utils_stringEquals(visit->readFromEntryPath, entry->readFromEntryPath)) {
return true;
}
}
return false;
}

/**
* Validates an pubsub serialization entry and check if this is a new unique entry.
*
Expand Down Expand Up @@ -407,6 +422,15 @@ static void pubsub_serializationProvider_parseDescriptors(pubsub_serialization_p
serEntry->svc.freeDeserializedMsg = (void*)provider->freeDeserializeMsg;
serEntry->svcId = -1L;

if (pubsub_serializationProvider_alreadyAddedEntry(provider, serEntry)) {
L_WARN("Skipping entry %s. Exact entry already present!. Double event triggered?", serEntry->readFromEntryPath);
free(serEntry->descriptorContent);
free(serEntry->readFromEntryPath);
free(serEntry->msgVersionStr);
dynMessage_destroy(serEntry->msgType);
free(serEntry);
continue;
}

bool unique = pubsub_serializationProvider_validateEntry(provider, serEntry);
if (unique && serEntry->valid) { //note only register if unique and valid
Expand Down