/* * Copyright 2014-2015 Open Networking Laboratory * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.onosproject.codec.impl; import java.util.stream.IntStream; import org.onosproject.codec.CodecContext; import org.onosproject.codec.JsonCodec; import org.onosproject.net.flow.DefaultTrafficTreatment; import org.onosproject.net.flow.TrafficTreatment; import org.onosproject.net.flow.instructions.Instruction; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import static com.google.common.base.Preconditions.checkNotNull; /** * Traffic treatment codec. */ public final class TrafficTreatmentCodec extends JsonCodec { private static final String INSTRUCTIONS = "instructions"; @Override public ObjectNode encode(TrafficTreatment treatment, CodecContext context) { checkNotNull(treatment, "Traffic treatment cannot be null"); final ObjectNode result = context.mapper().createObjectNode(); final ArrayNode jsonInstructions = result.putArray(INSTRUCTIONS); final JsonCodec instructionCodec = context.codec(Instruction.class); for (final Instruction instruction : treatment.immediate()) { jsonInstructions.add(instructionCodec.encode(instruction, context)); } final ArrayNode jsonDeferred = result.putArray("deferred"); for (final Instruction instruction : treatment.deferred()) { jsonDeferred.add(instructionCodec.encode(instruction, context)); } return result; } @Override public TrafficTreatment decode(ObjectNode json, CodecContext context) { final JsonCodec instructionsCodec = context.codec(Instruction.class); JsonNode instructionsJson = json.get(INSTRUCTIONS); TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder(); if (instructionsJson != null) { IntStream.range(0, instructionsJson.size()) .forEach(i -> builder.add( instructionsCodec.decode(get(instructionsJson, i), context))); } return builder.build(); } }