// Path: ocpp-common/src/main/java/eu/chargetime/ocpp/model/Message.java
// public class Message {
//   private String id;
//   private Object payload;
//   private String action;
// 
//   /**
//    * Get unique id for message.
//    *
//    * @return message id.
//    */
//   public String getId() {
//     return id;
//   }
// 
//   /**
//    * Set unique id for message.
//    *
//    * @param id String, message id.
//    */
//   public void setId(String id) {
//     this.id = id;
//   }
// 
//   /**
//    * Get attached payload.
//    *
//    * @return payload.
//    */
//   public Object getPayload() {
//     return payload;
//   }
// 
//   /**
//    * Attach payload to message.
//    *
//    * @param payload payload object.
//    */
//   public void setPayload(Object payload) {
//     this.payload = payload;
//   }
// 
//   /**
//    * Get the action.
//    *
//    * @return String, action.
//    */
//   public String getAction() {
//     return action;
//   }
// 
//   /**
//    * Set the action.
//    *
//    * @param action String, action.
//    */
//   public void setAction(String action) {
//     this.action = action;
//   }
// 
//   @Override
//   public String toString() {
//     return MoreObjects.toStringHelper(this)
//         .add("id", id)
//         .add("payload", payload)
//         .add("action", action)
//         .toString();
//   }
// }


import com.google.gson.*;
import eu.chargetime.ocpp.model.CallErrorMessage;
import eu.chargetime.ocpp.model.CallMessage;
import eu.chargetime.ocpp.model.CallResultMessage;
import eu.chargetime.ocpp.model.Message;
import java.lang.reflect.Type;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
    gson = builder.create();
  }

  @Override
  public <T> T unpackPayload(Object payload, Class<T> type) throws Exception {
    return gson.fromJson(payload.toString(), type);
  }

  @Override
  public Object packPayload(Object payload) {
    return gson.toJson(payload);
  }

  @Override
  protected Object makeCallResult(String uniqueId, String action, Object payload) {
    return String.format(CALLRESULT_FORMAT, uniqueId, payload);
  }

  @Override
  protected Object makeCall(String uniqueId, String action, Object payload) {
    return String.format(CALL_FORMAT, uniqueId, action, payload);
  }

  @Override
  protected Object makeCallError(
      String uniqueId, String action, String errorCode, String errorDescription) {
    return String.format(CALLERROR_FORMAT, uniqueId, errorCode, errorDescription, "{}");
  }

  @Override
// Path: ocpp-common/src/main/java/eu/chargetime/ocpp/model/Message.java
// public class Message {
//   private String id;
//   private Object payload;
//   private String action;
// 
//   /**
//    * Get unique id for message.
//    *
//    * @return message id.
//    */
//   public String getId() {
//     return id;
//   }
// 
//   /**
//    * Set unique id for message.
//    *
//    * @param id String, message id.
//    */
//   public void setId(String id) {
//     this.id = id;
//   }
// 
//   /**
//    * Get attached payload.
//    *
//    * @return payload.
//    */
//   public Object getPayload() {
//     return payload;
//   }
// 
//   /**
//    * Attach payload to message.
//    *
//    * @param payload payload object.
//    */
//   public void setPayload(Object payload) {
//     this.payload = payload;
//   }
// 
//   /**
//    * Get the action.
//    *
//    * @return String, action.
//    */
//   public String getAction() {
//     return action;
//   }
// 
//   /**
//    * Set the action.
//    *
//    * @param action String, action.
//    */
//   public void setAction(String action) {
//     this.action = action;
//   }
// 
//   @Override
//   public String toString() {
//     return MoreObjects.toStringHelper(this)
//         .add("id", id)
//         .add("payload", payload)
//         .add("action", action)
//         .toString();
//   }
// }


// Path: OCPP-J/src/main/java/eu/chargetime/ocpp/JSONCommunicator.java
import com.google.gson.*;
import eu.chargetime.ocpp.model.CallErrorMessage;
import eu.chargetime.ocpp.model.CallMessage;
import eu.chargetime.ocpp.model.CallResultMessage;
import eu.chargetime.ocpp.model.Message;
import java.lang.reflect.Type;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

    gson = builder.create();
  }

  @Override
  public <T> T unpackPayload(Object payload, Class<T> type) throws Exception {
    return gson.fromJson(payload.toString(), type);
  }

  @Override
  public Object packPayload(Object payload) {
    return gson.toJson(payload);
  }

  @Override
  protected Object makeCallResult(String uniqueId, String action, Object payload) {
    return String.format(CALLRESULT_FORMAT, uniqueId, payload);
  }

  @Override
  protected Object makeCall(String uniqueId, String action, Object payload) {
    return String.format(CALL_FORMAT, uniqueId, action, payload);
  }

  @Override
  protected Object makeCallError(
      String uniqueId, String action, String errorCode, String errorDescription) {
    return String.format(CALLERROR_FORMAT, uniqueId, errorCode, errorDescription, "{}");
  }

  @Override
  protected Message parse(Object json) {