--- title: "Event関数の設定" url: https://docs.catalyst.zoho.com/ja/tutorials/workdrivesync/java/configure-event-function/ description: "Catalyst関数とEvent Listenerを使用して、Catalyst StratusとZoho WorkDrive間でAPIを通じてファイルのアップロードと削除を同期するWebアプリケーションを構築します" last_updated: 2026-08-17T12:16:04Z service: All Services type: tutorial related_links: - name: "Event Functions" url: /ja/serverless/help/functions/event-functions --- # Event関数の設定 ここから、Event関数を設定してWorkDrive Syncアプリのコーディングを開始します。 > **注意:** Catalystコンソールでイベントリスナーを設定する前に、アプリケーションコードをCatalystリモートコンソールにコーディングしてデプロイする必要があります。これは、イベントリスナーをEvent関数に関連付ける必要があるためです。 [関数ディレクトリ](https://docs.catalyst.zoho.com/ja/cli/v1/project-directory-structure/functions-directory)`functions/WorkDrive`には以下が含まれています: * `WorkDriveSync.java`メイン関数ファイル * `catalyst-config.json`設定ファイル * `lib`フォルダ内のJavaライブラリファイル * `.classpath`および`.project`依存関係ファイル `WorkDriveSync.java`にコードを追加します。 任意のIDEを使用して関数を設定できます。 > **注意:** このセクションのコードを十分に理解するため、必ず内容を確認してください。関数とクライアントのコードについては、クライアントの設定後に説明します。 以下のコードをコピーして、`functions/WorkDrive`ディレクトリにある`WorkDriveSync.java`に貼り付けて、ファイルを保存してください。 **WorkDriveSync.java** ```java 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(); } } ``` > **注意:** このコードを関数ファイルにコピー&ペーストした後、コメントで示されている以下の値を必ず入力してください: * **[Client ID](https://docs.catalyst.zoho.com/ja/tutorials/workdrivesync/java/register-client)** * **[Client Secret](https://docs.catalyst.zoho.com/ja/tutorials/workdrivesync/java/register-client)** * このコードで使用されているZohoサービスリンク(例:accounts.zoho.com、workdrive.zoho.comなど)はデータセンター(DC)固有です。**.com**を対応するZohoデータセンタードメインに置き換えてください。認証やAPIエラーを避けるため、コード内のすべてのURLが同じDCドメインを使用していることを確認してください。 * **[Refresh Token](https://docs.catalyst.zoho.com/ja/tutorials/workdrivesync/java/generate-refresh-token)** * **WorkDriveフォルダID:** この値は、[先ほどWorkDriveで作成したフォルダ](https://docs.catalyst.zoho.com/ja/tutorials/workdrivesync/java/create-workdrive-folder)を開くことで取得できます。URLにはWorkDriveフォルダのフォルダIDが含まれています。URLの`folders/`の後に表示されるIDをコピーしてください。 ![catalyst_workdrive_folderid](https://catalyst-docs-development.zohostratus.in/images/tutorials/workdrivesync/workdrive-folder-id-through-link.webp) * **テーブルID:** [テーブルのテーブルID](https://docs.catalyst.zoho.com/ja/tutorials/workdrivesync/java/configure-event-function/#create-a-table)は、Data Storeのテーブル名の下で確認できます。 ![catalyst_workdrive_tableid](https://catalyst-docs-development.zohostratus.in/images/tutorials/workdrivesync/catalyst_workdrive_tableid.webp) Event関数の設定が完了しました。