aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/onos/core/api/src/main/java/org/onosproject/ui/topo/LinkHighlight.java
blob: a734c6b7d53b0da70e12c96da6a3873f8c26da26 (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
/*
 * 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.ui.topo;

import java.util.Collections;
import java.util.Set;
import java.util.TreeSet;

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

/**
 * Denotes the highlighting to be applied to a link.
 * {@link Flavor} is a closed set of NO-, PRIMARY-, or SECONDARY- highlighting.
 * {@link Mod} is an open ended set of additional modifications (CSS classes)
 * that may also be applied.
 * Note that {@link #MOD_OPTICAL} and {@link #MOD_ANIMATED} are pre-defined mods.
 * Label text may be set, which will also be displayed on the link.
 */
public class LinkHighlight extends AbstractHighlight {

    private static final String PLAIN = "plain";
    private static final String PRIMARY = "primary";
    private static final String SECONDARY = "secondary";
    private static final String EMPTY = "";
    private static final String SPACE = " ";

    private final Flavor flavor;
    private final Set<Mod> mods = new TreeSet<>();
    private String label = EMPTY;

    /**
     * Constructs a link highlight entity.
     *
     * @param linkId the link identifier
     * @param flavor the highlight flavor
     */
    public LinkHighlight(String linkId, Flavor flavor) {
        super(TopoElementType.LINK, linkId);
        this.flavor = checkNotNull(flavor);
    }

    /**
     * Adds a highlighting modification to this link highlight.
     *
     * @param mod mod to be added
     * @return self, for chaining
     */
    public LinkHighlight addMod(Mod mod) {
        mods.add(checkNotNull(mod));
        return this;
    }

    /**
     * Adds a label to be displayed on the link.
     *
     * @param label the label text
     * @return self, for chaining
     */
    public LinkHighlight setLabel(String label) {
        this.label = label == null ? EMPTY : label;
        return this;
    }

    /**
     * Returns the highlight flavor.
     *
     * @return highlight flavor
     */
    public Flavor flavor() {
        return flavor;
    }

    /**
     * Returns the highlight modifications.
     *
     * @return highlight modifications
     */
    public Set<Mod> mods() {
        return Collections.unmodifiableSet(mods);
    }

    /**
     * Generates the CSS classes string from the {@link #flavor} and
     * any optional {@link #mods}.
     *
     * @return CSS classes string
     */
    public String cssClasses() {
        StringBuilder sb = new StringBuilder(flavor.toString());
        mods.forEach(m -> sb.append(SPACE).append(m));
        return sb.toString();
    }

    /**
     * Returns the label text.
     *
     * @return label text
     */
    public String label() {
        return label;
    }

    /**
     * Link highlighting flavor.
     */
    public enum Flavor {
        NO_HIGHLIGHT(PLAIN),
        PRIMARY_HIGHLIGHT(PRIMARY),
        SECONDARY_HIGHLIGHT(SECONDARY);

        private String cssName;

        Flavor(String s) {
            cssName = s;
        }

        @Override
        public String toString() {
            return cssName;
        }
    }

    /**
     * Denotes a link to be tagged as an optical link.
     */
    public static final Mod MOD_OPTICAL = new Mod("optical");

    /**
     * Denotes a link to be tagged with animated traffic ("marching ants").
     */
    public static final Mod MOD_ANIMATED = new Mod("animated");
}