瀏覽代碼

HPCC-18831: Add JLIB support for rooted JSON writers

Signed-off-by: Anthony Fishbeck <anthony.fishbeck@lexisnexis.com>
Anthony Fishbeck 7 年之前
父節點
當前提交
c25e4b057f

+ 2 - 1
common/remote/sockfile.cpp

@@ -6298,7 +6298,7 @@ public:
             reply.append(cursorHandle);
         else // outFmt_Xml || outFmt_Json
         {
-            responseWriter.setown(createIXmlWriterExt(0, 0, nullptr, outFmt_Xml == outputFormat ? WTStandard : WTJSON));
+            responseWriter.setown(createIXmlWriterExt(0, 0, nullptr, outFmt_Xml == outputFormat ? WTStandard : WTJSONObject));
             responseWriter->outputBeginNested("Response", true);
             responseWriter->outputUInt(cursorHandle, sizeof(cursorHandle), "handle");
         }
@@ -6442,6 +6442,7 @@ public:
         if (outFmt_Binary != outputFormat)
         {
             responseWriter->outputEndNested("Response");
+            responseWriter->finalize();
             PROGLOG("Response: %s", responseWriter->str());
             reply.append(responseWriter->length(), responseWriter->str());
         }

+ 1 - 1
ecl/hthor/hthor.cpp

@@ -950,7 +950,7 @@ void CHThorXmlWriteActivity::execute()
     headerLength = header.length();
     diskout->write(headerLength, header.str());
 
-    Owned<IXmlWriterExt> writer = createIXmlWriterExt(helper.getXmlFlags(), 0, NULL, (kind==TAKjsonwrite) ? WTJSON : WTStandard);
+    Owned<IXmlWriterExt> writer = createIXmlWriterExt(helper.getXmlFlags(), 0, NULL, (kind==TAKjsonwrite) ? WTJSONRootless : WTStandard);
     writer->outputBeginArray(rowTag); //need to set up the array
     writer->clear(); //but not output it
 

文件差異過大導致無法顯示
+ 2 - 2
esp/logging/test/main.cpp


+ 3 - 3
esp/services/esdl_svc_engine/esdl_binding.cpp

@@ -502,7 +502,7 @@ void EsdlServiceImpl::handleServiceRequest(IEspContext &context,
              javactx->writeResult(m_esdl, srvdef.queryName(), mthdef.queryResponseType(), javaRespWriter);
              origResp.set(javaRespWriter->str());
 
-             Owned<IXmlWriterExt> finalRespWriter = createIXmlWriterExt(0, 0, NULL, (flags & ESDL_BINDING_RESPONSE_JSON) ? WTJSON : WTStandard);
+             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);
 
              out.append(finalRespWriter->str());
@@ -530,7 +530,7 @@ void EsdlServiceImpl::handleServiceRequest(IEspContext &context,
             if (isPublishedQuery(implType))
             {
                 context.addTraceSummaryTimeStamp(LogNormal, "srt-procres");
-                Owned<IXmlWriterExt> respWriter = createIXmlWriterExt(0, 0, NULL, (flags & ESDL_BINDING_RESPONSE_JSON) ? WTJSON : WTStandard);
+                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);
                 context.addTraceSummaryTimeStamp(LogNormal, "end-procres");
 
@@ -2514,7 +2514,7 @@ void EsdlBindingImpl::getRequestContent(IEspContext &context, StringBuffer & req
                Owned<IPropertyTree> tgtctx;
                Owned<IPropertyTree> req_pt = createPTreeFromXMLString(xmlstr.length(), xmlstr.str(), false);
 
-               Owned<IXmlWriterExt> writer = createIXmlWriterExt(0, 0, NULL, (flags & ESDL_BINDING_REQUEST_JSON) ? WTJSON : WTStandard);
+               Owned<IXmlWriterExt> writer = createIXmlWriterExt(0, 0, NULL, (flags & ESDL_BINDING_REQUEST_JSON) ? WTJSONRootless : WTStandard);
 
                m_pESDLService->m_pEsdlTransformer->process(context, EsdlRequestMode, m_espServiceName.get(), methodname, *req_pt.get(), writer.get(), flags, ns);
 

+ 4 - 0
plugins/javaembed/javaembed.cpp

@@ -2119,6 +2119,10 @@ public:
     {
         throwUnexpected();
     }
+    virtual void finalize() override
+    {
+    }
+
     virtual IInterface *saveLocation() const {return nullptr;}
     virtual void rewindTo(IInterface *loc)
     {

+ 3 - 3
roxie/ccd/ccdprotocol.cpp

@@ -507,7 +507,7 @@ public:
 
 IXmlWriterExt * createAdaptiveRESTWriterExt(AdaptiveRoot model, const char *tagname, unsigned _flags, unsigned _initialIndent, IXmlStreamFlusher *_flusher, XMLWriterType xmlType)
 {
-    if (xmlType==WTJSON)
+    if (xmlType==WTJSONRootless)
         return new AdaptiveRESTJsonWriter(model, _flags, _initialIndent, _flusher);
     return new AdaptiveRESTXmlWriter(model, tagname, _flags, _initialIndent, _flusher);
 }
@@ -607,7 +607,7 @@ public:
                         rootType = AdaptiveRoot::RootArray;
                 }
 
-                Owned<IXmlWriter> xmlwriter = createAdaptiveRESTWriterExt(rootType, tagName, writeFlags, 1, response, (response->mlFmt==MarkupFmt_JSON) ? WTJSON : WTStandard);
+                Owned<IXmlWriter> xmlwriter = createAdaptiveRESTWriterExt(rootType, tagName, writeFlags, 1, response, (response->mlFmt==MarkupFmt_JSON) ? WTJSONRootless : WTStandard);
                 xmlwriter->outputBeginArray("Row");
                 return xmlwriter.getClear();
             }
@@ -1174,7 +1174,7 @@ public:
             appendJSONName(tag, name);
             content->append(tag);
         }
-        Owned<IXmlWriter> xmlwriter = createIXmlWriterExt(XWFnoindent, 1, content, WTJSON);
+        Owned<IXmlWriter> xmlwriter = createIXmlWriterExt(XWFnoindent, 1, content, WTJSONRootless);
         return xmlwriter.getClear();
     }
     void outputContent()

+ 1 - 1
roxie/ccd/ccdserver.cpp

@@ -11966,7 +11966,7 @@ public:
         headerLength = header.length();
         diskout->write(header.length(), header.str());
 
-        Owned<IXmlWriterExt> writer = createIXmlWriterExt(xmlHelper.getXmlFlags(), 0, NULL, (kind==TAKjsonwrite) ? WTJSON : WTStandard);
+        Owned<IXmlWriterExt> writer = createIXmlWriterExt(xmlHelper.getXmlFlags(), 0, NULL, (kind==TAKjsonwrite) ? WTJSONRootless : WTStandard);
         writer->outputBeginArray(rowTag); //need to set this
         writer->clear(); //but not output it
 

+ 3 - 1
rtl/eclrtl/rtlformat.cpp

@@ -2029,7 +2029,9 @@ CommonXmlWriter * CreateCommonXmlWriter(unsigned _flags, unsigned _initialIndent
 
 IXmlWriterExt * createIXmlWriterExt(unsigned _flags, unsigned _initialIndent, IXmlStreamFlusher *_flusher, XMLWriterType xmlType)
 {
-    if (xmlType==WTJSON)
+    if (xmlType==WTJSONRootless)
         return new CommonJsonWriter(_flags, _initialIndent, _flusher);
+    if (xmlType==WTJSONObject)
+        return new CommonJsonObjectWriter(_flags, _initialIndent, _flusher);
     return CreateCommonXmlWriter(_flags, _initialIndent, _flusher, xmlType);
 }

+ 34 - 1
rtl/eclrtl/rtlformat.hpp

@@ -12,11 +12,13 @@ interface IXmlWriterExt : extends IXmlWriter
     virtual IXmlWriterExt & clear() = 0;
     virtual size32_t length() const = 0;
     virtual const char *str() const = 0;
+
     virtual IInterface *saveLocation() const = 0;
     virtual void rewindTo(IInterface *location) = 0;
     virtual void cutFrom(IInterface *location, StringBuffer& databuf) = 0;
     virtual void outputNumericString(const char *field, const char *fieldname) = 0;
     virtual void outputInline(const char* text) = 0;
+    virtual void finalize() = 0;
 };
 
 class ECLRTL_API SimpleOutputWriter : implements IXmlWriterExt, public CInterface
@@ -30,6 +32,8 @@ public:
     virtual SimpleOutputWriter & clear() override;
     virtual size32_t length() const override                { return out.length(); }
     virtual const char * str() const override               { return out.str(); }
+    virtual void finalize() override                        {}
+
 
     virtual void outputQuoted(const char *text) override;
     virtual void outputQString(unsigned len, const char *field, const char *fieldname) override;
@@ -126,6 +130,8 @@ public:
     virtual IXmlWriterExt & clear();
     virtual unsigned length() const                                 { return out.length(); }
     virtual const char * str() const                                { return out.str(); }
+    virtual void finalize() override                                {}
+
     virtual IInterface *saveLocation() const
     {
         if (flusher)
@@ -217,6 +223,7 @@ public:
     virtual IXmlWriterExt & clear();
     virtual unsigned length() const                                 { return out.length(); }
     virtual const char * str() const                                { return out.str(); }
+    virtual void finalize() override                                {}
     virtual void rewindTo(unsigned int prevlen)                     { if (prevlen < out.length()) out.setLength(prevlen); }
     virtual IInterface *saveLocation() const
     {
@@ -278,6 +285,31 @@ protected:
     bool needDelimiter;
 };
 
+class ECLRTL_API CommonJsonObjectWriter : public CommonJsonWriter
+{
+public:
+    CommonJsonObjectWriter(unsigned _flags, unsigned initialIndent,  IXmlStreamFlusher *_flusher) : CommonJsonWriter(_flags, initialIndent, _flusher)
+    {
+        outputBeginRoot();
+    }
+    ~CommonJsonObjectWriter()
+    {
+        if (!final)
+            outputEndRoot();
+    }
+    virtual void finalize() override
+    {
+        if (!final)
+        {
+            final=true;
+            outputEndRoot();
+        }
+    }
+
+private:
+    bool final=false;
+};
+
 class ECLRTL_API CPropertyTreeWriter : public CSimpleInterfaceOf<IXmlWriter>
 {
 public:
@@ -348,7 +380,7 @@ public:
     virtual void outputData(unsigned len, const void *field, const char *fieldname);
 };
 
-enum XMLWriterType{WTStandard, WTEncoding, WTEncodingData64, WTJSON} ;
+enum XMLWriterType{WTStandard, WTEncoding, WTEncodingData64, WTJSONObject, WTJSONRootless} ;
 ECLRTL_API CommonXmlWriter * CreateCommonXmlWriter(unsigned _flags, unsigned initialIndent=0, IXmlStreamFlusher *_flusher=NULL, XMLWriterType xmlType=WTStandard);
 ECLRTL_API IXmlWriterExt * createIXmlWriterExt(unsigned _flags, unsigned initialIndent=0, IXmlStreamFlusher *_flusher=NULL, XMLWriterType xmlType=WTStandard);
 
@@ -516,6 +548,7 @@ public:
 
     virtual unsigned length() const { return out.length(); }
     virtual const char* str() const { return out.str(); }
+    virtual void finalize() override {}
     virtual void rewindTo(IInterface* location) { };
     virtual void cutFrom(IInterface *location, StringBuffer& databuf) { };
     virtual IInterface* saveLocation() const

+ 1 - 1
thorlcr/activities/xmlwrite/thxmlwriteslave.cpp

@@ -68,7 +68,7 @@ public:
             if (calcFileCrc)
                 fileCRC.tally(out.length(), out.str());
         }
-        Owned<IXmlWriterExt> writer = createIXmlWriterExt(helper->getXmlFlags(), 0, NULL, (kind==TAKjsonwrite) ? WTJSON : WTStandard);
+        Owned<IXmlWriterExt> writer = createIXmlWriterExt(helper->getXmlFlags(), 0, NULL, (kind==TAKjsonwrite) ? WTJSONRootless : WTStandard);
         writer->outputBeginArray(rowTag); //need this to format rows, even if not outputting it below
         while(!abortSoon)
         {