Commit 1ca1a44e authored by Julian Zobel's avatar Julian Zobel
Browse files

Global Oracle provides knowledge on attraction points

Remodelled attraction points generators to a common abstract class and interface
parent d8bfa8aa
...@@ -27,7 +27,6 @@ import java.util.LinkedList; ...@@ -27,7 +27,6 @@ import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Scanner; import java.util.Scanner;
import de.tud.kom.p2psim.api.churn.ChurnGenerator;
import de.tud.kom.p2psim.api.network.SimNetInterface; import de.tud.kom.p2psim.api.network.SimNetInterface;
import de.tud.kom.p2psim.api.network.SimNetworkComponent; import de.tud.kom.p2psim.api.network.SimNetworkComponent;
import de.tud.kom.p2psim.api.scenario.ConfigurationException; import de.tud.kom.p2psim.api.scenario.ConfigurationException;
...@@ -36,7 +35,7 @@ import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator; ...@@ -36,7 +35,7 @@ import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.impl.topology.DefaultTopology; import de.tud.kom.p2psim.impl.topology.DefaultTopology;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.IAttractionBasedMovementAnalyzer; import de.tud.kom.p2psim.impl.topology.movement.modularosm.IAttractionBasedMovementAnalyzer;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.AttractionPointViz; import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.AttractionPointViz;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionGenerator; import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionProvider;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.mapvisualization.IMapVisualization; import de.tud.kom.p2psim.impl.topology.movement.modularosm.mapvisualization.IMapVisualization;
import de.tud.kom.p2psim.impl.topology.util.PositionVector; import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tud.kom.p2psim.impl.topology.views.VisualizationTopologyView.VisualizationInjector; import de.tud.kom.p2psim.impl.topology.views.VisualizationTopologyView.VisualizationInjector;
...@@ -69,7 +68,7 @@ public class TracefileMovementModel implements MovementModel, EventHandler { ...@@ -69,7 +68,7 @@ public class TracefileMovementModel implements MovementModel, EventHandler {
protected long timeBetweenMoveOperations; protected long timeBetweenMoveOperations;
protected IMapVisualization mapVisualization; protected IMapVisualization mapVisualization;
protected IAttractionGenerator attractionGenerator; protected IAttractionProvider attractionGenerator;
protected AttractionPointViz attractionpointVisualization; protected AttractionPointViz attractionpointVisualization;
protected boolean initialized = false; protected boolean initialized = false;
...@@ -106,6 +105,8 @@ public class TracefileMovementModel implements MovementModel, EventHandler { ...@@ -106,6 +105,8 @@ public class TracefileMovementModel implements MovementModel, EventHandler {
} }
if (attractionpointVisualization != null) { if (attractionpointVisualization != null) {
attractionpointVisualization.setAttractionPoints(new LinkedList<>(attractionGenerator.getAttractionPoints()));
VisualizationInjector.injectComponent(attractionpointVisualization); VisualizationInjector.injectComponent(attractionpointVisualization);
} }
...@@ -363,7 +364,7 @@ public class TracefileMovementModel implements MovementModel, EventHandler { ...@@ -363,7 +364,7 @@ public class TracefileMovementModel implements MovementModel, EventHandler {
this.attractionpointVisualization = viz; this.attractionpointVisualization = viz;
} }
public void setIAttractionGenerator(IAttractionGenerator attractionGenerator) { public void setIAttractionGenerator(IAttractionProvider attractionGenerator) {
if (attractionGenerator == null) { if (attractionGenerator == null) {
throw new ConfigurationException( throw new ConfigurationException(
"AttractionGenerator is missing in ModularMovementModel!"); "AttractionGenerator is missing in ModularMovementModel!");
......
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
package de.tud.kom.p2psim.impl.topology.movement.modularosm; package de.tud.kom.p2psim.impl.topology.movement.modularosm;
import de.tud.kom.p2psim.api.topology.Topology; import de.tud.kom.p2psim.api.topology.Topology;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.AttractionPointImpl;
import de.tud.kom.p2psim.impl.topology.util.PositionVector; import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tud.kom.p2psim.impl.topology.views.VisualizationTopologyView.VisualizationInjector; import de.tud.kom.p2psim.impl.topology.views.VisualizationTopologyView.VisualizationInjector;
import de.tudarmstadt.maki.simonstrator.api.Binder; import de.tudarmstadt.maki.simonstrator.api.Binder;
......
...@@ -38,7 +38,7 @@ import de.tud.kom.p2psim.impl.simengine.Simulator; ...@@ -38,7 +38,7 @@ import de.tud.kom.p2psim.impl.simengine.Simulator;
import de.tud.kom.p2psim.impl.topology.DefaultTopology; import de.tud.kom.p2psim.impl.topology.DefaultTopology;
import de.tud.kom.p2psim.impl.topology.TopologyFactory; import de.tud.kom.p2psim.impl.topology.TopologyFactory;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.AttractionPointViz; import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.AttractionPointViz;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionGenerator; import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionProvider;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.mapvisualization.IMapVisualization; import de.tud.kom.p2psim.impl.topology.movement.modularosm.mapvisualization.IMapVisualization;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.transition.IAttractionAssigmentStrategy; import de.tud.kom.p2psim.impl.topology.movement.modularosm.transition.IAttractionAssigmentStrategy;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.transition.IAttractionAssigmentStrategy.AttractionAssignmentListener; import de.tud.kom.p2psim.impl.topology.movement.modularosm.transition.IAttractionAssigmentStrategy.AttractionAssignmentListener;
...@@ -104,7 +104,7 @@ public class ModularMovementModel implements MovementModel, EventHandler, Attrac ...@@ -104,7 +104,7 @@ public class ModularMovementModel implements MovementModel, EventHandler, Attrac
protected IAttractionAssigmentStrategy attractionAssigment; protected IAttractionAssigmentStrategy attractionAssigment;
protected IAttractionGenerator attractionGenerator; protected IAttractionProvider attractionProvider;
protected LocalMovementStrategy localMovementStrategy; protected LocalMovementStrategy localMovementStrategy;
...@@ -175,6 +175,7 @@ public class ModularMovementModel implements MovementModel, EventHandler, Attrac ...@@ -175,6 +175,7 @@ public class ModularMovementModel implements MovementModel, EventHandler, Attrac
.setScaleFactor(timeBetweenMoveOperation / (double) Time.SECOND); .setScaleFactor(timeBetweenMoveOperation / (double) Time.SECOND);
attractionAssigment.addAttractionAssignmentListener(this); attractionAssigment.addAttractionAssignmentListener(this);
attractionAssigment.setAttractionProvider(attractionProvider);
// This adds the mobile hosts (smartphones/users) to the transition // This adds the mobile hosts (smartphones/users) to the transition
// strategy // strategy
...@@ -373,12 +374,12 @@ public class ModularMovementModel implements MovementModel, EventHandler, Attrac ...@@ -373,12 +374,12 @@ public class ModularMovementModel implements MovementModel, EventHandler, Attrac
} }
public void setIAttractionGenerator(IAttractionGenerator attractionGenerator) { public void setIAttractionProvider(IAttractionProvider attractionProvider) {
if (attractionGenerator == null) { if (attractionProvider == null) {
throw new ConfigurationException( throw new ConfigurationException(
"AttractionGenerator is missing in ModularMovementModel!"); "AttractionProvider is missing in ModularMovementModel!");
} }
this.attractionGenerator = attractionGenerator; this.attractionProvider = attractionProvider;
} }
public void setLocalMovementStrategy(LocalMovementStrategy localMovementStrategy) { public void setLocalMovementStrategy(LocalMovementStrategy localMovementStrategy) {
...@@ -418,7 +419,7 @@ public class ModularMovementModel implements MovementModel, EventHandler, Attrac ...@@ -418,7 +419,7 @@ public class ModularMovementModel implements MovementModel, EventHandler, Attrac
* @return * @return
*/ */
public List<IAttractionPoint> getAttractionPoints() { public List<IAttractionPoint> getAttractionPoints() {
return new Vector<IAttractionPoint>(IAttractionGenerator.attractionPoints); return new Vector<IAttractionPoint>(attractionProvider.getAttractionPoints());
} }
public void setAttractionPointViz(AttractionPointViz viz) { public void setAttractionPointViz(AttractionPointViz viz) {
......
...@@ -43,7 +43,7 @@ import com.graphhopper.util.shapes.GHPoint3D; ...@@ -43,7 +43,7 @@ import com.graphhopper.util.shapes.GHPoint3D;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator; import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.impl.topology.movement.local.AbstractLocalMovementStrategy; import de.tud.kom.p2psim.impl.topology.movement.local.AbstractLocalMovementStrategy;
import de.tud.kom.p2psim.impl.topology.movement.local.RealWorldStreetsMovement; import de.tud.kom.p2psim.impl.topology.movement.local.RealWorldStreetsMovement;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionGenerator; import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionProvider;
import de.tud.kom.p2psim.impl.topology.util.PositionVector; import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tud.kom.p2psim.impl.topology.views.VisualizationTopologyView; import de.tud.kom.p2psim.impl.topology.views.VisualizationTopologyView;
import de.tud.kom.p2psim.impl.topology.views.VisualizationTopologyView.VisualizationInjector; import de.tud.kom.p2psim.impl.topology.views.VisualizationTopologyView.VisualizationInjector;
...@@ -304,7 +304,7 @@ public class ModularMovementModelViz extends JComponent ...@@ -304,7 +304,7 @@ public class ModularMovementModelViz extends JComponent
{ {
Composite gc = g2.getComposite(); Composite gc = g2.getComposite();
for (IAttractionPoint aPoint : IAttractionGenerator.attractionPoints) { for (IAttractionPoint aPoint : movementModel.getAttractionPoints()) {
Point point = ((PositionVector) aPoint).asPoint(); Point point = ((PositionVector) aPoint).asPoint();
// draw border // draw border
g2.setColor(Color.BLACK); g2.setColor(Color.BLACK);
......
...@@ -30,7 +30,7 @@ import de.tud.kom.p2psim.api.scenario.ConfigurationException; ...@@ -30,7 +30,7 @@ import de.tud.kom.p2psim.api.scenario.ConfigurationException;
import de.tud.kom.p2psim.api.topology.Topology; import de.tud.kom.p2psim.api.topology.Topology;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator; import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.api.topology.movement.local.LocalMovementStrategy; import de.tud.kom.p2psim.api.topology.movement.local.LocalMovementStrategy;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionGenerator; import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionProvider;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.MovementGroupContainer; import de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.MovementGroupContainer;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.SocialMovementGroup; import de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.SocialMovementGroup;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.groupencounter.IGroupEncounterBehavior; import de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.groupencounter.IGroupEncounterBehavior;
......
...@@ -22,32 +22,48 @@ package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction; ...@@ -22,32 +22,48 @@ package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import de.tud.kom.p2psim.api.topology.Topology;
import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tud.kom.p2psim.impl.util.oracle.GlobalOracle;
import de.tudarmstadt.maki.simonstrator.api.Binder;
import de.tudarmstadt.maki.simonstrator.api.Monitor; import de.tudarmstadt.maki.simonstrator.api.Monitor;
import de.tudarmstadt.maki.simonstrator.api.Monitor.Level; import de.tudarmstadt.maki.simonstrator.api.Monitor.Level;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint; import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
/** public class AbstractAttractionProvider implements IAttractionProvider {
* Interface for {@link IAttractionPoint} generators. Will generate a given amount of attraction points.
*
* @author Christoph Muenker, Julian Zobel
* @version 1.1, 09 2018
*/
public interface IAttractionGenerator {
static LinkedList<IAttractionPoint> attractionPoints = new LinkedList<>();
public List<IAttractionPoint> getAttractionPoints(); private LinkedList<AttractionPoint> attractionPoints = new LinkedList<>();
protected PositionVector worldDimension;
public AbstractAttractionProvider() {
this.worldDimension = Binder.getComponentOrNull(Topology.class).getWorldDimensions();
}
public List<AttractionPoint> getAttractionPoints() {
return new LinkedList<AttractionPoint>(attractionPoints);
}
protected void clearAttractionPoints() {
attractionPoints.clear();
}
protected boolean hasAttractionPoint(AttractionPoint ap) {
return attractionPoints.contains(ap);
}
/** /**
* Remove an {@link IAttractionPoint} from the list * Remove an {@link IAttractionPoint} from the list
* @param ap * @param ap
*/ */
default void removeAttractionPoint(IAttractionPoint ap) { public void removeAttractionPoint(AttractionPoint ap) {
if(Monitor.hasAnalyzer(AttractionPointMonitor.class)) { if(Monitor.hasAnalyzer(AttractionPointMonitor.class)) {
Monitor.getOrNull(AttractionPointMonitor.class).removedAttractionPoint(ap); Monitor.getOrNull(AttractionPointMonitor.class).removedAttractionPoint(ap);
} }
GlobalOracle.removeAttractionPoint(ap);
attractionPoints.remove(ap); attractionPoints.remove(ap);
} }
...@@ -55,18 +71,19 @@ public interface IAttractionGenerator { ...@@ -55,18 +71,19 @@ public interface IAttractionGenerator {
* Add an {@link IAttractionPoint} to the list * Add an {@link IAttractionPoint} to the list
* @param ap * @param ap
*/ */
default void addAttractionPoint(IAttractionPoint ap) { public void addAttractionPoint(AttractionPoint ap) {
if(ap == null) { if(ap == null) {
Monitor.log(IAttractionGenerator.class, Level.ERROR, "IAttractionGenerator: Tried to add NULL as Attraction Point"); Monitor.log(IAttractionProvider.class, Level.ERROR, "IAttractionGenerator: Tried to add NULL as Attraction Point");
return; return;
} }
if(Monitor.hasAnalyzer(AttractionPointMonitor.class)) { if(Monitor.hasAnalyzer(AttractionPointMonitor.class)) {
Monitor.getOrNull(AttractionPointMonitor.class).addedAttractionPoint(ap); Monitor.getOrNull(AttractionPointMonitor.class).addedAttractionPoint(ap);
} }
GlobalOracle.addAttractionPoint(ap);
attractionPoints.add(ap); attractionPoints.add(ap);
} }
} }
...@@ -41,17 +41,15 @@ import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractio ...@@ -41,17 +41,15 @@ import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractio
* @version 1.1, 26.10.2018 - since the class was very similar to {@link BasicAttractionPoint}, made this class an extension * @version 1.1, 26.10.2018 - since the class was very similar to {@link BasicAttractionPoint}, made this class an extension
* @version 1.2, 24.01.2020 - added pause time interval, weight, and radius exclusively to this class, because {@link BasicAttractionPoint} should be just a named point. * @version 1.2, 24.01.2020 - added pause time interval, weight, and radius exclusively to this class, because {@link BasicAttractionPoint} should be just a named point.
*/ */
public class AttractionPointImpl extends BasicAttractionPoint { public class AttractionPoint extends BasicAttractionPoint {
protected static Map<String, AttractionPoint> instances = new LinkedHashMap<>();
protected static Random rnd = Randoms.getRandom(IAttractionPoint.class);
protected static Map<String, AttractionPointImpl> instances = new LinkedHashMap<>();
protected long pauseTimeMin = -1; protected long pauseTimeMin = -1;
protected long pauseTimeMax = -1; protected long pauseTimeMax = -1;
protected double weight = 0; protected double weight = 0;
protected double radius = 0; protected double radius = 0;
public AttractionPointImpl(String name, PositionVector posVec) { public AttractionPoint(String name, PositionVector posVec) {
super(name, posVec); super(name, posVec);
if (instances.containsKey(name)) { if (instances.containsKey(name)) {
...@@ -64,7 +62,7 @@ public class AttractionPointImpl extends BasicAttractionPoint { ...@@ -64,7 +62,7 @@ public class AttractionPointImpl extends BasicAttractionPoint {
} }
} }
public AttractionPointImpl(String name, PositionVector posVec, double weight, double radius, long pauseTimeMin, long pauseTimeMax) { public AttractionPoint(String name, PositionVector posVec, double weight, double radius, long pauseTimeMin, long pauseTimeMax) {
this(name, posVec); this(name, posVec);
assert weight >= 0 && weight <= 1.0; assert weight >= 0 && weight <= 1.0;
...@@ -77,7 +75,7 @@ public class AttractionPointImpl extends BasicAttractionPoint { ...@@ -77,7 +75,7 @@ public class AttractionPointImpl extends BasicAttractionPoint {
@Override @Override
public IAttractionPoint clone(String newName) { public IAttractionPoint clone(String newName) {
return new AttractionPointImpl(name, this, weight, radius, pauseTimeMin, pauseTimeMax); return new AttractionPoint(name, this, weight, radius, pauseTimeMin, pauseTimeMax);
} }
@Override @Override
...@@ -100,7 +98,7 @@ public class AttractionPointImpl extends BasicAttractionPoint { ...@@ -100,7 +98,7 @@ public class AttractionPointImpl extends BasicAttractionPoint {
return true; return true;
if (getClass() != obj.getClass()) if (getClass() != obj.getClass())
return false; return false;
AttractionPointImpl other = (AttractionPointImpl) obj; AttractionPoint other = (AttractionPoint) obj;
if (name == null) { if (name == null) {
if (other.name != null) if (other.name != null)
return false; return false;
......
...@@ -56,10 +56,15 @@ public class AttractionPointViz extends JComponent ...@@ -56,10 +56,15 @@ public class AttractionPointViz extends JComponent
public static LinkedList<LinkedList<SimHost>> clusters = new LinkedList<LinkedList<SimHost>>(); public static LinkedList<LinkedList<SimHost>> clusters = new LinkedList<LinkedList<SimHost>>();
public static LinkedList<Color> colors = new LinkedList<Color>(); public static LinkedList<Color> colors = new LinkedList<Color>();
public LinkedList<IAttractionPoint> aps;
public AttractionPointViz() { public AttractionPointViz() {
init(); init();
} }
public void setAttractionPoints(LinkedList<IAttractionPoint> aps) {
this.aps = aps;
}
protected void init() { protected void init() {
setBounds(0, 0, VisualizationInjector.getWorldX(), setBounds(0, 0, VisualizationInjector.getWorldX(),
...@@ -141,9 +146,13 @@ public class AttractionPointViz extends JComponent ...@@ -141,9 +146,13 @@ public class AttractionPointViz extends JComponent
*/ */
protected void drawAttractionPoints(Graphics2D g2) protected void drawAttractionPoints(Graphics2D g2)
{ {
if(aps == null || aps.size() == 0) {
return;
}
Composite gc = g2.getComposite(); Composite gc = g2.getComposite();
for (IAttractionPoint aPoint : IAttractionGenerator.attractionPoints) { for (IAttractionPoint aPoint : aps) {
Point point = ((PositionVector) aPoint).asPoint(); Point point = ((PositionVector) aPoint).asPoint();
// draw border // draw border
g2.setColor(Color.BLACK); g2.setColor(Color.BLACK);
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
*/ */
package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction; package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction;
import java.util.List;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
/** /**
* For simple scenarios: add attraction points by specifying a coordinate. * For simple scenarios: add attraction points by specifying a coordinate.
...@@ -28,16 +26,10 @@ import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractio ...@@ -28,16 +26,10 @@ import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractio
* @author Bjoern Richerzhagen * @author Bjoern Richerzhagen
* @version 1.0, Dec 11, 2015 * @version 1.0, Dec 11, 2015
*/ */
public class ConfigAttractionGenerator implements IAttractionGenerator { public class ConfigAttractionGenerator extends AbstractAttractionProvider {
@Override public void setAttractionPoint(AttractionPoint point) {
public List<IAttractionPoint> getAttractionPoints() { addAttractionPoint(point);
return attractionPoints;
}
public void setAttractionPoint(IAttractionPoint point) {
attractionPoints.add(point);
} }
} }
...@@ -21,17 +21,8 @@ ...@@ -21,17 +21,8 @@
package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction; package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import de.tud.kom.p2psim.api.scenario.ConfigurationException;
import de.tud.kom.p2psim.api.topology.Topology;
import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.Binder;
import de.tudarmstadt.maki.simonstrator.api.Event; import de.tudarmstadt.maki.simonstrator.api.Event;
import de.tudarmstadt.maki.simonstrator.api.EventHandler; import de.tudarmstadt.maki.simonstrator.api.EventHandler;
import de.tudarmstadt.maki.simonstrator.api.Randoms;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/** /**
* Implementation of the interface {@link AttractionGenerator}. * Implementation of the interface {@link AttractionGenerator}.
...@@ -40,16 +31,9 @@ import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor; ...@@ -40,16 +31,9 @@ import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
* @author Julian Zobel * @author Julian Zobel
* @version 1.0, April 2019 * @version 1.0, April 2019
*/ */
public class ConfigDynamicAttractionGenerator implements IAttractionGenerator { public class ConfigDynamicAttractionGenerator extends AbstractAttractionProvider {
private LinkedList<TemporalAttractionPoint> allAPs = new LinkedList<>(); private LinkedList<TemporalAttractionPoint> allAPs = new LinkedList<>();
@Override
public List<IAttractionPoint> getAttractionPoints() {
return attractionPoints;
}
public void setAttractionPoint(TemporalAttractionPoint ap) { public void setAttractionPoint(TemporalAttractionPoint ap) {
allAPs.add(ap); allAPs.add(ap);
...@@ -62,21 +46,17 @@ public class ConfigDynamicAttractionGenerator implements IAttractionGenerator { ...@@ -62,21 +46,17 @@ public class ConfigDynamicAttractionGenerator implements IAttractionGenerator {
}, null, 0); }, null, 0);
} }
private void placeAP(TemporalAttractionPoint ap) { void placeAP(TemporalAttractionPoint ap) {
attractionPoints.add(ap); addAttractionPoint(ap);
Event.scheduleWithDelay(ap.getRemovalTime(), new EventHandler() { Event.scheduleWithDelay(ap.getRemovalTime(), new EventHandler() {
@Override @Override
public void eventOccurred(Object content, int type) { public void eventOccurred(Object content, int type) {
removeAP(ap); removeAttractionPoint(ap);
} }
}, null, 0); }, null, 0);
} }
private void removeAP(TemporalAttractionPoint ap) {
attractionPoints.remove(ap);
}
} }
...@@ -39,9 +39,7 @@ import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor; ...@@ -39,9 +39,7 @@ import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
* @author Nils Richerzhagen * @author Nils Richerzhagen
* @version 1.0, 16.07.2014 * @version 1.0, 16.07.2014
*/ */
public class CsvAttractionGenerator implements IAttractionGenerator { public class CsvAttractionGenerator extends AbstractAttractionProvider {
private PositionVector worldDimensions;
private String file; private String file;
...@@ -55,8 +53,7 @@ public class CsvAttractionGenerator implements IAttractionGenerator { ...@@ -55,8 +53,7 @@ public class CsvAttractionGenerator implements IAttractionGenerator {
*/ */
@XMLConfigurableConstructor({ "placementFile" }) @XMLConfigurableConstructor({ "placementFile" })
public CsvAttractionGenerator(String placementFile) { public CsvAttractionGenerator(String placementFile) {
this.worldDimensions = Binder.getComponentOrNull(Topology.class) super();
.getWorldDimensions();
this.file = placementFile; this.file = placementFile;
readData(); readData();
...@@ -67,11 +64,11 @@ public class CsvAttractionGenerator implements IAttractionGenerator { ...@@ -67,11 +64,11 @@ public class CsvAttractionGenerator implements IAttractionGenerator {
} }
@Override @Override
public List<IAttractionPoint> getAttractionPoints() { public List<AttractionPoint> getAttractionPoints() {
if (attractionPoints == null) { if (super.getAttractionPoints().isEmpty()) {
readData(); readData();
} }
return attractionPoints; return super.getAttractionPoints();
} }
private void readData() { private void readData() {
...@@ -91,14 +88,14 @@ public class CsvAttractionGenerator implements IAttractionGenerator { ...@@ -91,14 +88,14 @@ public class CsvAttractionGenerator implements IAttractionGenerator {
Double x = Double.parseDouble(parts[0]); Double x = Double.parseDouble(parts[0]);
Double y = Double.parseDouble(parts[1]); Double y = Double.parseDouble(parts[1]);
if (x > worldDimensions.getX() if (x > worldDimension.getX()
|| y > worldDimensions.getY() || x < 0 || y > worldDimension.getY() || x < 0
|| y < 0) { || y < 0) {
System.err.println("Skipped entry " + x + ";" System.err.println("Skipped entry " + x + ";"
+ y); + y);
continue; continue;
} }
IAttractionPoint ap = new AttractionPointImpl("AP"+i, new PositionVector(x, y)); AttractionPoint ap = new AttractionPoint("AP"+i, new PositionVector(x, y));
ap.setRadius(radius); ap.setRadius(radius);
addAttractionPoint(ap); addAttractionPoint(ap);
...@@ -117,15 +114,15 @@ public class CsvAttractionGenerator implements IAttractionGenerator { ...@@ -117,15 +114,15 @@ public class CsvAttractionGenerator implements IAttractionGenerator {
Double y = Double.parseDouble(parts[1]); Double y = Double.parseDouble(parts[1]);
Double r = Double.parseDouble(parts[2]); Double r = Double.parseDouble(parts[2]);
if (x > worldDimensions.getX() if (x > worldDimension.getX()
|| y > worldDimensions.getY() || x < 0 || y > worldDimension.getY() || x < 0
|| y < 0) { || y < 0) {
System.err.println("Skipped entry " + x + ";" System.err.println("Skipped entry " + x + ";"
+ y); + y);
continue; continue;
} }
IAttractionPoint ap = new AttractionPointImpl("AP"+i, new PositionVector(x, y)); AttractionPoint ap = new AttractionPoint("AP"+i, new PositionVector(x, y));
ap.setRadius(r); ap.setRadius(r);
addAttractionPoint(ap); addAttractionPoint(ap);
......
...@@ -21,42 +21,32 @@ ...@@ -21,42 +21,32 @@
package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction; package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction;
import java.util.List; import java.util.List;
import de.tud.kom.p2psim.api.topology.Topology;
import de.tud.kom.p2psim.impl.topology.util.PositionVector; import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.Binder;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor; import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/** /**
* Implementation of the interface {@link AttractionGenerator}. * Attraction Generator, providing 4 equidistant attraction points, i.e., in a square
*
* Generates the given number of {@link IAttractionPoint}s and sets the
* position randomly within the world dimensions.
* *
* @author Julian Zobel * @author Julian Zobel
* @version 1.0, Nov 2018 * @version 1.0, Nov 2018
*/ */
public class EquidistantSquareAttractionGenerator implements IAttractionGenerator { public class EquidistantSquareAttractionGenerator extends AbstractAttractionProvider {
private PositionVector worldDimension; private PositionVector worldDimension;
private double squareSize; private double squareSize;
@XMLConfigurableConstructor({ "squareSize" }) @XMLConfigurableConstructor({ "squareSize" })
public EquidistantSquareAttractionGenerator(double squareSize) { public EquidistantSquareAttractionGenerator(double squareSize) {
this.worldDimension = Binder.getComponentOrNull(Topology.class)
.getWorldDimensions();
this.squareSize = squareSize; this.squareSize = squareSize;
createAttractionPoints(); createAttractionPoints();
} }
@Override @Override
public List<IAttractionPoint> getAttractionPoints() { public List<AttractionPoint> getAttractionPoints() {
if(attractionPoints.isEmpty()) if(super.getAttractionPoints().isEmpty())
createAttractionPoints(); createAttractionPoints();
return attractionPoints; return super.getAttractionPoints();
} }
private void createAttractionPoints() { private void createAttractionPoints() {
...@@ -64,21 +54,17 @@ public class EquidistantSquareAttractionGenerator implements IAttractionGenerato ...@@ -64,21 +54,17 @@ public class EquidistantSquareAttractionGenerator implements IAttractionGenerato
double x = worldDimension.getX() / 2; double x = worldDimension.getX() / 2;
double y = worldDimension.getY() / 2; double y = worldDimension.getY() / 2;
PositionVector p1 = new PositionVector(x - squareSize, y - squareSize); PositionVector p1 = new PositionVector(x - squareSize, y - squareSize);
IAttractionPoint ap1 = new AttractionPointImpl("AP1", p1); this.addAttractionPoint(new AttractionPoint("AP1", p1));
attractionPoints.add(ap1);
PositionVector p2 = new PositionVector(x - squareSize, y + squareSize); PositionVector p2 = new PositionVector(x - squareSize, y + squareSize);
IAttractionPoint ap2 = new AttractionPointImpl("AP2", p2); this.addAttractionPoint(new AttractionPoint("AP2", p2));
attractionPoints.add(ap2);
PositionVector p3 = new PositionVector(x + squareSize, y - squareSize); PositionVector p3 = new PositionVector(x + squareSize, y - squareSize);
IAttractionPoint ap3 = new AttractionPointImpl("AP3", p3); this.addAttractionPoint(new AttractionPoint("AP3", p3));
attractionPoints.add(ap3);
PositionVector p4 = new PositionVector(x + squareSize, y + squareSize); PositionVector p4 = new PositionVector(x + squareSize, y + squareSize);
IAttractionPoint ap4 = new AttractionPointImpl("AP4", p4); this.addAttractionPoint(new AttractionPoint("AP4", p4));
attractionPoints.add(ap4);
} }
......
/*
* Copyright (c) 2005-2010 KOM – Multimedia Communications Lab
*
* This file is part of PeerfactSim.KOM.
*
* PeerfactSim.KOM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* PeerfactSim.KOM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PeerfactSim.KOM. If not, see <http://www.gnu.org/licenses/>.
*
*/
package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction;
import java.util.List;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
/**
* Interface for {@link IAttractionPoint} generators. Will generate a given amount of attraction points.
*
* @author Christoph Muenker, Julian Zobel
* @version 1.1, 09 2018
*/
public interface IAttractionProvider {
public List<AttractionPoint> getAttractionPoints();
}
\ No newline at end of file
...@@ -23,16 +23,14 @@ package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction; ...@@ -23,16 +23,14 @@ package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import de.tud.kom.p2psim.api.topology.Topology;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.GPSCalculation; import de.tud.kom.p2psim.impl.topology.movement.modularosm.GPSCalculation;
import de.tud.kom.p2psim.impl.topology.util.PositionVector; import de.tud.kom.p2psim.impl.util.oracle.GlobalOracle;
import de.tudarmstadt.maki.simonstrator.api.Binder;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor; import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/** /**
...@@ -52,115 +50,117 @@ import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor; ...@@ -52,115 +50,117 @@ import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
* *
* *
*/ */
public class JSONAttractionGenerator implements IAttractionGenerator { public class JSONAttractionGenerator extends AbstractAttractionProvider {
private int numberOfAttractionPoints; protected int numberOfAttractionPoints;
private String placementJsonFile; protected String placementJsonFile = "";
private double maximumRadius = -1; // Values >= 0, or -1 if radius taken from file protected double maximumRadius = -1; // Values >= 0, or -1 if radius taken from file
/** /**
* You have to set a json-file, which has set some POIs * You have to set a json-file, which has set some POIs
* Sample-query for "bar"-POIs in Darmstadt (Bounding Box from [49.4813, 8.5590] to [49.9088, 8,7736]: * Sample-query for "bar"-POIs in Darmstadt (Bounding Box from [49.4813, 8.5590] to [49.9088, 8,7736]:
http://overpass-api.de/api/interpreter?data=%5Bout:json%5D;node%5Bamenity=bar%5D%2849%2E4813%2C8%2E5590%2C49%2E9088%2C8%2E7736%29%3Bout%3B http://overpass-api.de/api/interpreter?data=%5Bout:json%5D;node%5Bamenity=bar%5D%2849%2E4813%2C8%2E5590%2C49%2E9088%2C8%2E7736%29%3Bout%3B
*/ */
@XMLConfigurableConstructor({"numberOfAttractionPoints"}) @XMLConfigurableConstructor({"numberOfAttractionPoints", "maximumRadius", "placementJsonFile"})
public JSONAttractionGenerator(int numberOfAttractionPoints) { public JSONAttractionGenerator(int numberOfAttractionPoints, double maximumRadius, String placementJsonFile) {
this.numberOfAttractionPoints = numberOfAttractionPoints; this.numberOfAttractionPoints = numberOfAttractionPoints;
this.maximumRadius = maximumRadius;
this.placementJsonFile = placementJsonFile;
createAttractionPoints();
} }
@Override @Override
public List<IAttractionPoint> getAttractionPoints() { public List<AttractionPoint> getAttractionPoints() {
if(attractionPoints.size() == 0) { if(super.getAttractionPoints().size() == 0) {
String poiString = ""; createAttractionPoints();
JSONArray allPOI = null;
FileInputStream inputStream;
try {
inputStream = new FileInputStream(placementJsonFile);
poiString = IOUtils.toString(inputStream);
JSONObject poiData = new JSONObject(poiString);
allPOI = poiData.getJSONArray("elements");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
if(allPOI != null) {
int limit = 0;
if(numberOfAttractionPoints == 0 || numberOfAttractionPoints > allPOI.length()) {
limit = allPOI.length();
}
else {
limit = numberOfAttractionPoints;
}
for(int i = 0; i < limit; i++) {
try {
String barname = allPOI.getJSONObject(i).getJSONObject("tags").getString("name");
double lat = allPOI.getJSONObject(i).getDouble("lat");
double lon = allPOI.getJSONObject(i).getDouble("lon");
AttractionPointImpl ap;
// check that the point is within the simulation boundaries
if(GPSCalculation.isWithinGPSBoundaries(lat, lon)) {
// initialize the attraction point with basic information, will be filled now...
ap = new AttractionPointImpl(barname, GPSCalculation.transformGPSWindowToOwnWorld(lat, lon));
attractionPoints.add(ap);
// the following setters are allowed to fail
// AP weight
if(allPOI.getJSONObject(i).getJSONObject("tags").has("weight")) {
ap.setWeight(allPOI.getJSONObject(i).getJSONObject("tags").getDouble("weight"));
}
// AP radius
if(allPOI.getJSONObject(i).getJSONObject("tags").has("radius")) {
double radius = allPOI.getJSONObject(i).getJSONObject("tags").getDouble("radius");
if(maximumRadius == -1) {
ap.setRadius(radius);
}
else {
ap.setRadius(Math.min(maximumRadius, radius));
}
}
if(allPOI.getJSONObject(i).getJSONObject("tags").has("pauseTimeMin") && allPOI.getJSONObject(i).getJSONObject("tags").has("pauseTimeMax")) {
ap.setPauseTime( allPOI.getJSONObject(i).getJSONObject("tags").getLong("pauseTimeMin"), allPOI.getJSONObject(i).getJSONObject("tags").getLong("pauseTimeMax"));
}
System.out.println(ap);
}
}
catch (JSONException e) {
//This bar had no name defined, so there was an error. Not so bad
System.out.println(e);
}
}
}
} }
return attractionPoints; return super.getAttractionPoints();
} }
protected JSONArray getPOIArray() {
assert !placementJsonFile.equals("");
public void setPlacementJsonFile(String placementJsonFile) { String poiString = "";
this.placementJsonFile = placementJsonFile; JSONArray allPOI = null;
//System.out.println(placementJsonFile); FileInputStream inputStream;
if(attractionPoints.isEmpty()) { try {
this.getAttractionPoints(); inputStream = new FileInputStream(placementJsonFile);
poiString = IOUtils.toString(inputStream);
JSONObject poiData = new JSONObject(poiString);
allPOI = poiData.getJSONArray("elements");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
} }
return allPOI;
} }
/** private void createAttractionPoints() {
* Set a maximum radius that an attraction point can have. Minimum is 10 meters. assert super.getAttractionPoints().size() == 0;
* @param radius
*/ JSONArray allPOI = getPOIArray();
public void setMaximumRadius(double radius) {
this.maximumRadius = radius; if(allPOI == null) {
} throw new UnsupportedOperationException("[JSONAttractionGenerator] POI Data Array cannot be NULL.");
}
int limit = 0;
if(numberOfAttractionPoints == 0 || numberOfAttractionPoints > allPOI.length()) {
limit = allPOI.length();
}
else {
limit = numberOfAttractionPoints;
}
for(int i = 0; i < limit; i++) {
try {
String barname = allPOI.getJSONObject(i).getJSONObject("tags").getString("name");
double lat = allPOI.getJSONObject(i).getDouble("lat");
double lon = allPOI.getJSONObject(i).getDouble("lon");
AttractionPoint ap;
// check that the point is within the simulation boundaries
if(GPSCalculation.isWithinGPSBoundaries(lat, lon)) {
// initialize the attraction point with basic information, will be filled now...
ap = new AttractionPoint(barname, GPSCalculation.transformGPSWindowToOwnWorld(lat, lon));
// the following setters are allowed to fail
// AP weight
if(allPOI.getJSONObject(i).getJSONObject("tags").has("weight")) {
ap.setWeight(allPOI.getJSONObject(i).getJSONObject("tags").getDouble("weight"));
}
// AP radius
if(allPOI.getJSONObject(i).getJSONObject("tags").has("radius")) {
double radius = allPOI.getJSONObject(i).getJSONObject("tags").getDouble("radius");
if(maximumRadius == -1) {
ap.setRadius(radius);
}
else {
ap.setRadius(Math.min(maximumRadius, radius));
}
}
if(allPOI.getJSONObject(i).getJSONObject("tags").has("pauseTimeMin") && allPOI.getJSONObject(i).getJSONObject("tags").has("pauseTimeMax")) {
ap.setPauseTime( allPOI.getJSONObject(i).getJSONObject("tags").getLong("pauseTimeMin"), allPOI.getJSONObject(i).getJSONObject("tags").getLong("pauseTimeMax"));
}
addAttractionPoint(ap);
}
}
catch (JSONException e) {
//This bar had no name defined, so there was an error. Not so bad
System.out.println(e);
}
}
}
} }
...@@ -21,26 +21,18 @@ ...@@ -21,26 +21,18 @@
package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction; package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import de.tud.kom.p2psim.api.topology.Topology;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.GPSCalculation; import de.tud.kom.p2psim.impl.topology.movement.modularosm.GPSCalculation;
import de.tud.kom.p2psim.impl.topology.util.PositionVector; import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
import de.tudarmstadt.maki.simonstrator.api.Binder;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
/** /**
* Generates attraction points out of real data from osm * Generates attraction points out of real data from osm
...@@ -49,150 +41,58 @@ import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractio ...@@ -49,150 +41,58 @@ import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractio
* @author Martin Hellwig * @author Martin Hellwig
* @version 1.0, 02.07.2015 * @version 1.0, 02.07.2015
*/ */
public class OnlineJSONAttractionGenerator implements IAttractionGenerator { public class OnlineJSONAttractionGenerator extends JSONAttractionGenerator {
private PositionVector worldDimensions;
private List<IAttractionPoint> attractionPoints;
private int maxNumberOfAttractionPoints;
private String placementJsonFile;
private String placementJsonPath;
private String amenity; private String amenity;
private double latLeft; //Values from -90 to 90; always smaller than latRight
private double latRight; //Values from -90 to 90
private double lonLeft; //Values from -180 to 180; Always smaller than lonRight
private double lonRight; //Values from -180 to 180
public OnlineJSONAttractionGenerator() {
this.worldDimensions = Binder.getComponentOrNull(Topology.class)
.getWorldDimensions();
attractionPoints = new LinkedList<IAttractionPoint>();
latLeft = GPSCalculation.getLatLower(); @XMLConfigurableConstructor({"numberOfAttractionPoints", "maximumRadius", "placementJsonPath", "amenity"})
latRight = GPSCalculation.getLatUpper(); public OnlineJSONAttractionGenerator(int numberOfAttractionPoints, double maximumRadius,
lonLeft = GPSCalculation.getLonLeft(); String placementJsonPath, String amenity) {
lonRight = GPSCalculation.getLonRight();
}
/** super(numberOfAttractionPoints, maximumRadius, placementJsonPath +
* Projects the gps coordinates in the given gps window to the world-coordinates given in world-dimensions "pois" +
* @param lat GPSCalculation.getLatCenter() +
* @param lon GPSCalculation.getLonCenter() +
* @return The projected position in world-dimensions GPSCalculation.getZoom() +
*/ amenity + ".json");
private PositionVector transformGPSWindowToOwnWorld(double lat, double lon) {
double x = worldDimensions.getX() * (lon - lonLeft)/(lonRight - lonLeft); this.amenity = amenity;
//Invert the y value, because in Java Swing we start drawing in the upper left corner instead in the lower left one }
double y = worldDimensions.getY() - worldDimensions.getY() * (lat - latLeft)/(latRight - latLeft);
return new PositionVector(x, y);
}
public void setNumberOfAttractionPoints(int numberOfAttractionPoints) {
this.maxNumberOfAttractionPoints = numberOfAttractionPoints;
}
@Override @Override
public List<IAttractionPoint> getAttractionPoints() { protected JSONArray getPOIArray() {
if(attractionPoints.size() == 0) { //Check if the file with same properties (same location) already exists
placementJsonFile = placementJsonPath + File f = new File(placementJsonFile);
"pois" + if(!f.exists()) {
GPSCalculation.getLatCenter() + String poiString = "";
GPSCalculation.getLonCenter() + JSONArray allPOI = null;
GPSCalculation.getZoom() + InputStream in;
amenity + ".json"; try {
in = new URL( "http://overpass-api.de/api/interpreter?data=%5Bout:json%5D;node%5Bamenity=" + amenity + "%5D%28"
//Check if the file with same properties (same location) already exists + GPSCalculation.getLatUpper() + "%2C" + GPSCalculation.getLonLeft() + "%2C"
File f = new File(placementJsonFile); + GPSCalculation.getLatLower() + "%2C" + GPSCalculation.getLonRight() + "%29%3Bout%3B" ).openStream();
if(!f.exists()) { poiString = IOUtils.toString(in);
String poiString = ""; //Save the json data in file
JSONArray allPOI = null; PrintWriter out = new PrintWriter(placementJsonFile);
InputStream in; out.print(poiString);
try { out.close();
in = new URL( "http://overpass-api.de/api/interpreter?data=%5Bout:json%5D;node%5Bamenity=" + amenity + "%5D%28" + latLeft + "%2C" + lonLeft + "%2C" + latRight + "%2C" + lonRight + "%29%3Bout%3B" ).openStream(); JSONObject poiData = new JSONObject(poiString);
poiString = IOUtils.toString(in); allPOI = poiData.getJSONArray("elements");
//Save the json data in file } catch (JSONException e) {
PrintWriter out = new PrintWriter(placementJsonFile); e.printStackTrace();
out.print(poiString); } catch (MalformedURLException e) {
out.close(); // TODO Auto-generated catch block
JSONObject poiData = new JSONObject(poiString); e.printStackTrace();
allPOI = poiData.getJSONArray("elements"); } catch (IOException e) {
} catch (JSONException e) { // TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(allPOI != null) {
for(int i = 0; i < allPOI.length(); i++) {
try {
String barname = allPOI.getJSONObject(i).getJSONObject("tags").getString("name");
double lat = allPOI.getJSONObject(i).getDouble("lat");
double lon = allPOI.getJSONObject(i).getDouble("lon");
if(lat > latLeft && lat < latRight &&
lon > lonLeft && lon < lonRight) {
attractionPoints.add(new AttractionPointImpl(barname, transformGPSWindowToOwnWorld(lat, lon)));
}
}
catch (JSONException e) {
//This bar had no name defined, so there was an error. Not so bad
}
}
}
} }
else {
//File already exists, now we have to parse this file return allPOI;
String poiString = "";
JSONArray allPOI = null;
FileInputStream inputStream;
try {
inputStream = new FileInputStream(placementJsonFile);
poiString = IOUtils.toString(inputStream);
JSONObject poiData = new JSONObject(poiString);
allPOI = poiData.getJSONArray("elements");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
if(allPOI != null) {
for(int i = 0; i < allPOI.length(); i++) {
try {
String barname = allPOI.getJSONObject(i).getJSONObject("tags").getString("name");
double lat = allPOI.getJSONObject(i).getDouble("lat");
double lon = allPOI.getJSONObject(i).getDouble("lon");
attractionPoints.add(new AttractionPointImpl(barname, transformGPSWindowToOwnWorld(lat, lon)));
}
catch (JSONException e) {
//This bar had no name defined, so there was an error. Not so bad
}
}
}
}
}
if(maxNumberOfAttractionPoints == 0) maxNumberOfAttractionPoints = Integer.MAX_VALUE;
List<IAttractionPoint> result = new LinkedList<IAttractionPoint>();
for (int i = 0; (i < attractionPoints.size() && i < maxNumberOfAttractionPoints); i++) {
result.add(attractionPoints.get(i));
} }
return result; else {
} return super.getPOIArray();
}
public void setAmenity(String amenity) {
this.amenity = amenity;
}
public void setPlacementJsonPath(String placementJsonPath) {
this.placementJsonPath = placementJsonPath;
} }
} }
...@@ -44,12 +44,10 @@ import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor; ...@@ -44,12 +44,10 @@ import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
* @author Christoph Muenker, Julian Zobel * @author Christoph Muenker, Julian Zobel
* @version 1.21, 12 2018 * @version 1.21, 12 2018
*/ */
public class RandomAttractionGenerator implements IAttractionGenerator { public class RandomAttractionGenerator extends AbstractAttractionProvider {
private Random rand; private Random rand;
private PositionVector worldDimension;
private int numberOfAttractionPoints; private int numberOfAttractionPoints;
private boolean numberOfAPsSet = false; private boolean numberOfAPsSet = false;
...@@ -62,9 +60,9 @@ public class RandomAttractionGenerator implements IAttractionGenerator { ...@@ -62,9 +60,9 @@ public class RandomAttractionGenerator implements IAttractionGenerator {
@XMLConfigurableConstructor({"numberOfAttractionPoints", "maximumRadius", "minimumRadius", "minimumDistance"}) @XMLConfigurableConstructor({"numberOfAttractionPoints", "maximumRadius", "minimumRadius", "minimumDistance"})
public RandomAttractionGenerator(int numberOfAttractionPoints, double maximumRadius, double minimumRadius, double minimumDistance) { public RandomAttractionGenerator(int numberOfAttractionPoints, double maximumRadius, double minimumRadius, double minimumDistance) {
this.rand = Randoms.getRandom(RandomAttractionGenerator.class); super();
this.worldDimension = Binder.getComponentOrNull(Topology.class)
.getWorldDimensions(); this.rand = Randoms.getRandom(RandomAttractionGenerator.class);
if (numberOfAttractionPoints <= 0) { if (numberOfAttractionPoints <= 0) {
throw new ConfigurationException( throw new ConfigurationException(
"NumberOfAttractionPoints should be at least 1!"); "NumberOfAttractionPoints should be at least 1!");
...@@ -74,25 +72,23 @@ public class RandomAttractionGenerator implements IAttractionGenerator { ...@@ -74,25 +72,23 @@ public class RandomAttractionGenerator implements IAttractionGenerator {
this.maximumRadius = maximumRadius; this.maximumRadius = maximumRadius;
this.minimumRadius = minimumRadius; this.minimumRadius = minimumRadius;
this.minimumDistance = minimumDistance; this.minimumDistance = minimumDistance;
attractionPoints.clear();
createAttractionPoints();
} }
@Override @Override
public List<IAttractionPoint> getAttractionPoints() { public List<AttractionPoint> getAttractionPoints() {
if (!numberOfAPsSet) { if (!numberOfAPsSet) {
throw new ConfigurationException( throw new ConfigurationException(
"Number of Attraction Points is not set in RandomAttractionGenerator!"); "Number of Attraction Points is not set in RandomAttractionGenerator!");
} }
if(attractionPoints.isEmpty()) if(super.getAttractionPoints().isEmpty())
createAttractionPoints(); createAttractionPoints();
return attractionPoints; return super.getAttractionPoints();
} }
private void createAttractionPoints() { private void createAttractionPoints() {
List<IAttractionPoint> result = new LinkedList<IAttractionPoint>(); List<AttractionPoint> result = new LinkedList<AttractionPoint>();
// make a break counter to prevent more than 10 iterations and an infinity loop in general. // make a break counter to prevent more than 10 iterations and an infinity loop in general.
int c = 0; int c = 0;
...@@ -130,15 +126,13 @@ public class RandomAttractionGenerator implements IAttractionGenerator { ...@@ -130,15 +126,13 @@ public class RandomAttractionGenerator implements IAttractionGenerator {
radius = minimumRadius; radius = minimumRadius;
} }
IAttractionPoint aPoint = new AttractionPointImpl("AP-"+i, posVec); AttractionPoint aPoint = new AttractionPoint("AP-"+i, posVec);
aPoint.setRadius(radius); aPoint.setRadius(radius);
c = 0; c = 0;
result.add(aPoint); result.add(aPoint);
} }
attractionPoints.clear(); for (AttractionPoint ap : result) {
for (IAttractionPoint ap : result) {
addAttractionPoint(ap); addAttractionPoint(ap);
} }
} }
......
...@@ -20,18 +20,15 @@ ...@@ -20,18 +20,15 @@
package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction; package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction;
import java.util.List;
import java.util.Random; import java.util.Random;
import de.tud.kom.p2psim.api.scenario.ConfigurationException; import de.tud.kom.p2psim.api.scenario.ConfigurationException;
import de.tud.kom.p2psim.api.topology.Topology;
import de.tud.kom.p2psim.impl.topology.util.PositionVector; import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.Binder;
import de.tudarmstadt.maki.simonstrator.api.Event; import de.tudarmstadt.maki.simonstrator.api.Event;
import de.tudarmstadt.maki.simonstrator.api.EventHandler; import de.tudarmstadt.maki.simonstrator.api.EventHandler;
import de.tudarmstadt.maki.simonstrator.api.Monitor; import de.tudarmstadt.maki.simonstrator.api.Monitor;
import de.tudarmstadt.maki.simonstrator.api.Monitor.Level; import de.tudarmstadt.maki.simonstrator.api.Monitor.Level;
import de.tudarmstadt.maki.simonstrator.api.Randoms; import de.tudarmstadt.maki.simonstrator.api.Randoms;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor; import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/** /**
...@@ -46,12 +43,10 @@ import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor; ...@@ -46,12 +43,10 @@ import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
* @author Julian Zobel * @author Julian Zobel
* @version 1.0, March 2019 * @version 1.0, March 2019
*/ */
public class RandomDynamicAttractionGenerator implements IAttractionGenerator { public class RandomDynamicAttractionGenerator extends AbstractAttractionProvider {
private Random rand; private Random rand;
private PositionVector worldDimension;
private int minNumberOfAttractionPoints; private int minNumberOfAttractionPoints;
private int maxNumberOfAttractionPoints; private int maxNumberOfAttractionPoints;
...@@ -70,9 +65,7 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator { ...@@ -70,9 +65,7 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
double minimumDistance) { double minimumDistance) {
this.rand = Randoms.getRandom(RandomDynamicAttractionGenerator.class); this.rand = Randoms.getRandom(RandomDynamicAttractionGenerator.class);
this.worldDimension = Binder.getComponentOrNull(Topology.class)
.getWorldDimensions();
if (minNumberOfAttractionPoints <= 0) { if (minNumberOfAttractionPoints <= 0) {
throw new ConfigurationException( throw new ConfigurationException(
"NumberOfAttractionPoints should be at least 1!"); "NumberOfAttractionPoints should be at least 1!");
...@@ -91,26 +84,15 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator { ...@@ -91,26 +84,15 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
this.minDynamicIntervall = minDynamicIntervall; this.minDynamicIntervall = minDynamicIntervall;
this.maxDynamicIntervall = maxDynamicIntervall; this.maxDynamicIntervall = maxDynamicIntervall;
attractionPoints.clear();
updateAttractionPoints(); updateAttractionPoints();
} }
@Override
public List<IAttractionPoint> getAttractionPoints() {
return attractionPoints;
}
/**
*
* @return an integer representing a randomly chosen number of attraction points within the allowed range of numbers
*/
private int randomNumberOfAttractionPoints() { private int randomNumberOfAttractionPoints() {
return minNumberOfAttractionPoints + rand.nextInt((maxNumberOfAttractionPoints - minNumberOfAttractionPoints) + 1); return minNumberOfAttractionPoints + rand.nextInt((maxNumberOfAttractionPoints - minNumberOfAttractionPoints) + 1);
} }
private void scheduleDynamicEvent(AttractionPoint attractionPoint) {
private void scheduleDynamicEvent(IAttractionPoint attractionPoint) {
long r = (long) (rand.nextDouble() * (maxDynamicIntervall - minDynamicIntervall)) + minDynamicIntervall; long r = (long) (rand.nextDouble() * (maxDynamicIntervall - minDynamicIntervall)) + minDynamicIntervall;
...@@ -118,7 +100,7 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator { ...@@ -118,7 +100,7 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
@Override @Override
public void eventOccurred(Object content, int type) { public void eventOccurred(Object content, int type) {
// maybe was already removed... // maybe was already removed...
if(attractionPoints.contains(attractionPoint)) { if(hasAttractionPoint(attractionPoint)) {
removeAttractionPoint(attractionPoint); removeAttractionPoint(attractionPoint);
updateAttractionPoints(); updateAttractionPoints();
} }
...@@ -128,29 +110,30 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator { ...@@ -128,29 +110,30 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
protected void updateAttractionPoints() { protected void updateAttractionPoints() {
int numberOfAttractionPoints = randomNumberOfAttractionPoints(); int numberOfAttractionPoints = randomNumberOfAttractionPoints();
int currentSize = getAttractionPoints().size();
// do nothing if this is the required amount of attraction points // do nothing if this is the required amount of attraction points
if(numberOfAttractionPoints == attractionPoints.size()) { if(numberOfAttractionPoints == currentSize) {
return; return;
} }
// remove until this number fits // remove until this number fits
else if(numberOfAttractionPoints < attractionPoints.size()) { else if(numberOfAttractionPoints < currentSize) {
int deltaAP = attractionPoints.size() - numberOfAttractionPoints; int deltaAP = currentSize - numberOfAttractionPoints;
for(int i = 0; i < deltaAP; i++) { for(int i = 0; i < deltaAP; i++) {
int random = rand.nextInt(attractionPoints.size()); int random = rand.nextInt(currentSize);
removeAttractionPoint(attractionPoints.get(random)); removeAttractionPoint(getAttractionPoints().get(random));
} }
return; return;
} }
// add more attraction points until it fits // add more attraction points until it fits
else { else {
int deltaAP = numberOfAttractionPoints - attractionPoints.size(); int deltaAP = numberOfAttractionPoints - currentSize;
for(int i = 0; i < deltaAP; i++) { for(int i = 0; i < deltaAP; i++) {
IAttractionPoint newAP = createAttractionPoint(); AttractionPoint newAP = createAttractionPoint();
scheduleDynamicEvent(newAP); scheduleDynamicEvent(newAP);
addAttractionPoint(newAP); addAttractionPoint(newAP);
} }
...@@ -162,7 +145,7 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator { ...@@ -162,7 +145,7 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
* *
* @return * @return
*/ */
private IAttractionPoint createAttractionPoint() { private AttractionPoint createAttractionPoint() {
// make a break counter to prevent more than 100 iterations and an infinity loop in general. // make a break counter to prevent more than 100 iterations and an infinity loop in general.
int c = 100; int c = 100;
...@@ -181,7 +164,7 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator { ...@@ -181,7 +164,7 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
} }
// if within world dimensions, continue checking against other attraction points // if within world dimensions, continue checking against other attraction points
for (IAttractionPoint ap : attractionPoints) { for (AttractionPoint ap : getAttractionPoints()) {
// if this point is closer than the given minimum distance to another point, or the radii of the points would overlap, // if this point is closer than the given minimum distance to another point, or the radii of the points would overlap,
// or if the radius would exceed the simulation area // or if the radius would exceed the simulation area
// then discard this attraction point and create a new one // then discard this attraction point and create a new one
...@@ -195,12 +178,12 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator { ...@@ -195,12 +178,12 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
radius = 0; radius = 0;
} }
IAttractionPoint aPoint = new AttractionPointImpl("AP-" + rand.nextInt(), posVec); AttractionPoint aPoint = new AttractionPoint("AP-" + rand.nextInt(), posVec);
aPoint.setRadius(radius); aPoint.setRadius(radius);
return aPoint; return aPoint;
} }
IAttractionPoint ap = new AttractionPointImpl("AP-ERROR", new PositionVector(worldDimension.getX() / 2, worldDimension.getY() / 2)); AttractionPoint ap = new AttractionPoint("AP-ERROR", new PositionVector(worldDimension.getX() / 2, worldDimension.getY() / 2));
ap.setRadius(0); ap.setRadius(0);
ap.setWeight(0); ap.setWeight(0);
...@@ -208,13 +191,10 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator { ...@@ -208,13 +191,10 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
return ap; return ap;
} }
private PositionVector createPosVec() { private PositionVector createPosVec() {
double x = rand.nextDouble() * worldDimension.getX(); double x = rand.nextDouble() * worldDimension.getX();
double y = rand.nextDouble() * worldDimension.getY(); double y = rand.nextDouble() * worldDimension.getY();
return new PositionVector(x, y); return new PositionVector(x, y);
} }
} }
...@@ -23,7 +23,7 @@ package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction; ...@@ -23,7 +23,7 @@ package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction;
import de.tud.kom.p2psim.impl.topology.util.PositionVector; import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor; import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
public class TemporalAttractionPoint extends BasicAttractionPoint { public class TemporalAttractionPoint extends AttractionPoint {
private long placementTime; private long placementTime;
private long removalTime; private long removalTime;
......
...@@ -20,33 +20,21 @@ ...@@ -20,33 +20,21 @@
package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction; package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction;
import java.util.List;
import de.tud.kom.p2psim.api.topology.Topology;
import de.tud.kom.p2psim.impl.topology.util.PositionVector; import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.Binder;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor; import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/** /**
* Implementation of the interface {@link AttractionGenerator}.
*
* Generates the given number of {@link IAttractionPoint}s and sets the
* position randomly within the world dimensions.
*
* @author Julian Zobel * @author Julian Zobel
* @version 1.0, Nov 2018 * @version 1.0, Nov 2018
*/ */
public class TwoPointFixedAttractionGenerator implements IAttractionGenerator { public class TwoPointFixedAttractionGenerator extends AbstractAttractionProvider {
private PositionVector worldDimension;
private double x1, x2, y1, y2; private double x1, x2, y1, y2;
@XMLConfigurableConstructor({ "x1", "y1", "x2", "y2"}) @XMLConfigurableConstructor({ "x1", "y1", "x2", "y2"})
public TwoPointFixedAttractionGenerator(double x1, double y1, double x2, double y2) { public TwoPointFixedAttractionGenerator(double x1, double y1, double x2, double y2) {
this.worldDimension = Binder.getComponentOrNull(Topology.class) super();
.getWorldDimensions();
this.x1 = x1; this.x1 = x1;
this.y1 = y1; this.y1 = y1;
...@@ -55,27 +43,19 @@ public class TwoPointFixedAttractionGenerator implements IAttractionGenerator { ...@@ -55,27 +43,19 @@ public class TwoPointFixedAttractionGenerator implements IAttractionGenerator {
createAttractionPoints(); createAttractionPoints();
} }
@Override
public List<IAttractionPoint> getAttractionPoints() {
if(attractionPoints.isEmpty())
createAttractionPoints();
return attractionPoints;
}
private void createAttractionPoints() { private void createAttractionPoints() {
PositionVector p1 = new PositionVector(x1, y1); PositionVector p1 = new PositionVector(x1, y1);
IAttractionPoint ap1 = new AttractionPointImpl("AP1", p1); AttractionPoint ap1 = new AttractionPoint("AP1", p1);
ap1.setRadius(100); ap1.setRadius(100);
attractionPoints.add(ap1); addAttractionPoint(ap1);
PositionVector p2 = new PositionVector(x2, y2); PositionVector p2 = new PositionVector(x2, y2);
IAttractionPoint ap2 = new AttractionPointImpl("AP2", p2); AttractionPoint ap2 = new AttractionPoint("AP2", p2);
ap2.setRadius(100); ap2.setRadius(100);
attractionPoints.add(ap2); addAttractionPoint(ap2);
} }
......
...@@ -30,7 +30,7 @@ import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator; ...@@ -30,7 +30,7 @@ import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.ISocialGroupMovementAnalyzer; import de.tud.kom.p2psim.impl.topology.movement.modularosm.ISocialGroupMovementAnalyzer;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.SocialGroupMovementModel; import de.tud.kom.p2psim.impl.topology.movement.modularosm.SocialGroupMovementModel;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.BasicAttractionPoint; import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.BasicAttractionPoint;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionGenerator; import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionProvider;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.hostcount.HostAtAttractionPointCounter; import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.hostcount.HostAtAttractionPointCounter;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.SocialMovementGroup; import de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.SocialMovementGroup;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.MovementGroupContainer; import de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.MovementGroupContainer;
...@@ -293,7 +293,7 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior { ...@@ -293,7 +293,7 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior {
IAttractionPoint result = null; IAttractionPoint result = null;
long maxDuration = 0; long maxDuration = 0;
for(IAttractionPoint ap : IAttractionGenerator.attractionPoints) { for(IAttractionPoint ap : movementModel.getAllAttractionPoints()) {
for(SimLocationActuator host : HostAtAttractionPointCounter.getHostsOfAttractionPoint(ap, movementModel.getAllLocationActuators())) { for(SimLocationActuator host : HostAtAttractionPointCounter.getHostsOfAttractionPoint(ap, movementModel.getAllLocationActuators())) {
INodeID id = host.getHost().getId(); INodeID id = host.getHost().getId();
long duration = stayDuration.get(id).getA(); long duration = stayDuration.get(id).getA();
...@@ -311,7 +311,7 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior { ...@@ -311,7 +311,7 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior {
protected IAttractionPoint getAttractionPointWithMostHosts() { protected IAttractionPoint getAttractionPointWithMostHosts() {
IAttractionPoint apCandidate = null; IAttractionPoint apCandidate = null;
int size = 0; int size = 0;
for(IAttractionPoint ap : IAttractionGenerator.attractionPoints) { for(IAttractionPoint ap : movementModel.getAllAttractionPoints()) {
int numberOfHostsInAP = HostAtAttractionPointCounter.getHostCountOfAttractionPoint(ap, movementModel.getAllLocationActuators()); int numberOfHostsInAP = HostAtAttractionPointCounter.getHostCountOfAttractionPoint(ap, movementModel.getAllLocationActuators());
if(numberOfHostsInAP > size) { if(numberOfHostsInAP > size) {
apCandidate = ap; apCandidate = ap;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment