blob: 982aa0c199bcbb4ea890216deb6ed1c60d5980c9 [file] [log] [blame]
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07001/*
2 * Copyright 2014 Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.net.intent.impl;
Brian O'Connor66630c82014-10-02 21:08:19 -070017
Brian O'Connor64a0369d2015-02-20 22:02:59 -080018import com.google.common.collect.ImmutableList;
Brian O'Connor66630c82014-10-02 21:08:19 -070019import org.apache.felix.scr.annotations.Activate;
20import org.apache.felix.scr.annotations.Component;
21import org.apache.felix.scr.annotations.Deactivate;
22import org.apache.felix.scr.annotations.Reference;
23import org.apache.felix.scr.annotations.ReferenceCardinality;
24import org.apache.felix.scr.annotations.Service;
Brian O'Connorabafb502014-12-02 22:26:20 -080025import org.onosproject.core.CoreService;
26import org.onosproject.core.IdGenerator;
27import org.onosproject.event.AbstractListenerRegistry;
28import org.onosproject.event.EventDeliveryService;
Brian O'Connor0e271dc2015-02-04 18:20:25 -080029import org.onosproject.net.flow.FlowRuleOperations;
Brian O'Connorabafb502014-12-02 22:26:20 -080030import org.onosproject.net.flow.FlowRuleService;
31import org.onosproject.net.intent.Intent;
32import org.onosproject.net.intent.IntentBatchDelegate;
Brian O'Connorabafb502014-12-02 22:26:20 -080033import org.onosproject.net.intent.IntentCompiler;
Brian O'Connorcff03322015-02-03 15:28:59 -080034import org.onosproject.net.intent.IntentData;
Brian O'Connorabafb502014-12-02 22:26:20 -080035import org.onosproject.net.intent.IntentEvent;
Brian O'Connorabafb502014-12-02 22:26:20 -080036import org.onosproject.net.intent.IntentExtensionService;
Brian O'Connorabafb502014-12-02 22:26:20 -080037import org.onosproject.net.intent.IntentInstaller;
38import org.onosproject.net.intent.IntentListener;
Brian O'Connorabafb502014-12-02 22:26:20 -080039import org.onosproject.net.intent.IntentService;
40import org.onosproject.net.intent.IntentState;
41import org.onosproject.net.intent.IntentStore;
Brian O'Connorabafb502014-12-02 22:26:20 -080042import org.onosproject.net.intent.IntentStoreDelegate;
Ray Milkeyf9af43c2015-02-09 16:45:48 -080043import org.onosproject.net.intent.Key;
Sho SHIMIZU36a8a6e2015-02-13 15:38:45 -080044import org.onosproject.net.intent.impl.phase.FinalIntentProcessPhase;
Sho SHIMIZUce49b602015-02-23 19:15:49 -080045import org.onosproject.net.intent.impl.phase.IntentProcessPhase;
Sho SHIMIZU662c3db2015-02-23 16:59:01 -080046import org.onosproject.net.intent.impl.phase.IntentWorker;
Brian O'Connor66630c82014-10-02 21:08:19 -070047import org.slf4j.Logger;
48
Brian O'Connor64a0369d2015-02-20 22:02:59 -080049import java.util.Collection;
Brian O'Connor64a0369d2015-02-20 22:02:59 -080050import java.util.EnumSet;
Brian O'Connor64a0369d2015-02-20 22:02:59 -080051import java.util.List;
52import java.util.Map;
Brian O'Connor64a0369d2015-02-20 22:02:59 -080053import java.util.concurrent.ExecutionException;
54import java.util.concurrent.ExecutorService;
55import java.util.concurrent.Future;
56import java.util.stream.Collectors;
Brian O'Connorfa81eae2014-10-30 13:20:05 -070057
Brian O'Connorfa81eae2014-10-30 13:20:05 -070058import static com.google.common.base.Preconditions.checkNotNull;
Yuta HIGUCHIc2bf3d82014-11-28 18:50:41 -080059import static java.util.concurrent.Executors.newFixedThreadPool;
Brian O'Connordb15b042015-02-04 14:59:28 -080060import static java.util.concurrent.Executors.newSingleThreadExecutor;
Brian O'Connorbdc7f002015-02-18 20:49:41 -080061import static org.onlab.util.Tools.groupedThreads;
Sho SHIMIZUb0a47d42015-02-19 13:26:30 -080062import static org.onosproject.net.intent.IntentState.FAILED;
63import static org.onosproject.net.intent.IntentState.INSTALL_REQ;
Sho SHIMIZUb0a47d42015-02-19 13:26:30 -080064import static org.onosproject.net.intent.IntentState.WITHDRAW_REQ;
Sho SHIMIZUce49b602015-02-23 19:15:49 -080065import static org.onosproject.net.intent.impl.phase.IntentProcessPhase.newInitialPhase;
Brian O'Connorfa81eae2014-10-30 13:20:05 -070066import static org.slf4j.LoggerFactory.getLogger;
Brian O'Connor66630c82014-10-02 21:08:19 -070067
68/**
69 * An implementation of Intent Manager.
70 */
71@Component(immediate = true)
72@Service
73public class IntentManager
74 implements IntentService, IntentExtensionService {
Sho SHIMIZU8b5051d2014-11-05 11:24:13 -080075 private static final Logger log = getLogger(IntentManager.class);
Brian O'Connor66630c82014-10-02 21:08:19 -070076
77 public static final String INTENT_NULL = "Intent cannot be null";
Ray Milkeyf9af43c2015-02-09 16:45:48 -080078 public static final String INTENT_ID_NULL = "Intent key cannot be null";
Brian O'Connor66630c82014-10-02 21:08:19 -070079
Yuta HIGUCHIc2bf3d82014-11-28 18:50:41 -080080 private static final int NUM_THREADS = 12;
81
Brian O'Connor7a71d5d2014-12-02 00:12:27 -080082 private static final EnumSet<IntentState> RECOMPILE
83 = EnumSet.of(INSTALL_REQ, FAILED, WITHDRAW_REQ);
Brian O'Connor7a71d5d2014-12-02 00:12:27 -080084
Brian O'Connor66630c82014-10-02 21:08:19 -070085 private final AbstractListenerRegistry<IntentEvent, IntentListener>
tom95329eb2014-10-06 08:40:06 -070086 listenerRegistry = new AbstractListenerRegistry<>();
Brian O'Connor66630c82014-10-02 21:08:19 -070087
Brian O'Connor520c0522014-11-23 23:50:47 -080088 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
89 protected CoreService coreService;
Brian O'Connor66630c82014-10-02 21:08:19 -070090
91 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
92 protected IntentStore store;
93
94 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
tom85258ee2014-10-07 00:10:02 -070095 protected ObjectiveTrackerService trackerService;
tom95329eb2014-10-06 08:40:06 -070096
97 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Brian O'Connor66630c82014-10-02 21:08:19 -070098 protected EventDeliveryService eventDispatcher;
99
Brian O'Connorf2dbde52014-10-10 16:20:24 -0700100 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Sho SHIMIZU214ac322015-02-23 19:30:15 -0800101 protected FlowRuleService flowRuleService;
Brian O'Connorf2dbde52014-10-10 16:20:24 -0700102
Brian O'Connor520c0522014-11-23 23:50:47 -0800103
Brian O'Connordb15b042015-02-04 14:59:28 -0800104 private ExecutorService batchExecutor;
105 private ExecutorService workerExecutor;
Brian O'Connor520c0522014-11-23 23:50:47 -0800106
Sho SHIMIZUb0a47d42015-02-19 13:26:30 -0800107 private final CompilerRegistry compilerRegistry = new CompilerRegistry();
108 private final InstallerRegistry installerRegistry = new InstallerRegistry();
109 private final InternalIntentProcessor processor = new InternalIntentProcessor();
Brian O'Connor520c0522014-11-23 23:50:47 -0800110 private final IntentStoreDelegate delegate = new InternalStoreDelegate();
111 private final TopologyChangeDelegate topoDelegate = new InternalTopoChangeDelegate();
112 private final IntentBatchDelegate batchDelegate = new InternalBatchDelegate();
113 private IdGenerator idGenerator;
114
Brian O'Connorb499b352015-02-03 16:46:15 -0800115 private final IntentAccumulator accumulator = new IntentAccumulator(batchDelegate);
Brian O'Connorcff03322015-02-03 15:28:59 -0800116
Brian O'Connor66630c82014-10-02 21:08:19 -0700117 @Activate
118 public void activate() {
119 store.setDelegate(delegate);
tom95329eb2014-10-06 08:40:06 -0700120 trackerService.setDelegate(topoDelegate);
Brian O'Connor66630c82014-10-02 21:08:19 -0700121 eventDispatcher.addSink(IntentEvent.class, listenerRegistry);
Brian O'Connorbdc7f002015-02-18 20:49:41 -0800122 batchExecutor = newSingleThreadExecutor(groupedThreads("onos/intent", "batch"));
123 workerExecutor = newFixedThreadPool(NUM_THREADS, groupedThreads("onos/intent", "worker-%d"));
Brian O'Connor520c0522014-11-23 23:50:47 -0800124 idGenerator = coreService.getIdGenerator("intent-ids");
125 Intent.bindIdGenerator(idGenerator);
Brian O'Connor66630c82014-10-02 21:08:19 -0700126 log.info("Started");
127 }
128
129 @Deactivate
130 public void deactivate() {
131 store.unsetDelegate(delegate);
tom95329eb2014-10-06 08:40:06 -0700132 trackerService.unsetDelegate(topoDelegate);
Brian O'Connor66630c82014-10-02 21:08:19 -0700133 eventDispatcher.removeSink(IntentEvent.class);
Brian O'Connordb15b042015-02-04 14:59:28 -0800134 batchExecutor.shutdown();
Brian O'Connor520c0522014-11-23 23:50:47 -0800135 Intent.unbindIdGenerator(idGenerator);
Brian O'Connor66630c82014-10-02 21:08:19 -0700136 log.info("Stopped");
137 }
138
139 @Override
140 public void submit(Intent intent) {
141 checkNotNull(intent, INTENT_NULL);
Brian O'Connorcff03322015-02-03 15:28:59 -0800142 IntentData data = new IntentData(intent, IntentState.INSTALL_REQ, null);
Brian O'Connorcff03322015-02-03 15:28:59 -0800143 store.addPending(data);
Brian O'Connor66630c82014-10-02 21:08:19 -0700144 }
145
146 @Override
147 public void withdraw(Intent intent) {
148 checkNotNull(intent, INTENT_NULL);
Brian O'Connorcff03322015-02-03 15:28:59 -0800149 IntentData data = new IntentData(intent, IntentState.WITHDRAW_REQ, null);
Brian O'Connorcff03322015-02-03 15:28:59 -0800150 store.addPending(data);
Brian O'Connor66630c82014-10-02 21:08:19 -0700151 }
152
Brian O'Connor66630c82014-10-02 21:08:19 -0700153 @Override
Ray Milkey8c6d00e2015-03-13 14:14:34 -0700154 public void purge(Intent intent) {
155 checkNotNull(intent, INTENT_NULL);
156 IntentData data = new IntentData(intent, IntentState.PURGE_REQ, null);
157 store.addPending(data);
158 }
159
160 @Override
Ray Milkeyf9af43c2015-02-09 16:45:48 -0800161 public Intent getIntent(Key key) {
162 return store.getIntent(key);
163 }
164
165 @Override
Brian O'Connor66630c82014-10-02 21:08:19 -0700166 public Iterable<Intent> getIntents() {
167 return store.getIntents();
168 }
169
170 @Override
171 public long getIntentCount() {
172 return store.getIntentCount();
173 }
174
175 @Override
Ray Milkeyf9af43c2015-02-09 16:45:48 -0800176 public IntentState getIntentState(Key intentKey) {
177 checkNotNull(intentKey, INTENT_ID_NULL);
178 return store.getIntentState(intentKey);
Brian O'Connor66630c82014-10-02 21:08:19 -0700179 }
180
181 @Override
Ray Milkeyf9af43c2015-02-09 16:45:48 -0800182 public List<Intent> getInstallableIntents(Key intentKey) {
183 checkNotNull(intentKey, INTENT_ID_NULL);
184 return store.getInstallableIntents(intentKey);
Thomas Vachuska10d4abc2014-10-21 12:47:26 -0700185 }
186
187 @Override
Brian O'Connorbe28a872015-02-19 21:44:37 -0800188 public boolean isLocal(Key intentKey) {
189 return store.isMaster(intentKey);
190 }
191
192 @Override
Brian O'Connor66630c82014-10-02 21:08:19 -0700193 public void addListener(IntentListener listener) {
194 listenerRegistry.addListener(listener);
195 }
196
197 @Override
198 public void removeListener(IntentListener listener) {
199 listenerRegistry.removeListener(listener);
200 }
201
202 @Override
203 public <T extends Intent> void registerCompiler(Class<T> cls, IntentCompiler<T> compiler) {
Sho SHIMIZUb0a47d42015-02-19 13:26:30 -0800204 compilerRegistry.registerCompiler(cls, compiler);
Brian O'Connor66630c82014-10-02 21:08:19 -0700205 }
206
207 @Override
208 public <T extends Intent> void unregisterCompiler(Class<T> cls) {
Sho SHIMIZUb0a47d42015-02-19 13:26:30 -0800209 compilerRegistry.unregisterCompiler(cls);
Brian O'Connor66630c82014-10-02 21:08:19 -0700210 }
211
212 @Override
213 public Map<Class<? extends Intent>, IntentCompiler<? extends Intent>> getCompilers() {
Sho SHIMIZUb0a47d42015-02-19 13:26:30 -0800214 return compilerRegistry.getCompilers();
Brian O'Connor66630c82014-10-02 21:08:19 -0700215 }
216
217 @Override
Thomas Vachuskab97cf282014-10-20 23:31:12 -0700218 public <T extends Intent> void registerInstaller(Class<T> cls, IntentInstaller<T> installer) {
Sho SHIMIZUb0a47d42015-02-19 13:26:30 -0800219 installerRegistry.registerInstaller(cls, installer);
Brian O'Connor66630c82014-10-02 21:08:19 -0700220 }
221
222 @Override
Thomas Vachuskab97cf282014-10-20 23:31:12 -0700223 public <T extends Intent> void unregisterInstaller(Class<T> cls) {
Sho SHIMIZUb0a47d42015-02-19 13:26:30 -0800224 installerRegistry.unregisterInstaller(cls);
Brian O'Connor66630c82014-10-02 21:08:19 -0700225 }
226
227 @Override
Thomas Vachuskab97cf282014-10-20 23:31:12 -0700228 public Map<Class<? extends Intent>, IntentInstaller<? extends Intent>> getInstallers() {
Sho SHIMIZUb0a47d42015-02-19 13:26:30 -0800229 return installerRegistry.getInstallers();
Brian O'Connor66630c82014-10-02 21:08:19 -0700230 }
231
Jonathan Hart34f1e382015-02-24 16:52:23 -0800232 @Override
233 public Iterable<Intent> getPending() {
234 return store.getPending();
235 }
236
Brian O'Connor66630c82014-10-02 21:08:19 -0700237 // Store delegate to re-post events emitted from the store.
238 private class InternalStoreDelegate implements IntentStoreDelegate {
239 @Override
240 public void notify(IntentEvent event) {
tom85258ee2014-10-07 00:10:02 -0700241 eventDispatcher.post(event);
Brian O'Connor66630c82014-10-02 21:08:19 -0700242 }
Brian O'Connorea4d7d12015-01-28 16:37:46 -0800243
244 @Override
Brian O'Connorcff03322015-02-03 15:28:59 -0800245 public void process(IntentData data) {
246 accumulator.add(data);
Brian O'Connorea4d7d12015-01-28 16:37:46 -0800247 }
Brian O'Connor66630c82014-10-02 21:08:19 -0700248 }
249
Ray Milkeyf9af43c2015-02-09 16:45:48 -0800250 private void buildAndSubmitBatches(Iterable<Key> intentKeys,
Brian O'Connor72a034c2014-11-26 18:24:23 -0800251 boolean compileAllFailed) {
Brian O'Connor72a034c2014-11-26 18:24:23 -0800252 // Attempt recompilation of the specified intents first.
Ray Milkeyf9af43c2015-02-09 16:45:48 -0800253 for (Key key : intentKeys) {
254 Intent intent = store.getIntent(key);
Brian O'Connor72a034c2014-11-26 18:24:23 -0800255 if (intent == null) {
256 continue;
257 }
Brian O'Connor03406a42015-02-03 17:28:57 -0800258 submit(intent);
Brian O'Connor72a034c2014-11-26 18:24:23 -0800259 }
260
261 if (compileAllFailed) {
262 // If required, compile all currently failed intents.
263 for (Intent intent : getIntents()) {
Ray Milkeyf9af43c2015-02-09 16:45:48 -0800264 IntentState state = getIntentState(intent.key());
Brian O'Connor7a71d5d2014-12-02 00:12:27 -0800265 if (RECOMPILE.contains(state)) {
Brian O'Connor7a71d5d2014-12-02 00:12:27 -0800266 if (state == WITHDRAW_REQ) {
Brian O'Connor03406a42015-02-03 17:28:57 -0800267 withdraw(intent);
Brian O'Connor7a71d5d2014-12-02 00:12:27 -0800268 } else {
Brian O'Connor03406a42015-02-03 17:28:57 -0800269 submit(intent);
Brian O'Connor7a71d5d2014-12-02 00:12:27 -0800270 }
Brian O'Connor72a034c2014-11-26 18:24:23 -0800271 }
272 }
273 }
274
Brian O'Connorb499b352015-02-03 16:46:15 -0800275 //FIXME
276// for (ApplicationId appId : batches.keySet()) {
277// if (batchService.isLocalLeader(appId)) {
278// execute(batches.get(appId).build());
279// }
280// }
Brian O'Connor72a034c2014-11-26 18:24:23 -0800281 }
282
tom95329eb2014-10-06 08:40:06 -0700283 // Topology change delegate
284 private class InternalTopoChangeDelegate implements TopologyChangeDelegate {
285 @Override
Ray Milkeyf9af43c2015-02-09 16:45:48 -0800286 public void triggerCompile(Iterable<Key> intentKeys,
tom85258ee2014-10-07 00:10:02 -0700287 boolean compileAllFailed) {
Ray Milkeyf9af43c2015-02-09 16:45:48 -0800288 buildAndSubmitBatches(intentKeys, compileAllFailed);
tom95329eb2014-10-06 08:40:06 -0700289 }
tom95329eb2014-10-06 08:40:06 -0700290 }
tom85258ee2014-10-07 00:10:02 -0700291
Sho SHIMIZU36a8a6e2015-02-13 15:38:45 -0800292 private Future<FinalIntentProcessPhase> submitIntentData(IntentData data) {
Sho SHIMIZU0cb6fe62015-02-23 16:39:57 -0800293 IntentData current = store.getIntentData(data.key());
Sho SHIMIZUce49b602015-02-23 19:15:49 -0800294 IntentProcessPhase initial = newInitialPhase(processor, data, current);
295 return workerExecutor.submit(new IntentWorker(initial));
Sho SHIMIZU8d9d1362015-02-04 12:28:15 -0800296 }
297
Sho SHIMIZUd42058e2015-02-23 16:16:20 -0800298 private class IntentBatchProcess implements Runnable {
Sho SHIMIZUadf8c482014-12-12 18:23:29 -0800299
Sho SHIMIZU5f281a42015-02-04 15:29:11 -0800300 protected final Collection<IntentData> data;
Sho SHIMIZUadf8c482014-12-12 18:23:29 -0800301
Sho SHIMIZUd42058e2015-02-23 16:16:20 -0800302 IntentBatchProcess(Collection<IntentData> data) {
Sho SHIMIZU5f281a42015-02-04 15:29:11 -0800303 this.data = checkNotNull(data);
Sho SHIMIZUadf8c482014-12-12 18:23:29 -0800304 }
305
306 @Override
307 public void run() {
308 try {
Brian O'Connor0e271dc2015-02-04 18:20:25 -0800309 /*
310 1. wrap each intentdata in a runnable and submit
311 2. wait for completion of all the work
312 3. accumulate results and submit batch write of IntentData to store
313 (we can also try to update these individually)
314 */
315 submitUpdates(waitForFutures(createIntentUpdates()));
Sho SHIMIZUadf8c482014-12-12 18:23:29 -0800316 } catch (Exception e) {
317 log.error("Error submitting batches:", e);
318 // FIXME incomplete Intents should be cleaned up
319 // (transition to FAILED, etc.)
320
Sho SHIMIZUadf8c482014-12-12 18:23:29 -0800321 // the batch has failed
322 // TODO: maybe we should do more?
323 log.error("Walk the plank, matey...");
Brian O'Connorb499b352015-02-03 16:46:15 -0800324 //FIXME
Sho SHIMIZU5f281a42015-02-04 15:29:11 -0800325// batchService.removeIntentOperations(data);
Sho SHIMIZUadf8c482014-12-12 18:23:29 -0800326 }
Brian O'Connor3c4b00d2015-02-22 20:42:26 -0800327 accumulator.ready();
Sho SHIMIZUadf8c482014-12-12 18:23:29 -0800328 }
329
Sho SHIMIZU36a8a6e2015-02-13 15:38:45 -0800330 private List<Future<FinalIntentProcessPhase>> createIntentUpdates() {
Sho SHIMIZU5f281a42015-02-04 15:29:11 -0800331 return data.stream()
Brian O'Connor0e271dc2015-02-04 18:20:25 -0800332 .map(IntentManager.this::submitIntentData)
333 .collect(Collectors.toList());
334 }
335
Sho SHIMIZU36a8a6e2015-02-13 15:38:45 -0800336 private List<FinalIntentProcessPhase> waitForFutures(List<Future<FinalIntentProcessPhase>> futures) {
337 ImmutableList.Builder<FinalIntentProcessPhase> updateBuilder = ImmutableList.builder();
338 for (Future<FinalIntentProcessPhase> future : futures) {
Brian O'Connor0e271dc2015-02-04 18:20:25 -0800339 try {
340 updateBuilder.add(future.get());
341 } catch (InterruptedException | ExecutionException e) {
342 //FIXME
343 log.warn("Future failed: {}", e);
344 }
345 }
346 return updateBuilder.build();
347 }
348
Sho SHIMIZU36a8a6e2015-02-13 15:38:45 -0800349 private void submitUpdates(List<FinalIntentProcessPhase> updates) {
Brian O'Connor0e271dc2015-02-04 18:20:25 -0800350 store.batchWrite(updates.stream()
Sho SHIMIZU36a8a6e2015-02-13 15:38:45 -0800351 .map(FinalIntentProcessPhase::data)
Brian O'Connor0e271dc2015-02-04 18:20:25 -0800352 .collect(Collectors.toList()));
Sho SHIMIZUadf8c482014-12-12 18:23:29 -0800353 }
Sho SHIMIZUadf8c482014-12-12 18:23:29 -0800354 }
Yuta HIGUCHIc2bf3d82014-11-28 18:50:41 -0800355
Brian O'Connorfa81eae2014-10-30 13:20:05 -0700356 private class InternalBatchDelegate implements IntentBatchDelegate {
357 @Override
Brian O'Connorb499b352015-02-03 16:46:15 -0800358 public void execute(Collection<IntentData> operations) {
Brian O'Connorab8ef822015-02-17 18:08:54 -0800359 log.debug("Execute {} operation(s).", operations.size());
360 log.trace("Execute operations: {}", operations);
Sho SHIMIZUd42058e2015-02-23 16:16:20 -0800361 batchExecutor.execute(new IntentBatchProcess(operations));
Brian O'Connordb15b042015-02-04 14:59:28 -0800362 // TODO ensure that only one batch is in flight at a time
Brian O'Connorfa81eae2014-10-30 13:20:05 -0700363 }
Brian O'Connorfa81eae2014-10-30 13:20:05 -0700364 }
Sho SHIMIZUb0a47d42015-02-19 13:26:30 -0800365
366 private class InternalIntentProcessor implements IntentProcessor {
367 @Override
368 public List<Intent> compile(Intent intent, List<Intent> previousInstallables) {
369 return compilerRegistry.compile(intent, previousInstallables);
370 }
371
372 @Override
373 public FlowRuleOperations coordinate(IntentData current, IntentData pending) {
374 return installerRegistry.coordinate(current, pending, store, trackerService);
375 }
376
377 @Override
378 public FlowRuleOperations uninstallCoordinate(IntentData current, IntentData pending) {
379 return installerRegistry.uninstallCoordinate(current, pending, store, trackerService);
380 }
381
382 @Override
383 public void applyFlowRules(FlowRuleOperations flowRules) {
384 flowRuleService.apply(flowRules);
385 }
386 }
Brian O'Connor66630c82014-10-02 21:08:19 -0700387}