From 6cd3cdd337163b046847d526193c6fefb8535838 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Galland?= Date: Thu, 31 Aug 2017 15:38:39 +0200 Subject: [PATCH] [lang] Replace collection interfaces by interfaces that enable faster implementation. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Galland --- .../io.sarl.core/src/io/sarl/core/bic.sarl | 14 ++++---- .../kernel/bic/BehaviorsSkill.java | 6 ++-- .../kernel/bic/BuiltinCapacityUtil.java | 4 +-- .../kernel/bic/InnerContextSkill.java | 3 +- .../kernel/bic/SchedulesSkill.java | 6 ++-- .../jdk/spawn/StandardSpawnService.java | 4 +-- .../kernel/bic/BuiltinCapacityUtilTest.java | 36 +++++++++++++------ .../kernel/bic/InnerContextSkillTest.java | 22 ++++++++---- 8 files changed, 61 insertions(+), 34 deletions(-) diff --git a/main/apiplugins/io.sarl.core/src/io/sarl/core/bic.sarl b/main/apiplugins/io.sarl.core/src/io/sarl/core/bic.sarl index 02bedb5118..fc0580d59a 100644 --- a/main/apiplugins/io.sarl.core/src/io/sarl/core/bic.sarl +++ b/main/apiplugins/io.sarl.core/src/io/sarl/core/bic.sarl @@ -21,7 +21,6 @@ package io.sarl.core import java.text.MessageFormat -import java.util.Collection import java.util.UUID import java.util.concurrent.TimeUnit import java.util.Collection @@ -40,6 +39,7 @@ import io.sarl.lang.core.Space import io.sarl.lang.core.SpaceID import io.sarl.lang.util.SynchronizedCollection import io.sarl.lang.util.SynchronizedSet +import io.sarl.lang.util.SynchronizedIterable /** * Provides functions for accessing and managing the external contexts of an agent. @@ -52,7 +52,7 @@ capacity ExternalContextAccess { * @return the list of the agent contexts. */ @Pure - def getAllContexts : SynchronizedCollection + def getAllContexts : SynchronizedIterable /** * Replies the AgentContext for the given ID. @@ -180,7 +180,7 @@ capacity InnerContextAccess { * @return the identifiers of the members of the internal context of the current agent. */ @Pure - def getMemberAgents : SynchronizedSet + def getMemberAgents : SynchronizedIterable /** Replies if the given space is the default space of the inner context. * @@ -248,7 +248,7 @@ capacity Behaviors { * @return the unmodifiable collection of the registered behavior. * @since 0.5 */ - def getRegisteredBehaviors : Collection + def getRegisteredBehaviors : SynchronizedIterable /** * Register a Behavior for the owner agent. @@ -328,7 +328,7 @@ capacity Lifecycle { * @fires AgentSpawned in DefaultSpace * @since 0.5 */ - def spawn(nbAgents : int, agentType : Class, params : Object*) : Collection fires AgentSpawned + def spawn(nbAgents : int, agentType : Class, params : Object*) : Iterable fires AgentSpawned /** * Spawns a new member agent in the parent's context (parentID). @@ -353,7 +353,7 @@ capacity Lifecycle { * @fires AgentSpawned inside the default context of the parent. The source of the event is this agent. * @since 0.5 */ - def spawnInContext(nbAgents : int, agentClass : Class , context : AgentContext, params : Object*) : Collection fires AgentSpawned + def spawnInContext(nbAgents : int, agentClass : Class , context : AgentContext, params : Object*) : Iterable fires AgentSpawned /** * Spawns a new member agent in the parent's context (parentID). @@ -393,7 +393,7 @@ capacity Schedules { * @return the names of the active tasks. * @since 0.5 */ - def getActiveTasks : Collection + def getActiveTasks : SynchronizedSet /** * Schedule a given task to be executed after the specified delay. diff --git a/sre/io.janusproject/io.janusproject.plugin/src/io/janusproject/kernel/bic/BehaviorsSkill.java b/sre/io.janusproject/io.janusproject.plugin/src/io/janusproject/kernel/bic/BehaviorsSkill.java index 5eb9ea9101..805a5b5b24 100644 --- a/sre/io.janusproject/io.janusproject.plugin/src/io/janusproject/kernel/bic/BehaviorsSkill.java +++ b/sre/io.janusproject/io.janusproject.plugin/src/io/janusproject/kernel/bic/BehaviorsSkill.java @@ -38,6 +38,8 @@ import io.sarl.lang.core.Scope; import io.sarl.lang.core.Skill; import io.sarl.lang.util.ClearableReference; +import io.sarl.lang.util.SynchronizedIterable; +import io.sarl.util.Collections3; /** * Janus implementation of SARL's {@link Behaviors} built-in capacity. @@ -117,10 +119,10 @@ public boolean hasRegisteredBehavior() { } @Override - public Collection getRegisteredBehaviors() { + public SynchronizedIterable getRegisteredBehaviors() { final Collection behaviors = new ArrayList<>(); getSkill(InternalEventBusCapacity.class).getRegisteredEventListeners(Behavior.class, behaviors); - return behaviors; + return Collections3.unmodifiableSynchronizedIterable(behaviors, behaviors); } @Override diff --git a/sre/io.janusproject/io.janusproject.plugin/src/io/janusproject/kernel/bic/BuiltinCapacityUtil.java b/sre/io.janusproject/io.janusproject.plugin/src/io/janusproject/kernel/bic/BuiltinCapacityUtil.java index 03889876f4..a17d4b6e9f 100644 --- a/sre/io.janusproject/io.janusproject.plugin/src/io/janusproject/kernel/bic/BuiltinCapacityUtil.java +++ b/sre/io.janusproject/io.janusproject.plugin/src/io/janusproject/kernel/bic/BuiltinCapacityUtil.java @@ -27,7 +27,7 @@ import io.sarl.core.InnerContextAccess; import io.sarl.lang.core.Agent; import io.sarl.lang.core.AgentContext; -import io.sarl.lang.util.SynchronizedCollection; +import io.sarl.lang.util.SynchronizedIterable; /** * Utilities that are dedicated to the built-in capacities. @@ -60,7 +60,7 @@ private static Method getMethodGetSkill() throws Exception { * @return the contexts of the agents. * @throws Exception - when it is not possible to retreive the contexts. */ - public static SynchronizedCollection getContextsOf(Agent agent) throws Exception { + public static SynchronizedIterable getContextsOf(Agent agent) throws Exception { final Method method = getMethodGetSkill(); final ExternalContextAccess skill = (ExternalContextAccess) method.invoke(agent, ExternalContextAccess.class); assert skill != null; diff --git a/sre/io.janusproject/io.janusproject.plugin/src/io/janusproject/kernel/bic/InnerContextSkill.java b/sre/io.janusproject/io.janusproject.plugin/src/io/janusproject/kernel/bic/InnerContextSkill.java index 0876bd08ce..0eef404758 100644 --- a/sre/io.janusproject/io.janusproject.plugin/src/io/janusproject/kernel/bic/InnerContextSkill.java +++ b/sre/io.janusproject/io.janusproject.plugin/src/io/janusproject/kernel/bic/InnerContextSkill.java @@ -39,6 +39,7 @@ import io.sarl.lang.core.Space; import io.sarl.lang.core.SpaceID; import io.sarl.lang.util.ClearableReference; +import io.sarl.lang.util.SynchronizedIterable; import io.sarl.lang.util.SynchronizedSet; import io.sarl.util.Collections3; import io.sarl.util.OpenEventSpace; @@ -176,7 +177,7 @@ public synchronized int getMemberAgentCount() { } @Override - public synchronized SynchronizedSet getMemberAgents() { + public synchronized SynchronizedIterable getMemberAgents() { if (this.innerContext != null) { final SynchronizedSet participants = this.innerContext.getDefaultSpace().getParticipants(); assert participants != null; diff --git a/sre/io.janusproject/io.janusproject.plugin/src/io/janusproject/kernel/bic/SchedulesSkill.java b/sre/io.janusproject/io.janusproject.plugin/src/io/janusproject/kernel/bic/SchedulesSkill.java index eaaba285eb..a0972d4945 100644 --- a/sre/io.janusproject/io.janusproject.plugin/src/io/janusproject/kernel/bic/SchedulesSkill.java +++ b/sre/io.janusproject/io.janusproject.plugin/src/io/janusproject/kernel/bic/SchedulesSkill.java @@ -54,6 +54,8 @@ import io.sarl.lang.core.SREutils; import io.sarl.lang.core.Skill; import io.sarl.lang.util.ClearableReference; +import io.sarl.lang.util.SynchronizedSet; +import io.sarl.util.Collections3; /** * Skill that permits to execute tasks with an executor service. @@ -138,10 +140,10 @@ private void finishTask(AgentTask task, boolean updateSkillReferences, boolean u } @Override - public Collection getActiveTasks() { + public SynchronizedSet getActiveTasks() { synchronized (getTaskListMutex()) { //TODO: Avoid copy of collection - return Lists.newArrayList(this.tasks.keySet()); + return Collections3.unmodifiableSynchronizedSet(this.tasks.keySet(), getTaskListMutex()); } } diff --git a/sre/io.janusproject/io.janusproject.plugin/src/io/janusproject/kernel/services/jdk/spawn/StandardSpawnService.java b/sre/io.janusproject/io.janusproject.plugin/src/io/janusproject/kernel/services/jdk/spawn/StandardSpawnService.java index 627692df7f..f82e7f396d 100644 --- a/sre/io.janusproject/io.janusproject.plugin/src/io/janusproject/kernel/services/jdk/spawn/StandardSpawnService.java +++ b/sre/io.janusproject/io.janusproject.plugin/src/io/janusproject/kernel/services/jdk/spawn/StandardSpawnService.java @@ -63,7 +63,7 @@ import io.sarl.lang.core.BuiltinCapacitiesProvider; import io.sarl.lang.core.EventSpace; import io.sarl.lang.core.Skill; -import io.sarl.lang.util.SynchronizedCollection; +import io.sarl.lang.util.SynchronizedIterable; import io.sarl.lang.util.SynchronizedSet; import io.sarl.sarlspecification.SarlSpecificationChecker; import io.sarl.util.Collections3; @@ -467,7 +467,7 @@ protected void fireAgentDestroyed(Agent agent) { final SpawnServiceListener[] ilisteners2 = this.globalListeners.getListeners(SpawnServiceListener.class); try { - final SynchronizedCollection sc = BuiltinCapacityUtil.getContextsOf(agent); + final SynchronizedIterable sc = BuiltinCapacityUtil.getContextsOf(agent); synchronized (sc.mutex()) { for (final AgentContext context : sc) { final EventSpace defSpace = context.getDefaultSpace(); diff --git a/sre/io.janusproject/io.janusproject.tests/src/test/java/io/janusproject/tests/kernel/bic/BuiltinCapacityUtilTest.java b/sre/io.janusproject/io.janusproject.tests/src/test/java/io/janusproject/tests/kernel/bic/BuiltinCapacityUtilTest.java index f26be94b7a..dac4a6dee7 100644 --- a/sre/io.janusproject/io.janusproject.tests/src/test/java/io/janusproject/tests/kernel/bic/BuiltinCapacityUtilTest.java +++ b/sre/io.janusproject/io.janusproject.tests/src/test/java/io/janusproject/tests/kernel/bic/BuiltinCapacityUtilTest.java @@ -25,8 +25,11 @@ import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.Iterator; +import java.util.List; import java.util.UUID; import org.junit.Before; @@ -46,6 +49,7 @@ import io.sarl.lang.core.Skill; import io.sarl.lang.util.ClearableReference; import io.sarl.lang.util.SynchronizedCollection; +import io.sarl.lang.util.SynchronizedIterable; import io.sarl.tests.api.Nullable; import io.sarl.util.Collections3; @@ -79,9 +83,9 @@ public void setUp() { public void getContextsOf_emptycontextlist() throws Exception { Mockito.when(this.contextSkill.getAllContexts()) .thenReturn(Collections3.synchronizedCollection(Collections. emptyList(), this)); - SynchronizedCollection c = BuiltinCapacityUtil.getContextsOf(this.agent); + SynchronizedIterable c = BuiltinCapacityUtil.getContextsOf(this.agent); assertNotNull(c); - assertTrue(c.isEmpty()); + assertFalse(c.iterator().hasNext()); } @Test @@ -89,11 +93,16 @@ public void getContextsOf_onecontext() throws Exception { AgentContext context = mock(AgentContext.class); Mockito.when(this.contextSkill.getAllContexts()) .thenReturn(Collections3.synchronizedCollection(Collections.singletonList(context), this)); - SynchronizedCollection c = BuiltinCapacityUtil.getContextsOf(this.agent); + SynchronizedIterable c = BuiltinCapacityUtil.getContextsOf(this.agent); assertNotNull(c); - assertFalse(c.isEmpty()); - assertEquals(1, c.size()); - assertTrue(c.contains(context)); + List list = new ArrayList<>(); + Iterator iterator = c.iterator(); + while (iterator.hasNext()) { + list.add(iterator.next()); + } + assertFalse(list.isEmpty()); + assertEquals(1, list.size()); + assertTrue(list.contains(context)); } @Test @@ -102,12 +111,17 @@ public void getContextsOf_twocontexts() throws Exception { AgentContext context2 = mock(AgentContext.class); Mockito.when(this.contextSkill.getAllContexts()) .thenReturn(Collections3.synchronizedCollection(Arrays.asList(context1, context2), this)); - SynchronizedCollection c = BuiltinCapacityUtil.getContextsOf(this.agent); + SynchronizedIterable c = BuiltinCapacityUtil.getContextsOf(this.agent); assertNotNull(c); - assertFalse(c.isEmpty()); - assertEquals(2, c.size()); - assertTrue(c.contains(context1)); - assertTrue(c.contains(context2)); + List list = new ArrayList<>(); + Iterator iterator = c.iterator(); + while (iterator.hasNext()) { + list.add(iterator.next()); + } + assertFalse(list.isEmpty()); + assertEquals(2, list.size()); + assertTrue(list.contains(context1)); + assertTrue(list.contains(context2)); } @Test diff --git a/sre/io.janusproject/io.janusproject.tests/src/test/java/io/janusproject/tests/kernel/bic/InnerContextSkillTest.java b/sre/io.janusproject/io.janusproject.tests/src/test/java/io/janusproject/tests/kernel/bic/InnerContextSkillTest.java index 1e14deebbc..dd6224485f 100644 --- a/sre/io.janusproject/io.janusproject.tests/src/test/java/io/janusproject/tests/kernel/bic/InnerContextSkillTest.java +++ b/sre/io.janusproject/io.janusproject.tests/src/test/java/io/janusproject/tests/kernel/bic/InnerContextSkillTest.java @@ -26,8 +26,11 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; +import java.util.Iterator; +import java.util.List; import java.util.UUID; import org.junit.Before; @@ -59,7 +62,7 @@ import io.sarl.lang.core.Space; import io.sarl.lang.core.SpaceID; import io.sarl.lang.util.ClearableReference; -import io.sarl.lang.util.SynchronizedSet; +import io.sarl.lang.util.SynchronizedIterable; import io.sarl.tests.api.ManualMocking; import io.sarl.tests.api.Nullable; import io.sarl.util.Collections3; @@ -191,9 +194,9 @@ public void getMemberAgentCount_member() { @Test public void getMemberAgents_nomember() { - SynchronizedSet set = this.skill.getMemberAgents(); + SynchronizedIterable set = this.skill.getMemberAgents(); assertNotNull(set); - assertTrue(set.isEmpty()); + assertFalse(set.iterator().hasNext()); } @Test @@ -201,11 +204,16 @@ public void getMemberAgents_member() { UUID otherAgent = UUID.randomUUID(); when(this.innerSpace.getParticipants()) .thenReturn(Collections3.synchronizedSet(new HashSet<>(Arrays.asList(this.agentId, otherAgent)), this)); - SynchronizedSet set = this.skill.getMemberAgents(); + SynchronizedIterable set = this.skill.getMemberAgents(); assertNotNull(set); - assertFalse(set.isEmpty()); - assertEquals(1, set.size()); - assertTrue(set.contains(otherAgent)); + final List list = new ArrayList<>(); + Iterator iterator = set.iterator(); + while (iterator.hasNext()) { + list.add(iterator.next()); + } + assertFalse(list.isEmpty()); + assertEquals(1, list.size()); + assertTrue(list.contains(otherAgent)); } @Test(expected = NullPointerException.class)