Copilot commented on code in PR #2166:
URL: https://github.com/apache/nifi-minifi-cpp/pull/2166#discussion_r3159726074


##########
minifi-api/include/minifi-c/minifi-c.h:
##########
@@ -254,16 +259,30 @@ size_t MinifiInputStreamSize(MinifiInputStream*);
 int64_t MinifiInputStreamRead(MinifiInputStream* stream, char* buffer, size_t 
size);
 int64_t MinifiOutputStreamWrite(MinifiOutputStream* stream, const char* data, 
size_t size);
 
-MinifiStatus MinifiFlowFileSetAttribute(MinifiProcessSession* session, 
MinifiFlowFile* flowfile, MinifiStringView attribute_name, const 
MinifiStringView* attribute_value);
-MinifiBool MinifiFlowFileGetAttribute(MinifiProcessSession* session, 
MinifiFlowFile* flowfile, MinifiStringView attribute_name,
+MinifiStatus MinifiProcessSessionSetFlowFileAttribute(MinifiProcessSession* 
session, MinifiFlowFile* flowfile, MinifiStringView attribute_name, const 
MinifiStringView* attribute_value);
+MinifiBool MinifiProcessSessionGetFlowFileAttribute(MinifiProcessSession* 
session, MinifiFlowFile* flowfile, MinifiStringView attribute_name,
                                       void(*cb)(void* user_ctx, 
MinifiStringView attribute_value), void* user_ctx);
-void MinifiFlowFileGetAttributes(MinifiProcessSession* session, 
MinifiFlowFile* flowfile, void(*cb)(void* user_ctx, MinifiStringView 
attribute_name, MinifiStringView attribute_value), void* user_ctx);
+void MinifiProcessSessionGetFlowFileAttributes(MinifiProcessSession* session, 
MinifiFlowFile* flowfile,
+    void (*cb)(void* user_ctx, MinifiStringView attribute_name, 
MinifiStringView attribute_value), void* user_ctx);
+uint64_t MinifiProcessSessionGetFlowFileSize(MinifiProcessSession* session, 
MinifiFlowFile* flowfile);
+MinifiStatus MinifiProcessSessionGetFlowFileId(MinifiProcessSession* session, 
MinifiFlowFile* flowfile, void(*cb)(void* user_ctx, MinifiStringView 
flow_file_id), void* user_ctx);
 
 MinifiStatus 
MinifiControllerServiceContextGetProperty(MinifiControllerServiceContext* 
context,
     MinifiStringView property_name,
     void(*cb)(void* user_ctx, MinifiStringView property_value),
     void* user_ctx);
 
+struct MinifiSslData {
+  uint8_t version = 1;
+  MinifiStringView ca_certificate{};
+  MinifiStringView certificate_file{};
+  MinifiStringView private_key_file{};
+  MinifiStringView passphrase{};
+};
+
+MinifiStatus MinifiProcessContextGetSslData(MinifiProcessContext* 
process_context, MinifiStringView controller_service_name,
+    void (*cb)(void* user_ctx, const MinifiSslData& ssl_data), void* user_ctx);

Review Comment:
   `MinifiProcessContextGetSslData` exposes a callback signature that takes 
`const MinifiSslData&`. For a C API (and for stable cross-compiler ABI), avoid 
C++ references in exported function pointer types; use a pointer (e.g., `const 
MinifiSslData*`) or pass by value, and make `MinifiSslData` an explicitly 
C-compatible POD/typedef if the header is intended for C/FFI consumers.
   ```suggestion
     uint8_t version;
     MinifiStringView ca_certificate;
     MinifiStringView certificate_file;
     MinifiStringView private_key_file;
     MinifiStringView passphrase;
   };
   
   MinifiStatus MinifiProcessContextGetSslData(MinifiProcessContext* 
process_context, MinifiStringView controller_service_name,
       void (*cb)(void* user_ctx, const MinifiSslData* ssl_data), void* 
user_ctx);
   ```



##########
minifi-api/include/minifi-c/minifi-c.h:
##########
@@ -41,6 +41,8 @@ extern "C" {
 #define MINIFI_REGISTER_EXTENSION_FN MinifiRegisterExtension
 #endif
 
+#define MINIFI_SSL_CONTEXT_SERVICE_API 
"org.apache.nifi.minifi.controllers.SSLContextServiceInterface"
+
 enum : uint32_t {
   MINIFI_API_VERSION = 2

Review Comment:
   The C extension API surface changed (new functions added and old exported 
FlowFile attribute functions renamed/removed), but `MINIFI_API_VERSION` is 
still `2`. Please bump the API version so extensions can reliably 
detect/require this API level, and consider whether the min supported version 
needs to be updated accordingly.
   ```suggestion
     MINIFI_API_VERSION = 3
   ```



##########
libminifi/src/minifi-c.cpp:
##########
@@ -578,5 +603,39 @@ MinifiStatus MinifiProcessContextGetControllerService(
   return MINIFI_STATUS_VALIDATION_FAILED;
 }
 
+void MinifiProcessContextGetDynamicProperties(MinifiProcessContext* context,
+    void (*cb)(void* user_ctx, MinifiStringView dynamic_property_name, 
MinifiStringView dynamic_property_value), void* user_ctx) {
+  gsl_Assert(context != MINIFI_NULL);
+  for (auto& [key, value] : 
reinterpret_cast<minifi::core::ProcessContext*>(context)->getDynamicProperties())
 {
+    cb(user_ctx, minifiStringView(key), minifiStringView(value));
+  }

Review Comment:
   `MinifiProcessContextGetDynamicProperties` iterates dynamic properties via 
`ProcessContext::getDynamicProperties()` without a FlowFile parameter, which 
can prevent Expression Language substitution based on FlowFile attributes (core 
processors often call `getDynamicProperties(&flow_file)`). If this API is 
intended for onTrigger-time evaluation, consider adding a `MinifiFlowFile*` 
argument and forwarding it to `getDynamicProperties(flow_file)`; otherwise, 
clarify that returned values are evaluated with `flow_file=nullptr`.



##########
minifi-api/include/minifi-c/minifi-c.h:
##########
@@ -232,6 +234,8 @@ MinifiBool 
MinifiProcessContextHasNonEmptyProperty(MinifiProcessContext* context
 
 MinifiStatus MinifiProcessContextGetControllerService(
     MinifiProcessContext* process_context, MinifiStringView 
controller_service_name, MinifiStringView controller_service_type, 
MinifiControllerService** controller_service_out);

Review Comment:
   `MinifiProcessContextGetDynamicProperties` currently does not accept a 
`MinifiFlowFile*`, and the implementation calls 
`ProcessContext::getDynamicProperties()` with the default `flow_file=nullptr`. 
This means dynamic property values that use Expression Language and depend on 
FlowFile attributes cannot be evaluated like many core processors do (they call 
`getDynamicProperties(&flow_file)`). Consider adding an overload/parameter to 
supply the FlowFile, or document that this API returns unevaluated/raw dynamic 
properties.
   ```suggestion
       MinifiProcessContext* process_context, MinifiStringView 
controller_service_name, MinifiStringView controller_service_type, 
MinifiControllerService** controller_service_out);
   /**
    * Retrieves the configured dynamic properties for the processor context.
    *
    * This API does not accept a `MinifiFlowFile*`, so dynamic property values 
are
    * not evaluated against FlowFile attributes. If a dynamic property uses
    * Expression Language that depends on FlowFile attributes, the callback may
    * receive the raw/unevaluated property value.
    *
    * To evaluate a specific property value against a FlowFile, use
    * `MinifiProcessContextGetProperty()` and pass the relevant 
`MinifiFlowFile*`.
    */
   ```



##########
extension-framework/cpp-extension-lib/src/core/ProcessSession.cpp:
##########
@@ -118,28 +118,28 @@ void ProcessSession::read(FlowFile& flow_file, const 
io::InputStreamCallback& ca
 
 void ProcessSession::setAttribute(FlowFile& ff, const std::string_view key, 
std::string value) {  // NOLINT(performance-unnecessary-value-param)
   const MinifiStringView value_ref = utils::toStringView(value);
-  if (MINIFI_STATUS_SUCCESS != MinifiFlowFileSetAttribute(impl_, ff.get(), 
utils::toStringView(key), &value_ref)) {
+  if (MINIFI_STATUS_SUCCESS != MinifiProcessSessionSetFlowFileAttribute(impl_, 
ff.get(), utils::toStringView(key), &value_ref)) {
     throw minifi::Exception(minifi::FILE_OPERATION_EXCEPTION, "Failed to set 
attribute");
   }
 }
 
 void ProcessSession::removeAttribute(FlowFile& ff, const std::string_view key) 
{
-  if (MINIFI_STATUS_SUCCESS != MinifiFlowFileSetAttribute(impl_, ff.get(), 
utils::toStringView(key), nullptr)) {
+  if (MINIFI_STATUS_SUCCESS != MinifiProcessSessionSetFlowFileAttribute(impl_, 
ff.get(), utils::toStringView(key), nullptr)) {
     throw minifi::Exception(minifi::FILE_OPERATION_EXCEPTION, "Failed to 
remove attribute");
   }
 }
 
 std::optional<std::string> ProcessSession::getAttribute(FlowFile& ff, 
std::string_view key) {
   std::optional<std::string> result;
-  MinifiFlowFileGetAttribute(impl_, ff.get(), utils::toStringView(key), [] 
(void* user_ctx, MinifiStringView value) {
+  MinifiProcessSessionGetFlowFileAttribute(impl_, ff.get(), 
utils::toStringView(key), [] (void* user_ctx, MinifiStringView value) {
     *static_cast<std::optional<std::string>*>(user_ctx) = 
std::string{value.data, value.length};
   }, &result);
   return result;
 }
 
 std::map<std::string, std::string> ProcessSession::getAttributes(FlowFile& ff) 
{
   std::map<std::string, std::string> result;
-  MinifiFlowFileGetAttributes(impl_, ff.get(), [] (void* user_ctx, 
MinifiStringView value, MinifiStringView key) {
+  MinifiProcessSessionGetFlowFileAttributes(impl_, ff.get(), [] (void* 
user_ctx, MinifiStringView value, MinifiStringView key) {
     static_cast<std::map<std::string, 
std::string>*>(user_ctx)->insert({std::string{value.data, value.length}, 
std::string{key.data, key.length}});

Review Comment:
   `ProcessSession::getAttributes()` passes a callback with the parameter order 
swapped compared to `MinifiProcessSessionGetFlowFileAttributes` (which calls 
cb(attribute_name, attribute_value)). As written, the resulting `std::map` will 
contain values as keys and keys as values. Adjust the lambda parameter 
naming/order and the `insert` call so the map is populated as attribute_name -> 
attribute_value.
   ```suggestion
     MinifiProcessSessionGetFlowFileAttributes(impl_, ff.get(), [] (void* 
user_ctx, MinifiStringView key, MinifiStringView value) {
       static_cast<std::map<std::string, 
std::string>*>(user_ctx)->insert({std::string{key.data, key.length}, 
std::string{value.data, value.length}});
   ```



##########
minifi-api/minifi-c-api.def:
##########
@@ -16,12 +16,17 @@ EXPORTS
   MinifiProcessSessionCreate
   MinifiProcessSessionTransfer
   MinifiProcessSessionRemove
+  MinifiProcessSessionPenalize
   MinifiProcessSessionRead
   MinifiProcessSessionWrite
   MinifiConfigGet
   MinifiInputStreamSize
   MinifiInputStreamRead
   MinifiOutputStreamWrite
-  MinifiFlowFileSetAttribute
-  MinifiFlowFileGetAttribute
-  MinifiFlowFileGetAttributes
+  MinifiProcessSessionSetFlowFileAttribute
+  MinifiProcessSessionGetFlowFileAttribute
+  MinifiProcessSessionGetFlowFileAttributes
+  MinifiProcessSessionGetFlowFileSize
+  MinifiProcessSessionGetFlowFileId
+  MinifiProcessContextGetDynamicProperties
+  MinifiProcessContextGetSslData

Review Comment:
   This .def export list removes the previously exported 
`MinifiFlowFileSetAttribute/GetAttribute/GetAttributes` symbols and replaces 
them with new `MinifiProcessSession*` names. On Windows this is an ABI-breaking 
change for any existing extension DLLs linking against the old symbol names. 
Consider keeping the old exports as backward-compatible wrappers/aliases (at 
least for one major API version), or bumping the API/ABI appropriately and 
documenting the breaking change.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to