Преглед на файлове

HPCC-24582 Add DESDL support for numeric boolean output

Signed-off-by: Anthony Fishbeck <anthony.fishbeck@lexisnexisrisk.com>
Anthony Fishbeck преди 4 години
родител
ревизия
e583fa4187
променени са 3 файла, в които са добавени 44 реда и са изтрити 5 реда
  1. 1 0
      esp/esdllib/esdl_transformer.hpp
  2. 34 1
      esp/esdllib/esdl_transformer2.cpp
  3. 9 4
      esp/services/esdl_svc_engine/esdl_binding.cpp

+ 1 - 0
esp/esdllib/esdl_transformer.hpp

@@ -46,6 +46,7 @@ typedef void REQUEST_HOOK (IEspContext& ctx, IEspStruct& req, StringBuffer& quer
 
 #define ESDL_TRANS_TRIM                0x0010
 #define ESDL_TRANS_NO_DEFAULTS        0x0020
+#define ESDL_TRANS_NUMERIC_BOOLEAN    0x0040
 
 #define ESDL_TRANS_INPUT_XMLTAG        0x0100
 #define ESDL_TRANS_OUTPUT_XMLTAG    0x0200

+ 34 - 1
esp/esdllib/esdl_transformer2.cpp

@@ -311,7 +311,10 @@ void Esdl2Base::output_content(Esdl2TransformerContext &ctx, const char * conten
                 switch (type_id)
                 {
                     case ESDLT_BOOL:
-                        ctx.writer->outputBool(strToBool(content), tagname);
+                        if (ctx.flags & ESDL_TRANS_NUMERIC_BOOLEAN)
+                            ctx.writer->outputNumericString(strToBool(content) ? "1" : "0", tagname);
+                        else
+                            ctx.writer->outputBool(strToBool(content), tagname);
                         break;
                     case ESDLT_INT8:
                     case ESDLT_INT16:
@@ -1558,6 +1561,30 @@ Esdl2Transformer::~Esdl2Transformer()
 
 }
 
+static const char *queryMethodMetaData(IEsdlDefMethod *mthdef, IEsdlMethodInfo *mi, const char *tag)
+{
+    if (mthdef)
+        return mthdef->queryMetaData(tag);
+    if (mi)
+        return mi->queryMetaData(tag);
+    return nullptr;
+}
+
+static void updateTransformFlags(EsdlProcessMode mode, IEsdlDefMethod *mthdef, IEsdlMethodInfo *mi, unsigned int &flags)
+{
+    if (mode==EsdlProcessMode::EsdlResponseMode)
+    {
+        const char *numeric_bool = queryMethodMetaData(mthdef, mi, "numeric_bool");
+        if (!isEmptyString(numeric_bool)) //method level wins
+        {
+            if (strToBool(numeric_bool))
+                flags |= ESDL_TRANS_NUMERIC_BOOLEAN;
+            else
+                flags &= ~ESDL_TRANS_NUMERIC_BOOLEAN;
+        }
+    }
+}
+
 int Esdl2Transformer::process(IEspContext &ctx, EsdlProcessMode mode, const char* service, const char *method, StringBuffer &out, const char *in, unsigned int flags, const char *ns, const char *schema_location)
 {
     int rc = 0;
@@ -1565,6 +1592,8 @@ int Esdl2Transformer::process(IEspContext &ctx, EsdlProcessMode mode, const char
     if (!mi)
         throw MakeStringException(-1, "Error processing ESDL - method '%s'not found", method);
 
+    updateTransformFlags(mode, nullptr, mi, flags);
+
     const char *root_type=NULL;
     const char *root_name=NULL;
     if (mode==EsdlRequestMode)
@@ -1645,6 +1674,8 @@ int Esdl2Transformer::process(IEspContext &ctx, EsdlProcessMode mode, const char
     if (!mi)
         throw MakeStringException(-1, "ESDL - method '%s::%s'not found", service, method);
 
+    updateTransformFlags(mode, nullptr, mi, flags);
+
     const char *root_type=NULL;
     if (mode==EsdlRequestMode)
         root_type=mi->queryRequestType();
@@ -1791,6 +1822,8 @@ void Esdl2Transformer::processHPCCResult(IEspContext &ctx, IEsdlDefMethod &mthde
     StartTag stag;
     int depth=1;
 
+    updateTransformFlags(EsdlResponseMode, &mthdef, nullptr, flags);
+
     IEsdlDefinition *esdl = m_def.get();
 
     if (!esdl)

+ 9 - 4
esp/services/esdl_svc_engine/esdl_binding.cpp

@@ -758,6 +758,11 @@ void EsdlServiceImpl::handleServiceRequest(IEspContext &context,
 
         implType = getEsdlMethodImplType(tgtcfg->queryProp("@querytype"));
 
+        bool use_numeric_bool = srvdef.getPropBool("numeric_bool");
+        unsigned txResultFlags = ESDL_TRANS_OUTPUT_ROOT;
+        if (use_numeric_bool)
+            txResultFlags |= ESDL_TRANS_NUMERIC_BOOLEAN;
+
         if (implType==EsdlMethodImplJava)
         {
             const char *javaPackage = srvdef.queryName();
@@ -812,7 +817,7 @@ void EsdlServiceImpl::handleServiceRequest(IEspContext &context,
              origResp.set(javaRespWriter->str());
 
              Owned<IXmlWriterExt> finalRespWriter = createIXmlWriterExt(0, 0, NULL, (flags & ESDL_BINDING_RESPONSE_JSON) ? WTJSONRootless : WTStandard);
-             m_pEsdlTransformer->processHPCCResult(context, mthdef, origResp.str(), finalRespWriter, logdata, ESDL_TRANS_OUTPUT_ROOT, ns, schema_location);
+             m_pEsdlTransformer->processHPCCResult(context, mthdef, origResp.str(), finalRespWriter, logdata, txResultFlags, ns, schema_location);
 
              out.append(finalRespWriter->str());
         }
@@ -849,7 +854,7 @@ void EsdlServiceImpl::handleServiceRequest(IEspContext &context,
 
             context.addTraceSummaryTimeStamp(LogNormal, "srt-procres");
             Owned<IXmlWriterExt> finalRespWriter = createIXmlWriterExt(0, 0, NULL, (flags & ESDL_BINDING_RESPONSE_JSON) ? WTJSONRootless : WTStandard);
-            m_pEsdlTransformer->processHPCCResult(context, mthdef, origResp.str(), finalRespWriter, logdata, ESDL_TRANS_OUTPUT_ROOT, ns, schema_location);
+            m_pEsdlTransformer->processHPCCResult(context, mthdef, origResp.str(), finalRespWriter, logdata, txResultFlags, ns, schema_location);
             context.addTraceSummaryTimeStamp(LogNormal, "end-procres");
 
             out.append(finalRespWriter->str());
@@ -878,7 +883,7 @@ void EsdlServiceImpl::handleServiceRequest(IEspContext &context,
             {
                 context.addTraceSummaryTimeStamp(LogNormal, "srt-procres");
                 Owned<IXmlWriterExt> respWriter = createIXmlWriterExt(0, 0, NULL, (flags & ESDL_BINDING_RESPONSE_JSON) ? WTJSONRootless : WTStandard);
-                m_pEsdlTransformer->processHPCCResult(context, mthdef, origResp.str(), respWriter.get(), logdata, ESDL_TRANS_OUTPUT_ROOT, ns, schema_location);
+                m_pEsdlTransformer->processHPCCResult(context, mthdef, origResp.str(), respWriter.get(), logdata, txResultFlags, ns, schema_location);
                 context.addTraceSummaryTimeStamp(LogNormal, "end-procres");
 
                 out.append(respWriter->str());
@@ -886,7 +891,7 @@ void EsdlServiceImpl::handleServiceRequest(IEspContext &context,
             else if(implType==EsdlMethodImplProxy)
                 getSoapBody(out, origResp);
             else
-                m_pEsdlTransformer->process(context, EsdlResponseMode, srvdef.queryName(), mthdef.queryName(), out, origResp.str(), ESDL_TRANS_OUTPUT_ROOT, ns, schema_location);
+                m_pEsdlTransformer->process(context, EsdlResponseMode, srvdef.queryName(), mthdef.queryName(), out, origResp.str(), txResultFlags, ns, schema_location);
         }
     }