// This rule exports dimension metadata from Enterprise Data Management (EDM), and then imports the metadata into Planning. // The rule is hard-coded for connections, artifacts, files, and jobs used in the tutorial. // 1. Initialize input variables // EDM instance String EDMapplicationName = 'Corporate Planning' // Registered Planning application name String EDMdimensionName = 'Product' // Managed dimension name String EDMconnectionName = 'Production' // Connection name for Planning application String EDMexportFileName = 'edmc-groovy-product.csv' // Export file name // Planning instance String PLNconnectionNameForEDM = 'EDM' // Named connection for EDM instance String PLNconnectionNameForPLN = 'Planning Rule' // Named connection for this Planning instance String PLNimportDimJobName = 'Import_EDMC_Groovy_Product' // Job name for importing the managed dimension into Planning // 2. Retrieve the application and dimension IDs for the Planning application and managed dimension in EDM HttpResponse jsonResponse = operation.application.getConnection(PLNconnectionNameForEDM).get("/epm/rest/v1/applications").asString() String appJSON = JsonPath.parse(jsonResponse.body).read('$.items[?(@.name == "'+EDMapplicationName+'")]') String[] EDMapplicationID = JsonPath.parse(appJSON).read('$.[?(@.name == "'+EDMapplicationName+'")].id') String[] EDMdimensionID = JsonPath.parse(appJSON).read('$..dimensions[?(@.name == "'+EDMdimensionName+'")].id') // 3. Retrieve the connection ID for the registered Planning application in Enterprise Data Management jsonResponse = operation.application.getConnection(PLNconnectionNameForEDM).get("/epm/rest/v1/applications/"+EDMapplicationID[0]+"/connections").asString() String[] EDMconnectionID = JsonPath.parse(jsonResponse.body).read('$.items[?(@.name == "'+EDMconnectionName+'")].id') // 4. Export the managed dimension from EDMC to the Planning instance inbox jsonResponse = operation.application.getConnection(PLNconnectionNameForEDM).post("/epm/rest/v1/dimensions/" + EDMdimensionID[0]+"/export/connection") .header("Content-Type", "application/json").body(json(["connectionId":EDMconnectionID[0],"fileName":EDMexportFileName])).asString() String[] jobURL = JsonPath.parse(jsonResponse.body).read('$.links[?(@.rel == "results")].href') String EDMexportJobID = jobURL[0].substring(jobURL[0].lastIndexOf("/")+1) // 5. Check the EDM Dimension Export job status while (getEDMexportJobStatus(PLNconnectionNameForEDM, EDMexportJobID) != "COMPLETED") { sleep(1000) } // Get the EDM Dimension Export Job status String getEDMexportJobStatus(String connectionName, String jobId) { HttpResponse pingResponse = operation.application.getConnection(connectionName).get("/epm/rest/v1/jobRuns/" + jobId+ "/result").asString() if (pingResponse.status != 200) throwVetoException("Error occured: $pingResponse.statusText") return ((String)(JsonPath.parse(pingResponse.body).read('$.status')))} // 6. Run a job in Planning to import the dimension metadata from the inbox. jsonResponse = operation.application.getConnection(PLNconnectionNameForPLN).post().body(json(["jobType":"IMPORT_METADATA", "jobName":PLNimportDimJobName, "parameters": ["refreshCube": "false"]])).asString() boolean importMetadataToPlanning = awaitCompletion(jsonResponse, PLNconnectionNameForPLN, 'Refresh Product dimension') // Parse the JSON response to get the status of the operation def awaitCompletion(HttpResponse jsonResponse, String connectionName, String operation) { if (!(200..299).contains(jsonResponse.status)) throwVetoException("Error occured: $jsonResponse.statusText") Map result = (Map) new JsonSlurper().parseText(jsonResponse.body) int status = (int)result.status while (status < 0) { status = getPlanningJobStatus(connectionName, (String)result.jobId) sleep(1000) } if (status == 0) { println("$operation successful.\n") return true } else { println("$operation failed.\n"); return false } } // Check the Planning Job status int getPlanningJobStatus(String connectionName, String jobId) { HttpResponse pingResponse = operation.application.getConnection(connectionName).get("/" + jobId).asString() return ((int)((Map)new JsonSlurper().parseText(pingResponse.body)).status)}