Advanced I/O Functionの設定
Alien Cityアプリケーションのコーディングを、Functionコンポーネントの設定から始めましょう。
Javaのfunctionディレクトリ( functions/AlienCityAIO )には、以下のファイルが含まれています:
- AlienCityAIO.java メインfunctionファイル
- catalyst-config.json 設定ファイル
- libフォルダ内のJavaライブラリファイル
- .classpath および .project 依存関係ファイル
AlienCityAIO.java メインfunctionファイルにコードを追加します。
Advanced I/O functionには、サーバーとData Store間のルーティングを処理する2つのAPIがあります:
- GET /alien:都市にエイリアンが存在するかどうかを確認する
- POST /alien:都市でのエイリアンの存在を報告する
それでは、functionファイルにコードを追加しましょう。
以下のコードをコピーして、プロジェクトの functions/AlienCityAIO ディレクトリにある AlienCityAIO.java に貼り付けて、ファイルを保存してください。アプリケーションのファイルを操作するには、お好みのIDEを使用できます。
注意: このセクションのコードを十分に理解するために、必ず目を通してください。
AlienCityAIO.java
copy
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.zc.common.ZCProject;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.catalyst.advanced.CatalystAdvancedIOHandler;
import com.zc.component.object.ZCObject;
import com.zc.component.object.ZCRowObject;
import com.zc.component.zcql.ZCQL;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
public class AlienCityAIO implements CatalystAdvancedIOHandler {
private static final Logger LOGGER = Logger.getLogger(AlienCityAIO.class.getName());
private static String TABLENAME = "AlienCity";
private static String COLUMNNAME = "CityName";
JSONObject responseData = new JSONObject();
static String GET = "GET";
static String POST = "POST";
@Override
@SuppressWarnings("unchecked")
public void runner(HttpServletRequest request, HttpServletResponse response) throws Exception {
try {
ZCProject.initProject();
//呼び出し先のエンドポイントとメソッドを取得します
String url = request.getRequestURI();
String method = request.getMethod();
//テーブルで該当都市のエイリアン遭遇を確認するGET API
if ((url.equals("/alien")) && method.equals(GET)) {
String cityName = request.getParameter("city_name");
//Catalyst Data Storeテーブルにクエリを実行し、指定された都市の行が存在するかどうかを確認します
int length = getAlienCountFromCatalystDataStore(cityName);
if (length > 0) {
responseData.put("message", "Uh oh! Looks like there are aliens in this city!");
responseData.put("signal", "positive");
} else {
responseData.put("message", "Hurray! No alien encounters in this city yet!");
responseData.put("signal", "negative");
}
}
//特定の都市のエイリアン遭遇を報告するPOST API
else if ((url.equals("/alien")) && method.equals(POST)) {
//リクエストボディを取得してパースします
ServletInputStream requestBody = request.getInputStream();
JSONParser jsonParser = new JSONParser();
JSONObject jsonObject = (JSONObject) jsonParser.parse(new InputStreamReader(requestBody, "UTF-8"));
String cityName = (String) jsonObject.get("city_name");
//Catalyst Data Storeテーブルにクエリを実行し、指定された都市の行が存在するかどうかを確認します
int length = getAlienCountFromCatalystDataStore(cityName);
if (length > 0) {
responseData.put("message",
"Looks like you are not the first person to encounter aliens in this city! Someone has already reported an alien encounter here!");
}
//行が存在しない場合、新しい行を挿入します
else {
ZCRowObject row = ZCRowObject.getInstance();
row.set("CityName", cityName);
ZCObject.getInstance().getTableInstance(TABLENAME).insertRow(row);
responseData.put("message", "Thanks for reporting!");
}
} else {
//アクションがログに記録されます。Catalyst Logsからログを確認できます。
LOGGER.log(Level.SEVERE, "Error. Invalid Request");
responseData.put("error", "Request Endpoint not found");
response.setStatus(404);
}
//クライアントにレスポンスを返します
response.setContentType("application/json");
response.getWriter().write(responseData.toString());
response.setStatus(200);
} catch (Exception e) {
//アクションがログに記録されます。Catalyst Logsからログを確認できます。
LOGGER.log(Level.SEVERE, "Exception in AlienCityAIO", e);
responseData.put("error", "Internal server error occurred. Please try again in some time.");
response.getWriter().write(responseData.toString());
response.setStatus(500);
}
}
/**
* 指定された都市のエイリアン遭遇が既に報告されているかどうかを
* Data Storeテーブルにクエリを実行して確認します
*
* @param {*} catalystApp
* @param {*} cityName
*/
private int getAlienCountFromCatalystDataStore(String cityName) throws Exception {
String query = "SELECT * FROM AlienCity WHERE CityName = '" + cityName + "'";
//ZCQLインスタンスを取得し、クエリ文字列を使用してクエリを実行します
ArrayList rowList = ZCQL.getInstance().executeQuery(query);
return rowList.size();
}
}
functionsディレクトリの設定が完了しました。次のセクションでは、functionとクライアントのアーキテクチャについて説明します。
最終更新日 2026-03-05 11:43:24 +0530 IST