blob: f2518a63bd9c6ed839ae8f40e06850557d155a7e [file] [log] [blame]
package net.onrc.onos.core.intent;
import java.util.Objects;
/**
* The PathIntent is a "low-level" intent that is the manifestation
* of a "high-level" intent. It contains the path through the network
* and a pointer to the "high-level" intent.
*/
public class PathIntent extends Intent {
protected Path path;
protected double bandwidth;
protected Intent parentIntent;
/**
* Generate the PathIntent ID for the first path for a
* parent Intent. It is derived from the parent Intent ID.
*
* @param parentId parent Intent ID
* @return new PathIntent ID
*/
public static String createFirstId(String parentId) {
return String.format("%s___0", parentId);
}
/**
* Generate the PathIntent ID for subsequent paths used to
* satisfy a parent Intent. It is derived from the previous ID.
*
* @param currentId current PathIntent's ID
* @return new PathIntent ID
*/
public static String createNextId(String currentId) {
String[] parts = currentId.split("___");
return String.format("%s___%d", parts[0], Long.parseLong(parts[1]) + 1);
}
/**
* Default constructor for Kryo deserialization.
*/
protected PathIntent() {
}
/**
* Constructor.
*
* @param id the PathIntent ID
* @param path the path for this Intent
* @param bandwidth bandwidth which should be allocated for the path.
* If 0, no intent for bandwidth allocation (best effort).
* @param parentIntent parent intent. If null, this is root intent.
*/
public PathIntent(String id, Path path, double bandwidth, Intent parentIntent) {
super(id);
this.path = path;
this.bandwidth = bandwidth;
this.parentIntent = parentIntent;
}
/**
* Get the bandwidth specified for this Intent.
* TODO: specify unit
*
* @return this Intent's bandwidth
*/
public double getBandwidth() {
return bandwidth;
}
/**
* Get the Path for this Intent.
*
* @return this Intent's Path
*/
public Path getPath() {
return path;
}
/**
* Get the parent Intent.
*
* @return the parent Intent
*/
public Intent getParentIntent() {
return parentIntent;
}
/**
* Checks the specified PathIntent have the same fields of
* path, bandwidth and parentIntent's id with this PathIntent.
*
* @param target target PathIntent instance
* @return true if the specified intent has the same fields, otherwise false
*/
public boolean hasSameFields(PathIntent target) {
if (target == null) {
return false;
}
if (!Objects.equals(getPath(), target.getPath())) {
return false;
}
if (getBandwidth() != target.getBandwidth()) {
return false;
}
return Objects.equals(getParentIntent(), target.getParentIntent());
}
/**
* Generates a hash code using the Intent ID.
*
* @return hashcode
*/
@Override
public int hashCode() {
return super.hashCode();
}
/**
* Compares two intent object by type (class) and Intent ID.
*
* @param obj other Intent
* @return true if equal, false otherwise
*/
@Override
public boolean equals(Object obj) {
return super.equals(obj);
}
/**
* Returns a String representation of this Intent.
*
* @return "Intent ID, State, Path"
*/
@Override
public String toString() {
return String.format("%s, %s, %s", getId(), getState(), getPath());
}
}