package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action;
+import com.google.common.collect.Ordering;
import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
import java.util.List;
import java.util.Optional;
+import java.util.Set;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.cases.SalToOfCopyTtlInCase;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.cases.SalToOfCopyTtlOutCase;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.cases.SalToOfDecMplsTtlCase;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.data.ActionConvertorData;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorProcessor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.OrderComparator;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
/**
- * Converts SAL actions into OF Library actions
+ * Converts SAL actions into OF Library actions.
*
+ * <p>
* Example usage:
* <pre>
* {@code
* ActionConvertorData data = new ActionConvertorData(version);
* data.setDatapathId(datapathId);
* data.setIpProtocol(ipProtocol);
- * Optional<List<Action>> ofActions = ConvertorManager.getInstance().convert(salActions, data);
+ * Optional<List<Action>> ofActions = convertorManager.convert(salActions, data);
* }
* </pre>
*/
-public final class ActionConvertor implements Convertor<
- List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action>,
- List<Action>,
+public final class ActionConvertor extends Convertor<
+ Collection<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action>,
+ Collection<Action>,
ActionConvertorData> {
- private static final ConvertorProcessor<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action, Action, ActionConvertorData> PROCESSOR = new ConvertorProcessor<
+ private static final ConvertorProcessor<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112
+ .action.Action, Action, ActionConvertorData> PROCESSOR = new ConvertorProcessor<
org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action,
Action,
ActionConvertorData>()
// Try to convert action grouping using converters from openflowplugin-extension
.addCase(new SalToOfGeneralExtensionGroupingCase());
+ private static final Set<Class<?>> TYPES = Collections.singleton(org.opendaylight.yang.gen.v1.urn.opendaylight
+ .action.types.rev131112.action.list.Action.class);
+ private static final Ordering<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112
+ .action.list.Action> ACTION_ORDERING = Ordering.from(OrderComparator.build());
+
@Override
- public Class<? extends DataContainer> getType() {
- return org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action.class;
+ public Collection<Class<?>> getTypes() {
+ return TYPES;
}
@Override
- public List<Action> convert(List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> source, ActionConvertorData data) {
+ public List<Action> convert(Collection<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action
+ .list.Action> source, ActionConvertorData data) {
// Prepare list of converted actions
final List<Action> result = new ArrayList<>();
// Iterate over SAL actions, run them through tokenizer and then add them to list of converted actions
if (source != null) {
- for (final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action action : source) {
- final Optional<Action> convertedAction = PROCESSOR.process(action.getAction(), data);
+ final List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action>
+ sortedActions = ACTION_ORDERING.sortedCopy(source);
+
+ for (final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action action :
+ sortedActions) {
+ final Optional<Action> convertedAction = PROCESSOR.process(action.getAction(), data,
+ getConvertorExecutor());
if (convertedAction.isPresent()) {
result.add(convertedAction.get());