Scala SDK Samples - Bulk Write Operations
package com.zoho.crm.sample.bulkwrite
import java.io.File
import java.io.FileOutputStream
import java.util
import com.zoho.crm.api.HeaderMap
import com.zoho.crm.api.bulkwrite.SuccessResponse
import com.zoho.crm.api.bulkwrite.APIException
import com.zoho.crm.api.bulkwrite.BulkWriteOperations
import com.zoho.crm.api.bulkwrite.BulkWriteOperations.UploadFileHeader
import com.zoho.crm.api.util.Choice
import com.zoho.crm.api.bulkwrite.BulkWriteResponse
import com.zoho.crm.api.bulkwrite.CallBack
import com.zoho.crm.api.bulkwrite.FieldMapping
import com.zoho.crm.api.bulkwrite.FileBodyWrapper
import com.zoho.crm.api.bulkwrite.RequestWrapper
import com.zoho.crm.api.bulkwrite.Resource
import com.zoho.crm.api.util.StreamWrapper
import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.HashMap
object Bulkwrite {
/**
* Upload File
* This method is used to upload a CSV file in ZIP format for bulk write API. The response contains the file_id.
* Use this ID while making the bulk write request.
*
* @param orgID The unique ID (zgid) of your organization obtained through the Organization API.
* @param absoluteFilePath The absoluteFilePath of the zip file you want to upload.
* @throws Exception
*/
@throws[Exception]
def uploadFile(orgID: String, absoluteFilePath: String): Unit = { //example
//String absoluteFilePath = "/Users/user_name/Documents/Leads.zip"
//String orgID = "6773045"
//Get instance of BulkWriteOperations Class
val bulkWriteOperations = new BulkWriteOperations
//Get instance of FileBodyWrapper class that will contain the request file
val fileBodyWrapper = new FileBodyWrapper
//Get instance of StreamWrapper class that takes absolute path of the file to be attached as parameter
val streamWrapper = new StreamWrapper(absoluteFilePath)
//FileInputStream stream = new FileInputStream(absoluteFilePath)
//Get instance of StreamWrapper class that takes file name and stream of the file to be attached as parameter
//StreamWrapper streamWrapper = new StreamWrapper("Leads.zip", stream)
//Set file to the FileBodyWrapper instance
fileBodyWrapper.setFile(Option(streamWrapper))
//Get instance of HeaderMap Class
val headerInstance = new HeaderMap
//To indicate that this a bulk write operation
headerInstance.add(new UploadFileHeader().feature, "bulk-write")
headerInstance.add(new UploadFileHeader().XCRMORG, orgID)
//Call uploadFile method that takes FileBodyWrapper instance and headerInstance as parameter
val responseOption = bulkWriteOperations.uploadFile(fileBodyWrapper, Option(headerInstance))
if (responseOption.isDefined) { //check response
var response= responseOption.get
println("Status Code: " + response.getStatusCode)
//Check if expected response is received
if (response.isExpected) { //Get object from response
val actionResponse = response.getObject
//Check if the request is successful
if (actionResponse.isInstanceOf[SuccessResponse]) { //Get the received SuccessResponse instance
val successResponse = actionResponse.asInstanceOf[SuccessResponse]
//Get the Status
println("Status: " + successResponse.getStatus.getValue)
//Get the Code
println("Code: " + successResponse.getCode.getValue)
println("Details: ")
//Get the details map
successResponse.getDetails.foreach(entry=>{
println(entry._1 + ": " + entry._2)
})
//Get the Message
println("Message: " + successResponse.getMessage.getValue)
}
else { //Check if the request returned an exception
if (actionResponse.isInstanceOf[APIException]) { //Get the received APIException instance
val exception = actionResponse.asInstanceOf[APIException]
if (exception.getStatus != null) println("Status: " + exception.getStatus.getValue)
if (exception.getCode != null) println("Code: " + exception.getCode.getValue)
if (exception.getMessage != null) println("Message: " + exception.getMessage.getValue)
println("Details: ")
if (exception.getDetails != null) {
exception.getDetails.foreach(entry=>{
println(entry._1 + ": " + entry._2)
})
}
if (exception.getErrorMessage != null) { //Get the ErrorMessage
println("ErrorMessage: " + exception.getErrorMessage.getValue)
}
//Get the ErrorCode
println("ErrorCode: " + exception.getErrorCode)
if (exception.getXError != null) { //Get the XError
println("XError: " + exception.getXError.getValue)
}
if (exception.getInfo != null) { //Get the Info
println("Info: " + exception.getInfo.getValue)
}
if (exception.getXInfo != null) { //Get the XInfo
println("XInfo: " + exception.getXInfo.getValue)
}
//Get the HttpStatus
println("HttpStatus: " + exception.getHttpStatus)
}
}
}
else { //If response is not as expected
//Get model object from response
val responseObject = response.getModel
//Get the response object's class
val clas = responseObject.getClass
//Get all declared fields of the response class
val fields = clas.getDeclaredFields
for (field
package com.zoho.crm.sample.bulkwrite
import java.io.File
import java.io.FileOutputStream
import java.util
import com.zoho.crm.api.HeaderMap
import com.zoho.crm.api.bulkwrite.SuccessResponse
import com.zoho.crm.api.bulkwrite.APIException
import com.zoho.crm.api.bulkwrite.BulkWriteOperations
import com.zoho.crm.api.bulkwrite.BulkWriteOperations.UploadFileHeader
import com.zoho.crm.api.util.Choice
import com.zoho.crm.api.bulkwrite.BulkWriteResponse
import com.zoho.crm.api.bulkwrite.CallBack
import com.zoho.crm.api.bulkwrite.FieldMapping
import com.zoho.crm.api.bulkwrite.FileBodyWrapper
import com.zoho.crm.api.bulkwrite.RequestWrapper
import com.zoho.crm.api.bulkwrite.Resource
import com.zoho.crm.api.util.StreamWrapper
import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.HashMap
object Bulkwrite {
/**
* Create BulkWrite Job
* This method is used to create a bulk write job.
*
* @param moduleAPIName The API Name of the record's module.
* @param fileId The ID of the uploaded file to create BulkWrite Job.
*/
@throws[Exception]
def createBulkWriteJob(moduleAPIName: String, fileId: String): Unit = { //String moduleAPIName = "Leads"
//String fileId = "34770616121001"
val bulkWriteOperations = new BulkWriteOperations
//Get instance of RequestWrapper Class that will contain the request body
val requestWrapper = new RequestWrapper
//Get instance of CallBack Class
val callback = new CallBack
// To set valid callback URL.
callback.setUrl(Option("https://www.example.com/callback"))
//To set the HTTP method of the callback URL. The allowed value is post.
callback.setMethod(new Choice[String]("post"))
//The Bulk Write Job's details are posted to this URL on successful completion of job or on failure of job.
requestWrapper.setCallback(Option(callback))
//To set the charset of the uploaded file
requestWrapper.setCharacterEncoding(Option("UTF-8"))
//To set the type of operation you want to perform on the bulk write job.
requestWrapper.setOperation(new Choice[String]("upsert"))
val resource = new ArrayBuffer[Resource]
//Get instance of Resource Class
val resourceIns = new Resource
// To set the type of module that you want to import. The value is data.
resourceIns.setType(new Choice[String]("data"))
//To set API name of the module that you select for bulk write job.
resourceIns.setModule(Option(moduleAPIName))
//To set the file_id obtained from file upload API.
resourceIns.setFileId(Option(fileId))
//True - Ignores the empty values.The default value is false.
resourceIns.setIgnoreEmpty(Option(true))
// To set a field as a unique field or ID of a record.
resourceIns.setFindBy(Option("Last_Name"))
val fieldMappings = new ArrayBuffer[FieldMapping]
var fieldMapping:FieldMapping = null
//Get instance of FieldMapping Class
fieldMapping = new FieldMapping
//To set API name of the field present in Zoho module object that you want to import.
// fieldMapping.setAPIName("Last_Name")
// //To set the column index of the field you want to map to the CRM field.
// fieldMapping.setIndex(0)
// fieldMappings.addOne(fieldMapping)
// fieldMapping = new FieldMapping
// fieldMapping.setAPIName("Email")
// fieldMapping.setIndex(1)
// fieldMappings.addOne(fieldMapping)
// fieldMapping = new FieldMapping
//// fieldMapping.setAPIName("Company")
// fieldMapping.setIndex(1)
// fieldMappings.addOne(fieldMapping)
// fieldMapping = new FieldMapping
// fieldMapping.setAPIName("Phone")
// fieldMapping.setIndex(3)
// fieldMappings.addOne(fieldMapping)
fieldMapping = new FieldMapping
fieldMapping.setAPIName(Option("Website"))
//fieldMapping.setFormat("")
//fieldMapping.setFindBy("")
val defaultValue:HashMap[String,Any] = HashMap()
defaultValue.put("value", "https://www.zohoapis.com")
//To set the default value for an empty column in the uploaded file.
fieldMapping.setDefaultValue(defaultValue)
fieldMappings.addOne(fieldMapping)
resourceIns.setFieldMappings(fieldMappings)
resource.addOne(resourceIns)
requestWrapper.setResource(resource)
//Call createBulkWriteJob method that takes RequestWrapper instance as parameter
val responseOption = bulkWriteOperations.createBulkWriteJob(requestWrapper)
if (responseOption.isDefined) {
val response= responseOption.get
println("Status Code: " + response.getStatusCode)
if (response.isExpected) {
val actionResponse = response.getObject
if (actionResponse.isInstanceOf[SuccessResponse]) {
val successResponse = actionResponse.asInstanceOf[SuccessResponse]
println("Status: " + successResponse.getStatus.getValue)
println("Code: " + successResponse.getCode.getValue)
println("Details: ")
successResponse.getDetails.foreach(entry=>{
println(entry._1 + ": " + entry._2)
})
println("Message: " + successResponse.getMessage.getValue)
}
else if (actionResponse.isInstanceOf[APIException]) {
val exception = actionResponse.asInstanceOf[APIException]
println("Status: " + exception.getStatus.getValue)
println("Code: " + exception.getCode.getValue)
println("Details: ")
exception.getDetails.foreach(entry=>{
println(entry._1 + ": " + entry._2)
})
println("Message: " + exception.getMessage.getValue)
}
}
else {
val responseObject = response.getModel
val clas = responseObject.getClass
val fields = clas.getDeclaredFields
for (field
package com.zoho.crm.sample.bulkwrite
import java.io.File
import java.io.FileOutputStream
import java.util
import com.zoho.crm.api.HeaderMap
import com.zoho.crm.api.bulkwrite.SuccessResponse
import com.zoho.crm.api.bulkwrite.APIException
import com.zoho.crm.api.bulkwrite.BulkWriteOperations
import com.zoho.crm.api.bulkwrite.BulkWriteOperations.UploadFileHeader
import com.zoho.crm.api.util.Choice
import com.zoho.crm.api.bulkwrite.BulkWriteResponse
import com.zoho.crm.api.bulkwrite.CallBack
import com.zoho.crm.api.bulkwrite.FieldMapping
import com.zoho.crm.api.bulkwrite.FileBodyWrapper
import com.zoho.crm.api.bulkwrite.RequestWrapper
import com.zoho.crm.api.bulkwrite.Resource
import com.zoho.crm.api.util.StreamWrapper
import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.HashMap
object Bulkwrite {
/**
* Download BulkWrite Result
* This method is used to download the result of the bulk write job as a CSV file.
*
* @param downloadUrl The URL present in the download_url parameter in the response of Get Bulk Write Job Details.
* @param destinationFolder The absolute path where downloaded file has to be stored.
* @throws Exception
*/
@throws[Exception]
def downloadBulkWriteResult(downloadUrl: String, destinationFolder: String): Unit = { //String downloadUrl = "https://download-accl.zoho.com/v2/crm/6735/bulk-write/347706122009/347706122009.zip"
//String destinationFolder = "/Users/user_name/Documents"
val bulkWriteOperations = new BulkWriteOperations
//Call downloadBulkWriteResult method that takes downloadUrl as parameter
val responseOption = bulkWriteOperations.downloadBulkWriteResult(downloadUrl)
if (responseOption.isDefined) {
var response = responseOption.get
println("Status Code: " + response.getStatusCode)
if (util.Arrays.asList(204, 304).contains(response.getStatusCode)) {
println(if (response.getStatusCode == 204) "No Content"
else "Not Modified")
return
}
if (response.isExpected) {
val responseHandler = response.getObject
if (responseHandler.isInstanceOf[FileBodyWrapper]) {
val fileBodyWrapper = responseHandler.asInstanceOf[FileBodyWrapper]
//Get StreamWrapper instance from the returned FileBodyWrapper instance
val streamWrapper = fileBodyWrapper.getFile.get
//Create a file instance with the absolute_file_path
val file = new File(destinationFolder + File.separatorChar + streamWrapper.getName.get)
//Get InputStream from the response
val is = streamWrapper.getStream.get
//Create an OutputStream for the destination file
val os = new FileOutputStream(file)
val buffer = new Array[Byte](1024)
var bytesRead = 0
//read the InputStream till the end
while ( {
(bytesRead = is.read(buffer)) != -1
}) { //write data to OutputStream
os.write(buffer, 0, bytesRead)
}
//Close the InputStream
is.close()
//Flush and close the OutputStream
os.flush()
os.close()
}
else if (responseHandler.isInstanceOf[APIException]) {
val exception = responseHandler.asInstanceOf[APIException]
if (exception.getStatus != null) println("Status: " + exception.getStatus.getValue)
if (exception.getCode != null) println("Code: " + exception.getCode.getValue)
if (exception.getDetails != null) {
println("Details: ")
exception.getDetails.foreach(entry=>{
println(entry._1 + ": " + entry._2)
})
}
if (exception.getMessage != null) println("Message: " + exception.getMessage.getValue)
if (exception.getXError != null) println("XError: " + exception.getXError.getValue)
if (exception.getXInfo != null) println("XInfo: " + exception.getXInfo.getValue)
if (exception.getHttpStatus != null) println("Message: " + exception.getHttpStatus)
}
}
else {
val responseObject = response.getModel
val clas = responseObject.getClass
val fields = clas.getDeclaredFields
for (field