Committed by
Gerrit Code Review
ONOS-743 - Use REST API Codecs to generate JSON for CLI commands
Change-Id: I25e0840d1af03341c638f837498c95275e6cf31b
Showing
23 changed files
with
134 additions
and
296 deletions
| ... | @@ -41,6 +41,10 @@ | ... | @@ -41,6 +41,10 @@ |
| 41 | <groupId>org.onosproject</groupId> | 41 | <groupId>org.onosproject</groupId> |
| 42 | <artifactId>onlab-osgi</artifactId> | 42 | <artifactId>onlab-osgi</artifactId> |
| 43 | </dependency> | 43 | </dependency> |
| 44 | + <dependency> | ||
| 45 | + <groupId>org.onosproject</groupId> | ||
| 46 | + <artifactId>onos-core-common</artifactId> | ||
| 47 | + </dependency> | ||
| 44 | 48 | ||
| 45 | <dependency> | 49 | <dependency> |
| 46 | <groupId>com.fasterxml.jackson.core</groupId> | 50 | <groupId>com.fasterxml.jackson.core</groupId> | ... | ... |
| ... | @@ -15,20 +15,24 @@ | ... | @@ -15,20 +15,24 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.cli; | 16 | package org.onosproject.cli; |
| 17 | 17 | ||
| 18 | -import com.fasterxml.jackson.databind.ObjectMapper; | ||
| 19 | -import com.fasterxml.jackson.databind.node.ObjectNode; | ||
| 20 | import org.apache.karaf.shell.commands.Option; | 18 | import org.apache.karaf.shell.commands.Option; |
| 21 | import org.apache.karaf.shell.console.AbstractAction; | 19 | import org.apache.karaf.shell.console.AbstractAction; |
| 22 | import org.onlab.osgi.DefaultServiceDirectory; | 20 | import org.onlab.osgi.DefaultServiceDirectory; |
| 23 | import org.onlab.osgi.ServiceNotFoundException; | 21 | import org.onlab.osgi.ServiceNotFoundException; |
| 22 | +import org.onosproject.codec.CodecContext; | ||
| 23 | +import org.onosproject.codec.CodecService; | ||
| 24 | +import org.onosproject.codec.JsonCodec; | ||
| 24 | import org.onosproject.core.ApplicationId; | 25 | import org.onosproject.core.ApplicationId; |
| 25 | import org.onosproject.core.CoreService; | 26 | import org.onosproject.core.CoreService; |
| 26 | import org.onosproject.net.Annotations; | 27 | import org.onosproject.net.Annotations; |
| 27 | 28 | ||
| 29 | +import com.fasterxml.jackson.databind.ObjectMapper; | ||
| 30 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
| 31 | + | ||
| 28 | /** | 32 | /** |
| 29 | * Base abstraction of Karaf shell commands. | 33 | * Base abstraction of Karaf shell commands. |
| 30 | */ | 34 | */ |
| 31 | -public abstract class AbstractShellCommand extends AbstractAction { | 35 | +public abstract class AbstractShellCommand extends AbstractAction implements CodecContext { |
| 32 | 36 | ||
| 33 | @Option(name = "-j", aliases = "--json", description = "Output JSON", | 37 | @Option(name = "-j", aliases = "--json", description = "Output JSON", |
| 34 | required = false, multiValued = false) | 38 | required = false, multiValued = false) |
| ... | @@ -129,4 +133,35 @@ public abstract class AbstractShellCommand extends AbstractAction { | ... | @@ -129,4 +133,35 @@ public abstract class AbstractShellCommand extends AbstractAction { |
| 129 | return null; | 133 | return null; |
| 130 | } | 134 | } |
| 131 | 135 | ||
| 136 | + | ||
| 137 | + | ||
| 138 | + private final ObjectMapper mapper = new ObjectMapper(); | ||
| 139 | + | ||
| 140 | + @Override | ||
| 141 | + public ObjectMapper mapper() { | ||
| 142 | + return mapper; | ||
| 143 | + } | ||
| 144 | + | ||
| 145 | + @Override | ||
| 146 | + @SuppressWarnings("unchecked") | ||
| 147 | + public <T> JsonCodec<T> codec(Class<T> entityClass) { | ||
| 148 | + return get(CodecService.class).getCodec(entityClass); | ||
| 149 | + } | ||
| 150 | + | ||
| 151 | + @Override | ||
| 152 | + public <T> T getService(Class<T> serviceClass) { | ||
| 153 | + return get(serviceClass); | ||
| 154 | + } | ||
| 155 | + | ||
| 156 | + /** | ||
| 157 | + * Generates a Json representation of an object. | ||
| 158 | + * | ||
| 159 | + * @param entity object to generate JSON for | ||
| 160 | + * @param entityClass class to format with - this chooses which codec to use | ||
| 161 | + * @param <T> Type of the object being formatted | ||
| 162 | + * @return JSON object representation | ||
| 163 | + */ | ||
| 164 | + public <T> ObjectNode jsonForEntity(T entity, Class<T> entityClass) { | ||
| 165 | + return codec(entityClass).encode(entity, this); | ||
| 166 | + } | ||
| 132 | } | 167 | } | ... | ... |
| ... | @@ -15,9 +15,9 @@ | ... | @@ -15,9 +15,9 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.cli.app; | 16 | package org.onosproject.cli.app; |
| 17 | 17 | ||
| 18 | -import com.fasterxml.jackson.databind.JsonNode; | 18 | +import java.util.Collections; |
| 19 | -import com.fasterxml.jackson.databind.ObjectMapper; | 19 | +import java.util.List; |
| 20 | -import com.fasterxml.jackson.databind.node.ArrayNode; | 20 | + |
| 21 | import org.apache.karaf.shell.commands.Command; | 21 | import org.apache.karaf.shell.commands.Command; |
| 22 | import org.apache.karaf.shell.commands.Option; | 22 | import org.apache.karaf.shell.commands.Option; |
| 23 | import org.onosproject.app.ApplicationService; | 23 | import org.onosproject.app.ApplicationService; |
| ... | @@ -25,8 +25,9 @@ import org.onosproject.cli.AbstractShellCommand; | ... | @@ -25,8 +25,9 @@ import org.onosproject.cli.AbstractShellCommand; |
| 25 | import org.onosproject.cli.Comparators; | 25 | import org.onosproject.cli.Comparators; |
| 26 | import org.onosproject.core.Application; | 26 | import org.onosproject.core.Application; |
| 27 | 27 | ||
| 28 | -import java.util.Collections; | 28 | +import com.fasterxml.jackson.databind.JsonNode; |
| 29 | -import java.util.List; | 29 | +import com.fasterxml.jackson.databind.ObjectMapper; |
| 30 | +import com.fasterxml.jackson.databind.node.ArrayNode; | ||
| 30 | 31 | ||
| 31 | import static com.google.common.collect.Lists.newArrayList; | 32 | import static com.google.common.collect.Lists.newArrayList; |
| 32 | import static org.onosproject.app.ApplicationState.ACTIVE; | 33 | import static org.onosproject.app.ApplicationState.ACTIVE; |
| ... | @@ -88,25 +89,12 @@ public class ApplicationsListCommand extends AbstractShellCommand { | ... | @@ -88,25 +89,12 @@ public class ApplicationsListCommand extends AbstractShellCommand { |
| 88 | for (Application app : apps) { | 89 | for (Application app : apps) { |
| 89 | boolean isActive = service.getState(app.id()) == ACTIVE; | 90 | boolean isActive = service.getState(app.id()) == ACTIVE; |
| 90 | if (activeOnly && isActive || !activeOnly) { | 91 | if (activeOnly && isActive || !activeOnly) { |
| 91 | - result.add(json(service, mapper, app)); | 92 | + result.add(jsonForEntity(app, Application.class)); |
| 92 | } | 93 | } |
| 93 | } | 94 | } |
| 94 | return result; | 95 | return result; |
| 95 | } | 96 | } |
| 96 | 97 | ||
| 97 | - protected JsonNode json(ApplicationService service, ObjectMapper mapper, | 98 | + |
| 98 | - Application app) { | ||
| 99 | - return mapper.createObjectNode() | ||
| 100 | - .put("name", app.id().name()) | ||
| 101 | - .put("id", app.id().id()) | ||
| 102 | - .put("version", app.version().toString()) | ||
| 103 | - .put("description", app.description()) | ||
| 104 | - .put("origin", app.origin()) | ||
| 105 | - .put("permissions", app.permissions().toString()) | ||
| 106 | - .put("featuresRepo", app.featuresRepo().isPresent() ? | ||
| 107 | - app.featuresRepo().get().toString() : "") | ||
| 108 | - .put("features", app.features().toString()) | ||
| 109 | - .put("state", service.getState(app.id()).toString()); | ||
| 110 | - } | ||
| 111 | 99 | ||
| 112 | } | 100 | } | ... | ... |
| ... | @@ -43,7 +43,7 @@ public class ClusterLinksCommand extends ClustersListCommand { | ... | @@ -43,7 +43,7 @@ public class ClusterLinksCommand extends ClustersListCommand { |
| 43 | if (cluster == null) { | 43 | if (cluster == null) { |
| 44 | error("No such cluster %s", cid); | 44 | error("No such cluster %s", cid); |
| 45 | } else if (outputJson()) { | 45 | } else if (outputJson()) { |
| 46 | - print("%s", json(service.getClusterLinks(topology, cluster))); | 46 | + print("%s", json(this, service.getClusterLinks(topology, cluster))); |
| 47 | } else { | 47 | } else { |
| 48 | for (Link link : service.getClusterLinks(topology, cluster)) { | 48 | for (Link link : service.getClusterLinks(topology, cluster)) { |
| 49 | print(linkString(link)); | 49 | print(linkString(link)); | ... | ... |
| ... | @@ -55,12 +55,11 @@ public class ClustersListCommand extends TopologyCommand { | ... | @@ -55,12 +55,11 @@ public class ClustersListCommand extends TopologyCommand { |
| 55 | private JsonNode json(Iterable<TopologyCluster> clusters) { | 55 | private JsonNode json(Iterable<TopologyCluster> clusters) { |
| 56 | ObjectMapper mapper = new ObjectMapper(); | 56 | ObjectMapper mapper = new ObjectMapper(); |
| 57 | ArrayNode result = mapper.createArrayNode(); | 57 | ArrayNode result = mapper.createArrayNode(); |
| 58 | - for (TopologyCluster cluster : clusters) { | 58 | + |
| 59 | - result.add(mapper.createObjectNode() | 59 | + clusters.spliterator() |
| 60 | - .put("id", cluster.id().index()) | 60 | + .forEachRemaining(cluster -> |
| 61 | - .put("deviceCount", cluster.deviceCount()) | 61 | + result.add(jsonForEntity(cluster, TopologyCluster.class))); |
| 62 | - .put("linkCount", cluster.linkCount())); | 62 | + |
| 63 | - } | ||
| 64 | return result; | 63 | return result; |
| 65 | } | 64 | } |
| 66 | 65 | ... | ... |
| ... | @@ -116,7 +116,7 @@ public class DevicePortsListCommand extends DevicesListCommand { | ... | @@ -116,7 +116,7 @@ public class DevicePortsListCommand extends DevicesListCommand { |
| 116 | .set("annotations", annotations(mapper, port.annotations()))); | 116 | .set("annotations", annotations(mapper, port.annotations()))); |
| 117 | } | 117 | } |
| 118 | } | 118 | } |
| 119 | - result.set("device", json(service, mapper, device)); | 119 | + result.set("device", jsonForEntity(device, Device.class)); |
| 120 | result.set("ports", ports); | 120 | result.set("ports", ports); |
| 121 | return result; | 121 | return result; |
| 122 | } | 122 | } | ... | ... |
| ... | @@ -15,18 +15,18 @@ | ... | @@ -15,18 +15,18 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.cli.net; | 16 | package org.onosproject.cli.net; |
| 17 | 17 | ||
| 18 | -import com.fasterxml.jackson.databind.JsonNode; | 18 | +import java.util.Collections; |
| 19 | -import com.fasterxml.jackson.databind.ObjectMapper; | 19 | +import java.util.List; |
| 20 | -import com.fasterxml.jackson.databind.node.ArrayNode; | 20 | + |
| 21 | -import com.fasterxml.jackson.databind.node.ObjectNode; | ||
| 22 | import org.apache.karaf.shell.commands.Command; | 21 | import org.apache.karaf.shell.commands.Command; |
| 23 | import org.onosproject.cli.AbstractShellCommand; | 22 | import org.onosproject.cli.AbstractShellCommand; |
| 24 | import org.onosproject.cli.Comparators; | 23 | import org.onosproject.cli.Comparators; |
| 25 | import org.onosproject.net.Device; | 24 | import org.onosproject.net.Device; |
| 26 | import org.onosproject.net.device.DeviceService; | 25 | import org.onosproject.net.device.DeviceService; |
| 27 | 26 | ||
| 28 | -import java.util.Collections; | 27 | +import com.fasterxml.jackson.databind.JsonNode; |
| 29 | -import java.util.List; | 28 | +import com.fasterxml.jackson.databind.ObjectMapper; |
| 29 | +import com.fasterxml.jackson.databind.node.ArrayNode; | ||
| 30 | 30 | ||
| 31 | import static com.google.common.collect.Lists.newArrayList; | 31 | import static com.google.common.collect.Lists.newArrayList; |
| 32 | 32 | ||
| ... | @@ -44,7 +44,7 @@ public class DevicesListCommand extends AbstractShellCommand { | ... | @@ -44,7 +44,7 @@ public class DevicesListCommand extends AbstractShellCommand { |
| 44 | protected void execute() { | 44 | protected void execute() { |
| 45 | DeviceService service = get(DeviceService.class); | 45 | DeviceService service = get(DeviceService.class); |
| 46 | if (outputJson()) { | 46 | if (outputJson()) { |
| 47 | - print("%s", json(service, getSortedDevices(service))); | 47 | + print("%s", json(getSortedDevices(service))); |
| 48 | } else { | 48 | } else { |
| 49 | for (Device device : getSortedDevices(service)) { | 49 | for (Device device : getSortedDevices(service)) { |
| 50 | printDevice(service, device); | 50 | printDevice(service, device); |
| ... | @@ -55,40 +55,14 @@ public class DevicesListCommand extends AbstractShellCommand { | ... | @@ -55,40 +55,14 @@ public class DevicesListCommand extends AbstractShellCommand { |
| 55 | /** | 55 | /** |
| 56 | * Returns JSON node representing the specified devices. | 56 | * Returns JSON node representing the specified devices. |
| 57 | * | 57 | * |
| 58 | - * @param service device service | ||
| 59 | * @param devices collection of devices | 58 | * @param devices collection of devices |
| 60 | * @return JSON node | 59 | * @return JSON node |
| 61 | */ | 60 | */ |
| 62 | - public static JsonNode json(DeviceService service, Iterable<Device> devices) { | 61 | + private JsonNode json(Iterable<Device> devices) { |
| 63 | ObjectMapper mapper = new ObjectMapper(); | 62 | ObjectMapper mapper = new ObjectMapper(); |
| 64 | ArrayNode result = mapper.createArrayNode(); | 63 | ArrayNode result = mapper.createArrayNode(); |
| 65 | for (Device device : devices) { | 64 | for (Device device : devices) { |
| 66 | - result.add(json(service, mapper, device)); | 65 | + result.add(jsonForEntity(device, Device.class)); |
| 67 | - } | ||
| 68 | - return result; | ||
| 69 | - } | ||
| 70 | - | ||
| 71 | - /** | ||
| 72 | - * Returns JSON node representing the specified device. | ||
| 73 | - * | ||
| 74 | - * @param service device service | ||
| 75 | - * @param mapper object mapper | ||
| 76 | - * @param device infrastructure device | ||
| 77 | - * @return JSON node | ||
| 78 | - */ | ||
| 79 | - public static ObjectNode json(DeviceService service, ObjectMapper mapper, | ||
| 80 | - Device device) { | ||
| 81 | - ObjectNode result = mapper.createObjectNode(); | ||
| 82 | - if (device != null) { | ||
| 83 | - result.put("id", device.id().toString()) | ||
| 84 | - .put("available", service.isAvailable(device.id())) | ||
| 85 | - .put("type", device.type().toString()) | ||
| 86 | - .put("role", service.getRole(device.id()).toString()) | ||
| 87 | - .put("mfr", device.manufacturer()) | ||
| 88 | - .put("hw", device.hwVersion()) | ||
| 89 | - .put("sw", device.swVersion()) | ||
| 90 | - .put("serial", device.serialNumber()) | ||
| 91 | - .set("annotations", annotations(mapper, device.annotations())); | ||
| 92 | } | 66 | } |
| 93 | return result; | 67 | return result; |
| 94 | } | 68 | } | ... | ... |
| ... | @@ -15,31 +15,28 @@ | ... | @@ -15,31 +15,28 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.cli.net; | 16 | package org.onosproject.cli.net; |
| 17 | 17 | ||
| 18 | -import com.fasterxml.jackson.databind.JsonNode; | 18 | +import java.util.Collections; |
| 19 | -import com.fasterxml.jackson.databind.ObjectMapper; | 19 | +import java.util.List; |
| 20 | -import com.fasterxml.jackson.databind.node.ArrayNode; | 20 | +import java.util.Map; |
| 21 | -import com.fasterxml.jackson.databind.node.ObjectNode; | 21 | +import java.util.SortedMap; |
| 22 | +import java.util.TreeMap; | ||
| 22 | 23 | ||
| 23 | import org.apache.karaf.shell.commands.Argument; | 24 | import org.apache.karaf.shell.commands.Argument; |
| 24 | import org.apache.karaf.shell.commands.Command; | 25 | import org.apache.karaf.shell.commands.Command; |
| 25 | -import org.onosproject.core.ApplicationId; | ||
| 26 | -import org.onosproject.core.CoreService; | ||
| 27 | import org.onosproject.cli.AbstractShellCommand; | 26 | import org.onosproject.cli.AbstractShellCommand; |
| 28 | import org.onosproject.cli.Comparators; | 27 | import org.onosproject.cli.Comparators; |
| 28 | +import org.onosproject.core.CoreService; | ||
| 29 | import org.onosproject.net.Device; | 29 | import org.onosproject.net.Device; |
| 30 | import org.onosproject.net.DeviceId; | 30 | import org.onosproject.net.DeviceId; |
| 31 | import org.onosproject.net.device.DeviceService; | 31 | import org.onosproject.net.device.DeviceService; |
| 32 | import org.onosproject.net.flow.FlowEntry; | 32 | import org.onosproject.net.flow.FlowEntry; |
| 33 | import org.onosproject.net.flow.FlowEntry.FlowEntryState; | 33 | import org.onosproject.net.flow.FlowEntry.FlowEntryState; |
| 34 | import org.onosproject.net.flow.FlowRuleService; | 34 | import org.onosproject.net.flow.FlowRuleService; |
| 35 | -import org.onosproject.net.flow.criteria.Criterion; | ||
| 36 | -import org.onosproject.net.flow.instructions.Instruction; | ||
| 37 | 35 | ||
| 38 | -import java.util.Collections; | 36 | +import com.fasterxml.jackson.databind.JsonNode; |
| 39 | -import java.util.List; | 37 | +import com.fasterxml.jackson.databind.ObjectMapper; |
| 40 | -import java.util.Map; | 38 | +import com.fasterxml.jackson.databind.node.ArrayNode; |
| 41 | -import java.util.SortedMap; | 39 | +import com.fasterxml.jackson.databind.node.ObjectNode; |
| 42 | -import java.util.TreeMap; | ||
| 43 | 40 | ||
| 44 | import static com.google.common.collect.Lists.newArrayList; | 41 | import static com.google.common.collect.Lists.newArrayList; |
| 45 | 42 | ||
| ... | @@ -73,7 +70,7 @@ public class FlowsListCommand extends AbstractShellCommand { | ... | @@ -73,7 +70,7 @@ public class FlowsListCommand extends AbstractShellCommand { |
| 73 | SortedMap<Device, List<FlowEntry>> flows = getSortedFlows(deviceService, service); | 70 | SortedMap<Device, List<FlowEntry>> flows = getSortedFlows(deviceService, service); |
| 74 | 71 | ||
| 75 | if (outputJson()) { | 72 | if (outputJson()) { |
| 76 | - print("%s", json(coreService, flows.keySet(), flows)); | 73 | + print("%s", json(flows.keySet(), flows)); |
| 77 | } else { | 74 | } else { |
| 78 | flows.forEach((device, flow) -> printFlows(device, flow, coreService)); | 75 | flows.forEach((device, flow) -> printFlows(device, flow, coreService)); |
| 79 | } | 76 | } |
| ... | @@ -82,30 +79,27 @@ public class FlowsListCommand extends AbstractShellCommand { | ... | @@ -82,30 +79,27 @@ public class FlowsListCommand extends AbstractShellCommand { |
| 82 | /** | 79 | /** |
| 83 | * Produces a JSON array of flows grouped by the each device. | 80 | * Produces a JSON array of flows grouped by the each device. |
| 84 | * | 81 | * |
| 85 | - * @param coreService core service | ||
| 86 | * @param devices collection of devices to group flow by | 82 | * @param devices collection of devices to group flow by |
| 87 | * @param flows collection of flows per each device | 83 | * @param flows collection of flows per each device |
| 88 | * @return JSON array | 84 | * @return JSON array |
| 89 | */ | 85 | */ |
| 90 | - private JsonNode json(CoreService coreService, Iterable<Device> devices, | 86 | + private JsonNode json(Iterable<Device> devices, |
| 91 | Map<Device, List<FlowEntry>> flows) { | 87 | Map<Device, List<FlowEntry>> flows) { |
| 92 | ObjectMapper mapper = new ObjectMapper(); | 88 | ObjectMapper mapper = new ObjectMapper(); |
| 93 | ArrayNode result = mapper.createArrayNode(); | 89 | ArrayNode result = mapper.createArrayNode(); |
| 94 | for (Device device : devices) { | 90 | for (Device device : devices) { |
| 95 | - result.add(json(coreService, mapper, device, flows.get(device))); | 91 | + result.add(json(mapper, device, flows.get(device))); |
| 96 | } | 92 | } |
| 97 | return result; | 93 | return result; |
| 98 | } | 94 | } |
| 99 | 95 | ||
| 100 | // Produces JSON object with the flows of the given device. | 96 | // Produces JSON object with the flows of the given device. |
| 101 | - private ObjectNode json(CoreService coreService, ObjectMapper mapper, | 97 | + private ObjectNode json(ObjectMapper mapper, |
| 102 | Device device, List<FlowEntry> flows) { | 98 | Device device, List<FlowEntry> flows) { |
| 103 | ObjectNode result = mapper.createObjectNode(); | 99 | ObjectNode result = mapper.createObjectNode(); |
| 104 | ArrayNode array = mapper.createArrayNode(); | 100 | ArrayNode array = mapper.createArrayNode(); |
| 105 | 101 | ||
| 106 | - for (FlowEntry flow : flows) { | 102 | + flows.forEach(flow -> array.add(jsonForEntity(flow, FlowEntry.class))); |
| 107 | - array.add(json(coreService, mapper, flow)); | ||
| 108 | - } | ||
| 109 | 103 | ||
| 110 | result.put("device", device.id().toString()) | 104 | result.put("device", device.id().toString()) |
| 111 | .put("flowCount", flows.size()) | 105 | .put("flowCount", flows.size()) |
| ... | @@ -113,37 +107,6 @@ public class FlowsListCommand extends AbstractShellCommand { | ... | @@ -113,37 +107,6 @@ public class FlowsListCommand extends AbstractShellCommand { |
| 113 | return result; | 107 | return result; |
| 114 | } | 108 | } |
| 115 | 109 | ||
| 116 | - // Produces JSON structure with the specified flow data. | ||
| 117 | - private ObjectNode json(CoreService coreService, ObjectMapper mapper, | ||
| 118 | - FlowEntry flow) { | ||
| 119 | - ObjectNode result = mapper.createObjectNode(); | ||
| 120 | - ArrayNode crit = mapper.createArrayNode(); | ||
| 121 | - for (Criterion c : flow.selector().criteria()) { | ||
| 122 | - crit.add(c.toString()); | ||
| 123 | - } | ||
| 124 | - | ||
| 125 | - ArrayNode instr = mapper.createArrayNode(); | ||
| 126 | - for (Instruction i : flow.treatment().allInstructions()) { | ||
| 127 | - instr.add(i.toString()); | ||
| 128 | - } | ||
| 129 | - | ||
| 130 | - ApplicationId appCoreId = coreService.getAppId(flow.appId()); | ||
| 131 | - String appName = appCoreId == null ? | ||
| 132 | - Short.toString(flow.appId()) | ||
| 133 | - : appCoreId.name(); | ||
| 134 | - | ||
| 135 | - result.put("flowId", Long.toHexString(flow.id().value())) | ||
| 136 | - .put("state", flow.state().toString()) | ||
| 137 | - .put("bytes", flow.bytes()) | ||
| 138 | - .put("packets", flow.packets()) | ||
| 139 | - .put("life", flow.life()) | ||
| 140 | - .put("tableId", flow.tableId()) | ||
| 141 | - .put("appId", appName); | ||
| 142 | - result.set("selector", crit); | ||
| 143 | - result.set("treatment", instr); | ||
| 144 | - return result; | ||
| 145 | - } | ||
| 146 | - | ||
| 147 | /** | 110 | /** |
| 148 | * Returns the list of devices sorted using the device ID URIs. | 111 | * Returns the list of devices sorted using the device ID URIs. |
| 149 | * | 112 | * | ... | ... |
| ... | @@ -15,19 +15,18 @@ | ... | @@ -15,19 +15,18 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.cli.net; | 16 | package org.onosproject.cli.net; |
| 17 | 17 | ||
| 18 | -import com.fasterxml.jackson.databind.JsonNode; | 18 | +import java.util.Collections; |
| 19 | -import com.fasterxml.jackson.databind.ObjectMapper; | 19 | +import java.util.List; |
| 20 | -import com.fasterxml.jackson.databind.node.ArrayNode; | 20 | + |
| 21 | -import com.fasterxml.jackson.databind.node.ObjectNode; | ||
| 22 | import org.apache.karaf.shell.commands.Command; | 21 | import org.apache.karaf.shell.commands.Command; |
| 23 | import org.onosproject.cli.AbstractShellCommand; | 22 | import org.onosproject.cli.AbstractShellCommand; |
| 24 | import org.onosproject.cli.Comparators; | 23 | import org.onosproject.cli.Comparators; |
| 25 | import org.onosproject.net.Host; | 24 | import org.onosproject.net.Host; |
| 26 | import org.onosproject.net.host.HostService; | 25 | import org.onosproject.net.host.HostService; |
| 27 | -import org.onlab.packet.IpAddress; | ||
| 28 | 26 | ||
| 29 | -import java.util.Collections; | 27 | +import com.fasterxml.jackson.databind.JsonNode; |
| 30 | -import java.util.List; | 28 | +import com.fasterxml.jackson.databind.ObjectMapper; |
| 29 | +import com.fasterxml.jackson.databind.node.ArrayNode; | ||
| 31 | 30 | ||
| 32 | import static com.google.common.collect.Lists.newArrayList; | 31 | import static com.google.common.collect.Lists.newArrayList; |
| 33 | 32 | ||
| ... | @@ -54,30 +53,11 @@ public class HostsListCommand extends AbstractShellCommand { | ... | @@ -54,30 +53,11 @@ public class HostsListCommand extends AbstractShellCommand { |
| 54 | } | 53 | } |
| 55 | 54 | ||
| 56 | // Produces JSON structure. | 55 | // Produces JSON structure. |
| 57 | - private static JsonNode json(Iterable<Host> hosts) { | 56 | + private JsonNode json(Iterable<Host> hosts) { |
| 58 | ObjectMapper mapper = new ObjectMapper(); | 57 | ObjectMapper mapper = new ObjectMapper(); |
| 59 | ArrayNode result = mapper.createArrayNode(); | 58 | ArrayNode result = mapper.createArrayNode(); |
| 60 | - for (Host host : hosts) { | ||
| 61 | - result.add(json(mapper, host)); | ||
| 62 | - } | ||
| 63 | - return result; | ||
| 64 | - } | ||
| 65 | 59 | ||
| 66 | - // Produces JSON structure. | 60 | + hosts.forEach(host -> result.add(jsonForEntity(host, Host.class))); |
| 67 | - private static JsonNode json(ObjectMapper mapper, Host host) { | ||
| 68 | - ObjectNode loc = LinksListCommand.json(mapper, host.location()) | ||
| 69 | - .put("time", host.location().time()); | ||
| 70 | - ArrayNode ips = mapper.createArrayNode(); | ||
| 71 | - for (IpAddress ip : host.ipAddresses()) { | ||
| 72 | - ips.add(ip.toString()); | ||
| 73 | - } | ||
| 74 | - ObjectNode result = mapper.createObjectNode() | ||
| 75 | - .put("id", host.id().toString()) | ||
| 76 | - .put("mac", host.mac().toString()) | ||
| 77 | - .put("vlan", host.vlan().toString()); | ||
| 78 | - result.set("location", loc); | ||
| 79 | - result.set("ips", ips); | ||
| 80 | - result.set("annotations", annotations(mapper, host.annotations())); | ||
| 81 | return result; | 61 | return result; |
| 82 | } | 62 | } |
| 83 | 63 | ... | ... |
| ... | @@ -15,16 +15,11 @@ | ... | @@ -15,16 +15,11 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.cli.net; | 16 | package org.onosproject.cli.net; |
| 17 | 17 | ||
| 18 | -import com.fasterxml.jackson.databind.JsonNode; | 18 | +import java.util.List; |
| 19 | -import com.fasterxml.jackson.databind.ObjectMapper; | 19 | + |
| 20 | -import com.fasterxml.jackson.databind.node.ArrayNode; | ||
| 21 | -import com.fasterxml.jackson.databind.node.ObjectNode; | ||
| 22 | import org.apache.karaf.shell.commands.Command; | 20 | import org.apache.karaf.shell.commands.Command; |
| 23 | import org.apache.karaf.shell.commands.Option; | 21 | import org.apache.karaf.shell.commands.Option; |
| 24 | import org.onosproject.cli.AbstractShellCommand; | 22 | import org.onosproject.cli.AbstractShellCommand; |
| 25 | -import org.onosproject.net.ConnectPoint; | ||
| 26 | -import org.onosproject.net.Link; | ||
| 27 | -import org.onosproject.net.NetworkResource; | ||
| 28 | import org.onosproject.net.intent.ConnectivityIntent; | 23 | import org.onosproject.net.intent.ConnectivityIntent; |
| 29 | import org.onosproject.net.intent.HostToHostIntent; | 24 | import org.onosproject.net.intent.HostToHostIntent; |
| 30 | import org.onosproject.net.intent.Intent; | 25 | import org.onosproject.net.intent.Intent; |
| ... | @@ -36,8 +31,10 @@ import org.onosproject.net.intent.PathIntent; | ... | @@ -36,8 +31,10 @@ import org.onosproject.net.intent.PathIntent; |
| 36 | import org.onosproject.net.intent.PointToPointIntent; | 31 | import org.onosproject.net.intent.PointToPointIntent; |
| 37 | import org.onosproject.net.intent.SinglePointToMultiPointIntent; | 32 | import org.onosproject.net.intent.SinglePointToMultiPointIntent; |
| 38 | 33 | ||
| 39 | -import java.util.List; | 34 | +import com.fasterxml.jackson.databind.JsonNode; |
| 40 | -import java.util.Set; | 35 | +import com.fasterxml.jackson.databind.ObjectMapper; |
| 36 | +import com.fasterxml.jackson.databind.node.ArrayNode; | ||
| 37 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
| 41 | 38 | ||
| 42 | /** | 39 | /** |
| 43 | * Lists the inventory of intents and their states. | 40 | * Lists the inventory of intents and their states. |
| ... | @@ -393,81 +390,9 @@ public class IntentsListCommand extends AbstractShellCommand { | ... | @@ -393,81 +390,9 @@ public class IntentsListCommand extends AbstractShellCommand { |
| 393 | private JsonNode json(IntentService service, Iterable<Intent> intents) { | 390 | private JsonNode json(IntentService service, Iterable<Intent> intents) { |
| 394 | ObjectMapper mapper = new ObjectMapper(); | 391 | ObjectMapper mapper = new ObjectMapper(); |
| 395 | ArrayNode result = mapper.createArrayNode(); | 392 | ArrayNode result = mapper.createArrayNode(); |
| 396 | - for (Intent intent : intents) { | ||
| 397 | - result.add(json(service, mapper, intent)); | ||
| 398 | - } | ||
| 399 | - return result; | ||
| 400 | - } | ||
| 401 | - | ||
| 402 | - private JsonNode json(IntentService service, ObjectMapper mapper, Intent intent) { | ||
| 403 | - ObjectNode result = mapper.createObjectNode() | ||
| 404 | - .put("id", intent.id().toString()) | ||
| 405 | - .put("type", intent.getClass().getSimpleName()) | ||
| 406 | - .put("appId", intent.appId().name()); | ||
| 407 | - | ||
| 408 | - IntentState state = service.getIntentState(intent.key()); | ||
| 409 | - if (state != null) { | ||
| 410 | - result.put("state", state.toString()); | ||
| 411 | - } | ||
| 412 | - | ||
| 413 | - if (!intent.resources().isEmpty()) { | ||
| 414 | - ArrayNode rnode = mapper.createArrayNode(); | ||
| 415 | - for (NetworkResource resource : intent.resources()) { | ||
| 416 | - rnode.add(resource.toString()); | ||
| 417 | - } | ||
| 418 | - result.set("resources", rnode); | ||
| 419 | - } | ||
| 420 | - | ||
| 421 | - if (intent instanceof ConnectivityIntent) { | ||
| 422 | - ConnectivityIntent ci = (ConnectivityIntent) intent; | ||
| 423 | - if (!ci.selector().criteria().isEmpty()) { | ||
| 424 | - result.put("selector", ci.selector().criteria().toString()); | ||
| 425 | - } | ||
| 426 | - if (!ci.treatment().allInstructions().isEmpty()) { | ||
| 427 | - result.put("treatment", ci.treatment().allInstructions().toString()); | ||
| 428 | - } | ||
| 429 | - } | ||
| 430 | - | ||
| 431 | - if (intent instanceof PathIntent) { | ||
| 432 | - PathIntent pi = (PathIntent) intent; | ||
| 433 | - ArrayNode pnode = mapper.createArrayNode(); | ||
| 434 | - for (Link link : pi.path().links()) { | ||
| 435 | - pnode.add(link.toString()); | ||
| 436 | - } | ||
| 437 | - result.set("path", pnode); | ||
| 438 | - } else if (intent instanceof HostToHostIntent) { | ||
| 439 | - HostToHostIntent pi = (HostToHostIntent) intent; | ||
| 440 | - result.set("host1", LinksListCommand.json(mapper, pi.one())); | ||
| 441 | - result.set("host2", LinksListCommand.json(mapper, pi.two())); | ||
| 442 | - } else if (intent instanceof PointToPointIntent) { | ||
| 443 | - PointToPointIntent pi = (PointToPointIntent) intent; | ||
| 444 | - result.set("ingress", LinksListCommand.json(mapper, pi.ingressPoint())); | ||
| 445 | - result.set("egress", LinksListCommand.json(mapper, pi.egressPoint())); | ||
| 446 | - } else if (intent instanceof MultiPointToSinglePointIntent) { | ||
| 447 | - MultiPointToSinglePointIntent pi = (MultiPointToSinglePointIntent) intent; | ||
| 448 | - result.set("ingress", json(mapper, pi.ingressPoints())); | ||
| 449 | - result.set("egress", LinksListCommand.json(mapper, pi.egressPoint())); | ||
| 450 | - } else if (intent instanceof SinglePointToMultiPointIntent) { | ||
| 451 | - SinglePointToMultiPointIntent pi = (SinglePointToMultiPointIntent) intent; | ||
| 452 | - result.set("ingress", LinksListCommand.json(mapper, pi.ingressPoint())); | ||
| 453 | - result.set("egress", json(mapper, pi.egressPoints())); | ||
| 454 | - } else if (intent instanceof LinkCollectionIntent) { | ||
| 455 | - LinkCollectionIntent li = (LinkCollectionIntent) intent; | ||
| 456 | - result.set("links", LinksListCommand.json(li.links())); | ||
| 457 | - } | ||
| 458 | 393 | ||
| 459 | - List<Intent> installable = service.getInstallableIntents(intent.key()); | 394 | + intents.forEach(intent -> result.add(jsonForEntity(intent, Intent.class))); |
| 460 | - if (installable != null && !installable.isEmpty()) { | ||
| 461 | - result.set("installable", json(service, installable)); | ||
| 462 | - } | ||
| 463 | return result; | 395 | return result; |
| 464 | } | 396 | } |
| 465 | 397 | ||
| 466 | - private JsonNode json(ObjectMapper mapper, Set<ConnectPoint> connectPoints) { | ||
| 467 | - ArrayNode result = mapper.createArrayNode(); | ||
| 468 | - for (ConnectPoint cp : connectPoints) { | ||
| 469 | - result.add(LinksListCommand.json(mapper, cp)); | ||
| 470 | - } | ||
| 471 | - return result; | ||
| 472 | - } | ||
| 473 | } | 398 | } | ... | ... |
| ... | @@ -15,18 +15,17 @@ | ... | @@ -15,18 +15,17 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.cli.net; | 16 | package org.onosproject.cli.net; |
| 17 | 17 | ||
| 18 | -import com.fasterxml.jackson.databind.JsonNode; | ||
| 19 | -import com.fasterxml.jackson.databind.ObjectMapper; | ||
| 20 | -import com.fasterxml.jackson.databind.node.ArrayNode; | ||
| 21 | -import com.fasterxml.jackson.databind.node.ObjectNode; | ||
| 22 | import org.apache.karaf.shell.commands.Argument; | 18 | import org.apache.karaf.shell.commands.Argument; |
| 23 | import org.apache.karaf.shell.commands.Command; | 19 | import org.apache.karaf.shell.commands.Command; |
| 24 | import org.onosproject.cli.AbstractShellCommand; | 20 | import org.onosproject.cli.AbstractShellCommand; |
| 25 | -import org.onosproject.net.ConnectPoint; | ||
| 26 | -import org.onosproject.net.HostId; | ||
| 27 | import org.onosproject.net.Link; | 21 | import org.onosproject.net.Link; |
| 28 | import org.onosproject.net.link.LinkService; | 22 | import org.onosproject.net.link.LinkService; |
| 29 | 23 | ||
| 24 | +import com.fasterxml.jackson.databind.JsonNode; | ||
| 25 | +import com.fasterxml.jackson.databind.ObjectMapper; | ||
| 26 | +import com.fasterxml.jackson.databind.node.ArrayNode; | ||
| 27 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
| 28 | + | ||
| 30 | import static org.onosproject.net.DeviceId.deviceId; | 29 | import static org.onosproject.net.DeviceId.deviceId; |
| 31 | 30 | ||
| 32 | /** | 31 | /** |
| ... | @@ -49,7 +48,7 @@ public class LinksListCommand extends AbstractShellCommand { | ... | @@ -49,7 +48,7 @@ public class LinksListCommand extends AbstractShellCommand { |
| 49 | Iterable<Link> links = uri != null ? | 48 | Iterable<Link> links = uri != null ? |
| 50 | service.getDeviceLinks(deviceId(uri)) : service.getLinks(); | 49 | service.getDeviceLinks(deviceId(uri)) : service.getLinks(); |
| 51 | if (outputJson()) { | 50 | if (outputJson()) { |
| 52 | - print("%s", json(links)); | 51 | + print("%s", json(this, links)); |
| 53 | } else { | 52 | } else { |
| 54 | for (Link link : links) { | 53 | for (Link link : links) { |
| 55 | print(linkString(link)); | 54 | print(linkString(link)); |
| ... | @@ -60,59 +59,28 @@ public class LinksListCommand extends AbstractShellCommand { | ... | @@ -60,59 +59,28 @@ public class LinksListCommand extends AbstractShellCommand { |
| 60 | /** | 59 | /** |
| 61 | * Produces a JSON array containing the specified links. | 60 | * Produces a JSON array containing the specified links. |
| 62 | * | 61 | * |
| 62 | + * @param context context to use for looking up codecs | ||
| 63 | * @param links collection of links | 63 | * @param links collection of links |
| 64 | * @return JSON array | 64 | * @return JSON array |
| 65 | */ | 65 | */ |
| 66 | - public static JsonNode json(Iterable<Link> links) { | 66 | + public static JsonNode json(AbstractShellCommand context, Iterable<Link> links) { |
| 67 | ObjectMapper mapper = new ObjectMapper(); | 67 | ObjectMapper mapper = new ObjectMapper(); |
| 68 | ArrayNode result = mapper.createArrayNode(); | 68 | ArrayNode result = mapper.createArrayNode(); |
| 69 | - for (Link link : links) { | 69 | + |
| 70 | - result.add(json(mapper, link)); | 70 | + links.forEach(link -> result.add(context.jsonForEntity(link, Link.class))); |
| 71 | - } | 71 | + |
| 72 | return result; | 72 | return result; |
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | /** | 75 | /** |
| 76 | * Produces a JSON object for the specified link. | 76 | * Produces a JSON object for the specified link. |
| 77 | * | 77 | * |
| 78 | - * @param mapper object mapper | 78 | + * @param context context to use for looking up codecs |
| 79 | * @param link link to encode | 79 | * @param link link to encode |
| 80 | * @return JSON object | 80 | * @return JSON object |
| 81 | */ | 81 | */ |
| 82 | - public static ObjectNode json(ObjectMapper mapper, Link link) { | 82 | + public static ObjectNode json(AbstractShellCommand context, Link link) { |
| 83 | - ObjectNode result = mapper.createObjectNode(); | 83 | + return context.jsonForEntity(link, Link.class); |
| 84 | - result.set("src", json(mapper, link.src())); | ||
| 85 | - result.set("dst", json(mapper, link.dst())); | ||
| 86 | - result.put("type", link.type().toString()); | ||
| 87 | - result.put("state", link.state().toString()); | ||
| 88 | - result.set("annotations", annotations(mapper, link.annotations())); | ||
| 89 | - return result; | ||
| 90 | - } | ||
| 91 | - | ||
| 92 | - /** | ||
| 93 | - * Produces a JSON object for the specified host ID. | ||
| 94 | - * | ||
| 95 | - * @param mapper object mapper | ||
| 96 | - * @param hostId host ID to encode | ||
| 97 | - * @return JSON object | ||
| 98 | - */ | ||
| 99 | - public static ObjectNode json(ObjectMapper mapper, HostId hostId) { | ||
| 100 | - return mapper.createObjectNode() | ||
| 101 | - .put("mac", hostId.mac().toString()) | ||
| 102 | - .put("vlanId", hostId.vlanId().toString()); | ||
| 103 | - } | ||
| 104 | - | ||
| 105 | - /** | ||
| 106 | - * Produces a JSON object for the specified connect point. | ||
| 107 | - * | ||
| 108 | - * @param mapper object mapper | ||
| 109 | - * @param connectPoint connection point to encode | ||
| 110 | - * @return JSON object | ||
| 111 | - */ | ||
| 112 | - public static ObjectNode json(ObjectMapper mapper, ConnectPoint connectPoint) { | ||
| 113 | - return mapper.createObjectNode() | ||
| 114 | - .put("device", connectPoint.deviceId().toString()) | ||
| 115 | - .put("port", connectPoint.port().toString()); | ||
| 116 | } | 84 | } |
| 117 | 85 | ||
| 118 | /** | 86 | /** | ... | ... |
| ... | @@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; | ... | @@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; |
| 20 | import com.fasterxml.jackson.databind.node.ArrayNode; | 20 | import com.fasterxml.jackson.databind.node.ArrayNode; |
| 21 | import org.apache.karaf.shell.commands.Argument; | 21 | import org.apache.karaf.shell.commands.Argument; |
| 22 | import org.apache.karaf.shell.commands.Command; | 22 | import org.apache.karaf.shell.commands.Command; |
| 23 | +import org.onosproject.cli.AbstractShellCommand; | ||
| 23 | import org.onosproject.net.Link; | 24 | import org.onosproject.net.Link; |
| 24 | import org.onosproject.net.Path; | 25 | import org.onosproject.net.Path; |
| 25 | 26 | ||
| ... | @@ -51,7 +52,7 @@ public class PathListCommand extends TopologyCommand { | ... | @@ -51,7 +52,7 @@ public class PathListCommand extends TopologyCommand { |
| 51 | init(); | 52 | init(); |
| 52 | Set<Path> paths = service.getPaths(topology, deviceId(src), deviceId(dst)); | 53 | Set<Path> paths = service.getPaths(topology, deviceId(src), deviceId(dst)); |
| 53 | if (outputJson()) { | 54 | if (outputJson()) { |
| 54 | - print("%s", json(paths)); | 55 | + print("%s", json(this, paths)); |
| 55 | } else { | 56 | } else { |
| 56 | for (Path path : paths) { | 57 | for (Path path : paths) { |
| 57 | print(pathString(path)); | 58 | print(pathString(path)); |
| ... | @@ -62,16 +63,17 @@ public class PathListCommand extends TopologyCommand { | ... | @@ -62,16 +63,17 @@ public class PathListCommand extends TopologyCommand { |
| 62 | /** | 63 | /** |
| 63 | * Produces a JSON array containing the specified paths. | 64 | * Produces a JSON array containing the specified paths. |
| 64 | * | 65 | * |
| 66 | + * @param context context to use for looking up codecs | ||
| 65 | * @param paths collection of paths | 67 | * @param paths collection of paths |
| 66 | * @return JSON array | 68 | * @return JSON array |
| 67 | */ | 69 | */ |
| 68 | - public static JsonNode json(Iterable<Path> paths) { | 70 | + public static JsonNode json(AbstractShellCommand context, Iterable<Path> paths) { |
| 69 | ObjectMapper mapper = new ObjectMapper(); | 71 | ObjectMapper mapper = new ObjectMapper(); |
| 70 | ArrayNode result = mapper.createArrayNode(); | 72 | ArrayNode result = mapper.createArrayNode(); |
| 71 | for (Path path : paths) { | 73 | for (Path path : paths) { |
| 72 | - result.add(LinksListCommand.json(mapper, path) | 74 | + result.add(LinksListCommand.json(context, path) |
| 73 | - .put("cost", path.cost()) | 75 | + .put("cost", path.cost()) |
| 74 | - .set("links", LinksListCommand.json(path.links()))); | 76 | + .set("links", LinksListCommand.json(context, path.links()))); |
| 75 | } | 77 | } |
| 76 | return result; | 78 | return result; |
| 77 | } | 79 | } | ... | ... |
| ... | @@ -27,8 +27,6 @@ import org.onosproject.net.topology.Topology; | ... | @@ -27,8 +27,6 @@ import org.onosproject.net.topology.Topology; |
| 27 | import org.onosproject.net.topology.TopologyProvider; | 27 | import org.onosproject.net.topology.TopologyProvider; |
| 28 | import org.onosproject.net.topology.TopologyService; | 28 | import org.onosproject.net.topology.TopologyService; |
| 29 | 29 | ||
| 30 | -import com.fasterxml.jackson.databind.ObjectMapper; | ||
| 31 | - | ||
| 32 | /** | 30 | /** |
| 33 | * Lists summary of the current topology. | 31 | * Lists summary of the current topology. |
| 34 | */ | 32 | */ |
| ... | @@ -64,14 +62,7 @@ public class TopologyCommand extends AbstractShellCommand { | ... | @@ -64,14 +62,7 @@ public class TopologyCommand extends AbstractShellCommand { |
| 64 | 62 | ||
| 65 | } else if (outputJson()) { | 63 | } else if (outputJson()) { |
| 66 | print("%s", | 64 | print("%s", |
| 67 | - new ObjectMapper() | 65 | + jsonForEntity(topology, Topology.class)); |
| 68 | - .createObjectNode() | ||
| 69 | - .put("time", topology.time()) | ||
| 70 | - .put("created", formatCreationTime(topology.creationTime())) | ||
| 71 | - .put("uptime", formatElapsedTime(topologyUptime)) | ||
| 72 | - .put("deviceCount", topology.deviceCount()) | ||
| 73 | - .put("linkCount", topology.linkCount()) | ||
| 74 | - .put("clusterCount", topology.clusterCount())); | ||
| 75 | } else { | 66 | } else { |
| 76 | print(FMT, formatCreationTime(topology.creationTime()), | 67 | print(FMT, formatCreationTime(topology.creationTime()), |
| 77 | formatElapsedTime(topologyUptime), | 68 | formatElapsedTime(topologyUptime), | ... | ... |
| ... | @@ -45,6 +45,6 @@ public interface CodecContext { | ... | @@ -45,6 +45,6 @@ public interface CodecContext { |
| 45 | * @param <T> service type | 45 | * @param <T> service type |
| 46 | * @return JSON codec; null if no codec available for the class | 46 | * @return JSON codec; null if no codec available for the class |
| 47 | */ | 47 | */ |
| 48 | - <T> T get(Class<T> serviceClass); | 48 | + <T> T getService(Class<T> serviceClass); |
| 49 | 49 | ||
| 50 | } | 50 | } | ... | ... |
| ... | @@ -60,4 +60,9 @@ public class AbstractWebResource extends BaseResource implements CodecContext { | ... | @@ -60,4 +60,9 @@ public class AbstractWebResource extends BaseResource implements CodecContext { |
| 60 | return result; | 60 | return result; |
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | + @Override | ||
| 64 | + public <T> T getService(Class<T> serviceClass) { | ||
| 65 | + return get(serviceClass); | ||
| 66 | + } | ||
| 67 | + | ||
| 63 | } | 68 | } | ... | ... |
| ... | @@ -92,7 +92,7 @@ public class JsonCodecTest { | ... | @@ -92,7 +92,7 @@ public class JsonCodecTest { |
| 92 | } | 92 | } |
| 93 | 93 | ||
| 94 | @Override | 94 | @Override |
| 95 | - public <T> T get(Class<T> serviceClass) { | 95 | + public <T> T getService(Class<T> serviceClass) { |
| 96 | return null; | 96 | return null; |
| 97 | } | 97 | } |
| 98 | } | 98 | } | ... | ... |
| ... | @@ -31,7 +31,7 @@ public final class ApplicationCodec extends JsonCodec<Application> { | ... | @@ -31,7 +31,7 @@ public final class ApplicationCodec extends JsonCodec<Application> { |
| 31 | @Override | 31 | @Override |
| 32 | public ObjectNode encode(Application app, CodecContext context) { | 32 | public ObjectNode encode(Application app, CodecContext context) { |
| 33 | checkNotNull(app, "Application cannot be null"); | 33 | checkNotNull(app, "Application cannot be null"); |
| 34 | - ApplicationService service = context.get(ApplicationService.class); | 34 | + ApplicationService service = context.getService(ApplicationService.class); |
| 35 | ObjectNode result = context.mapper().createObjectNode() | 35 | ObjectNode result = context.mapper().createObjectNode() |
| 36 | .put("name", app.id().name()) | 36 | .put("name", app.id().name()) |
| 37 | .put("id", app.id().id()) | 37 | .put("id", app.id().id()) | ... | ... |
| ... | @@ -35,7 +35,7 @@ public final class ControllerNodeCodec extends JsonCodec<ControllerNode> { | ... | @@ -35,7 +35,7 @@ public final class ControllerNodeCodec extends JsonCodec<ControllerNode> { |
| 35 | @Override | 35 | @Override |
| 36 | public ObjectNode encode(ControllerNode node, CodecContext context) { | 36 | public ObjectNode encode(ControllerNode node, CodecContext context) { |
| 37 | checkNotNull(node, "Controller node cannot be null"); | 37 | checkNotNull(node, "Controller node cannot be null"); |
| 38 | - ClusterService service = context.get(ClusterService.class); | 38 | + ClusterService service = context.getService(ClusterService.class); |
| 39 | return context.mapper().createObjectNode() | 39 | return context.mapper().createObjectNode() |
| 40 | .put("id", node.id().toString()) | 40 | .put("id", node.id().toString()) |
| 41 | .put("ip", node.ip().toString()) | 41 | .put("ip", node.ip().toString()) | ... | ... |
This diff is collapsed. Click to expand it.
| ... | @@ -48,7 +48,7 @@ public final class DeviceCodec extends AnnotatedCodec<Device> { | ... | @@ -48,7 +48,7 @@ public final class DeviceCodec extends AnnotatedCodec<Device> { |
| 48 | @Override | 48 | @Override |
| 49 | public ObjectNode encode(Device device, CodecContext context) { | 49 | public ObjectNode encode(Device device, CodecContext context) { |
| 50 | checkNotNull(device, "Device cannot be null"); | 50 | checkNotNull(device, "Device cannot be null"); |
| 51 | - DeviceService service = context.get(DeviceService.class); | 51 | + DeviceService service = context.getService(DeviceService.class); |
| 52 | ObjectNode result = context.mapper().createObjectNode() | 52 | ObjectNode result = context.mapper().createObjectNode() |
| 53 | .put(ID, device.id().toString()) | 53 | .put(ID, device.id().toString()) |
| 54 | .put(TYPE, device.type().name()) | 54 | .put(TYPE, device.type().name()) | ... | ... |
| ... | @@ -37,6 +37,7 @@ public final class LinkCodec extends AnnotatedCodec<Link> { | ... | @@ -37,6 +37,7 @@ public final class LinkCodec extends AnnotatedCodec<Link> { |
| 37 | private static final String SRC = "src"; | 37 | private static final String SRC = "src"; |
| 38 | private static final String DST = "dst"; | 38 | private static final String DST = "dst"; |
| 39 | private static final String TYPE = "type"; | 39 | private static final String TYPE = "type"; |
| 40 | + private static final String STATE = "state"; | ||
| 40 | 41 | ||
| 41 | @Override | 42 | @Override |
| 42 | public ObjectNode encode(Link link, CodecContext context) { | 43 | public ObjectNode encode(Link link, CodecContext context) { |
| ... | @@ -46,6 +47,9 @@ public final class LinkCodec extends AnnotatedCodec<Link> { | ... | @@ -46,6 +47,9 @@ public final class LinkCodec extends AnnotatedCodec<Link> { |
| 46 | result.set(SRC, codec.encode(link.src(), context)); | 47 | result.set(SRC, codec.encode(link.src(), context)); |
| 47 | result.set(DST, codec.encode(link.dst(), context)); | 48 | result.set(DST, codec.encode(link.dst(), context)); |
| 48 | result.put(TYPE, link.type().toString()); | 49 | result.put(TYPE, link.type().toString()); |
| 50 | + if (link.state() != null) { | ||
| 51 | + result.put(STATE, link.state().toString()); | ||
| 52 | + } | ||
| 49 | return annotate(result, link, context); | 53 | return annotate(result, link, context); |
| 50 | } | 54 | } |
| 51 | 55 | ... | ... |
| ... | @@ -52,7 +52,7 @@ public class MockCodecContext implements CodecContext { | ... | @@ -52,7 +52,7 @@ public class MockCodecContext implements CodecContext { |
| 52 | 52 | ||
| 53 | @SuppressWarnings("unchecked") | 53 | @SuppressWarnings("unchecked") |
| 54 | @Override | 54 | @Override |
| 55 | - public <T> T get(Class<T> serviceClass) { | 55 | + public <T> T getService(Class<T> serviceClass) { |
| 56 | return (T) services.get(serviceClass); | 56 | return (T) services.get(serviceClass); |
| 57 | } | 57 | } |
| 58 | 58 | ... | ... |
| ... | @@ -67,7 +67,7 @@ public class ApplicationsResourceTest extends ResourceTest { | ... | @@ -67,7 +67,7 @@ public class ApplicationsResourceTest extends ResourceTest { |
| 67 | 67 | ||
| 68 | @Override | 68 | @Override |
| 69 | @SuppressWarnings("unchecked") | 69 | @SuppressWarnings("unchecked") |
| 70 | - public <T> T get(Class<T> serviceClass) { | 70 | + public <T> T getService(Class<T> serviceClass) { |
| 71 | return (T) service; | 71 | return (T) service; |
| 72 | } | 72 | } |
| 73 | } | 73 | } | ... | ... |
-
Please register or login to post a comment