/* * Copyright 2016-present 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.impl.topo.util; import org.onosproject.net.intent.Intent; import org.onosproject.ui.topo.NodeSelection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * Encapsulates a selection of intents (paths) inferred from a selection * of devices and/or hosts from the topology view. */ public class IntentSelection { private static final int ALL = -1; protected static final Logger log = LoggerFactory.getLogger(IntentSelection.class); private final NodeSelection nodes; private final List<Intent> intents; private int index = ALL; /** * Creates an intent selection group, based on selected nodes. * * @param nodes node selection * @param filter intent filter */ public IntentSelection(NodeSelection nodes, TopoIntentFilter filter) { this.nodes = nodes; intents = filter.findPathIntents( nodes.hostsWithHover(), nodes.devicesWithHover(), nodes.linksWithHover()); if (intents.size() == 1) { index = 0; // pre-select a single intent } } /** * Creates an intent selection group, for a single intent. * * @param intent the intent */ public IntentSelection(Intent intent) { nodes = null; intents = new ArrayList<>(1); intents.add(intent); index = 0; } /** * Returns true if no intents are selected. * * @return true if nothing selected */ public boolean none() { return intents.isEmpty(); } /** * Returns true if all intents in this select group are currently selected. * This is the initial state, so that all intents are shown on the * topology view with primary highlighting. * * @return true if all selected */ public boolean all() { return index == ALL; } /** * Returns true if there is a single intent in this select group, or if * a specific intent has been marked (index != ALL). * * @return true if single intent marked */ public boolean single() { return !all(); } /** * Returns the number of intents in this selection group. * * @return number of intents */ public int size() { return intents.size(); } /** * Returns the index of the currently selected intent. * * @return the current index */ public int index() { return index; } /** * The list of intents in this selection group. * * @return list of intents */ public List<Intent> intents() { return Collections.unmodifiableList(intents); } /** * Marks and returns the next intent in this group. Note that the * selection wraps around to the beginning again, if necessary. * * @return the next intent in the group */ public Intent next() { index += 1; if (index >= intents.size()) { index = 0; } return intents.get(index); } /** * Marks and returns the previous intent in this group. Note that the * selection wraps around to the end again, if necessary. * * @return the previous intent in the group */ public Intent prev() { index -= 1; if (index < 0) { index = intents.size() - 1; } return intents.get(index); } /** * Returns the currently marked intent, or null if "all" intents * are marked. * * @return the currently marked intent */ public Intent current() { return all() ? null : intents.get(index); } @Override public String toString() { return "IntentSelection{" + "nodes=" + nodes + ", #intents=" + intents.size() + ", index=" + index + '}'; } }