/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.communication.routing.internal.v2;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import de.rcenvironment.core.utils.common.JsonUtils;
/**
* Converter between {@link LinkState} objects and their string representation.
*
* @author Robert Mischke
*/
public final class LinkStateSerializer {
private LinkStateSerializer() {}
/**
* Local stub to simplify JSON generation and parsing.
*
* @author Robert Mischke
*/
private static class LinkStateJsonStub {
public String id; // link id
public String node; // NodeIdentifier string
/**
* Constructor for JSON deserialization.
*/
@SuppressWarnings("unused")
LinkStateJsonStub() {}
LinkStateJsonStub(Link link) {
id = link.getLinkId();
node = link.getNodeIdString();
}
public Link toLink() {
return new Link(id, node);
}
}
/**
* Converts a {@link LinkState} to its string representation.
*
* @param state the LinkState
* @return the string representation
*/
public static String serialize(LinkState state) {
return serialize(state.getLinks());
}
/**
* Convenience method: Converts a list of {@link Link}s to an equivalent {@link LinkState}
* string representation.
*
* @param links the list of {@link Link}s
* @return the string representation
*/
public static String serialize(Collection<Link> links) {
ObjectMapper mapper = JsonUtils.getDefaultObjectMapper();
try {
List<LinkStateJsonStub> stubList = new ArrayList<LinkStateSerializer.LinkStateJsonStub>();
for (Link link : links) {
stubList.add(new LinkStateJsonStub(link));
}
return mapper.writeValueAsString(stubList);
} catch (IOException e) {
// should never happen
throw new IllegalStateException("Error serializing local link state", e);
}
}
/**
* Restores a {@link LinkState} from its string representation.
*
* @param serialized the string representation
* @return the restored
* @throws IOException on failure to parse the given string
*/
public static LinkState deserialize(String serialized) throws IOException {
ObjectMapper mapper = JsonUtils.getDefaultObjectMapper();
try {
List<LinkStateJsonStub> stubList =
mapper.readValue(serialized, new TypeReference<List<LinkStateJsonStub>>() {
});
List<Link> links = new ArrayList<Link>();
for (LinkStateJsonStub stub : stubList) {
links.add(stub.toLink());
}
return new LinkState(links);
} catch (IOException e) {
throw new IOException("Failed to parse link state data: linkStateData", e);
}
}
}