aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/onos/core/common/src/main/java/org/onosproject/codec/impl/EncodeConstraintCodecHelper.java
blob: 61f4dbf430b54c11bccc73f5fcb834725d33a5a5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
/*
 * Copyright 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 org.onosproject.codec.CodecContext;
import org.onosproject.net.DeviceId;
import org.onosproject.net.Link;
import org.onosproject.net.intent.Constraint;
import org.onosproject.net.intent.constraint.AnnotationConstraint;
import org.onosproject.net.intent.constraint.BandwidthConstraint;
import org.onosproject.net.intent.constraint.LambdaConstraint;
import org.onosproject.net.intent.constraint.LatencyConstraint;
import org.onosproject.net.intent.constraint.LinkTypeConstraint;
import org.onosproject.net.intent.constraint.ObstacleConstraint;
import org.onosproject.net.intent.constraint.WaypointConstraint;

import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

import static com.google.common.base.Preconditions.checkNotNull;

/**
 * Implementation of encoder for constraint JSON codec.
 */
public final class EncodeConstraintCodecHelper {

    private final Constraint constraint;
    private final CodecContext context;

    /**
     * Constructs a constraint encoder.
     *
     * @param constraint constraint to encode
     * @param context to use for look ups
     */
    public EncodeConstraintCodecHelper(Constraint constraint, CodecContext context) {
        this.constraint = constraint;
        this.context = context;
    }

    /**
     * Encodes a latency constraint.
     *
     * @return JSON ObjectNode representing the constraint
     */
    private ObjectNode encodeLatencyConstraint() {
        checkNotNull(constraint, "Duration constraint cannot be null");
        final LatencyConstraint latencyConstraint =
                (LatencyConstraint) constraint;
        return context.mapper().createObjectNode()
                .put("latencyMillis", latencyConstraint.latency().toMillis());
    }

    /**
     * Encodes an obstacle constraint.
     *
     * @return JSON ObjectNode representing the constraint
     */
    private ObjectNode encodeObstacleConstraint() {
        checkNotNull(constraint, "Obstacle constraint cannot be null");
        final ObstacleConstraint obstacleConstraint =
                (ObstacleConstraint) constraint;

        final ObjectNode result = context.mapper().createObjectNode();
        final ArrayNode jsonObstacles = result.putArray("obstacles");

        for (DeviceId did : obstacleConstraint.obstacles()) {
            jsonObstacles.add(did.toString());
        }

        return result;
    }

    /**
     * Encodes a waypoint constraint.
     *
     * @return JSON ObjectNode representing the constraint
     */
    private ObjectNode encodeWaypointConstraint() {
        checkNotNull(constraint, "Waypoint constraint cannot be null");
        final WaypointConstraint waypointConstraint =
                (WaypointConstraint) constraint;

        final ObjectNode result = context.mapper().createObjectNode();
        final ArrayNode jsonWaypoints = result.putArray("waypoints");

        for (DeviceId did : waypointConstraint.waypoints()) {
            jsonWaypoints.add(did.toString());
        }

        return result;
    }

    /**
     * Encodes a annotation constraint.
     *
     * @return JSON ObjectNode representing the constraint
     */
    private ObjectNode encodeAnnotationConstraint() {
        checkNotNull(constraint, "Annotation constraint cannot be null");
        final AnnotationConstraint annotationConstraint =
                (AnnotationConstraint) constraint;
        return context.mapper().createObjectNode()
                .put("key", annotationConstraint.key())
                .put("threshold", annotationConstraint.threshold());
    }

    /**
     * Encodes a bandwidth constraint.
     *
     * @return JSON ObjectNode representing the constraint
     */
    private ObjectNode encodeBandwidthConstraint() {
        checkNotNull(constraint, "Bandwidth constraint cannot be null");
        final BandwidthConstraint bandwidthConstraint =
                (BandwidthConstraint) constraint;
        return context.mapper().createObjectNode()
                .put("bandwidth", bandwidthConstraint.bandwidth().toDouble());
    }

    /**
     * Encodes a lambda constraint.
     *
     * @return JSON ObjectNode representing the constraint
     */
    private ObjectNode encodeLambdaConstraint() {
        checkNotNull(constraint, "Lambda constraint cannot be null");
        final LambdaConstraint lambdaConstraint =
                (LambdaConstraint) constraint;

        return context.mapper().createObjectNode()
                .put("lambda", lambdaConstraint.lambda().toInt());
    }

    /**
     * Encodes a link type constraint.
     *
     * @return JSON ObjectNode representing the constraint
     */
    private ObjectNode encodeLinkTypeConstraint() {
        checkNotNull(constraint, "Link type constraint cannot be null");

        final LinkTypeConstraint linkTypeConstraint =
                (LinkTypeConstraint) constraint;

        final ObjectNode result = context.mapper().createObjectNode()
                .put(ConstraintCodec.INCLUSIVE, linkTypeConstraint.isInclusive());

        final ArrayNode jsonTypes = result.putArray(ConstraintCodec.TYPES);

        if (linkTypeConstraint.types() != null) {
            for (Link.Type type : linkTypeConstraint.types()) {
                jsonTypes.add(type.name());
            }
        }

        return result;
    }

    /**
     * Encodes the constraint in JSON.
     *
     * @return JSON node
     */
    public ObjectNode encode() {
        final ObjectNode result;
        if (constraint instanceof BandwidthConstraint) {
            result = encodeBandwidthConstraint();
        } else if (constraint instanceof LambdaConstraint) {
            result = encodeLambdaConstraint();
        } else if (constraint instanceof LinkTypeConstraint) {
            result = encodeLinkTypeConstraint();
        } else if (constraint instanceof AnnotationConstraint) {
            result = encodeAnnotationConstraint();
        } else if (constraint instanceof LatencyConstraint) {
            result = encodeLatencyConstraint();
        } else if (constraint instanceof ObstacleConstraint) {
            result = encodeObstacleConstraint();
        } else if (constraint instanceof WaypointConstraint) {
            result = encodeWaypointConstraint();
        } else {
            result = context.mapper().createObjectNode();
        }

        result.put(ConstraintCodec.TYPE, constraint.getClass().getSimpleName());
        return result;
    }
}