/*******************************************************************************
* Copyright (c) 2016 Sierra Wireless and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.html.
*
* Contributors:
* Sierra Wireless - initial API and implementation
*******************************************************************************/
package org.eclipse.leshan.server.cluster.serialization;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.californium.core.coap.Request;
import org.eclipse.californium.core.network.serialization.DataParser;
import org.eclipse.californium.core.network.serialization.DataSerializer;
import org.eclipse.californium.core.network.serialization.UdpDataParser;
import org.eclipse.californium.core.network.serialization.UdpDataSerializer;
import org.eclipse.californium.core.observe.Observation;
import org.eclipse.californium.elements.RawData;
import org.eclipse.leshan.util.Hex;
import com.eclipsesource.json.Json;
import com.eclipsesource.json.JsonObject;
import com.eclipsesource.json.JsonValue;
/**
* Functions for serializing and deserializing a Californium {@link Observation} in JSON.
*
* The embedded CoAP request is serialized using the Californium network serialization (see {@link UdpDataParser} and
* {@link UdpDataSerializer}).
*/
public class ObservationSerDes {
private static final DataSerializer serializer = new UdpDataSerializer();
private static final DataParser parser = new UdpDataParser();
public static byte[] serialize(Observation obs) {
JsonObject o = Json.object();
o.set("request", Hex.encodeHexString(serializer.serializeRequest(obs.getRequest()).bytes));
if (obs.getRequest().getUserContext() != null) {
JsonObject ctxObject = Json.object();
for (Entry<String, String> e : obs.getRequest().getUserContext().entrySet()) {
ctxObject.set(e.getKey(), e.getValue());
}
o.set("context", ctxObject);
}
return o.toString().getBytes();
}
public static Observation deserialize(byte[] data) {
JsonObject v = (JsonObject) Json.parse(new String(data));
byte[] req = Hex.decodeHex(v.getString("request", null).toCharArray());
Request request = (Request) parser.parseMessage(new RawData(req, null, 0));
JsonValue ctxValue = v.get("context");
if (ctxValue != null) {
Map<String, String> context = new HashMap<>();
JsonObject ctxObject = (JsonObject) ctxValue;
for (String name : ctxObject.names()) {
context.put(name, ctxObject.getString(name, null));
}
request.setUserContext(context);
}
// TODO handle security context
return new Observation(request, null);
}
}