Carry previous alternative routes in ALTERNATIVE_ROUTES_CHANGED event

Change-Id: I393f4cb258a7b7824b4a6811e430c04acb6bd441
diff --git a/apps/route-service/api/src/main/java/org/onosproject/routeservice/RouteEvent.java b/apps/route-service/api/src/main/java/org/onosproject/routeservice/RouteEvent.java
index 0428beb..a7f5d88 100644
--- a/apps/route-service/api/src/main/java/org/onosproject/routeservice/RouteEvent.java
+++ b/apps/route-service/api/src/main/java/org/onosproject/routeservice/RouteEvent.java
@@ -32,6 +32,7 @@
 
     private final ResolvedRoute prevSubject;
     private final Collection<ResolvedRoute> alternativeRoutes;
+    private final Collection<ResolvedRoute> prevAlternativeRoutes;
 
     /**
      * Route event type.
@@ -109,8 +110,8 @@
     protected RouteEvent(Type type, ResolvedRoute subject, long time) {
         super(type, subject, time);
         this.prevSubject = null;
-
         this.alternativeRoutes = Collections.emptySet();
+        this.prevAlternativeRoutes = null;
     }
 
     /**
@@ -134,9 +135,25 @@
      */
     public RouteEvent(Type type, ResolvedRoute subject, ResolvedRoute prevSubject,
                       Collection<ResolvedRoute> alternatives) {
+        this(type, subject, prevSubject, alternatives, null);
+    }
+
+    /**
+     * Creates a new route event with a previous subject, alternative routes and previous alternative
+     * routes.
+     *
+     * @param type event type
+     * @param subject event subject
+     * @param prevSubject previous subject
+     * @param alternatives alternative routes for subject's prefix
+     * @param prevAlternatives previous alternative routes for subject's prefix
+     */
+    public RouteEvent(Type type, ResolvedRoute subject, ResolvedRoute prevSubject,
+                      Collection<ResolvedRoute> alternatives, Collection<ResolvedRoute> prevAlternatives) {
         super(type, subject);
         this.prevSubject = prevSubject;
         this.alternativeRoutes = alternatives;
+        this.prevAlternativeRoutes = prevAlternatives;
     }
 
     /**
@@ -157,9 +174,18 @@
         return alternativeRoutes;
     }
 
+    /**
+     * Returns the set of previous alternative routes for the subject's prefix.
+     *
+     * @return previous alternative routes
+     */
+    public Collection<ResolvedRoute> prevAlternatives() {
+        return prevAlternativeRoutes;
+    }
+
     @Override
     public int hashCode() {
-        return Objects.hash(subject(), type(), prevSubject(), alternativeRoutes);
+        return Objects.hash(subject(), type(), prevSubject(), alternativeRoutes, prevAlternativeRoutes);
     }
 
     @Override
@@ -177,7 +203,8 @@
         return Objects.equals(this.subject(), that.subject()) &&
                 Objects.equals(this.type(), that.type()) &&
                 Objects.equals(this.prevSubject, that.prevSubject) &&
-                Objects.equals(this.alternativeRoutes, that.alternativeRoutes);
+                Objects.equals(this.alternativeRoutes, that.alternativeRoutes) &&
+                Objects.equals(this.prevAlternativeRoutes, that.prevAlternativeRoutes);
     }
 
     @Override
@@ -188,6 +215,7 @@
                 .add("subject", subject())
                 .add("prevSubject", prevSubject)
                 .add("alternatives", alternativeRoutes)
+                .add("prevAlternatives", prevAlternativeRoutes)
                 .toString();
     }
 }
diff --git a/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/DefaultResolvedRouteStore.java b/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/DefaultResolvedRouteStore.java
index 34aeaa7..4981932 100644
--- a/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/DefaultResolvedRouteStore.java
+++ b/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/DefaultResolvedRouteStore.java
@@ -149,7 +149,7 @@
 
                 if (!immutableAlternatives.equals(oldRoutes)) {
                     return new RouteEvent(RouteEvent.Type.ALTERNATIVE_ROUTES_CHANGED,
-                            route, immutableAlternatives);
+                            route, null, immutableAlternatives, oldRoutes);
                 }
 
                 return null;