Update MRI projects for Aluminium
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / action / ActionConvertor.java
index 4fd3a7f66ae78d120df3c08c7f7ce063f2b79a89..b60b517bc2ef46142e15373e94c21bec17b33c8d 100644 (file)
@@ -8,9 +8,13 @@
 
 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;
@@ -55,28 +59,30 @@ import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.cas
 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>()
@@ -126,20 +132,31 @@ public final class ActionConvertor implements Convertor<
             // 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());