Event関数の設定
ここから、Event関数を設定してWorkDrive Syncアプリのコーディングを開始します。
注意: Catalystコンソールでイベントリスナーを設定する前に、アプリケーションコードをCatalystリモートコンソールにコーディングしてデプロイする必要があります。これは、イベントリスナーをEvent関数に関連付ける必要があるためです。
関数ディレクトリfunctions/WorkDriveには以下が含まれています:
- WorkDriveSync.javaメイン関数ファイル
- catalyst-config.json設定ファイル
- libフォルダ内のJavaライブラリファイル
- .classpathおよび.project依存関係ファイル
WorkDriveSync.javaにコードを追加します。
任意のIDEを使用して関数を設定できます。
注意: このセクションのコードを十分に理解するため、必ず内容を確認してください。関数とクライアントのコードについては、クライアントの設定後に説明します。
以下のコードをコピーして、functions/WorkDriveディレクトリにあるWorkDriveSync.javaに貼り付けて、ファイルを保存してください。
WorkDriveSync.java
copy
import com.catalyst.Context;
import com.catalyst.event.EVENT_STATUS;
import com.catalyst.event.EventRequest;
import com.catalyst.event.CatalystEventHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.List;
import java.util.ArrayList;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.json.JSONObject;
import org.json.JSONArray;
import com.zc.component.object.ZCRowObject;
import com.zc.component.object.ZCTable;
import com.zc.component.zcql.ZCQL;
import com.zc.component.object.ZCObject;
import com.zc.component.object.ZCRowObject;
import com.zc.component.object.ZCTable;
import com.zc.auth.connectors.ZCConnection;
import com.zc.component.stratus.ZCStratus;
import com.zc.component.stratus.ZCBucket;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class WorkDriveSync implements CatalystEventHandler {
private static final Logger LOGGER = Logger.getLogger(WorkDriveSync.class.getName());
private static final String CLIENT_ID = "{{YOUR_CLIENT_ID}}"; // Client IDを入力してください
private static final String CLIENT_SECRET = "{{YOUR_CLIENT_SECRET}}"; // Client Secretを入力してください
private static final String AUTH_URL = "https://accounts.zoho.com/oauth/v2/token";
private static final String REFRESH_URL = "https://accounts.zoho.com/oauth/v2/token";
private static final String REFRESH_TOKEN = "{{YOUR_REFRESH_TOKEN}}"; // Refresh Tokenを入力してください
private static final String WORKDRIVE_FOLDER_ID = "{{YOUR_WORKDRIVE_FOLDER_ID}}"; // WorkDriveフォルダIDを入力してください
private static final String STRATUS_BUCKET_NAME = "{{YOUR_STRATUS_BUCKET_NAME}}"; // バケット名を入力してください
private static final String FILE_VAULT_TABLE_NAME = "FileVault";
private static final OkHttpClient okHttpClient = new OkHttpClient().newBuilder().build();
@Override
public EVENT_STATUS handleEvent(EventRequest paramEventRequest, Context paramContext) throws Exception {
try {
JSONObject eventData = (JSONObject) paramEventRequest.getRawData();
JSONArray eventsArray = (JSONArray) eventData.get("events");
JSONObject firstEvent = (JSONObject) eventsArray.get(0);
String eventType = (String) ((JSONObject) firstEvent.get("event_config")).get("api_name");
String fileName = (String) ((JSONObject) ((JSONArray) ((JSONObject) firstEvent.get("data")).get("object_details")).get(0)).get("key");
LOGGER.log(Level.INFO, "Received event: " + eventType + " for file: " + fileName);
String query = "SELECT ROWID, WorkDriveFileID FROM " + FILE_VAULT_TABLE_NAME + " WHERE FileName='" + fileName + "'";
List<ZCRowObject> queryResult = ZCQL.getInstance().executeQuery(query);
if (queryResult.isEmpty()) {
LOGGER.log(Level.INFO, "No entry found in " + FILE_VAULT_TABLE_NAME + " for file: " + fileName);
return EVENT_STATUS.SUCCESS;
}
ZCRowObject fileVaultEntry = queryResult.get(0);
Long rowId = Long.valueOf((String) fileVaultEntry.get("ROWID"));
String workDriveFileId = (String) fileVaultEntry.get("WorkDriveFileID");
LOGGER.log(Level.INFO, "Row Id: " + rowId + " , WorkDriveFileID: " + workDriveFileId);
if ("stratus_object_uploaded".equals(eventType)) {
handleUploadEvent(paramContext, fileName, rowId);
} else if ("stratus_object_deleted".equals(eventType)) {
handleDeleteEvent(paramContext, fileName, rowId, workDriveFileId);
}
return EVENT_STATUS.SUCCESS;
} catch(Exception ex) {
LOGGER.log(Level.SEVERE, "Exception in WorkDriveSync Function: ", ex);
return EVENT_STATUS.FAILURE;
}
}
private void handleUploadEvent(Context context, String fileName, Long rowId) throws Exception {
ZCStratus stratus = ZCStratus.getInstance();
ZCBucket bucket = stratus.bucketInstance(STRATUS_BUCKET_NAME);
LOGGER.log(Level.INFO, "Going to fetch the file " + fileName + " from the bucket " + STRATUS_BUCKET_NAME);
String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
InputStream dataStream = bucket.getObject(encodedFileName);
byte[] buffer = new byte[dataStream.available()];
dataStream.read(buffer);
File targetFile = new File(fileName);
OutputStream outStream = new FileOutputStream(targetFile);
outStream.write(buffer);
outStream.close();
String accessToken = getAccessToken();
RequestBody body = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("content", fileName, RequestBody.create(MediaType.parse("application/octet-stream"), new File(fileName)))
.build();
Request request = new Request.Builder()
.url("https://workdrive.zoho.com/api/v1/upload?filename=" + fileName + "&override-name-exist=true&parent_id=" + WORKDRIVE_FOLDER_ID)
.method("POST", body)
.addHeader("Authorization", "Zoho-oauthtoken " + accessToken)
.build();
Response response = okHttpClient.newCall(request).execute();
JSONObject responseJSON = new JSONObject(response.body().string());
JSONObject data = responseJSON.getJSONArray("data").getJSONObject(0);
String resourceId = data.getJSONObject("attributes").getString("resource_id");
LOGGER.log(Level.INFO, "WorkDrive File ID :: " + resourceId);
ZCObject object = ZCObject.getInstance();
ZCTable table = object.getTable(FILE_VAULT_TABLE_NAME);
List<ZCRowObject> rowsToUpdate = new ArrayList<>();
ZCRowObject row = ZCRowObject.getInstance();
row.set("ROWID", rowId);
row.set("WorkDriveFileID", resourceId);
row.set("WorkDriveSync", "Uploaded");
rowsToUpdate.add(row);
table.updateRows(rowsToUpdate);
LOGGER.log(Level.INFO, "FileVault table updated for ROWID: " + rowId + " with WorkDriveFileID: " + resourceId);
}
private void handleDeleteEvent(Context context, String fileName, Long rowId, String workDriveFileId) throws Exception {
JSONObject requestBody = new JSONObject();
JSONObject dataObject = new JSONObject();
JSONObject attributesObject = new JSONObject();
attributesObject.put("status", "51");
dataObject.put("attributes", attributesObject);
dataObject.put("type", "files");
requestBody.put("data", dataObject);
Request request = new Request.Builder()
.url(String.format("https://workdrive.zoho.com/api/v1/files/%s", workDriveFileId))
.patch(RequestBody.create(MediaType.parse("application/json"), requestBody.toString()))
.addHeader("Authorization", "Zoho-oauthtoken " + getAccessToken())
.addHeader("Accept", "application/vnd.api+json")
.addHeader("Content-Type", "application/json")
.build();
Response response = okHttpClient.newCall(request).execute();
LOGGER.log(Level.INFO, "WorkDrive Delete Response Status: " + response.code());
LOGGER.log(Level.INFO, "WorkDrive Delete Response Body: " + response.body().string());
ZCObject object = ZCObject.getInstance();
ZCTable table = object.getTable(FILE_VAULT_TABLE_NAME);
table.deleteRow(rowId);
LOGGER.log(Level.INFO, "FileVault table entry deleted for ROWID: " + rowId);
}
@SuppressWarnings("unchecked")
public String getAccessToken() throws Exception {
org.json.simple.JSONObject authJson = new org.json.simple.JSONObject();
org.json.simple.JSONObject connectorJson = new org.json.simple.JSONObject();
authJson.put("client_id", CLIENT_ID);
authJson.put("client_secret", CLIENT_SECRET);
authJson.put("auth_url", AUTH_URL);
authJson.put("refresh_url", REFRESH_URL);
authJson.put("refresh_token", REFRESH_TOKEN);
connectorJson.put("WorkDriveConnector", authJson);
return ZCConnection.getInstance(connectorJson).getConnector("WorkDriveConnector").getAccessToken();
}
}
注意: このコードを関数ファイルにコピー&ペーストした後、コメントで示されている以下の値を必ず入力してください:
-
このコードで使用されているZohoサービスリンク(例:accounts.zoho.com、workdrive.zoho.comなど)はデータセンター(DC)固有です。.comを対応するZohoデータセンタードメインに置き換えてください。認証やAPIエラーを避けるため、コード内のすべてのURLが同じDCドメインを使用していることを確認してください。
-
WorkDriveフォルダID: この値は、先ほどWorkDriveで作成したフォルダを開くことで取得できます。URLにはWorkDriveフォルダのフォルダIDが含まれています。URLのfolders/の後に表示されるIDをコピーしてください。

-
テーブルID: テーブルのテーブルIDは、Data Storeのテーブル名の下で確認できます。

Event関数の設定が完了しました。
最終更新日 2026-02-23 18:09:41 +0530 IST