Configurar la Advanced I/O Function
Comencemos a codificar la aplicación Alien City configurando el componente de la función.
El directorio de la función Java ( functions/AlienCityAIO ) contiene los siguientes archivos:
- El archivo principal de la función AlienCityAIO.java
- El archivo de configuración catalyst-config.json
- Los archivos de biblioteca Java en la carpeta lib
- Los archivos de dependencias .classpath y .project
Agregarás código en el archivo principal de la función AlienCityAIO.java.
Las dos APIs en la Advanced I/O Function que manejan el enrutamiento entre el servidor y Data Store son:
- GET /alien: Para verificar si hay alienígenas presentes en una ciudad
- POST /alien: Para reportar la presencia de alienígenas en una ciudad
Ahora agreguemos el código en el archivo de la función.
Copia el código que se muestra a continuación y pégalo en AlienCityAIO.java en el directorio functions/AlienCityAIO de tu proyecto, y guarda el archivo. Puedes usar cualquier IDE de tu preferencia para trabajar con los archivos de la aplicación.
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();
//Obtiene el endpoint y el método al que se realizó la llamada
String url = request.getRequestURI();
String method = request.getMethod();
//La API GET que verifica la tabla en busca de un encuentro con alienígenas en esa ciudad
if ((url.equals("/alien")) && method.equals(GET)) {
String cityName = request.getParameter("city_name");
//Consulta la tabla de Catalyst Data Store y verifica si existe una fila para la ciudad dada
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");
}
}
//La API POST que reporta el encuentro con alienígenas en una ciudad específica
else if ((url.equals("/alien")) && method.equals(POST)) {
//Obtiene el cuerpo de la solicitud y lo analiza
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");
//Consulta la tabla de Catalyst Data Store y verifica si existe una fila para la ciudad dada
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!");
}
//Si la fila no existe, se inserta una nueva fila
else {
ZCRowObject row = ZCRowObject.getInstance();
row.set("CityName", cityName);
ZCObject.getInstance().getTableInstance(TABLENAME).insertRow(row);
responseData.put("message", "Thanks for reporting!");
}
} else {
//Las acciones se registran en los logs. Puedes verificar los logs desde Catalyst Logs.
LOGGER.log(Level.SEVERE, "Error. Invalid Request");
responseData.put("error", "Request Endpoint not found");
response.setStatus(404);
}
//Envía la respuesta de vuelta al Client
response.setContentType("application/json");
response.getWriter().write(responseData.toString());
response.setStatus(200);
} catch (Exception e) {
//Las acciones se registran en los logs. Puedes verificar los logs desde 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);
}
}
/**
* Verifica si ya se reportó un encuentro con alienígenas en la ciudad dada
* consultando la tabla de Data Store
*
* @param {*} catalystApp
* @param {*} cityName
*/
private int getAlienCountFromCatalystDataStore(String cityName) throws Exception {
String query = "SELECT * FROM AlienCity WHERE CityName = '" + cityName + "'";
//Obtiene la instancia de ZCQL y ejecuta la consulta usando la cadena de consulta
ArrayList rowList = ZCQL.getInstance().executeQuery(query);
return rowList.size();
}
}
El directorio de funciones está ahora configurado. Discutiremos la arquitectura de la función y del cliente en la siguiente sección.
Última actualización 2026-03-20 21:51:56 +0530 IST