Configure the Advanced I/O Function

Let’s begin coding the Alien City application by configuring the function component.

The Java function directory ( functions/AlienCityAIO ) contains the following files:

  • The AlienCityAIO.java main function file
  • The catalyst-config.json configuration file
  • Java library files in the lib folder
  • .classpath and .project dependency files

You will be adding code in the AlienCityAIO.java main function file.

The two APIs in the Advanced I/O function that handle the routing between the server and the Data Store are:

  • GET /alien: To check whether aliens are present in a city
  • POST /alien: To report an alien presence in a city

Let’s now add the code in the function file.

Copy the code given below and paste it in AlienCityAIO.java in the functions/AlienCityAIO directory of your project, and save the file. You can use any IDE of your choice to work with the application’s files.

Note: Please go through the code in this section to make sure you fully understand it.
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();
		//Fetches the endpoint and method to which the call was made
		String url = request.getRequestURI();
		String method = request.getMethod();

		//The GET API that checks the table for an alien encounter in that city
		if ((url.equals("/alien")) && method.equals(GET)) {
			String cityName = request.getParameter("city_name");

			//Queries the Catalyst Data Store table and checks whether a row is present for the given city
			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");
			}
		}
		//The POST API that reports the alien encounter for a particular city
		else if ((url.equals("/alien")) && method.equals(POST)) {
			//Gets the request body and parses it
			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");

			//Queries the Catalyst Data Store table and checks whether a row is present for the given city
			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!");
			}

			//If the row is not present, then a new row is inserted
			else {
				ZCRowObject row = ZCRowObject.getInstance();
				row.set("CityName", cityName);
				ZCObject.getInstance().getTableInstance(TABLENAME).insertRow(row);
				responseData.put("message", "Thanks for reporting!");
			}
		} else {
			//The actions are logged. You can check the logs from Catalyst Logs.
			LOGGER.log(Level.SEVERE, "Error. Invalid Request");
			responseData.put("error", "Request Endpoint not found");
			response.setStatus(404);
		}

		//Sends the response back to the Client
		response.setContentType("application/json");
		response.getWriter().write(responseData.toString());
		response.setStatus(200);
	} catch (Exception e) {
		//The actions are logged. You can check the logs from 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);
	}
}

/**
 * Checks whether an alien encounter is already reported for the given city by
 * querying the Data Store table
 *
 * @param {*} catalystApp
 * @param {*} cityName
 */
private int getAlienCountFromCatalystDataStore(String cityName) throws Exception {

	String query = "select * from " + TABLENAME + " where " + COLUMNNAME + " = " + cityName;

	//Gets the ZCQL instance and executes query using the query string
	ArrayList<ZCRowObject> rowList = ZCQL.getInstance().executeQuery(query);
	return rowList.size();
}

}

View more

The functions directory is now configured. We will discuss the architecture of the function and the client in the next section.

Last Updated 2024-03-25 14:47:40 +0530 IST