Remove dependency on LinkResourceService from Constraint

Change-Id: Ib9c488331b22eef6769a767c6186ef7d2e8b1501
diff --git a/core/api/src/main/java/org/onosproject/net/intent/Constraint.java b/core/api/src/main/java/org/onosproject/net/intent/Constraint.java
index 03acf17..be88cc9 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/Constraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/Constraint.java
@@ -18,7 +18,6 @@
 import com.google.common.annotations.Beta;
 import org.onosproject.net.Link;
 import org.onosproject.net.Path;
-import org.onosproject.net.resource.link.LinkResourceService;
 
 /**
  * Representation of a connectivity constraint capable of evaluating a link
@@ -33,21 +32,19 @@
     /**
      * Evaluates the specified link and provides the cost for its traversal.
      *
-     * @param link            link to be evaluated
-     * @param resourceService resource service for validating availability of
-     *                        link resources
+     * @param link    link to be evaluated
+     * @param context resource context for validating availability of resources
      * @return cost of link traversal
      */
-    double cost(Link link, LinkResourceService resourceService);
+    double cost(Link link, ResourceContext context);
 
     /**
      * Validates that the specified path satisfies the constraint.
      *
      * @param path            path to be validated
-     * @param resourceService resource service for validating availability of
-     *                        link resources
+     * @param context resource context for validating availability of resources
      * @return cost of link traversal
      */
-    boolean validate(Path path, LinkResourceService resourceService);
+    boolean validate(Path path, ResourceContext context);
 
 }
diff --git a/core/api/src/main/java/org/onosproject/net/intent/ResourceContext.java b/core/api/src/main/java/org/onosproject/net/intent/ResourceContext.java
new file mode 100644
index 0000000..0193c61
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/intent/ResourceContext.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2016 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.net.intent;
+
+import com.google.common.annotations.Beta;
+import org.onosproject.net.newresource.Resource;
+
+/**
+ * Class providing resource information to constraints.
+ * This class is subject to be removed during refactorings on Constraint.
+ */
+@Beta
+public interface ResourceContext {
+    /**
+     * Returns the availability of the specified resource.
+     *
+     * @param resource resource to check the availability
+     * @return true if available, otherwise false
+     */
+    boolean isAvailable(Resource resource);
+}
diff --git a/core/api/src/main/java/org/onosproject/net/intent/constraint/AnnotationConstraint.java b/core/api/src/main/java/org/onosproject/net/intent/constraint/AnnotationConstraint.java
index f5439ef..1edb79c 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/constraint/AnnotationConstraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/constraint/AnnotationConstraint.java
@@ -18,7 +18,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.base.MoreObjects;
 import org.onosproject.net.Link;
-import org.onosproject.net.resource.link.LinkResourceService;
+import org.onosproject.net.intent.ResourceContext;
 
 import java.util.Objects;
 
@@ -68,16 +68,28 @@
         return threshold;
     }
 
+    // doesn't use LinkResourceService
     @Override
-    public boolean isValid(Link link, LinkResourceService resourceService) {
+    public boolean isValid(Link link, ResourceContext context) {
+        // explicitly call a method not depending on LinkResourceService
+        return isValid(link);
+    }
+
+    private boolean isValid(Link link) {
         double value = getAnnotatedValue(link, key);
 
         return value <= threshold;
     }
 
+    // doesn't use LinkResourceService
     @Override
-    public double cost(Link link, LinkResourceService resourceService) {
-        if (isValid(link, resourceService)) {
+    public double cost(Link link, ResourceContext context) {
+        // explicitly call a method not depending on LinkResourceService
+        return cost(link);
+    }
+
+    private double cost(Link link) {
+        if (isValid(link)) {
             return getAnnotatedValue(link, key);
         } else {
             return -1;
diff --git a/core/api/src/main/java/org/onosproject/net/intent/constraint/AsymmetricPathConstraint.java b/core/api/src/main/java/org/onosproject/net/intent/constraint/AsymmetricPathConstraint.java
index e0f8614..dcc2e95 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/constraint/AsymmetricPathConstraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/constraint/AsymmetricPathConstraint.java
@@ -19,7 +19,7 @@
 import org.onosproject.net.Link;
 import org.onosproject.net.Path;
 import org.onosproject.net.intent.Constraint;
-import org.onosproject.net.resource.link.LinkResourceService;
+import org.onosproject.net.intent.ResourceContext;
 
 import java.util.Objects;
 
@@ -31,13 +31,15 @@
 @Beta
 public class AsymmetricPathConstraint implements Constraint {
 
+    // doesn't use LinkResourceService
     @Override
-    public double cost(Link link, LinkResourceService resourceService) {
+    public double cost(Link link, ResourceContext context) {
         return 1;
     }
 
+    // doesn't use LinkResourceService
     @Override
-    public boolean validate(Path path, LinkResourceService resourceService) {
+    public boolean validate(Path path, ResourceContext context) {
         return true;
     }
 
diff --git a/core/api/src/main/java/org/onosproject/net/intent/constraint/BandwidthConstraint.java b/core/api/src/main/java/org/onosproject/net/intent/constraint/BandwidthConstraint.java
index 1b4a260..9ef0243 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/constraint/BandwidthConstraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/constraint/BandwidthConstraint.java
@@ -20,12 +20,11 @@
 import org.onlab.util.Bandwidth;
 import org.onlab.util.DataRateUnit;
 import org.onosproject.net.Link;
-import org.onosproject.net.resource.link.BandwidthResourceRequest;
-import org.onosproject.net.resource.link.LinkResourceService;
-import org.onosproject.net.resource.ResourceRequest;
-import org.onosproject.net.resource.ResourceType;
+import org.onosproject.net.intent.ResourceContext;
+import org.onosproject.net.newresource.Resources;
 
 import java.util.Objects;
+import java.util.stream.Stream;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -64,16 +63,10 @@
     }
 
     @Override
-    public boolean isValid(Link link, LinkResourceService resourceService) {
-        for (ResourceRequest request : resourceService.getAvailableResources(link)) {
-            if (request.type() == ResourceType.BANDWIDTH) {
-                BandwidthResourceRequest brr = (BandwidthResourceRequest) request;
-                if (brr.bandwidth().toDouble() >= bandwidth.bps()) {
-                    return true;
-                }
-            }
-        }
-        return false;
+    public boolean isValid(Link link, ResourceContext context) {
+        return Stream.of(link.src(), link.dst())
+                .map(cp -> Resources.continuous(cp.deviceId(), cp.port(), Bandwidth.class).resource(bandwidth.bps()))
+                .allMatch(context::isAvailable);
     }
 
     /**
diff --git a/core/api/src/main/java/org/onosproject/net/intent/constraint/BooleanConstraint.java b/core/api/src/main/java/org/onosproject/net/intent/constraint/BooleanConstraint.java
index b644692..9cff6fd 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/constraint/BooleanConstraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/constraint/BooleanConstraint.java
@@ -19,7 +19,7 @@
 import org.onosproject.net.Link;
 import org.onosproject.net.Path;
 import org.onosproject.net.intent.Constraint;
-import org.onosproject.net.resource.link.LinkResourceService;
+import org.onosproject.net.intent.ResourceContext;
 
 /**
  * Abstract base class for various constraints that evaluate link viability
@@ -32,10 +32,10 @@
      * Returns true if the specified link satisfies the constraint.
      *
      * @param link            link to be validated
-     * @param resourceService resource service for checking available link resources
+     * @param context resource context for checking available resources
      * @return true if link is viable
      */
-    public abstract boolean isValid(Link link, LinkResourceService resourceService);
+    public abstract boolean isValid(Link link, ResourceContext context);
 
     /**
      * {@inheritDoc}
@@ -43,18 +43,18 @@
      * Negative return value means the specified link does not satisfy this constraint.
      *
      * @param link {@inheritDoc}
-     * @param resourceService {@inheritDoc}
+     * @param context {@inheritDoc}
      * @return {@inheritDoc}
      */
     @Override
-    public double cost(Link link, LinkResourceService resourceService) {
-        return isValid(link, resourceService) ? +1 : -1;
+    public double cost(Link link, ResourceContext context) {
+        return isValid(link, context) ? +1 : -1;
     }
 
     @Override
-    public boolean validate(Path path, LinkResourceService resourceService) {
+    public boolean validate(Path path, ResourceContext context) {
         return path.links().stream()
-                .allMatch(link -> isValid(link, resourceService));
+                .allMatch(link -> isValid(link, context));
     }
 
 }
diff --git a/core/api/src/main/java/org/onosproject/net/intent/constraint/EncapsulationConstraint.java b/core/api/src/main/java/org/onosproject/net/intent/constraint/EncapsulationConstraint.java
index e853939..5e4b93a 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/constraint/EncapsulationConstraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/constraint/EncapsulationConstraint.java
@@ -19,7 +19,7 @@
 
 import org.onosproject.net.EncapsulationType;
 import org.onosproject.net.Link;
-import org.onosproject.net.resource.link.LinkResourceService;
+import org.onosproject.net.intent.ResourceContext;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -42,8 +42,9 @@
     }
 
 
+    // doesn't use LinkResourceService
     @Override
-    public boolean isValid(Link link, LinkResourceService resourceService) {
+    public boolean isValid(Link link, ResourceContext context) {
         //TODO: validate the availability of the resources for each link in the path.
         //e.g., availability of MPLSlabels, VLANID
 
diff --git a/core/api/src/main/java/org/onosproject/net/intent/constraint/LatencyConstraint.java b/core/api/src/main/java/org/onosproject/net/intent/constraint/LatencyConstraint.java
index aecef87..1e0d12a 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/constraint/LatencyConstraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/constraint/LatencyConstraint.java
@@ -20,7 +20,7 @@
 import org.onosproject.net.Link;
 import org.onosproject.net.Path;
 import org.onosproject.net.intent.Constraint;
-import org.onosproject.net.resource.link.LinkResourceService;
+import org.onosproject.net.intent.ResourceContext;
 
 import java.time.Duration;
 import java.time.temporal.ChronoUnit;
@@ -54,14 +54,26 @@
         return latency;
     }
 
+    // doesn't use LinkResourceService
     @Override
-    public double cost(Link link, LinkResourceService resourceService) {
+    public double cost(Link link, ResourceContext context) {
+        // explicitly call a method not depending on LinkResourceService
+        return cost(link);
+    }
+
+    private double cost(Link link) {
         return getAnnotatedValue(link, LATENCY);
     }
 
+    // doesn't use LinkResourceService
     @Override
-    public boolean validate(Path path, LinkResourceService resourceService) {
-        double pathLatency = path.links().stream().mapToDouble(link -> cost(link, resourceService)).sum();
+    public boolean validate(Path path, ResourceContext context) {
+        // explicitly call a method not depending on LinkResourceService
+        return validate(path);
+    }
+
+    private boolean validate(Path path) {
+        double pathLatency = path.links().stream().mapToDouble(this::cost).sum();
         return Duration.of((long) pathLatency, ChronoUnit.MICROS).compareTo(latency) <= 0;
     }
 
diff --git a/core/api/src/main/java/org/onosproject/net/intent/constraint/LinkTypeConstraint.java b/core/api/src/main/java/org/onosproject/net/intent/constraint/LinkTypeConstraint.java
index fae76d6..0ff5332 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/constraint/LinkTypeConstraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/constraint/LinkTypeConstraint.java
@@ -18,7 +18,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.collect.ImmutableSet;
 import org.onosproject.net.Link;
-import org.onosproject.net.resource.link.LinkResourceService;
+import org.onosproject.net.intent.ResourceContext;
 
 import java.util.Objects;
 import java.util.Set;
@@ -57,8 +57,14 @@
         this.isInclusive = false;
     }
 
+    // doesn't use LinkResourceService
     @Override
-    public boolean isValid(Link link, LinkResourceService resourceService) {
+    public boolean isValid(Link link, ResourceContext context) {
+        // explicitly call a method not depending on LinkResourceService
+        return isValid(link);
+    }
+
+    private boolean isValid(Link link) {
         boolean contains = types.contains(link.type());
         return isInclusive == contains;
     }
diff --git a/core/api/src/main/java/org/onosproject/net/intent/constraint/ObstacleConstraint.java b/core/api/src/main/java/org/onosproject/net/intent/constraint/ObstacleConstraint.java
index ca4f3fd..7487512 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/constraint/ObstacleConstraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/constraint/ObstacleConstraint.java
@@ -20,7 +20,7 @@
 import com.google.common.collect.ImmutableSet;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Link;
-import org.onosproject.net.resource.link.LinkResourceService;
+import org.onosproject.net.intent.ResourceContext;
 
 import java.util.Collections;
 import java.util.Objects;
@@ -56,8 +56,14 @@
         return obstacles;
     }
 
+    // doesn't use LinkResourceService
     @Override
-    public boolean isValid(Link link, LinkResourceService resourceService) {
+    public boolean isValid(Link link, ResourceContext context) {
+        // explicitly call a method not depending on LinkResourceService
+        return isValid(link);
+    }
+
+    private boolean isValid(Link link) {
         DeviceId src = link.src().deviceId();
         DeviceId dst = link.dst().deviceId();
 
diff --git a/core/api/src/main/java/org/onosproject/net/intent/constraint/PartialFailureConstraint.java b/core/api/src/main/java/org/onosproject/net/intent/constraint/PartialFailureConstraint.java
index 827859b..7256a55 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/constraint/PartialFailureConstraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/constraint/PartialFailureConstraint.java
@@ -20,7 +20,7 @@
 import org.onosproject.net.intent.ConnectivityIntent;
 import org.onosproject.net.intent.Constraint;
 import org.onosproject.net.intent.Intent;
-import org.onosproject.net.resource.link.LinkResourceService;
+import org.onosproject.net.intent.ResourceContext;
 
 /**
  * A constraint that allows intents that can only be partially compiled
@@ -28,13 +28,15 @@
  * to be installed when some endpoints or paths are not found.
  */
 public class PartialFailureConstraint implements Constraint {
+    // doesn't use LinkResourceService
     @Override
-    public double cost(Link link, LinkResourceService resourceService) {
+    public double cost(Link link, ResourceContext context) {
         return 1;
     }
 
+    // doesn't use LinkResourceService
     @Override
-    public boolean validate(Path path, LinkResourceService resourceService) {
+    public boolean validate(Path path, ResourceContext context) {
         return true;
     }
 
diff --git a/core/api/src/main/java/org/onosproject/net/intent/constraint/WaypointConstraint.java b/core/api/src/main/java/org/onosproject/net/intent/constraint/WaypointConstraint.java
index 4839fee..98ed34c 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/constraint/WaypointConstraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/constraint/WaypointConstraint.java
@@ -22,7 +22,7 @@
 import org.onosproject.net.Link;
 import org.onosproject.net.Path;
 import org.onosproject.net.intent.Constraint;
-import org.onosproject.net.resource.link.LinkResourceService;
+import org.onosproject.net.intent.ResourceContext;
 
 import java.util.Collections;
 import java.util.LinkedList;
@@ -60,14 +60,21 @@
         return waypoints;
     }
 
+    // doesn't use LinkResourceService
     @Override
-    public double cost(Link link, LinkResourceService resourceService) {
+    public double cost(Link link, ResourceContext context) {
         // Always consider the number of hops
         return 1;
     }
 
+    // doesn't use LinkResourceService
     @Override
-    public boolean validate(Path path, LinkResourceService resourceService) {
+    public boolean validate(Path path, ResourceContext context) {
+        // explicitly call a method not depending on LinkResourceService
+        return validate(path);
+    }
+
+    private boolean validate(Path path) {
         LinkedList<DeviceId> waypoints = new LinkedList<>(this.waypoints);
         DeviceId current = waypoints.poll();
         // This is safe because Path class ensures the number of links are more than 0