diff --git a/java/src/ipaaca/AbstractIU.java b/java/src/ipaaca/AbstractIU.java index 9937f8e6c8f17bee18a116c271a529684c792c8a..378659915f967128a398c2829e1cfcc4bbdc0cb5 100644 --- a/java/src/ipaaca/AbstractIU.java +++ b/java/src/ipaaca/AbstractIU.java @@ -32,11 +32,28 @@ public abstract class AbstractIU protected SetMultimap<String, String> links = HashMultimap.create(); private final SetMultimap<String, String> EMPTYLINKS = HashMultimap.create(); + public SetMultimap<String, String> getAllLinks() + { + return links; + } + public Set<String> getLinks(String type) { return links.get(type); } + public void setLinksLocally(SetMultimap<String, String> l) + { + links.clear(); + links.putAll(l); + } + + public void setLinksLocally(String type, Set<String> values) + { + links.removeAll(type); + links.putAll(type, values); + } + /** * Replace all links */ diff --git a/java/src/ipaaca/IUConverter.java b/java/src/ipaaca/IUConverter.java index b1365dc499419b81e1fe182ac2b6251fe7f29bd6..5d0508fe112141c572081d5477909867d4354f3e 100644 --- a/java/src/ipaaca/IUConverter.java +++ b/java/src/ipaaca/IUConverter.java @@ -1,9 +1,12 @@ package ipaaca; import java.nio.ByteBuffer; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Map.Entry; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.SetMultimap; import com.google.protobuf.InvalidProtocolBufferException; import rsb.converter.ConversionException; @@ -12,6 +15,7 @@ import rsb.converter.ConverterSignature; import rsb.converter.UserData; import rsb.converter.WireContents; import ipaaca.Ipaaca.IU; +import ipaaca.Ipaaca.LinkSet; import ipaaca.Ipaaca.PayloadItem; /** @@ -48,6 +52,12 @@ public class IUConverter implements Converter<ByteBuffer> .build()); } + List<LinkSet> links = new ArrayList<LinkSet>(); + for (Entry<String, Collection<String>> entry:iua.getAllLinks().asMap().entrySet()) + { + links.add(LinkSet.newBuilder().setType(entry.getKey()).addAllTargets(entry.getValue()).build()); + } + IU iu = IU.newBuilder() .setUid(iua.getUid()) .setRevision(iua.getRevision()) @@ -58,6 +68,7 @@ public class IUConverter implements Converter<ByteBuffer> .setReadOnly(iua.isReadOnly()) .setPayloadType("MAP") .addAllPayload(payloadItems) + .addAllLinks(links) .build(); return new WireContents<ByteBuffer>(ByteBuffer.wrap(iu.toByteArray()),"ipaaca-remotepushiu"); } @@ -83,7 +94,13 @@ public class IUConverter implements Converter<ByteBuffer> iuout.setOwnerName(iu.getOwnerName()); iuout.setRevision(iu.getRevision()); iuout.setReadOnly(iu.getReadOnly()); - iuout.payload = new Payload(iuout,iu.getPayloadList()); + iuout.payload = new Payload(iuout,iu.getPayloadList()); + SetMultimap<String, String> links = HashMultimap.create(); + for(LinkSet ls: iu.getLinksList()) + { + links.putAll(ls.getType(),ls.getTargetsList()); + } + iuout.setLinksLocally(links); return new UserData<RemotePushIU>(iuout, RemotePushIU.class); } else diff --git a/java/test/src/ipaaca/ComponentCommunicationIntegrationTest.java b/java/test/src/ipaaca/ComponentCommunicationIntegrationTest.java index 455cc025a0756ea8b6242a7c1e783318aa72354e..cb05c0eafccc2824a5648718d1ade71936f2b381 100644 --- a/java/test/src/ipaaca/ComponentCommunicationIntegrationTest.java +++ b/java/test/src/ipaaca/ComponentCommunicationIntegrationTest.java @@ -109,6 +109,7 @@ public class ComponentCommunicationIntegrationTest localIU = new LocalIU(); localIU.setCategory(CATEGORY); localIU.getPayload().put("key1", "item1"); + localIU.addLinks("INIT", ImmutableSet.of("init1","init2")); outBuffer.add(localIU); } @@ -126,6 +127,7 @@ public class ComponentCommunicationIntegrationTest AbstractIU iuIn = inBuffer.getIU(localIU.getUid()); assertNotNull(iuIn); assertEqualIU(iuIn, localIU); + assertThat(localIU.getLinks("INIT"),containsInAnyOrder("init1","init2")); assertEquals(1,component2EventHandler.getNumberOfAddEvents(iuIn.getUid())); assertEquals(0,component1EventHandler.getNumberOfAddEvents(localIU.getUid())); } diff --git a/java/test/src/ipaaca/IUTestUtil.java b/java/test/src/ipaaca/IUTestUtil.java index 2a4e6ae7328796089002587cbac0bc9f8374d1dc..f47149c014c614df59ae5fe41941455551dfd96c 100644 --- a/java/test/src/ipaaca/IUTestUtil.java +++ b/java/test/src/ipaaca/IUTestUtil.java @@ -1,12 +1,19 @@ package ipaaca; - +import static org.junit.Assert.*; +import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import ipaaca.Ipaaca.IU; +import ipaaca.Ipaaca.LinkSet; import ipaaca.Ipaaca.PayloadItem; +import java.util.Collection; +import java.util.List; import java.util.Map.Entry; +import com.google.common.collect.SetMultimap; + /** * Test utilities for the IU system. * @author hvanwelbergen @@ -22,30 +29,25 @@ public final class IUTestUtil assertEquals(iu1.getUid(), iu2.getUid()); assertEquals(iu1.getRevision(), iu2.getRevision()); assertEquals(iu1.isReadOnly(), iu2.isReadOnly()); - iu1.getPayload().equals(iu2.getPayload()); + assertEquals(iu1.getPayload(),iu2.getPayload()); + assertEquals(iu1.getAllLinks(),iu2.getAllLinks()); } - public static void assertEqualIU(IU iuSrc, AbstractIU iuTarget) + public static void assertEqualPayload(Collection<PayloadItem> pl1, Payload pl2) { - assertEquals(iuSrc.getCategory(), iuTarget.getCategory()); - assertEquals(iuSrc.getCommitted(), iuTarget.isCommitted()); - assertEquals(iuSrc.getUid(), iuTarget.getUid()); - assertEquals(iuSrc.getRevision(), iuTarget.getRevision()); - assertEquals(iuSrc.getReadOnly(), iuTarget.isReadOnly()); - - // all payload items in src are in target - for (PayloadItem item : iuSrc.getPayloadList()) + // all payload items in pl1 are in pl2 + for (PayloadItem item : pl1) { - assertTrue("Key "+item.getKey() +" from protocol buffer payload not found in IU payload "+iuTarget.getPayload(), - iuTarget.getPayload().containsKey(item.getKey())); - assertEquals(item.getValue(), iuTarget.getPayload().get(item.getKey())); + assertTrue("Key "+item.getKey() +" from protocol buffer payload not found in IU payload "+pl2, + pl2.containsKey(item.getKey())); + assertEquals(item.getValue(), pl2.get(item.getKey())); } - // all payload items in target are in source - for (Entry<String, String> entry : iuTarget.getPayload().entrySet()) + // all payload items in pl12 are in pl1 + for (Entry<String, String> entry : pl2.entrySet()) { boolean found = false; - for (PayloadItem item : iuSrc.getPayloadList()) + for (PayloadItem item : pl1) { if (item.getKey().equals(entry.getKey()) && item.getValue().equals(entry.getValue())) { @@ -54,7 +56,44 @@ public final class IUTestUtil } } assertTrue("Entry " + entry + "from IU implementation not found in protocol buffer. Protocal buffer payload: " - + iuSrc.getPayloadList(),found); + + pl2,found); + } + } + + public static void assertEqualLinks(List<LinkSet> links1, SetMultimap<String,String> links2) + { + // all links in links1 are in links2 + for(LinkSet ls:links1) + { + assertThat(links2.get(ls.getType()),containsInAnyOrder(ls.getTargetsList().toArray(new String[0]))); + } + + // all links in links2 are in links1 + for(Entry<String, Collection<String>> entry:links2.asMap().entrySet()) + { + boolean found = false; + for(LinkSet ls:links1) + { + if(ls.getType().equals(entry.getKey())) + { + assertThat(entry.getValue(), containsInAnyOrder(ls.getTargetsList().toArray(new String[0]))); + found = true; + break; + } + } + assertTrue("Link " + entry + "from IU implementation not found in protocol buffer. Protocal buffer links: " + + links2,found); } } + + public static void assertEqualIU(IU iuSrc, AbstractIU iuTarget) + { + assertEquals(iuSrc.getCategory(), iuTarget.getCategory()); + assertEquals(iuSrc.getCommitted(), iuTarget.isCommitted()); + assertEquals(iuSrc.getUid(), iuTarget.getUid()); + assertEquals(iuSrc.getRevision(), iuTarget.getRevision()); + assertEquals(iuSrc.getReadOnly(), iuTarget.isReadOnly()); + assertEqualPayload(iuSrc.getPayloadList(),iuTarget.getPayload()); + assertEqualLinks(iuSrc.getLinksList(),iuTarget.getAllLinks()); + } } diff --git a/java/test/src/ipaaca/IuConverterTest.java b/java/test/src/ipaaca/IuConverterTest.java index 78843d2780cd07a0d24596e0b7ce3382a4a0377f..5e2f8ac755ae6c3a42bc63f937f9c8bc62adc247 100644 --- a/java/test/src/ipaaca/IuConverterTest.java +++ b/java/test/src/ipaaca/IuConverterTest.java @@ -7,6 +7,7 @@ import java.util.List; import ipaaca.Ipaaca; import ipaaca.Ipaaca.IU; import ipaaca.Ipaaca.IU.AccessMode; +import ipaaca.Ipaaca.LinkSet; import ipaaca.Ipaaca.PayloadItem; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; @@ -15,6 +16,7 @@ import static org.mockito.Mockito.*; import org.junit.Before; import org.junit.Test; +import com.google.common.collect.ImmutableSet; import com.google.protobuf.InvalidProtocolBufferException; import rsb.converter.ConversionException; @@ -52,6 +54,8 @@ public class IuConverterTest rpIU.getPayload().enforcedSetItem("key1", "value1"); rpIU.getPayload().enforcedSetItem("key2", "value2"); rpIU.getPayload().enforcedSetItem("key3", "value3"); + rpIU.setLinksLocally("SAME_LEVEL",ImmutableSet.of("sibling1","sibling2")); + rpIU.setLinksLocally("GROUNDED_IN",ImmutableSet.of("parent1","parent2")); WireContents<ByteBuffer> wiu = converter.serialize(RemotePushIU.class,rpIU); IU iu = IU.newBuilder().mergeFrom(wiu.getSerialization().array()).build(); @@ -73,7 +77,20 @@ public class IuConverterTest List<PayloadItem> payload = new ArrayList<PayloadItem>(); payload.add(createPayloadItem("key1","value1")); payload.add(createPayloadItem("key2","value2")); - payload.add(createPayloadItem("key3","value3")); + payload.add(createPayloadItem("key3","value3")); + List<LinkSet> links = new ArrayList<LinkSet>(); + links.add( + LinkSet.newBuilder() + .addAllTargets(ImmutableSet.of("sibling1","sibling2")) + .setType("SAME_LEVEL") + .build() + ); + links.add( + LinkSet.newBuilder() + .addAllTargets(ImmutableSet.of("parent1","parent2")) + .setType("GROUNDED_IN") + .build() + ); Ipaaca.IU iu = Ipaaca.IU.newBuilder() .setUid("uid1") .setRevision(1) @@ -83,6 +100,8 @@ public class IuConverterTest .setReadOnly(false) .setCategory(CATEGORY) .addAllPayload(payload) + .addAllLinks(links) + .setPayloadType("") .build(); UserData<?> data = converter.deserialize("", ByteBuffer.wrap(iu.toByteArray()));