[Cardinal] Add builders for Intents and remove extra constructors.

Starting with PointToPoint intent to see how it looks

Change-Id: I5366a05d657ceaad18c03b95cd71f5d1107200e2
diff --git a/apps/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfInstaller.java b/apps/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfInstaller.java
index 794d223..30610de 100644
--- a/apps/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfInstaller.java
+++ b/apps/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfInstaller.java
@@ -324,11 +324,15 @@
         ConnectPoint ingress = new ConnectPoint(device.id(), PortNumber.portNumber(1));
         ConnectPoint egress = new ConnectPoint(device.id(), PortNumber.portNumber(2));
 
-        return new PointToPointIntent(appId, key,
-                                      selector, treatment,
-                                      ingress, egress,
-                                      Collections.emptyList(),
-                                      Intent.DEFAULT_INTENT_PRIORITY);
+        return PointToPointIntent.builder()
+                        .appId(appId)
+                        .key(key)
+                        .selector(selector)
+                        .treatment(treatment)
+                        .ingressPoint(ingress)
+                        .egressPoint(egress)
+                        .build();
+
     }
 
     /**
diff --git a/apps/sdnip/src/main/java/org/onosproject/sdnip/PeerConnectivityManager.java b/apps/sdnip/src/main/java/org/onosproject/sdnip/PeerConnectivityManager.java
index 9f34945..b5bc25b 100644
--- a/apps/sdnip/src/main/java/org/onosproject/sdnip/PeerConnectivityManager.java
+++ b/apps/sdnip/src/main/java/org/onosproject/sdnip/PeerConnectivityManager.java
@@ -37,7 +37,6 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 
 /**
@@ -130,8 +129,8 @@
      * @return the intents to install
      */
     private Collection<PointToPointIntent> buildPeerIntents(
-                                                BgpSpeaker bgpSpeaker,
-                                                BgpPeer bgpPeer) {
+            BgpSpeaker bgpSpeaker,
+            BgpPeer bgpPeer) {
         List<PointToPointIntent> intents = new ArrayList<>();
 
         ConnectPoint bgpdConnectPoint = bgpSpeaker.connectPoint();
@@ -157,7 +156,7 @@
         }
         if (bgpdAddress == null) {
             log.debug("No IP address found for peer {} on interface {}",
-                      bgpPeer, bgpPeer.connectPoint());
+                    bgpPeer, bgpPeer.connectPoint());
             return intents;
         }
 
@@ -185,83 +184,101 @@
 
         // Path from BGP speaker to BGP peer matching destination TCP port 179
         selector = buildSelector(tcpProtocol,
-                                 bgpdAddress,
-                                 bgpdPeerAddress,
-                                 null,
-                                 BGP_PORT);
+                bgpdAddress,
+                bgpdPeerAddress,
+                null,
+                BGP_PORT);
 
         int priority = PRIORITY_OFFSET;
 
-        intents.add(new PointToPointIntent(appId, selector, treatment,
-                                           bgpdConnectPoint,
-                                           bgpdPeerConnectPoint,
-                                           Collections.emptyList(),
-                                           priority));
+        intents.add(PointToPointIntent.builder()
+                .appId(appId)
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(bgpdConnectPoint)
+                .egressPoint(bgpdPeerConnectPoint)
+                .priority(priority)
+                .build());
 
         // Path from BGP speaker to BGP peer matching source TCP port 179
         selector = buildSelector(tcpProtocol,
-                                 bgpdAddress,
-                                 bgpdPeerAddress,
-                                 BGP_PORT,
-                                 null);
+                bgpdAddress,
+                bgpdPeerAddress,
+                BGP_PORT,
+                null);
 
-        intents.add(new PointToPointIntent(appId, selector, treatment,
-                                           bgpdConnectPoint,
-                                           bgpdPeerConnectPoint,
-                                           Collections.emptyList(),
-                                           priority));
+        intents.add(PointToPointIntent.builder()
+                .appId(appId)
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(bgpdConnectPoint)
+                .egressPoint(bgpdPeerConnectPoint)
+                .priority(priority)
+                .build());
 
         // Path from BGP peer to BGP speaker matching destination TCP port 179
         selector = buildSelector(tcpProtocol,
-                                 bgpdPeerAddress,
-                                 bgpdAddress,
-                                 null,
-                                 BGP_PORT);
+                bgpdPeerAddress,
+                bgpdAddress,
+                null,
+                BGP_PORT);
 
-        intents.add(new PointToPointIntent(appId, selector, treatment,
-                                           bgpdPeerConnectPoint,
-                                           bgpdConnectPoint,
-                                           Collections.emptyList(),
-                                           priority));
+        intents.add(PointToPointIntent.builder()
+                .appId(appId)
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(bgpdPeerConnectPoint)
+                .egressPoint(bgpdConnectPoint)
+                .priority(priority)
+                .build());
 
         // Path from BGP peer to BGP speaker matching source TCP port 179
         selector = buildSelector(tcpProtocol,
-                                 bgpdPeerAddress,
-                                 bgpdAddress,
-                                 BGP_PORT,
-                                 null);
+                bgpdPeerAddress,
+                bgpdAddress,
+                BGP_PORT,
+                null);
 
-        intents.add(new PointToPointIntent(appId, selector, treatment,
-                                           bgpdPeerConnectPoint,
-                                           bgpdConnectPoint,
-                                           Collections.emptyList(),
-                                           priority));
+        intents.add(PointToPointIntent.builder()
+                .appId(appId)
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(bgpdPeerConnectPoint)
+                .egressPoint(bgpdConnectPoint)
+                .priority(priority)
+                .build());
 
         // ICMP path from BGP speaker to BGP peer
         selector = buildSelector(icmpProtocol,
-                                 bgpdAddress,
-                                 bgpdPeerAddress,
-                                 null,
-                                 null);
+                bgpdAddress,
+                bgpdPeerAddress,
+                null,
+                null);
 
-        intents.add(new PointToPointIntent(appId, selector, treatment,
-                                           bgpdConnectPoint,
-                                           bgpdPeerConnectPoint,
-                                           Collections.emptyList(),
-                                           priority));
+        intents.add(PointToPointIntent.builder()
+                .appId(appId)
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(bgpdConnectPoint)
+                .egressPoint(bgpdPeerConnectPoint)
+                .priority(priority)
+                .build());
 
         // ICMP path from BGP peer to BGP speaker
         selector = buildSelector(icmpProtocol,
-                                 bgpdPeerAddress,
-                                 bgpdAddress,
-                                 null,
-                                 null);
+                bgpdPeerAddress,
+                bgpdAddress,
+                null,
+                null);
 
-        intents.add(new PointToPointIntent(appId, selector, treatment,
-                                           bgpdPeerConnectPoint,
-                                           bgpdConnectPoint,
-                                           Collections.emptyList(),
-                                           priority));
+        intents.add(PointToPointIntent.builder()
+                .appId(appId)
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(bgpdPeerConnectPoint)
+                .egressPoint(bgpdConnectPoint)
+                .priority(priority)
+                .build());
 
         return intents;
     }
diff --git a/apps/sdnip/src/test/java/org/onosproject/sdnip/PeerConnectivityManagerTest.java b/apps/sdnip/src/test/java/org/onosproject/sdnip/PeerConnectivityManagerTest.java
index 7ec843b..f16c8de 100644
--- a/apps/sdnip/src/test/java/org/onosproject/sdnip/PeerConnectivityManagerTest.java
+++ b/apps/sdnip/src/test/java/org/onosproject/sdnip/PeerConnectivityManagerTest.java
@@ -15,7 +15,13 @@
  */
 package org.onosproject.sdnip;
 
-import com.google.common.collect.Sets;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -46,14 +52,13 @@
 import org.onosproject.routing.config.InterfaceAddress;
 import org.onosproject.routing.config.RoutingConfigurationService;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
+import com.google.common.collect.Sets;
 
-import static org.easymock.EasyMock.*;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
 import static org.onosproject.sdnip.TestIntentServiceHelper.eqExceptId;
 
 /**
@@ -285,9 +290,13 @@
             builder.matchTcpDst(dstTcpPort);
         }
 
-        PointToPointIntent intent = new PointToPointIntent(
-                APPID, builder.build(), noTreatment,
-                srcConnectPoint, dstConnectPoint);
+        PointToPointIntent intent = PointToPointIntent.builder()
+                .appId(APPID)
+                .selector(builder.build())
+                .treatment(noTreatment)
+                .ingressPoint(srcConnectPoint)
+                .egressPoint(dstConnectPoint)
+                .build();
 
         intentList.add(intent);
     }
@@ -457,9 +466,13 @@
                 .matchIPDst(IpPrefix.valueOf(dstPrefix))
                 .build();
 
-        PointToPointIntent intent = new PointToPointIntent(
-                APPID, selector, noTreatment,
-                srcConnectPoint, dstConnectPoint);
+        PointToPointIntent intent = PointToPointIntent.builder()
+                .appId(APPID)
+                .selector(selector)
+                .treatment(noTreatment)
+                .ingressPoint(srcConnectPoint)
+                .egressPoint(dstConnectPoint)
+                .build();
 
         intentList.add(intent);
     }
diff --git a/cli/src/main/java/org/onosproject/cli/net/AddPointToPointIntentCommand.java b/cli/src/main/java/org/onosproject/cli/net/AddPointToPointIntentCommand.java
index 3c93fa6..4ca0ebd 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AddPointToPointIntentCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AddPointToPointIntentCommand.java
@@ -67,11 +67,16 @@
 
         List<Constraint> constraints = buildConstraints();
 
-        Intent intent = new PointToPointIntent(appId(),
-                key(),
-                selector, treatment,
-                ingress, egress, constraints,
-                priority());
+        Intent intent = PointToPointIntent.builder()
+                .appId(appId())
+                .key(key())
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(ingress)
+                .egressPoint(egress)
+                .constraints(constraints)
+                .priority(priority())
+                .build();
         service.submit(intent);
         print("Point to point intent submitted:\n%s", intent.toString());
     }
diff --git a/cli/src/main/java/org/onosproject/cli/net/IntentCycleCommand.java b/cli/src/main/java/org/onosproject/cli/net/IntentCycleCommand.java
index 6a61295..1c01c5b 100644
--- a/cli/src/main/java/org/onosproject/cli/net/IntentCycleCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/IntentCycleCommand.java
@@ -15,7 +15,11 @@
  */
 package org.onosproject.cli.net;
 
-import com.google.common.collect.Lists;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicLong;
+
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.onlab.packet.Ethernet;
@@ -36,11 +40,7 @@
 import org.onosproject.net.intent.Key;
 import org.onosproject.net.intent.PointToPointIntent;
 
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.atomic.AtomicLong;
+import com.google.common.collect.Lists;
 
 import static org.onlab.util.Tools.delay;
 import static org.onosproject.net.DeviceId.deviceId;
@@ -127,11 +127,16 @@
             TrafficSelector selector = selectorBldr
                     .matchEthSrc(MacAddress.valueOf(i + keyOffset))
                     .build();
-            intents.add(new PointToPointIntent(appId(), Key.of(i + keyOffset, appId()),
-                                               selector, treatment,
-                                               ingress, egress,
-                                               Collections.emptyList(),
-                                               Intent.DEFAULT_INTENT_PRIORITY));
+            intents.add(
+                    PointToPointIntent.builder()
+                        .appId(appId())
+                        .key(Key.of(i + keyOffset, appId()))
+                        .selector(selector)
+                        .treatment(treatment)
+                        .ingressPoint(ingress)
+                        .egressPoint(egress)
+                        .build());
+
 
         }
         return intents;
diff --git a/cli/src/main/java/org/onosproject/cli/net/IntentPushTestCommand.java b/cli/src/main/java/org/onosproject/cli/net/IntentPushTestCommand.java
index 20af27d..b31ad68 100644
--- a/cli/src/main/java/org/onosproject/cli/net/IntentPushTestCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/IntentPushTestCommand.java
@@ -15,7 +15,11 @@
  */
 package org.onosproject.cli.net;
 
-import com.google.common.collect.Lists;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
@@ -37,11 +41,7 @@
 import org.onosproject.net.intent.Key;
 import org.onosproject.net.intent.PointToPointIntent;
 
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
+import com.google.common.collect.Lists;
 
 import static org.onosproject.net.DeviceId.deviceId;
 import static org.onosproject.net.PortNumber.portNumber;
@@ -136,11 +136,15 @@
             TrafficSelector selector = selectorBldr
                     .matchEthSrc(MacAddress.valueOf(i + keyOffset))
                     .build();
-            intents.add(new PointToPointIntent(appId(), Key.of(i + keyOffset, appId()),
-                                               selector, treatment,
-                                               ingress, egress,
-                                               Collections.emptyList(),
-                                               Intent.DEFAULT_INTENT_PRIORITY));
+            intents.add(PointToPointIntent.builder()
+                    .appId(appId())
+                    .key(Key.of(i + keyOffset, appId()))
+                    .selector(selector)
+                    .treatment(treatment)
+                    .ingressPoint(ingress)
+                    .egressPoint(egress)
+                    .build());
+
 
         }
         return intents;
diff --git a/core/api/src/main/java/org/onosproject/net/intent/ConnectivityIntent.java b/core/api/src/main/java/org/onosproject/net/intent/ConnectivityIntent.java
index 038e96a..9d0a228 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/ConnectivityIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/ConnectivityIntent.java
@@ -15,10 +15,13 @@
  */
 package org.onosproject.net.intent;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.net.Link;
 import org.onosproject.net.NetworkResource;
+import org.onosproject.net.flow.DefaultTrafficSelector;
+import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.flow.TrafficTreatment;
 
@@ -112,6 +115,65 @@
     }
 
     /**
+     * Abstract builder for connectivity intents.
+     */
+    public abstract static class Builder extends Intent.Builder {
+        protected TrafficSelector selector = DefaultTrafficSelector.emptySelector();
+        protected TrafficTreatment treatment = DefaultTrafficTreatment.emptyTreatment();
+        protected List<Constraint> constraints = ImmutableList.of();
+
+        @Override
+        public Builder appId(ApplicationId appId) {
+            return (Builder) super.appId(appId);
+        }
+
+        @Override
+        public Builder key(Key key) {
+            return (Builder) super.key(key);
+        }
+
+        @Override
+        public Builder priority(int priority) {
+            return (Builder) super.priority(priority);
+        }
+
+
+        /**
+         * Sets the traffic selector for the intent that will be built.
+         *
+         * @param selector selector to use for built intent
+         * @return this builder
+         */
+        public Builder selector(TrafficSelector selector) {
+            this.selector = selector;
+            return this;
+        }
+
+        /**
+         * Sets the traffic treatment for the intent that will be built.
+         *
+         * @param treatment treatment to use for built intent
+         * @return this builder
+         */
+        public Builder treatment(TrafficTreatment treatment) {
+            this.treatment = treatment;
+            return this;
+        }
+
+        /**
+         * Sets the constraints for the intent that will be built.
+         *
+         * @param constraints constraints to use for built intent
+         * @return this builder
+         */
+        public Builder constraints(List<Constraint> constraints) {
+            this.constraints = ImmutableList.copyOf(constraints);
+            return this;
+        }
+    }
+
+
+    /**
      * Returns the match specifying the type of traffic.
      *
      * @return traffic match
diff --git a/core/api/src/main/java/org/onosproject/net/intent/Intent.java b/core/api/src/main/java/org/onosproject/net/intent/Intent.java
index 7959929..725fac4 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/Intent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/Intent.java
@@ -15,13 +15,13 @@
  */
 package org.onosproject.net.intent;
 
+import java.util.Collection;
+import java.util.Objects;
+
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.IdGenerator;
 import org.onosproject.net.NetworkResource;
 
-import java.util.Collection;
-import java.util.Objects;
-
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
@@ -92,6 +92,49 @@
     }
 
     /**
+     * Abstract builder for intents.
+     */
+    public abstract static class Builder {
+        protected ApplicationId appId;
+        protected Key key;
+        protected int priority = Intent.DEFAULT_INTENT_PRIORITY;
+
+        /**
+         * Sets the application id for the intent that will be built.
+         *
+         * @param appId application id to use for built intent
+         * @return this builder
+         */
+        public Builder appId(ApplicationId appId) {
+            this.appId = appId;
+            return this;
+        }
+
+        /**
+         * Sets the key for the intent that will be built.
+         *
+         * @param key key to use for built intent
+         * @return this builder
+         */
+        public Builder key(Key key) {
+            this.key = key;
+            return this;
+        }
+
+        /**
+         * Sets the priority for the intent that will be built.
+         *
+         * @param priority priority to use for built intent
+         * @return this builder
+         */
+        public Builder priority(int priority) {
+            this.priority = priority;
+            return this;
+        }
+
+    }
+
+    /**
      * Returns the intent identifier.
      *
      * @return intent fingerprint
diff --git a/core/api/src/main/java/org/onosproject/net/intent/PointToPointIntent.java b/core/api/src/main/java/org/onosproject/net/intent/PointToPointIntent.java
index 2df7b8b..5f80d9a 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/PointToPointIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/PointToPointIntent.java
@@ -15,18 +15,16 @@
  */
 package org.onosproject.net.intent;
 
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.ImmutableList;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.Link;
-import org.onosproject.net.flow.TrafficSelector;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.intent.constraint.LinkTypeConstraint;
-
 import java.util.Collections;
 import java.util.List;
 
+import org.onosproject.core.ApplicationId;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flow.TrafficTreatment;
+
+import com.google.common.base.MoreObjects;
+
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
@@ -39,6 +37,103 @@
     private final ConnectPoint egressPoint;
 
     /**
+     * Returns a new point to point intent builder. The application id,
+     * ingress point and egress point are required fields.  If they are
+     * not set by calls to the appropriate methods, an exception will
+     * be thrown.
+     *
+     * @return point to point builder
+     */
+    public static PointToPointIntent.Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * Builder of a point to point intent.
+     */
+    public static final class Builder extends ConnectivityIntent.Builder {
+        ConnectPoint ingressPoint;
+        ConnectPoint egressPoint;
+
+        private Builder() {
+            // Hide constructor
+        }
+
+        @Override
+        public Builder appId(ApplicationId appId) {
+            return (Builder) super.appId(appId);
+        }
+
+        @Override
+        public Builder key(Key key) {
+            return (Builder) super.key(key);
+        }
+
+        @Override
+        public Builder selector(TrafficSelector selector) {
+            return (Builder) super.selector(selector);
+        }
+
+        @Override
+        public Builder treatment(TrafficTreatment treatment) {
+            return (Builder) super.treatment(treatment);
+        }
+
+        @Override
+        public Builder constraints(List<Constraint> constraints) {
+            return (Builder) super.constraints(constraints);
+        }
+
+        @Override
+        public Builder priority(int priority) {
+            return (Builder) super.priority(priority);
+        }
+
+        /**
+         * Sets the ingress point of the point to point intent that will be built.
+         *
+         * @param ingressPoint ingress connect point
+         * @return this builder
+         */
+        public Builder ingressPoint(ConnectPoint ingressPoint) {
+            this.ingressPoint = ingressPoint;
+            return this;
+        }
+
+        /**
+         * Sets the egress point of the point to point intent that will be built.
+         *
+         * @param egressPoint egress connect point
+         * @return this builder
+         */
+        public Builder egressPoint(ConnectPoint egressPoint) {
+            this.egressPoint = egressPoint;
+            return this;
+        }
+
+        /**
+         * Builds a point to point intent from the accumulated parameters.
+         *
+         * @return point to point intent
+         */
+        public PointToPointIntent build() {
+
+            return new PointToPointIntent(
+                    appId,
+                    key,
+                    selector,
+                    treatment,
+                    ingressPoint,
+                    egressPoint,
+                    constraints,
+                    priority
+            );
+        }
+    }
+
+
+
+    /**
      * Creates a new point-to-point intent with the supplied ingress/egress
      * ports and constraints.
      *
@@ -50,9 +145,10 @@
      * @param egressPoint  egress port
      * @param constraints  optional list of constraints
      * @param priority     priority to use for flows generated by this intent
-     * @throws NullPointerException if {@code ingressPoint} or {@code egressPoints} is null.
+     * @throws NullPointerException if {@code ingressPoint} or
+     *        {@code egressPoints} or {@code appId} is null.
      */
-    public PointToPointIntent(ApplicationId appId,
+    private PointToPointIntent(ApplicationId appId,
                               Key key,
                               TrafficSelector selector,
                               TrafficTreatment treatment,
@@ -73,57 +169,6 @@
     }
 
     /**
-     * Creates a new point-to-point intent with the supplied ingress/egress
-     * ports and with built-in link type constraint to avoid optical links.
-     *
-     * @param appId        application identifier
-     * @param selector     traffic selector
-     * @param treatment    treatment
-     * @param ingressPoint ingress port
-     * @param egressPoint  egress port
-     * @throws NullPointerException if {@code ingressPoint} or {@code egressPoints} is null.
-     */
-    public PointToPointIntent(ApplicationId appId, TrafficSelector selector,
-                              TrafficTreatment treatment,
-                              ConnectPoint ingressPoint,
-                              ConnectPoint egressPoint) {
-        this(appId, null, selector, treatment, ingressPoint, egressPoint,
-             ImmutableList.of(new LinkTypeConstraint(false, Link.Type.OPTICAL)),
-                DEFAULT_INTENT_PRIORITY);
-    }
-
-    /**
-     * Creates a new point-to-point intent with the supplied ingress/egress
-     * ports and constraints.
-     *
-     * @param appId        application identifier
-     * @param selector     traffic selector
-     * @param treatment    treatment
-     * @param ingressPoint ingress port
-     * @param egressPoint  egress port
-     * @param constraints  optional list of constraints
-     * @param priority     priority to use for flows generated by this intent
-     * @throws NullPointerException if {@code ingressPoint} or {@code egressPoints} is null.
-     */
-    public PointToPointIntent(ApplicationId appId, TrafficSelector selector,
-                              TrafficTreatment treatment,
-                              ConnectPoint ingressPoint,
-                              ConnectPoint egressPoint,
-                              List<Constraint> constraints,
-                              int priority) {
-        super(appId, null, Collections.emptyList(), selector, treatment,
-                constraints, priority);
-
-        checkNotNull(ingressPoint);
-        checkNotNull(egressPoint);
-        checkArgument(!ingressPoint.equals(egressPoint),
-                "ingress and egress should be different (ingress: %s, egress: %s)", ingressPoint, egressPoint);
-
-        this.ingressPoint = ingressPoint;
-        this.egressPoint = egressPoint;
-    }
-
-    /**
      * Constructor for serializer.
      */
     protected PointToPointIntent() {
diff --git a/core/api/src/test/java/org/onosproject/net/intent/PointToPointIntentTest.java b/core/api/src/test/java/org/onosproject/net/intent/PointToPointIntentTest.java
index fc18242..7171e7a 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/PointToPointIntentTest.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/PointToPointIntentTest.java
@@ -44,11 +44,23 @@
 
     @Override
     protected PointToPointIntent createOne() {
-        return new PointToPointIntent(APPID, MATCH, NOP, P1, P2);
+        return PointToPointIntent.builder()
+                .appId(APPID)
+                .selector(MATCH)
+                .treatment(NOP)
+                .ingressPoint(P1)
+                .egressPoint(P2)
+                .build();
     }
 
     @Override
     protected PointToPointIntent createAnother() {
-        return new PointToPointIntent(APPID, MATCH, NOP, P2, P1);
+        return PointToPointIntent.builder()
+                .appId(APPID)
+                .selector(MATCH)
+                .treatment(NOP)
+                .ingressPoint(P2)
+                .egressPoint(P1)
+                .build();
     }
 }
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/TwoWayP2PIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/TwoWayP2PIntentCompiler.java
index a879236..63f8ebb 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/TwoWayP2PIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/TwoWayP2PIntentCompiler.java
@@ -48,14 +48,25 @@
     public List<Intent> compile(TwoWayP2PIntent intent, List<Intent> installable,
                                 Set<LinkResourceAllocations> resources) {
         return Lists.newArrayList(
-                new PointToPointIntent(intent.appId(), intent.key(),
-                                       intent.selector(), intent.treatment(),
-                                       intent.one(), intent.two(),
-                                       intent.constraints(), intent.priority()),
-                new PointToPointIntent(intent.appId(), intent.key(),
-                                       intent.selector(), intent.treatment(),
-                                       intent.two(), intent.one(),
-                                       intent.constraints(), intent.priority()));
-
+                PointToPointIntent.builder()
+                        .appId(intent.appId())
+                        .key(intent.key())
+                        .selector(intent.selector())
+                        .treatment(intent.treatment())
+                        .ingressPoint(intent.one())
+                        .egressPoint(intent.two())
+                        .constraints(intent.constraints())
+                        .priority(intent.priority())
+                        .build(),
+                PointToPointIntent.builder()
+                        .appId(intent.appId())
+                        .key(intent.key())
+                        .selector(intent.selector())
+                        .treatment(intent.treatment())
+                        .ingressPoint(intent.two())
+                        .egressPoint(intent.one())
+                        .constraints(intent.constraints())
+                        .priority(intent.priority())
+                        .build());
     }
 }
diff --git a/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/PointToPointIntentCompilerTest.java b/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/PointToPointIntentCompilerTest.java
index aedc124..b0a5df8 100644
--- a/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/PointToPointIntentCompilerTest.java
+++ b/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/PointToPointIntentCompilerTest.java
@@ -72,9 +72,13 @@
      */
     private PointToPointIntent makeIntent(String ingressIdString,
                                           String egressIdString) {
-        return new PointToPointIntent(APPID, selector, treatment,
-                                      connectPoint(ingressIdString, 1),
-                                      connectPoint(egressIdString, 1));
+        return PointToPointIntent.builder()
+                .appId(APPID)
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(connectPoint(ingressIdString, 1))
+                .egressPoint(connectPoint(egressIdString, 1))
+                .build();
     }
 
     /**
@@ -87,10 +91,14 @@
      */
     private PointToPointIntent makeIntent(String ingressIdString,
                                           String egressIdString, List<Constraint> constraints) {
-        return new PointToPointIntent(APPID, selector, treatment,
-                connectPoint(ingressIdString, 1),
-                connectPoint(egressIdString, 1),
-                constraints, Intent.DEFAULT_INTENT_PRIORITY);
+        return PointToPointIntent.builder()
+                .appId(APPID)
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(connectPoint(ingressIdString, 1))
+                .egressPoint(connectPoint(egressIdString, 1))
+                .constraints(constraints)
+                .build();
     }
 
     /**
@@ -187,7 +195,13 @@
     public void testSameSwitchDifferentPortsIntentCompilation() {
         ConnectPoint src = new ConnectPoint(deviceId("1"), portNumber(1));
         ConnectPoint dst = new ConnectPoint(deviceId("1"), portNumber(2));
-        PointToPointIntent intent = new PointToPointIntent(APP_ID, selector, treatment, src, dst);
+        PointToPointIntent intent = PointToPointIntent.builder()
+                .appId(APP_ID)
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(src)
+                .egressPoint(dst)
+                .build();
 
         String[] hops = {"1"};
         PointToPointIntentCompiler sut = makeCompiler(hops);
diff --git a/core/net/src/test/java/org/onosproject/net/intent/impl/phase/CompilingTest.java b/core/net/src/test/java/org/onosproject/net/intent/impl/phase/CompilingTest.java
index 11a6e6e..d450812 100644
--- a/core/net/src/test/java/org/onosproject/net/intent/impl/phase/CompilingTest.java
+++ b/core/net/src/test/java/org/onosproject/net/intent/impl/phase/CompilingTest.java
@@ -90,7 +90,13 @@
         Intent.bindIdGenerator(idGenerator);
 
         // Intent creation should be placed after binding an ID generator
-        input = new PointToPointIntent(appId, selector, treatment, cp1, cp3);
+        input = PointToPointIntent.builder()
+                .appId(appId)
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(cp1)
+                .egressPoint(cp3)
+                .build();
         compiled = new PathIntent(appId, selector, treatment, path);
     }
 
diff --git a/core/net/src/test/java/org/onosproject/net/intent/impl/phase/InstallCoordinatingTest.java b/core/net/src/test/java/org/onosproject/net/intent/impl/phase/InstallCoordinatingTest.java
index cad6768..678bd2d 100644
--- a/core/net/src/test/java/org/onosproject/net/intent/impl/phase/InstallCoordinatingTest.java
+++ b/core/net/src/test/java/org/onosproject/net/intent/impl/phase/InstallCoordinatingTest.java
@@ -91,7 +91,13 @@
         Intent.bindIdGenerator(idGenerator);
 
         // Intent creation should be placed after binding an ID generator
-        input = new PointToPointIntent(appId, selector, treatment, cp1, cp3);
+        input = PointToPointIntent.builder()
+                .appId(appId)
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(cp1)
+                .egressPoint(cp3)
+                .build();
         compiled = new PathIntent(appId, selector, treatment, path);
     }
 
diff --git a/core/net/src/test/java/org/onosproject/net/intent/impl/phase/InstallingTest.java b/core/net/src/test/java/org/onosproject/net/intent/impl/phase/InstallingTest.java
index 89c797c..b7d063f 100644
--- a/core/net/src/test/java/org/onosproject/net/intent/impl/phase/InstallingTest.java
+++ b/core/net/src/test/java/org/onosproject/net/intent/impl/phase/InstallingTest.java
@@ -91,7 +91,13 @@
         Intent.bindIdGenerator(idGenerator);
 
         // Intent creation should be placed after binding an ID generator
-        input = new PointToPointIntent(appId, selector, treatment, cp1, cp3);
+        input = PointToPointIntent.builder()
+                .appId(appId)
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(cp1)
+                .egressPoint(cp3)
+                .build();
         compiled = new PathIntent(appId, selector, treatment, path);
     }
 
diff --git a/core/net/src/test/java/org/onosproject/net/intent/impl/phase/WithdrawCoordinatingTest.java b/core/net/src/test/java/org/onosproject/net/intent/impl/phase/WithdrawCoordinatingTest.java
index f5dbf58..19c3f6f 100644
--- a/core/net/src/test/java/org/onosproject/net/intent/impl/phase/WithdrawCoordinatingTest.java
+++ b/core/net/src/test/java/org/onosproject/net/intent/impl/phase/WithdrawCoordinatingTest.java
@@ -92,7 +92,13 @@
         Intent.bindIdGenerator(idGenerator);
 
         // Intent creation should be placed after binding an ID generator
-        input = new PointToPointIntent(appId, selector, treatment, cp1, cp3);
+        input = PointToPointIntent.builder()
+                .appId(appId)
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(cp1)
+                .egressPoint(cp3)
+                .build();
         compiled = new PathIntent(appId, selector, treatment, path);
     }
 
diff --git a/core/net/src/test/java/org/onosproject/net/intent/impl/phase/WithdrawingTest.java b/core/net/src/test/java/org/onosproject/net/intent/impl/phase/WithdrawingTest.java
index 1861ae5..a1f08ec 100644
--- a/core/net/src/test/java/org/onosproject/net/intent/impl/phase/WithdrawingTest.java
+++ b/core/net/src/test/java/org/onosproject/net/intent/impl/phase/WithdrawingTest.java
@@ -90,7 +90,13 @@
         Intent.bindIdGenerator(idGenerator);
 
         // Intent creation should be placed after binding an ID generator
-        input = new PointToPointIntent(appId, selector, treatment, cp1, cp3);
+        input = PointToPointIntent.builder()
+                .appId(appId)
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(cp1)
+                .egressPoint(cp3)
+                .build();
         compiled = new PathIntent(appId, selector, treatment, path);
     }
 
diff --git a/web/api/src/test/java/org/onosproject/codec/impl/IntentCodecTest.java b/web/api/src/test/java/org/onosproject/codec/impl/IntentCodecTest.java
index 811e87a..57274d8 100644
--- a/web/api/src/test/java/org/onosproject/codec/impl/IntentCodecTest.java
+++ b/web/api/src/test/java/org/onosproject/codec/impl/IntentCodecTest.java
@@ -35,10 +35,9 @@
 import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.flow.TrafficTreatment;
+import org.onosproject.net.intent.AbstractIntentTest;
 import org.onosproject.net.intent.Constraint;
 import org.onosproject.net.intent.HostToHostIntent;
-import org.onosproject.net.intent.AbstractIntentTest;
-import org.onosproject.net.intent.Intent;
 import org.onosproject.net.intent.PointToPointIntent;
 import org.onosproject.net.intent.constraint.AnnotationConstraint;
 import org.onosproject.net.intent.constraint.AsymmetricPathConstraint;
@@ -53,11 +52,11 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.ImmutableList;
 
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.notNullValue;
 import static org.onosproject.codec.impl.IntentJsonMatcher.matchesIntent;
 import static org.onosproject.net.NetTestTools.did;
 import static org.onosproject.net.NetTestTools.hid;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.notNullValue;
 
 /**
  * Unit tests for the host to host intent class codec.
@@ -98,8 +97,12 @@
         ConnectPoint egress = NetTestTools.connectPoint("egress", 2);
 
         final PointToPointIntent intent =
-                new PointToPointIntent(appId, emptySelector,
-                        emptyTreatment, ingress, egress);
+                PointToPointIntent.builder()
+                        .appId(appId)
+                        .selector(emptySelector)
+                        .treatment(emptyTreatment)
+                        .ingressPoint(ingress)
+                        .egressPoint(egress).build();
 
         final CodecContext context = new MockCodecContext();
         final JsonCodec<PointToPointIntent> intentCodec =
@@ -147,9 +150,15 @@
                     new WaypointConstraint(did3));
 
         final PointToPointIntent intent =
-                new PointToPointIntent(appId, selector, treatment,
-                                       ingress, egress, constraints,
-                                       Intent.DEFAULT_INTENT_PRIORITY);
+                PointToPointIntent.builder()
+                        .appId(appId)
+                        .selector(selector)
+                        .treatment(treatment)
+                        .ingressPoint(ingress)
+                        .egressPoint(egress)
+                        .constraints(constraints)
+                        .build();
+
 
         final CodecContext context = new MockCodecContext();
         final JsonCodec<PointToPointIntent> intentCodec =