2 * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.
\r
4 * This program and the accompanying materials are made available under the
\r
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
\r
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
\r
9 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow;
\r
11 import java.math.BigInteger;
\r
12 import java.util.ArrayList;
\r
13 import java.util.Collections;
\r
14 import java.util.List;
\r
15 import java.util.Optional;
\r
16 import org.junit.Assert;
\r
17 import org.junit.Test;
\r
18 import org.opendaylight.openflowplugin.api.OFConstants;
\r
19 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
\r
20 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData;
\r
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCaseBuilder;
\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.id.action._case.SetVlanIdActionBuilder;
\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;
\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowTableRef;
\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInput;
\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder;
\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlow;
\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder;
\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow;
\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowRef;
\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ClearActionsCaseBuilder;
\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.GoToTableCaseBuilder;
\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.MeterCaseBuilder;
\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteActionsCaseBuilder;
\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteMetadataCaseBuilder;
\r
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
\r
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.clear.actions._case.ClearActionsBuilder;
\r
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.go.to.table._case.GoToTableBuilder;
\r
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.meter._case.MeterBuilder;
\r
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.actions._case.WriteActionsBuilder;
\r
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.metadata._case.WriteMetadataBuilder;
\r
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
\r
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
\r
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
\r
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
\r
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
\r
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
\r
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
\r
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;
\r
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
\r
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.ApplyActionsCase;
\r
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.GotoTableCase;
\r
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.MeterCase;
\r
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.WriteActionsCase;
\r
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.WriteMetadataCase;
\r
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModCommand;
\r
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlags;
\r
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;
\r
69 import org.opendaylight.yangtools.yang.binding.Augmentation;
\r
70 import org.opendaylight.yangtools.yang.binding.DataContainer;
\r
73 * @author michal.polkorab
\r
76 public class FlowConvertorTest {
\r
79 * Tests {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} }
\r
82 public void test() {
\r
83 RemoveFlowInputBuilder flowBuilder = new RemoveFlowInputBuilder();
\r
84 flowBuilder.setBarrier(false);
\r
85 flowBuilder.setCookie(new FlowCookie(new BigInteger("4")));
\r
86 flowBuilder.setCookieMask(new FlowCookie(new BigInteger("5")));
\r
87 flowBuilder.setTableId((short) 6);
\r
88 flowBuilder.setStrict(true);
\r
89 flowBuilder.setIdleTimeout(50);
\r
90 flowBuilder.setHardTimeout(500);
\r
91 flowBuilder.setPriority(40);
\r
92 flowBuilder.setBufferId(18L);
\r
93 flowBuilder.setOutPort(new BigInteger("65535"));
\r
94 flowBuilder.setOutGroup(5000L);
\r
95 flowBuilder.setFlags(null);
\r
96 flowBuilder.setMatch(null);
\r
97 RemoveFlowInput flow = flowBuilder.build();
\r
99 VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3);
\r
100 data.setDatapathId(new BigInteger("42"));
\r
102 List<FlowModInputBuilder> flowMod = convert(flow, data);
\r
104 Assert.assertEquals("Wrong version", 4, flowMod.get(0).getVersion().intValue());
\r
105 Assert.assertEquals("Wrong cookie", 4, flowMod.get(0).getCookie().intValue());
\r
106 Assert.assertEquals("Wrong cookie mask", 5, flowMod.get(0).getCookieMask().intValue());
\r
107 Assert.assertEquals("Wrong table id", 6, flowMod.get(0).getTableId().getValue().intValue());
\r
108 Assert.assertEquals("Wrong command", FlowModCommand.OFPFCDELETESTRICT, flowMod.get(0).getCommand());
\r
109 Assert.assertEquals("Wrong idle timeout", 50, flowMod.get(0).getIdleTimeout().intValue());
\r
110 Assert.assertEquals("Wrong hard timeout", 500, flowMod.get(0).getHardTimeout().intValue());
\r
111 Assert.assertEquals("Wrong priority", 40, flowMod.get(0).getPriority().intValue());
\r
112 Assert.assertEquals("Wrong buffer id", 18, flowMod.get(0).getBufferId().intValue());
\r
113 Assert.assertEquals("Wrong out port", 65535, flowMod.get(0).getOutPort().getValue().intValue());
\r
114 Assert.assertEquals("Wrong out group", 5000, flowMod.get(0).getOutGroup().intValue());
\r
115 Assert.assertEquals("Wrong flags", new FlowModFlags(false, false, false, false, false), flowMod.get(0).getFlags());
\r
116 Assert.assertEquals("Wrong match", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmMatchType",
\r
117 flowMod.get(0).getMatch().getType().getName());
\r
118 Assert.assertEquals("Wrong match entries size", 0, flowMod.get(0).getMatch().getMatchEntry().size());
\r
122 * Tests {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} }
\r
125 public void testOnlyModifyStrictCommand() {
\r
126 UpdatedFlowBuilder flowBuilder = new UpdatedFlowBuilder();
\r
127 flowBuilder.setStrict(true);
\r
128 UpdatedFlow flow = flowBuilder.build();
\r
130 VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_0);
\r
131 data.setDatapathId(new BigInteger("42"));
\r
133 List<FlowModInputBuilder> flowMod = convert(flow, data);
\r
135 Assert.assertEquals("Wrong version", 1, flowMod.get(0).getVersion().intValue());
\r
136 Assert.assertEquals("Wrong command", FlowModCommand.OFPFCADD, flowMod.get(0).getCommand());
\r
140 * Tests {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} }
\r
143 public void testInstructionsTranslation() {
\r
144 AddFlowInputBuilder flowBuilder = new AddFlowInputBuilder();
\r
145 InstructionsBuilder instructionsBuilder = new InstructionsBuilder();
\r
146 List<Instruction> instructions = new ArrayList<>();
\r
147 InstructionBuilder instructionBuilder = new InstructionBuilder();
\r
148 GoToTableCaseBuilder goToCaseBuilder = new GoToTableCaseBuilder();
\r
149 GoToTableBuilder goToBuilder = new GoToTableBuilder();
\r
150 goToBuilder.setTableId((short) 1);
\r
151 goToCaseBuilder.setGoToTable(goToBuilder.build());
\r
152 instructionBuilder.setInstruction(goToCaseBuilder.build());
\r
153 instructionBuilder.setOrder(0);
\r
154 instructions.add(instructionBuilder.build());
\r
155 instructionBuilder = new InstructionBuilder();
\r
156 WriteMetadataCaseBuilder metaCaseBuilder = new WriteMetadataCaseBuilder();
\r
157 WriteMetadataBuilder metaBuilder = new WriteMetadataBuilder();
\r
158 metaBuilder.setMetadata(new BigInteger("2"));
\r
159 metaBuilder.setMetadataMask(new BigInteger("3"));
\r
160 metaCaseBuilder.setWriteMetadata(metaBuilder.build());
\r
161 instructionBuilder.setInstruction(metaCaseBuilder.build());
\r
162 instructionBuilder.setOrder(1);
\r
163 instructions.add(instructionBuilder.build());
\r
164 instructionBuilder = new InstructionBuilder();
\r
165 WriteActionsCaseBuilder writeCaseBuilder = new WriteActionsCaseBuilder();
\r
166 WriteActionsBuilder writeBuilder = new WriteActionsBuilder();
\r
167 List<Action> actions = new ArrayList<>();
\r
168 writeBuilder.setAction(actions);
\r
169 writeCaseBuilder.setWriteActions(writeBuilder.build());
\r
170 instructionBuilder.setInstruction(writeCaseBuilder.build());
\r
171 instructionBuilder.setOrder(2);
\r
172 instructions.add(instructionBuilder.build());
\r
173 instructionBuilder = new InstructionBuilder();
\r
174 ApplyActionsCaseBuilder applyCaseBuilder = new ApplyActionsCaseBuilder();
\r
175 ApplyActionsBuilder applyBuilder = new ApplyActionsBuilder();
\r
176 actions = new ArrayList<>();
\r
177 applyBuilder.setAction(actions);
\r
178 applyCaseBuilder.setApplyActions(applyBuilder.build());
\r
179 instructionBuilder.setInstruction(applyCaseBuilder.build());
\r
180 instructionBuilder.setOrder(3);
\r
181 instructions.add(instructionBuilder.build());
\r
182 instructionBuilder = new InstructionBuilder();
\r
183 ClearActionsCaseBuilder clearCaseBuilder = new ClearActionsCaseBuilder();
\r
184 ClearActionsBuilder clearBuilder = new ClearActionsBuilder();
\r
185 actions = new ArrayList<>();
\r
186 clearBuilder.setAction(actions);
\r
187 clearCaseBuilder.setClearActions(clearBuilder.build());
\r
188 instructionBuilder.setInstruction(clearCaseBuilder.build());
\r
189 instructionBuilder.setOrder(4);
\r
190 instructions.add(instructionBuilder.build());
\r
191 instructionBuilder = new InstructionBuilder();
\r
192 MeterCaseBuilder meterCaseBuilder = new MeterCaseBuilder();
\r
193 MeterBuilder meterBuilder = new MeterBuilder();
\r
194 meterBuilder.setMeterId(new MeterId(5L));
\r
195 meterCaseBuilder.setMeter(meterBuilder.build());
\r
196 instructionBuilder.setInstruction(meterCaseBuilder.build());
\r
197 instructionBuilder.setOrder(5);
\r
198 instructions.add(instructionBuilder.build());
\r
199 instructionsBuilder.setInstruction(instructions);
\r
200 flowBuilder.setInstructions(instructionsBuilder.build());
\r
201 AddFlowInput flow = flowBuilder.build();
\r
203 VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_0);
\r
204 data.setDatapathId(new BigInteger("42"));
\r
205 List<FlowModInputBuilder> flowMod = convert(flow, data);
\r
207 Assert.assertEquals("Wrong version", 1, flowMod.get(0).getVersion().intValue());
\r
208 Assert.assertEquals("Wrong command", FlowModCommand.OFPFCADD, flowMod.get(0).getCommand());
\r
209 Assert.assertEquals("Wrong instructions size", 6, flowMod.get(0).getInstruction().size());
\r
210 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions
\r
211 .grouping.Instruction instruction = flowMod.get(0).getInstruction().get(0);
\r
212 Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"
\r
213 + ".instruction.rev130731.instruction.grouping.instruction.choice.GotoTableCase", instruction.getInstructionChoice().getImplementedInterface().getName());
\r
214 GotoTableCase gotoTableCase = (GotoTableCase) instruction.getInstructionChoice();
\r
215 Assert.assertEquals("Wrong table id", 1, gotoTableCase.getGotoTable().getTableId().intValue());
\r
216 instruction = flowMod.get(0).getInstruction().get(1);
\r
217 Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"
\r
218 + ".instruction.rev130731.instruction.grouping.instruction.choice.WriteMetadataCase", instruction.getInstructionChoice().getImplementedInterface().getName());
\r
219 WriteMetadataCase writeMetadataCase = (WriteMetadataCase) instruction.getInstructionChoice();
\r
220 Assert.assertArrayEquals("Wrong metadata", new byte[]{0, 0, 0, 0, 0, 0, 0, 2},
\r
221 writeMetadataCase.getWriteMetadata().getMetadata());
\r
222 Assert.assertArrayEquals("Wrong metadata mask", new byte[]{0, 0, 0, 0, 0, 0, 0, 3},
\r
223 writeMetadataCase.getWriteMetadata().getMetadataMask());
\r
225 instruction = flowMod.get(0).getInstruction().get(2);
\r
226 Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"
\r
227 + ".instruction.rev130731.instruction.grouping.instruction.choice.WriteActionsCase", instruction.getInstructionChoice().getImplementedInterface().getName());
\r
228 WriteActionsCase writeActionsCase = (WriteActionsCase) instruction.getInstructionChoice();
\r
229 Assert.assertEquals("Wrong actions size", 0, writeActionsCase.getWriteActions().getAction().size());
\r
230 instruction = flowMod.get(0).getInstruction().get(3);
\r
231 Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"
\r
232 + ".instruction.rev130731.instruction.grouping.instruction.choice.ApplyActionsCase", instruction.getInstructionChoice().getImplementedInterface().getName());
\r
233 ApplyActionsCase applyActionsCase = (ApplyActionsCase) instruction.getInstructionChoice();
\r
234 Assert.assertEquals("Wrong actions size", 0, applyActionsCase.getApplyActions().getAction().size());
\r
235 instruction = flowMod.get(0).getInstruction().get(4);
\r
236 Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"
\r
237 + ".instruction.rev130731.instruction.grouping.instruction.choice.ClearActionsCase", instruction.getInstructionChoice().getImplementedInterface().getName());
\r
238 instruction = flowMod.get(0).getInstruction().get(5);
\r
239 Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"
\r
240 + ".instruction.rev130731.instruction.grouping.instruction.choice.MeterCase", instruction.getInstructionChoice().getImplementedInterface().getName());
\r
241 MeterCase meterCase = (MeterCase) instruction.getInstructionChoice();
\r
242 Assert.assertEquals("Wrong meter id", 5, meterCase.getMeter().getMeterId().intValue());
\r
246 public void testCloneAndAugmentFlowWithSetVlanId() {
\r
247 MockFlow mockFlow = new MockFlow();
\r
248 Action action1 = createAction(
\r
249 new SetVlanIdActionCaseBuilder().setSetVlanIdAction(
\r
250 new SetVlanIdActionBuilder().setVlanId(new VlanId(10)).build())
\r
254 mockFlow.setMatch(new MatchBuilder().setEthernetMatch(createEthernetMatch()).build());
\r
255 mockFlow.setInstructions(toApplyInstruction(Collections.singletonList(action1)));
\r
257 VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3);
\r
258 data.setDatapathId(BigInteger.ONE);
\r
260 List<FlowModInputBuilder> flowModInputBuilders = convert(mockFlow, data);
\r
262 Assert.assertEquals(2, flowModInputBuilders.size());
\r
266 private List<FlowModInputBuilder> convert(Flow flow, VersionDatapathIdConvertorData data) {
\r
267 Optional<List<FlowModInputBuilder>> flowModOptional = ConvertorManager.getInstance().convert(flow, data);
\r
268 Assert.assertTrue("Flow convertor not found", flowModOptional.isPresent());
\r
269 return flowModOptional.get();
\r
272 private static Action createAction(final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action actionCase,
\r
274 Action action = new ActionBuilder().setOrder(order).setAction(actionCase).build();
\r
278 private static EthernetMatch createEthernetMatch() {
\r
279 EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder();
\r
280 ethernetMatchBuilder.setEthernetType(new EthernetTypeBuilder().setType(new EtherType(33024L)).build());
\r
281 return ethernetMatchBuilder.build();
\r
284 private static Instructions toApplyInstruction(
\r
285 final List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actions) {
\r
286 return new InstructionsBuilder()
\r
288 Collections.singletonList(
\r
289 new InstructionBuilder()
\r
292 new ApplyActionsCaseBuilder()
\r
293 .setApplyActions((new ApplyActionsBuilder()).setAction(actions).build())
\r
299 private static class MockFlow implements AddFlowInput {
\r
300 private Instructions instructions;
\r
301 private Match match;
\r
303 public void setInstructions(final Instructions instructions) {
\r
304 this.instructions = instructions;
\r
307 public void setMatch(final Match match) {
\r
308 this.match = match;
\r
313 public FlowRef getFlowRef() {
\r
318 public <E extends Augmentation<AddFlowInput>> E getAugmentation(final Class<E> augmentationType) {
\r
323 public FlowTableRef getFlowTable() {
\r
328 public Match getMatch() {
\r
333 public Instructions getInstructions() {
\r
334 return instructions;
\r
338 public String getContainerName() {
\r
343 public FlowCookie getCookieMask() {
\r
348 public Long getBufferId() {
\r
353 public BigInteger getOutPort() {
\r
358 public Long getOutGroup() {
\r
363 public org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags getFlags() {
\r
368 public String getFlowName() {
\r
373 public Boolean isInstallHw() {
\r
378 public Boolean isBarrier() {
\r
383 public Boolean isStrict() {
\r
388 public Integer getPriority() {
\r
393 public Integer getIdleTimeout() {
\r
398 public Integer getHardTimeout() {
\r
403 public FlowCookie getCookie() {
\r
408 public Short getTableId() {
\r
413 public NodeRef getNode() {
\r
418 public Uri getTransactionUri() {
\r
423 public Class<? extends DataContainer> getImplementedInterface() {
\r