Committed by
Gerrit Code Review
Filters intent list before installation
Change-Id: I6f73ff65ab7e31fac8e9a6f28f20f0119e24793d
Showing
1 changed file
with
59 additions
and
2 deletions
... | @@ -36,6 +36,7 @@ import org.slf4j.Logger; | ... | @@ -36,6 +36,7 @@ import org.slf4j.Logger; |
36 | 36 | ||
37 | import java.util.ArrayList; | 37 | import java.util.ArrayList; |
38 | import java.util.Collection; | 38 | import java.util.Collection; |
39 | +import java.util.Iterator; | ||
39 | import java.util.List; | 40 | import java.util.List; |
40 | import java.util.Optional; | 41 | import java.util.Optional; |
41 | import java.util.Set; | 42 | import java.util.Set; |
... | @@ -200,8 +201,64 @@ class IntentInstaller { | ... | @@ -200,8 +201,64 @@ class IntentInstaller { |
200 | this.toInstall = toInstall; | 201 | this.toInstall = toInstall; |
201 | this.successConsumer = successConsumer; | 202 | this.successConsumer = successConsumer; |
202 | this.errorConsumer = errorConsumer; | 203 | this.errorConsumer = errorConsumer; |
203 | - prepareIntentData(toUninstall, Direction.REMOVE); | 204 | + prepareIntentData(toUninstall, toInstall); |
204 | - prepareIntentData(toInstall, Direction.ADD); | 205 | + } |
206 | + | ||
207 | + private void prepareIntentData(Optional<IntentData> uninstallData, | ||
208 | + Optional<IntentData> installData) { | ||
209 | + if (!installData.isPresent() && !uninstallData.isPresent()) { | ||
210 | + return; | ||
211 | + } else if (!installData.isPresent()) { | ||
212 | + prepareIntentData(uninstallData, Direction.REMOVE); | ||
213 | + } else if (!uninstallData.isPresent()) { | ||
214 | + prepareIntentData(installData, Direction.ADD); | ||
215 | + } else { | ||
216 | + IntentData uninstall = uninstallData.get(); | ||
217 | + IntentData install = installData.get(); | ||
218 | + List<Intent> uninstallIntents = new ArrayList<>(); | ||
219 | + uninstallIntents.addAll(uninstall.installables()); | ||
220 | + List<Intent> installIntents = new ArrayList<>(); | ||
221 | + installIntents.addAll(install.installables()); | ||
222 | + | ||
223 | + checkState(uninstallIntents.stream().allMatch(this::isSupported), | ||
224 | + "Unsupported installable intents detected"); | ||
225 | + checkState(installIntents.stream().allMatch(this::isSupported), | ||
226 | + "Unsupported installable intents detected"); | ||
227 | + | ||
228 | + //TODO: Filter FlowObjective intents | ||
229 | + // Filter out same intents and intents with same flow rules | ||
230 | + Iterator<Intent> iterator = installIntents.iterator(); | ||
231 | + while (iterator.hasNext()) { | ||
232 | + Intent installIntent = iterator.next(); | ||
233 | + uninstallIntents.stream().filter(uIntent -> { | ||
234 | + if (uIntent.equals(installIntent)) { | ||
235 | + return true; | ||
236 | + } else if (uIntent instanceof FlowRuleIntent && installIntent instanceof FlowRuleIntent) { | ||
237 | + return ((FlowRuleIntent) uIntent).flowRules() | ||
238 | + .containsAll(((FlowRuleIntent) installIntent).flowRules()); | ||
239 | + } else { | ||
240 | + return false; | ||
241 | + } | ||
242 | + }).findFirst().ifPresent(common -> { | ||
243 | + uninstallIntents.remove(common); | ||
244 | + iterator.remove(); | ||
245 | + }); | ||
246 | + } | ||
247 | + | ||
248 | + final IntentData newUninstall = new IntentData(uninstall, uninstallIntents); | ||
249 | + final IntentData newInstall = new IntentData(install, installIntents); | ||
250 | + | ||
251 | + trackerService.removeTrackedResources(newUninstall.key(), newUninstall.intent().resources()); | ||
252 | + uninstallIntents.forEach(installable -> | ||
253 | + trackerService.removeTrackedResources(newUninstall.intent().key(), | ||
254 | + installable.resources())); | ||
255 | + trackerService.addTrackedResources(newInstall.key(), newInstall.intent().resources()); | ||
256 | + installIntents.forEach(installable -> | ||
257 | + trackerService.addTrackedResources(newInstall.key(), | ||
258 | + installable.resources())); | ||
259 | + prepareIntents(uninstallIntents, Direction.REMOVE); | ||
260 | + prepareIntents(installIntents, Direction.ADD); | ||
261 | + } | ||
205 | } | 262 | } |
206 | 263 | ||
207 | /** | 264 | /** | ... | ... |
-
Please register or login to post a comment