diff options
author | Ashlee Young <ashlee@onosfw.com> | 2015-09-09 22:15:21 -0700 |
---|---|---|
committer | Ashlee Young <ashlee@onosfw.com> | 2015-09-09 22:15:21 -0700 |
commit | 13d05bc8458758ee39cb829098241e89616717ee (patch) | |
tree | 22a4d1ce65f15952f07a3df5af4b462b4697cb3a /framework/src/onos/core/net/src/main/java/org/onosproject/net/intent/impl/CompilerRegistry.java | |
parent | 6139282e1e93c2322076de4b91b1c85d0bc4a8b3 (diff) |
ONOS checkin based on commit tag e796610b1f721d02f9b0e213cf6f7790c10ecd60
Change-Id: Ife8810491034fe7becdba75dda20de4267bd15cd
Diffstat (limited to 'framework/src/onos/core/net/src/main/java/org/onosproject/net/intent/impl/CompilerRegistry.java')
-rw-r--r-- | framework/src/onos/core/net/src/main/java/org/onosproject/net/intent/impl/CompilerRegistry.java | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/framework/src/onos/core/net/src/main/java/org/onosproject/net/intent/impl/CompilerRegistry.java b/framework/src/onos/core/net/src/main/java/org/onosproject/net/intent/impl/CompilerRegistry.java new file mode 100644 index 00000000..1b70bc67 --- /dev/null +++ b/framework/src/onos/core/net/src/main/java/org/onosproject/net/intent/impl/CompilerRegistry.java @@ -0,0 +1,128 @@ +/* + * Copyright 2015 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.impl; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; + +import org.onosproject.net.intent.Intent; +import org.onosproject.net.intent.IntentCompiler; +import org.onosproject.net.intent.IntentException; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +// TODO: consider a better name +class CompilerRegistry { + + private final ConcurrentMap<Class<? extends Intent>, + IntentCompiler<? extends Intent>> compilers = new ConcurrentHashMap<>(); + + /** + * Registers the specified compiler for the given intent class. + * + * @param cls intent class + * @param compiler intent compiler + * @param <T> the type of intent + */ + public <T extends Intent> void registerCompiler(Class<T> cls, IntentCompiler<T> compiler) { + compilers.put(cls, compiler); + } + + /** + * Unregisters the compiler for the specified intent class. + * + * @param cls intent class + * @param <T> the type of intent + */ + public <T extends Intent> void unregisterCompiler(Class<T> cls) { + compilers.remove(cls); + } + + /** + * Returns immutable set of bindings of currently registered intent compilers. + * + * @return the set of compiler bindings + */ + public Map<Class<? extends Intent>, IntentCompiler<? extends Intent>> getCompilers() { + return ImmutableMap.copyOf(compilers); + } + + /** + * Compiles an intent recursively. + * + * @param intent intent + * @param previousInstallables previous intent installables + * @return result of compilation + */ + List<Intent> compile(Intent intent, List<Intent> previousInstallables) { + if (intent.isInstallable()) { + return ImmutableList.of(intent); + } + + registerSubclassCompilerIfNeeded(intent); + // FIXME: get previous resources + List<Intent> installable = new ArrayList<>(); + for (Intent compiled : getCompiler(intent).compile(intent, previousInstallables, null)) { + installable.addAll(compile(compiled, previousInstallables)); + } + return installable; + } + + /** + * Returns the corresponding intent compiler to the specified intent. + * + * @param intent intent + * @param <T> the type of intent + * @return intent compiler corresponding to the specified intent + */ + private <T extends Intent> IntentCompiler<T> getCompiler(T intent) { + @SuppressWarnings("unchecked") + IntentCompiler<T> compiler = (IntentCompiler<T>) compilers.get(intent.getClass()); + if (compiler == null) { + throw new IntentException("no compiler for class " + intent.getClass()); + } + return compiler; + } + + /** + * Registers an intent compiler of the specified intent if an intent compiler + * for the intent is not registered. This method traverses the class hierarchy of + * the intent. Once an intent compiler for a parent type is found, this method + * registers the found intent compiler. + * + * @param intent intent + */ + private void registerSubclassCompilerIfNeeded(Intent intent) { + if (!compilers.containsKey(intent.getClass())) { + Class<?> cls = intent.getClass(); + while (cls != Object.class) { + // As long as we're within the Intent class descendants + if (Intent.class.isAssignableFrom(cls)) { + IntentCompiler<?> compiler = compilers.get(cls); + if (compiler != null) { + compilers.put(intent.getClass(), compiler); + return; + } + } + cls = cls.getSuperclass(); + } + } + } +} |