USING DocxFactory.* FROM PROPATH.
def var cDataFile as char init "/workspace/app/backend/webinar_data.json".
def var cDoc as char.
def var cData as longchar no-undo.
def var cTemplateName as char init "/workspace/app/backend/Template_Docs_Webinar" no-undo.
def var iCellId as int no-undo.
message ctemplatename skip "full path:" search(cTemplateName + ".docx").
WordProcessingCompiler:compileTemplate(cTemplateName + ".docx", cTemplateName + ".dfw").
message "after compile".
WordProcessingMerger:loadTemplate(cTemplateName + ".dfw").
//OS-CREATE-DIR VALUE("/workspace/data/documents").
message "after loadtemplate".
copy-lob from file cDataFile to cData.
WordProcessingMerger:merge(cData).
cDoc = "Result.docx".
message "current dir:" search(".").
//poParameter:Result = replace(cDoc, "/workspace/data", "").
WordProcessingMerger:saveDoc("/workspace/app/backend/Result.docx").
/*------------------------------------------------------------------------
File : ExportStruct
Purpose :
Syntax :
Description :
Author(s) : Build.One
Created :
Notes :
----------------------------------------------------------------------*/
USING Progress.Lang.*.
USING Consultingwerk.OERA.IBusinessService FROM PROPATH.
USING Consultingwerk.OERA.IBusinessTaskCatalogInfo FROM PROPATH.
USING Consultingwerk.OERA.BusinessTaskCatalogData FROM PROPATH.
USING Akioma.Swat.Struct.StructParser FROM PROPATH.
USING Consultingwerk.Exceptions.Exception FROM PROPATH.
USING Akioma.Swat.TextHelper FROM PROPATH.
USING Akioma.Swat.Struct.StructHelper FROM PROPATH.
USING Progress.Json.ObjectModel.JsonObject FROM PROPATH.
USING OpenEdge.Net.HTTP.IHttpRequest FROM PROPATH.
USING OpenEdge.Net.HTTP.IHttpResponse FROM PROPATH.
USING OpenEdge.Net.HTTP.ClientBuilder FROM PROPATH.
USING OpenEdge.Net.HTTP.StatusCodeEnum FROM PROPATH.
USING OpenEdge.Net.HTTP.RequestBuilder FROM PROPATH.
USING Akioma.Swat.RecordHdlHelper FROM PROPATH.
USING Akioma.Swat.System.TypeDatasetModel FROM PROPATH.
USING Akioma.Swat.Util.FileHelper FROM PROPATH.
USING Akioma.Swat.Struct.StructDatasetModel FROM PROPATH.
USING Consultingwerk.Util.ErrorHelper FROM PROPATH.
USING DocxFactory.* FROM PROPATH.
USING Customer.TreeEntity.* FROM PROPATH.
BLOCK-LEVEL ON ERROR UNDO, THROW.
CLASS Customer.TreeEntity.ExportStruct
IMPLEMENTS IBusinessService, IBusinessTaskCatalogInfo:
METHOD PUBLIC Consultingwerk.OERA.IBusinessTaskCatalogData GetCatalogData ():
DEFINE VARIABLE oCatalog AS BusinessTaskCatalogData NO-UNDO .
oCatalog = NEW BusinessTaskCatalogData (THIS-OBJECT:GetClass():TypeName,
"GenerateDocument",
GET-CLASS (Customer.TreeEntity.GenerateDocumentParameter)).
RETURN oCatalog .
END METHOD.
METHOD PUBLIC VOID GenerateDocument(poParameter AS Customer.TreeEntity.GenerateDocumentParameter):
DEFINE VARIABLE oParser AS StructParser NO-UNDO.
DEFINE VARIABLE i AS INTEGER NO-UNDO.
WordProcessingMerger:loadTemplate("/workspace/data/templates/master/TreeEntity.dfw").
WordProcessingMerger:paste("TreeEntity"). // insert root bookmark
oParser = NEW StructParser().
oParser:processNode:Subscribe(THIS-OBJECT:ProcessTreeEntry).
oParser:ScanStruct(poParameter:OwnerHdl, STRING(poParameter:Serialize())).
WordProcessingMerger:saveDoc("/workspace/data/documents/test.docx").
CATCH oErr AS Progress.Lang.AppError:
MESSAGE oErr:ReturnValue VIEW-AS ALERT-BOX.
END CATCH.
END METHOD.
METHOD PROTECTED VOID ProcessTreeEntry(INPUT pcNodeHdl AS CHARACTER, INPUT-OUTPUT pcOptions AS CHARACTER):
DEFINE VARIABLE cTextType AS CHARACTER NO-UNDO.
DEFINE VARIABLE cNodeTypeHdl AS CHARACTER NO-UNDO.
DEFINE VARIABLE cNodeTypeKey AS CHARACTER NO-UNDO.
DEFINE VARIABLE cDataRecordHdl AS CHARACTER NO-UNDO.
DEFINE VARIABLE cDataRecordKey AS CHARACTER NO-UNDO.
DEFINE VARIABLE lcText AS LONGCHAR NO-UNDO.
DEFINE VARIABLE oStructDSM AS StructDatasetModel NO-UNDO.
DEFINE VARIABLE oGenerateOptions AS GenerateDocumentParameter NO-UNDO.
MESSAGE pcNodeHdl.
oGenerateOptions = NEW GenerateDocumentParameter().
oGenerateOptions:Deserialize(pcOptions).
oStructDSM = NEW StructDatasetModel().
oStructDSM:Struct:Filter:SelfHdl:EQ(pcNodeHdl):Run().
IF NOT oStructDSM:Struct:Available THEN
UNDO, THROW NEW Exception(SUBSTITUTE("Could not find Struct with hdl '&1'!", pcNodeHdl)).
cNodeTypeHdl = oStructDSM:Struct:TypeHdl.
cNodeTypeKey = RecordHdlHelper:GetKeyFromHdl(cNodeTypeHdl).
//IF NOT CAN-DO(oGenerateOptions:ValidNodeTypes, cNodeTypeKey) THEN
// RETURN.
MESSAGE CNodeTypeKey.
CASE cNodeTypeKey:
WHEN "pos.bom.txtmod" THEN
cDataRecordHdl = RecordHdlHelper:GetValueFromStruct(pcNodeHdl, "TxtModHdl").
OTHERWISE
cDataRecordHdl = RecordHdlHelper:GetValueFromStruct(pcNodeHdl, "SelfHdl").
END CASE.
//cDataRecordKey = RecordHdlHelper:GetKeyFromHdl(cDataRecordHdl).
//cDataRecordKey = RecordHdlHelper:GetValueFromStruct(pcNodeHdl, "SelfKey").
END METHOD.
METHOD PROTECTED CHARACTER GetTextTypeForRecord(pcRecordHdl AS CHARACTER):
DEFINE VARIABLE cTextType AS CHARACTER NO-UNDO INITIAL ?.
DEFINE VARIABLE cTableId AS CHARACTER NO-UNDO.
DEFINE VARIABLE oTypeDSM AS TypeDatasetModel NO-UNDO.
cTableId = RecordHdlHelper:GetTableIdFromHdl(pcRecordHdl).
CASE cTableId:
WHEN "057" THEN
cTextType = "txt.bompos.grp".
WHEN "009" THEN
cTextType = "txt.mod.main".
WHEN "062" THEN
cTextType = "txt.txtposbom.main".
END CASE.
/*
IF cTableId > "" THEN
DO:
oTypeDSM = NEW TypeDatasetModel().
oTypeDSM:Type:Filter:TargetTableId:EQ(cTableId).
oTypeDSM:Type:SortBy:TypeSort:Ascending().
oTypeDSM:Type:Fill().
IF oTypeDSM:Type:Available THEN
cTextType = oTypeDSM:Type:SelfHdl.
END.
*/
RETURN cTextType.
END METHOD.
END CLASS.
/*------------------------------------------------------------------------
File : GenerateDocumentParameter
----------------------------------------------------------------------*/
USING Progress.Lang.*.
USING Consultingwerk.JsonSerializable FROM PROPATH.
BLOCK-LEVEL ON ERROR UNDO, THROW.
CLASS Customer.TreeEntity.GenerateDocumentParameter
&IF "{&FrameworkSerializationType}" EQ "XML" OR PROVERSION BEGINS "10.2":U &THEN
INHERITS XmlSerializable:
&ELSE
INHERITS JsonSerializable:
&ENDIF
// Data processing properies
{Consultingwerk/JsonSerializableProperty.i OwnerHdl CHARACTER}. // owner of the tree structure
{Consultingwerk/JsonSerializableProperty.i OutputDirectoryParameter CHARACTER "INITIAL 'AudioExtDoc'"}. // parameter record selfkey, for specifying an output directory
{Consultingwerk/JsonSerializableProperty.i ValidNodeTypes CHARACTER "INITIAL '*'"}. // can-do pattern of valid node types
{Consultingwerk/JsonSerializableProperty.i Options CHARACTER}. // custom options parameter
CONSTRUCTOR PUBLIC GenerateDocumentParameter ():
SUPER ().
THIS-OBJECT:AddSerializableProperties ("{&SerializableProperties}":U) .
END CONSTRUCTOR.
END CLASS.
block-level on error undo, throw.
USING Progress.Json.ObjectModel.*.
PROCEDURE UploadFileToSharePoint:
DEFINE INPUT PARAMETER pcFileLocation AS CHARACTER NO-UNDO.
DEFINE INPUT PARAMETER pcFileName AS CHARACTER NO-UNDO.
DEFINE OUTPUT PARAMETER pcServerFileName AS CHARACTER NO-UNDO.
DEFINE VARIABLE oLib AS OpenEdge.Net.HTTP.IHttpClientLibrary NO-UNDO.
DEFINE VARIABLE oClient AS OpenEdge.Net.HTTP.IHttpClient NO-UNDO.
DEFINE VARIABLE oRequest AS OpenEdge.Net.HTTP.IHttpRequest NO-UNDO.
DEFINE VARIABLE oResponse AS OpenEdge.Net.HTTP.IHttpResponse NO-UNDO.
DEFINE VARIABLE oRequestBody AS OpenEdge.Net.MultipartEntity NO-UNDO.
DEFINE VARIABLE oPart AS OpenEdge.Net.MessagePart NO-UNDO.
DEFINE VARIABLE oData AS OpenEdge.Core.Memptr NO-UNDO.
DEFINE VARIABLE oJsonObject AS JsonObject NO-UNDO.
DEFINE VARIABLE mpfile AS MEMPTR NO-UNDO.
FILE-INFO:FILE-NAME = SUBSTITUTE("&1/&2", pcFileLocation, pcFileName).
COPY-LOB FROM FILE file-info:full-pathname TO mpfile.
oData = NEW OpenEdge.Core.Memptr(mpfile).
oPart = NEW OpenEdge.Net.MessagePart(SUBSTITUTE('application/octet-stream; name=file', pcFileName), oData).
oPart:Headers:Put(OpenEdge.Net.HTTP.HttpHeaderBuilder:Build("Content-Disposition"):Value(SUBSTITUTE('form-data; name="file"; filename="&1"', pcFileName)):Header).
oPart:Headers:Put(OpenEdge.Net.HTTP.HttpHeaderBuilder:Build("Content-Type"):Value("application/vnd.openxmlformats-officedocument.wordprocessingml.document"):Header).
oRequestBody = NEW OpenEdge.Net.MultipartEntity().
oRequestBody:AddPart(oPart).
oLib = OpenEdge.Net.HTTP.Lib.ClientLibraryBuilder:Build():sslVerifyHost(FALSE):Library.
oClient = OpenEdge.Net.HTTP.ClientBuilder:Build():UsingLibrary(oLib):SetNumRetries(0):Client.
oRequest = OpenEdge.Net.HTTP.RequestBuilder:Post("http://gateway:3000/resource/graph/files", oRequestBody)
:ContentType("multipart/form-data")
:AddHeader("MIME-Version", "1.0")
:AddHeader("Connection", "Keep-Alive")
:WithData(oRequestBody, "multipart/form-data")
:Request.
oResponse = oClient:Execute(oRequest).
IF oResponse:ContentType = 'application/json' THEN
DO:
oJsonObject = CAST(oResponse:Entity, JsonObject).
pcServerFileName = oJsonObject:GetCharacter("serverFileName").
END.
CATCH e AS Progress.Lang.AppError :
MESSAGE 'Error' SKIP e:ReturnValue SKIP e:GetMessage(1).
END CATCH.
FINALLY:
SET-SIZE(mpfile) = 0.
END FINALLY.
END PROCEDURE.
PROCEDURE DownloadFileFromSharePoint:
DEFINE INPUT PARAMETER pcServerFileName AS CHARACTER NO-UNDO.
DEFINE INPUT PARAMETER pcOutputFileName AS CHARACTER NO-UNDO.
DEFINE VARIABLE oLib AS OpenEdge.Net.HTTP.IHttpClientLibrary NO-UNDO.
DEFINE VARIABLE oClient AS OpenEdge.Net.HTTP.IHttpClient NO-UNDO.
DEFINE VARIABLE oRequest AS OpenEdge.Net.HTTP.IHttpRequest NO-UNDO.
DEFINE VARIABLE oResponse AS OpenEdge.Net.HTTP.IHttpResponse NO-UNDO.
DEFINE VARIABLE oJsonObject AS JsonObject NO-UNDO.
DEFINE VARIABLE oPayload AS OpenEdge.Core.Memptr NO-UNDO.
oLib = OpenEdge.Net.HTTP.Lib.ClientLibraryBuilder:Build():sslVerifyHost(FALSE):Library.
oClient = OpenEdge.Net.HTTP.ClientBuilder:Build():UsingLibrary(oLib):SetNumRetries(0):Client.
oRequest = OpenEdge.Net.HTTP.RequestBuilder:Get(SUBSTITUTE("http://gateway:3000/resource/graph/files/&1/ConvertToPdf", pcServerFileName)):Request.
oResponse = oClient:Execute(oRequest).
IF oResponse:ContentType = 'application/json' THEN
DO:
oJsonObject = CAST(oResponse:Entity, JsonObject).
MESSAGE STRING(oJsonObject:GetJsonText()).
END.
ELSE
DO:
oPayload = CAST(oResponse:Entity, OpenEdge.Core.ByteBucket):GetBytes().
COPY-LOB oPayload:Value TO FILE pcOutputFileName.
END.
CATCH e AS Progress.Lang.AppError :
MESSAGE 'Error' SKIP e:ReturnValue SKIP e:GetMessage(1).
END CATCH.
END PROCEDURE.
DEFINE VARIABLE cServerFileName AS CHARACTER NO-UNDO.
RUN UploadFileToSharePoint(SUBSTITUTE("&1/master", Akioma.Swat.SessionManager:DataDirectoryServer), "Doc1.docx", OUTPUT cServerFileName).
RUN DownloadFileFromSharePoint(cServerFileName, SUBSTITUTE("&1/&2", SESSION:TEMP-DIR, "myFile2.pdf")).