PrintedCardRestView.java 3.07 KB
package fi.codecrew.moya.rest.meta;

import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.PathSegment;

import fi.codecrew.moya.beans.CardTemplateBeanLocal;
import fi.codecrew.moya.model.PrintedCard;
import fi.codecrew.moya.utilities.JsonUtils;

@RequestScoped
@Path("/meta/printedcard")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON + "; charset=UTF-8" })
public class PrintedCardRestView {

	@EJB
	CardTemplateBeanLocal cardTemplateBeanLocal;

	/**
	 * Convert List<PathSegment> to List<String>
	 * 
	 * @param path
	 *            List<PathSegment>
	 * @return List<String>
	 */
	public List<String> pathToStrings(List<PathSegment> path) {
		ArrayList<String> stringList = new ArrayList<String>(path.size());
		for (PathSegment s : path) {
			stringList.add(s.getPath());
		}
		return stringList;
	}

	/**
	 * Metadata for entity.
	 * 
	 * @param id
	 * @param keys
	 *            The path segments after card id
	 * @return
	 */
	@GET
	@Path("/{id}/{keys:.*}")
	@Produces(MediaType.APPLICATION_JSON)
	public String getPrintedCardMeta(@PathParam("id") Integer id,
			@PathParam("keys") List<PathSegment> keys) {

		// Get the card's metadata
		PrintedCard printedCard = cardTemplateBeanLocal.findCard(id);
		JsonObject meta = printedCard.getMeta();

		// Must be something
		if (meta == null) {
			meta = Json.createObjectBuilder().build();
		}

		// Remove lone empty string
		if (keys.size() == 1 && keys.get(0).getPath().isEmpty()) {
			keys = new ArrayList<PathSegment>();
		}

		// Get the subobject
		JsonObject subObject = JsonUtils
				.getSubObject(meta, pathToStrings(keys));

		return subObject.toString() + "\n";
	}

	/**
	 * Alter metadata in one subproperty of the object.
	 * 
	 * @param id
	 * @param keys
	 * @return
	 */
	@POST
	@Path("/{id}/{keys:.*}")
	@Consumes(MediaType.APPLICATION_JSON)
	public String setPrintedCardMeta(@PathParam("id") Integer id,
			@PathParam("keys") List<PathSegment> keys, String jsonData) {

		// Get PrintedCard and it's metadata
		PrintedCard printedCard = cardTemplateBeanLocal.findCard(id);
		JsonObject meta = printedCard.getMeta();

		// If no metadata yet, make empty metadata object
		if (meta == null) {
			meta = Json.createObjectBuilder().build();
		}

		// Parse the new json data to be inserted
		JsonReader jsonReader = Json.createReader(new StringReader(jsonData));
		JsonObject newData = jsonReader.readObject();

		// Merge the new json data into existing metadata object
		JsonObject alteredMeta = JsonUtils.alterSubObject(meta,
				pathToStrings(keys), newData);

		// Save the changed meta back to database
		printedCard.setMeta(alteredMeta);
		cardTemplateBeanLocal.saveCard(printedCard);

		return null;
	}
}