/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
 */
package org.ocelotds.messaging;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.ocelotds.Constants;
import java.util.Objects;

/**
 * Message to Client, for response after message from client. Server send this response asynchronous
 *
 * @author hhfrancois
 */
public class MessageToClient {

	private static final long serialVersionUID = -834697863344344854L;
	/**
	 * Type of message
	 */
	protected MessageType type = null;

	/**
	 * Id of request, compute from hash of packageName, classname, methodName, arguments
	 */
	protected String id;
	/**
	 * The result of request
	 */
	protected Object response = null;

	/**
	 * The result of request in json format
	 */
	protected String json = null;

	/**
	 * execution time
	 */
	protected long time = 0L;

	/**
	 * validity limit
	 */
	protected long deadline = 0L;

	public String getJson() {
		return json;
	}

	public void setJson(String json) {
		this.json = json;
	}

	public MessageType getType() {
		return type;
	}

	public void setType(MessageType type) {
		this.type = type;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public Object getResponse() {
		return response;
	}

	private void setResponse(Object response, MessageType type) {
		this.type = type;
		this.response = response;
	}

	public void setConstraints(ConstraintViolation[] response) {
		setResponse(response, MessageType.CONSTRAINT);
	}

	public void setResult(Object response) {
		setResponse(response, MessageType.RESULT);
	}

	public void setFault(Object response) {
		setResponse(response, MessageType.FAULT);
	}

	public void setResponse(Object response) {
		this.response = response;
	}

	public long getDeadline() {
		return deadline;
	}

	public void setDeadline(long deadline) {
		this.deadline = deadline;
	}

	public long getTime() {
		return time;
	}

	public void setTime(long time) {
		this.time = time;
	}

	@Override
	public int hashCode() {
		int hash = 7;
		hash = 83 * hash + Objects.hashCode(this.id);
		return hash;
	}

	@Override
	public boolean equals(Object obj) {
		if (obj == null) {
			return false;
		}
		if (getClass() != obj.getClass()) {
			return false;
		}
		final MessageToClient other = (MessageToClient) obj;
		return Objects.equals(this.id, other.id);
	}

	public String toJson() {
		ObjectMapper mapper = getObjectMapper();
		String jsonResponse;
		try {
			jsonResponse = this.json;
			if (null == this.json) {
				if(MessageType.FAULT.equals(this.getType())) {
					jsonResponse = ((Fault) this.getResponse()).toJson();
				} else {
					jsonResponse = mapper.writeValueAsString(this.getResponse());
				}
			}
		} catch (JsonProcessingException ex) {
			jsonResponse = new Fault(ex, 0).toJson();
		}
		return String.format("{\"%s\":\"%s\",\"%s\":\"%s\",\"%s\":%s,\"%s\":%s,\"%s\":%s}",
				  Constants.Message.TYPE, this.getType(), Constants.Message.ID, this.getId(), Constants.Message.TIME, this.getTime(),
				  Constants.Message.DEADLINE, this.getDeadline(), Constants.Message.RESPONSE, jsonResponse);
	}

	ObjectMapper getObjectMapper() {
		return new ObjectMapper();
	}

	@Override
	public String toString() {
		return toJson();
	}
}

@@ -2631,33 +2631,8 @@
 ing 
-jsonResponse;%0A%09%09try %7B%0A%09%09%09
 json
@@ -2653,16 +2653,24 @@
 s.json;%0A
+%09%09try %7B%0A
 %09%09%09if (n
@@ -2676,25 +2676,28 @@
 null == 
-this.json
+jsonResponse
 ) %7B%0A%09%09%09%09

simplify code