Commit 02dda393 authored by Nils Richerzhagen's avatar Nils Richerzhagen
Browse files

Merge branch 'master' into 'nr/master-debug'

Merge Master into nr/master-debug



See merge request !21
parents c9a213fb b1ae37ae
......@@ -23,7 +23,6 @@ package de.tud.kom.p2psim.impl.network.modular;
import java.util.Collection;
import de.tud.kom.p2psim.api.analyzer.MessageAnalyzer.Reason;
import de.tud.kom.p2psim.api.common.Position;
import de.tud.kom.p2psim.api.common.SimHost;
import de.tud.kom.p2psim.api.network.BandwidthImpl;
import de.tud.kom.p2psim.api.network.NetMessage;
......@@ -54,6 +53,7 @@ import de.tudarmstadt.maki.simonstrator.api.Monitor;
import de.tudarmstadt.maki.simonstrator.api.Monitor.Level;
import de.tudarmstadt.maki.simonstrator.api.component.network.Bandwidth;
import de.tudarmstadt.maki.simonstrator.api.component.network.NetID;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
/**
* <p>
......@@ -113,7 +113,8 @@ public class ModularNetLayer extends AbstractNetLayer {
* Device-Type of this Host
*/
ModularNetLayer(SimHost host, AbstractModularSubnet subnet,
BandwidthImpl maxBW, NetMeasurementDB.Host hostMeta, Position position,
BandwidthImpl maxBW, NetMeasurementDB.Host hostMeta,
Location position,
IPv4NetID id) {
super(host, id, maxBW, position, hostMeta);
this.subnet = subnet;
......
......@@ -21,9 +21,9 @@
package de.tud.kom.p2psim.impl.network.modular.st;
import de.tud.kom.p2psim.api.common.Position;
import de.tud.kom.p2psim.api.common.SimHost;
import de.tud.kom.p2psim.impl.network.modular.db.NetMeasurementDB;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
/**
* This strategy determines an abstract network position of a given host
......@@ -43,7 +43,7 @@ public interface PositioningStrategy extends ModNetLayerStrategy {
* @param hostMeta
* @return
*/
public Position getPosition(
public Location getPosition(
SimHost host,
NetMeasurementDB db,
NetMeasurementDB.Host hostMeta);
......
......@@ -30,7 +30,8 @@ public class FootprintLatency implements LatencyStrategy {
throw new IllegalArgumentException("FootprintLatency is incompatible with the NetMeasurementDB");
}
double distance = nlSender.getNetPosition().getDistance(nlReceiver.getNetPosition());
double distance = nlSender.getNetPosition()
.distanceTo(nlReceiver.getNetPosition());
return (staticPart + Math.round(geoDistFactor * distance))
* Time.MILLISECOND;
......
......@@ -19,12 +19,11 @@
*/
package de.tud.kom.p2psim.impl.network.modular.st.latency;
package de.tud.kom.p2psim.impl.network.modular.st.latency;
import java.util.Random;
import de.tud.kom.p2psim.api.common.Position;
import de.tud.kom.p2psim.api.network.NetLayer;
import de.tud.kom.p2psim.api.network.NetMessage;
import de.tud.kom.p2psim.impl.network.AbstractNetLayer;
......@@ -33,50 +32,51 @@ import de.tud.kom.p2psim.impl.network.modular.st.LatencyStrategy;
import de.tud.kom.p2psim.impl.network.simple.SimpleSubnet;
import de.tudarmstadt.maki.simonstrator.api.Randoms;
import de.tudarmstadt.maki.simonstrator.api.Time;
/**
* This model is abstracting the details of the four lower OSI layers (UDP and
* TCP) from the end-to-end connections between peers although important network
* characteristics, like the geographical distance between peers, the processing
* delay of intermediate systems, signal propagation, congestions,
* retransmission and packet loss are incorporated into it. The message delay is
* calculated using the following formula:
*
* Message delay = f * (df + dist/v)
*
* where dist - describes the geographical distance between the start and the
* end point of the transmission, df - represents the processing delay of the
* intermediate systems, v - stands for the speed of the signal propagation
* through the transmission medium, and f - is a variable part which
* encapsulates the retransmission, congestion.
*
* @author Sebastian Kaune
*
*/
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
/**
* This model is abstracting the details of the four lower OSI layers (UDP and
* TCP) from the end-to-end connections between peers although important network
* characteristics, like the geographical distance between peers, the processing
* delay of intermediate systems, signal propagation, congestions,
* retransmission and packet loss are incorporated into it. The message delay is
* calculated using the following formula:
*
* Message delay = f * (df + dist/v)
*
* where dist - describes the geographical distance between the start and the
* end point of the transmission, df - represents the processing delay of the
* intermediate systems, v - stands for the speed of the signal propagation
* through the transmission medium, and f - is a variable part which
* encapsulates the retransmission, congestion.
*
* @author Sebastian Kaune
*
*/
public class SimpleLatencyModel implements LatencyStrategy {
private Random rnd = Randoms.getRandom(SimpleLatencyModel.class);
/**
* Speed in kilometer per second
*/
private final int signalSpeed = 100000;
/**
* Earth circumference in kilometres
*/
private final int earth_circumference = 40000;
private final double relSignalSpeed;
/**
* Constructor
*
*/
public SimpleLatencyModel() {
relSignalSpeed = signalSpeed * (SimpleSubnet.SUBNET_WIDTH / earth_circumference);
}
private Random rnd = Randoms.getRandom(SimpleLatencyModel.class);
/**
* Speed in kilometer per second
*/
private final int signalSpeed = 100000;
/**
* Earth circumference in kilometres
*/
private final int earth_circumference = 40000;
private final double relSignalSpeed;
/**
* Constructor
*
*/
public SimpleLatencyModel() {
relSignalSpeed = signalSpeed * (SimpleSubnet.SUBNET_WIDTH / earth_circumference);
}
/**
* Gets the distance.
*
......@@ -84,12 +84,12 @@ public class SimpleLatencyModel implements LatencyStrategy {
* @param receiver the receiver
* @return the distance
*/
public double getDistance(NetLayer sender, NetLayer receiver) {
Position ps = sender.getNetPosition();
Position pr = receiver.getNetPosition();
return ps.getDistance(pr);
}
public double getDistance(NetLayer sender, NetLayer receiver) {
Location ps = sender.getNetPosition();
Location pr = receiver.getNetPosition();
return ps.distanceTo(pr);
}
/**
* Calc static delay.
*
......@@ -97,9 +97,9 @@ public class SimpleLatencyModel implements LatencyStrategy {
* @param distance the distance
* @return the double
*/
public double calcStaticDelay(NetLayer receiver, double distance) {
int df = Math.abs(receiver.hashCode() % 31);
return (df + (distance / relSignalSpeed) * 1000);
public double calcStaticDelay(NetLayer receiver, double distance) {
int df = Math.abs(receiver.hashCode() % 31);
return (df + (distance / relSignalSpeed) * 1000);
}
@Override
......@@ -119,6 +119,6 @@ public class SimpleLatencyModel implements LatencyStrategy {
@Override
public void writeBackToXML(BackWriter bw) {
// None.
}
}
}
\ No newline at end of file
......@@ -19,36 +19,36 @@
*/
package de.tud.kom.p2psim.impl.network.modular.st.latency;
import de.tud.kom.p2psim.api.common.Position;
package de.tud.kom.p2psim.impl.network.modular.st.latency;
import de.tud.kom.p2psim.api.network.NetMessage;
import de.tud.kom.p2psim.impl.network.AbstractNetLayer;
import de.tud.kom.p2psim.impl.network.modular.db.NetMeasurementDB;
import de.tud.kom.p2psim.impl.network.modular.st.LatencyStrategy;
import de.tudarmstadt.maki.simonstrator.api.Time;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
public class SimpleStaticLatencyModel implements LatencyStrategy {
protected long propagationDelay = 10; // 10 ms
public SimpleStaticLatencyModel(long staticLatency) {
this.setLatency(staticLatency);
}
/**
* Sets the static latency which is expected in millseconds. That is, if
* <code>staticLatency</code> is set to 10, the simulator will translate it
* into simulation units as follows: staticLatency *
* Simulator.MILLISECOND_UNIT.
*
* @param staticLatency
* the static latency in milliseconds.
*/
public void setLatency(long staticLatency) {
this.propagationDelay = staticLatency;
protected long propagationDelay = 10; // 10 ms
public SimpleStaticLatencyModel(long staticLatency) {
this.setLatency(staticLatency);
}
/**
* Sets the static latency which is expected in millseconds. That is, if
* <code>staticLatency</code> is set to 10, the simulator will translate it
* into simulation units as follows: staticLatency *
* Simulator.MILLISECOND_UNIT.
*
* @param staticLatency
* the static latency in milliseconds.
*/
public void setLatency(long staticLatency) {
this.propagationDelay = staticLatency;
}
/**
......@@ -60,13 +60,13 @@ public class SimpleStaticLatencyModel implements LatencyStrategy {
*/
protected double getDistance(AbstractNetLayer nlSender, AbstractNetLayer nlReceiver){
Position ps = nlSender.getNetPosition();
Position pr = nlReceiver.getNetPosition();
Location ps = nlSender.getNetPosition();
Location pr = nlReceiver.getNetPosition();
return ps.getDistance(pr);
return ps.distanceTo(pr);
}
/* (non-Javadoc)
* @see de.tud.kom.p2psim.impl.network.modular.st.LatencyStrategy#getMessagePropagationDelay(de.tud.kom.p2psim.api.network.NetMessage, de.tud.kom.p2psim.impl.network.AbstractNetLayer, de.tud.kom.p2psim.impl.network.AbstractNetLayer, de.tud.kom.p2psim.impl.network.modular.db.NetMeasurementDB)
......@@ -85,6 +85,6 @@ public class SimpleStaticLatencyModel implements LatencyStrategy {
@Override
public void writeBackToXML(BackWriter bw) {
bw.writeTime("propagationDelay", propagationDelay);
}
}
}
}
......@@ -9,12 +9,12 @@ import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Random;
import de.tud.kom.p2psim.api.common.Position;
import de.tud.kom.p2psim.api.common.SimHost;
import de.tud.kom.p2psim.impl.network.modular.db.NetMeasurementDB;
import de.tud.kom.p2psim.impl.network.modular.st.PositioningStrategy;
import de.tud.kom.p2psim.impl.util.positioning.GeoSpherePosition;
import de.tudarmstadt.maki.simonstrator.api.Randoms;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
public class AppJobberPositioning implements PositioningStrategy {
......@@ -25,7 +25,7 @@ public class AppJobberPositioning implements PositioningStrategy {
private Random rnd = Randoms.getRandom(AppJobberPositioning.class);
@Override
public Position getPosition(
public Location getPosition(
SimHost host,
NetMeasurementDB db,
NetMeasurementDB.Host hostMeta) {
......
......@@ -24,12 +24,12 @@ package de.tud.kom.p2psim.impl.network.modular.st.positioning;
import java.util.List;
import java.util.Vector;
import de.tud.kom.p2psim.api.common.Position;
import de.tud.kom.p2psim.api.common.SimHost;
import de.tud.kom.p2psim.impl.network.modular.common.GNPToolkit;
import de.tud.kom.p2psim.impl.network.modular.db.NetMeasurementDB;
import de.tud.kom.p2psim.impl.network.modular.st.PositioningStrategy;
import de.tud.kom.p2psim.impl.topology.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
/**
* Applies the (virtual) GNP position as the host's position
......@@ -40,7 +40,7 @@ import de.tud.kom.p2psim.impl.topology.PositionVector;
public class GNPPositioning implements PositioningStrategy {
@Override
public Position getPosition(SimHost host, NetMeasurementDB db,
public Location getPosition(SimHost host, NetMeasurementDB db,
NetMeasurementDB.Host hostMeta) {
if (hostMeta == null)
......@@ -51,7 +51,7 @@ public class GNPPositioning implements PositioningStrategy {
}
public static class GNPPosition extends PositionVector implements Position {
public static class GNPPosition extends PositionVector {
private List<Double> coords;
......@@ -63,7 +63,7 @@ public class GNPPositioning implements PositioningStrategy {
}
@Override
public double getDistance(Position netPosition) {
public double distanceTo(Location netPosition) {
if (!(netPosition instanceof PositionVector))
throw new AssertionError(
"Can not calculate distances between different position classes: "
......
......@@ -21,12 +21,12 @@
package de.tud.kom.p2psim.impl.network.modular.st.positioning;
import de.tud.kom.p2psim.api.common.Position;
import de.tud.kom.p2psim.api.common.SimHost;
import de.tud.kom.p2psim.impl.network.modular.common.GeoToolkit;
import de.tud.kom.p2psim.impl.network.modular.db.NetMeasurementDB;
import de.tud.kom.p2psim.impl.network.modular.st.PositioningStrategy;
import de.tud.kom.p2psim.impl.topology.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
/**
* Applies a geographical position as defined by the GeoIP project.
......@@ -49,8 +49,7 @@ public class GeographicalPositioning implements PositioningStrategy {
}
public class GeographicalPosition extends PositionVector implements
Position {
public class GeographicalPosition extends PositionVector {
private double latitude;
private double longitude;
......@@ -70,7 +69,7 @@ public class GeographicalPositioning implements PositioningStrategy {
*
*/
@Override
public double getDistance(Position netPosition) {
public double distanceTo(Location netPosition) {
if (!(netPosition instanceof PositionVector))
throw new AssertionError(
"Can not calculate the distance between two different position classes: "
......@@ -80,12 +79,6 @@ public class GeographicalPositioning implements PositioningStrategy {
return GeoToolkit.getDistance(this.latitude, this.longitude,
other.getEntry(1), other.getEntry(0));
}
@Override
public double getAngle(Position target) {
throw new AssertionError(
"getAngle is not defined for this Position-Type");
}
@Override
public int getTransmissionSize() {
......
......@@ -20,11 +20,11 @@
package de.tud.kom.p2psim.impl.network.modular.st.positioning;
import de.tud.kom.p2psim.api.common.Position;
import de.tud.kom.p2psim.api.common.SimHost;
import de.tud.kom.p2psim.impl.network.modular.db.NetMeasurementDB;
import de.tud.kom.p2psim.impl.network.modular.st.PositioningStrategy;
import de.tud.kom.p2psim.impl.topology.placement.PositionDistribution;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
/**
* Positioning on a 2D-Plane, used for all Movement-Enabled Routing-Scenarios
......@@ -42,7 +42,7 @@ public class PlanePositioning implements PositioningStrategy {
}
@Override
public Position getPosition(
public Location getPosition(
SimHost host,
NetMeasurementDB db,
de.tud.kom.p2psim.impl.network.modular.db.NetMeasurementDB.Host hostMeta) {
......
......@@ -22,13 +22,13 @@ package de.tud.kom.p2psim.impl.network.modular.st.positioning;
import java.util.Random;
import de.tud.kom.p2psim.api.common.Position;
import de.tud.kom.p2psim.api.common.SimHost;
import de.tud.kom.p2psim.impl.network.modular.db.NetMeasurementDB;
import de.tud.kom.p2psim.impl.network.modular.st.PositioningStrategy;
import de.tud.kom.p2psim.impl.network.simple.SimpleSubnet;
import de.tud.kom.p2psim.impl.topology.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.Randoms;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
/**
* Implementation of the <code>NetPosition</code> interface representing a two
......@@ -48,7 +48,7 @@ public class SimpleEuclidianPositioning implements PositioningStrategy {
* @see de.tud.kom.p2psim.impl.network.modular.st.PositioningStrategy#getPosition(de.tud.kom.p2psim.api.common.Host, de.tud.kom.p2psim.impl.network.modular.db.NetMeasurementDB, de.tud.kom.p2psim.impl.network.modular.db.NetMeasurementDB.Host)
*/
@Override
public Position getPosition(
public Location getPosition(
SimHost host,
NetMeasurementDB db,
NetMeasurementDB.Host hostMeta) {
......@@ -59,7 +59,7 @@ public class SimpleEuclidianPositioning implements PositioningStrategy {
}
public class SimpleEuclidianPosition extends PositionVector implements Position {
public class SimpleEuclidianPosition extends PositionVector {
private double xPos;
......@@ -93,7 +93,8 @@ public class SimpleEuclidianPositioning implements PositioningStrategy {
* de.tud.kom.p2psim.api.network.NetPosition#getDistance(de.tud.kom.
* p2psim .api.network.NetPosition)
*/
public double getDistance(Position ep) {
@Override
public double distanceTo(Location ep) {
double xDiff = 0;
double yDiff = 0;
SimpleEuclidianPosition point = (SimpleEuclidianPosition) ep;
......@@ -118,11 +119,6 @@ public class SimpleEuclidianPositioning implements PositioningStrategy {
return Math.pow(Math.pow(xDiff, 2) + Math.pow(yDiff, 2), 0.5);
}
@Override
public double getAngle(Position target) {
throw new AssertionError("getAngle is not defined for this Position-Type");
}
@Override
public int getTransmissionSize() {
return 16; // 2 * double
......
......@@ -23,12 +23,12 @@ package de.tud.kom.p2psim.impl.network.modular.st.positioning;
import java.util.Random;
import de.tud.kom.p2psim.api.common.Position;
import de.tud.kom.p2psim.api.common.SimHost;
import de.tud.kom.p2psim.impl.network.modular.db.NetMeasurementDB;
import de.tud.kom.p2psim.impl.network.modular.st.PositioningStrategy;
import de.tud.kom.p2psim.impl.topology.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.Randoms;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
/**
* Applies a uniformly-distributed random position on a 2-or multi-dimensional
......@@ -48,7 +48,7 @@ public class TorusPositioning implements PositioningStrategy {
Random rand = Randoms.getRandom(TorusPosition.class);
@Override
public Position getPosition(SimHost host, NetMeasurementDB db,
public Location getPosition(SimHost host, NetMeasurementDB db,
NetMeasurementDB.Host hostMeta) {
double[] rawPos = getRawTorusPositionFor(host);
......@@ -93,7 +93,7 @@ public class TorusPositioning implements PositioningStrategy {
this.halfTorusDimensionSize = torusDimensionSize * 0.5d;
}
public class TorusPosition extends PositionVector implements Position {
public class TorusPosition extends PositionVector {
TorusPosition(double[] rawPos) {
......@@ -101,7 +101,7 @@ public class TorusPositioning implements PositioningStrategy {
}
@Override
public double getDistance(Position netPosition) {
public double distanceTo(Location netPosition) {
if (!(netPosition instanceof PositionVector))
throw new AssertionError(
"Can not calculate distances between different position classes: "
......
......@@ -28,7 +28,6 @@ import java.util.Map;
import de.tud.kom.p2psim.api.analyzer.ConnectivityAnalyzer;
import de.tud.kom.p2psim.api.analyzer.MessageAnalyzer.Reason;
import de.tud.kom.p2psim.api.analyzer.NetlayerAnalyzer;
import de.tud.kom.p2psim.api.common.Position;
import de.tud.kom.p2psim.api.common.SimHost;
import de.tud.kom.p2psim.api.common.SimHostComponent;
import de.tud.kom.p2psim.api.linklayer.LinkLayer;
......@@ -57,6 +56,7 @@ import de.tudarmstadt.maki.simonstrator.api.component.network.Bandwidth;
import de.tudarmstadt.maki.simonstrator.api.component.network.NetID;
import de.tudarmstadt.maki.simonstrator.api.component.network.NetInterface;
import de.tudarmstadt.maki.simonstrator.api.component.network.NetworkComponent;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
import de.tudarmstadt.maki.simonstrator.api.component.transport.ConnectivityListener;
/**
......@@ -548,7 +548,7 @@ public class RoutedNetLayer implements SimNetworkComponent, NetworkComponent,
}
@Override
public Position getNetPosition() {
public Location getNetPosition() {
return host.getTopologyComponent().getRealPosition();
}
......
......@@ -19,11 +19,10 @@
*/
package de.tud.kom.p2psim.impl.network.simple;
package de.tud.kom.p2psim.impl.network.simple;
import de.tud.kom.p2psim.api.analyzer.MessageAnalyzer.Reason;
import de.tud.kom.p2psim.api.common.Position;
import de.tud.kom.p2psim.api.common.SimHost;
import de.tud.kom.p2psim.api.network.BandwidthImpl;
import de.tud.kom.p2psim.api.network.NetMessage;
......@@ -34,105 +33,106 @@ import de.tud.kom.p2psim.impl.transport.AbstractTransMessage;
import de.tudarmstadt.maki.simonstrator.api.Message;
import de.tudarmstadt.maki.simonstrator.api.Monitor;
import de.tudarmstadt.maki.simonstrator.api.component.network.NetID;
public class SimpleNetLayer extends AbstractNetLayer {
private double currentDownBandwidth;
private double currentUpBandwidth;
private final SimpleSubnet subNet;
public SimpleNetLayer(SimHost host, SimpleSubnet subNet, SimpleNetID netID,
Position netPosition, BandwidthImpl bandwidth) {
super(host, netID, bandwidth, netPosition, null);
this.subNet = subNet;
subNet.registerNetLayer(this);
}
public boolean isSupported(TransProtocol transProtocol) {
if (transProtocol.equals(TransProtocol.UDP))
return true;
else
return false;
}
public void send(Message msg, NetID receiver, NetProtocol netProtocol) {
// outer if-else-block is used to avoid sending although the host is
// offline
if (this.isOnline()) {
TransProtocol usedTransProtocol = ((AbstractTransMessage) msg)
.getProtocol();
if (this.isSupported(usedTransProtocol)) {
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
public class SimpleNetLayer extends AbstractNetLayer {
private double currentDownBandwidth;
private double currentUpBandwidth;
private final SimpleSubnet subNet;
public SimpleNetLayer(SimHost host, SimpleSubnet subNet, SimpleNetID netID,
Location netPosition, BandwidthImpl bandwidth) {
super(host, netID, bandwidth, netPosition, null);
this.subNet = subNet;
subNet.registerNetLayer(this);
}
public boolean isSupported(TransProtocol transProtocol) {
if (transProtocol.equals(TransProtocol.UDP))
return true;
else
return false;
}
public void send(Message msg, NetID receiver, NetProtocol netProtocol) {
// outer if-else-block is used to avoid sending although the host is
// offline
if (this.isOnline()) {
TransProtocol usedTransProtocol = ((AbstractTransMessage) msg)
.getProtocol();
if (this.isSupported(usedTransProtocol)) {
NetMessage netMsg = new SimpleNetMessage(msg, receiver,
getLocalInetAddress(),
getLocalInetAddress(),
netProtocol);
if (hasAnalyzer) {
netAnalyzerProxy
.netMsgEvent(netMsg, getHost(), Reason.SEND);
}
subNet.send(netMsg);
} else {
throw new IllegalArgumentException("Transport protocol "
+ usedTransProtocol
+ " not supported by this NetLayer implementation.");
}
} else {
int assignedMsgId = subNet.determineTransMsgNumber(msg);
}
subNet.send(netMsg);
} else {
throw new IllegalArgumentException("Transport protocol "
+ usedTransProtocol
+ " not supported by this NetLayer implementation.");
}
} else {
int assignedMsgId = subNet.determineTransMsgNumber(msg);
Monitor.log(SimpleNetLayer.class, Monitor.Level.DEBUG,
"During send: Assigning MsgId " + assignedMsgId
+ " to dropped message");
((AbstractTransMessage) msg).setCommId(assignedMsgId);
"During send: Assigning MsgId " + assignedMsgId
+ " to dropped message");
((AbstractTransMessage) msg).setCommId(assignedMsgId);
NetMessage netMsg = new SimpleNetMessage(msg, receiver,
getLocalInetAddress(),
getLocalInetAddress(),
netProtocol);
if (hasAnalyzer) {
netAnalyzerProxy.netMsgEvent(netMsg, getHost(), Reason.DROP);
}
}
}
@Override
public String toString() {
}
}
}
@Override
public String toString() {
return "NetLayer(netID=" + getLocalInetAddress() + ", "
+ (isOffline() ? "online" : "offline") + ")";
}
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
long temp;
temp = Double.doubleToLongBits(currentDownBandwidth);
result = PRIME * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(currentUpBandwidth);
result = PRIME * result + (int) (temp ^ (temp >>> 32));
result = PRIME * result + ((subNet == null) ? 0 : subNet.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final SimpleNetLayer other = (SimpleNetLayer) obj;
if (Double.doubleToLongBits(currentDownBandwidth) != Double
.doubleToLongBits(other.currentDownBandwidth))
return false;
if (Double.doubleToLongBits(currentUpBandwidth) != Double
.doubleToLongBits(other.currentUpBandwidth))
return false;
if (subNet == null) {
if (other.subNet != null)
return false;
} else if (!subNet.equals(other.subNet))
return false;
return true;
}
}
+ (isOffline() ? "online" : "offline") + ")";
}
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
long temp;
temp = Double.doubleToLongBits(currentDownBandwidth);
result = PRIME * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(currentUpBandwidth);
result = PRIME * result + (int) (temp ^ (temp >>> 32));
result = PRIME * result + ((subNet == null) ? 0 : subNet.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final SimpleNetLayer other = (SimpleNetLayer) obj;
if (Double.doubleToLongBits(currentDownBandwidth) != Double
.doubleToLongBits(other.currentDownBandwidth))
return false;
if (Double.doubleToLongBits(currentUpBandwidth) != Double
.doubleToLongBits(other.currentUpBandwidth))
return false;
if (subNet == null) {
if (other.subNet != null)
return false;
} else if (!subNet.equals(other.subNet))
return false;
return true;
}
}
......@@ -58,10 +58,12 @@ import de.tud.kom.p2psim.api.scenario.Composable;
import de.tud.kom.p2psim.api.scenario.ConfigurationException;
import de.tud.kom.p2psim.api.scenario.Configurator;
import de.tud.kom.p2psim.impl.util.toolkits.Dom4jToolkit;
import de.tudarmstadt.maki.simonstrator.api.Binder;
import de.tudarmstadt.maki.simonstrator.api.Monitor;
import de.tudarmstadt.maki.simonstrator.api.Monitor.Level;
import de.tudarmstadt.maki.simonstrator.api.Time;
import de.tudarmstadt.maki.simonstrator.api.component.Component;
import de.tudarmstadt.maki.simonstrator.api.component.GlobalComponent;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/**
......@@ -190,6 +192,10 @@ public class DefaultConfigurator implements Configurator {
@Override
public void register(String name, Component component) {
configurables.put(name, component);
if (component instanceof GlobalComponent) {
// register in the binder
Binder.registerComponent((GlobalComponent) component);
}
}
/**
......@@ -235,9 +241,7 @@ public class DefaultConfigurator implements Configurator {
assert root.getName().equals(Configurator.CONFIGURATION_ROOT_TAG);
configureFirstLevel(root);
componentList = null;
return configurables.values();
return componentList;
} catch (DocumentException e) {
throw new ConfigurationException(
"Failed to load configuration from file " + configFile, e);
......@@ -320,12 +324,17 @@ public class DefaultConfigurator implements Configurator {
Monitor.log(DefaultConfigurator.class, Level.DEBUG,
"Configure component " + name);
/*
* FIXED (BR) - if a component specifies a class-tag, do NOT reuse the
* old component for configuration. Instead, create a new component.
*/
// Constructor Attributes
Object component = configurables.get(name);
// register new component (if not done yet)
Set<String> consAttrs = new HashSet<String>(); // attributes that were
// part of the
// constructor
if (component == null) {
Set<String> consAttrs = new HashSet<String>();
String clazz = getAttributeValue(elem.attribute(CLASS_TAG));
if (clazz != null) {
// Create component
component = createComponent(elem, consAttrs);
}
......@@ -370,8 +379,9 @@ public class DefaultConfigurator implements Configurator {
component = createInstance(className,
getAttributeValue(elem.attribute(STATIC_CREATION_METHOD_TAG)),
consAttrs, elem);
if (component instanceof Component)
if (component instanceof Component) {
register(elem.getName(), (Component) component);
}
// composable can use other components
if (component instanceof Composable) {
Monitor.log(DefaultConfigurator.class, Level.DEBUG,
......@@ -586,6 +596,8 @@ public class DefaultConfigurator implements Configurator {
paramList[i] = convertToClass(valueList[i].trim());
}
param = paramList;
} else if (typeClass == String[].class) {
param = value.split(CLASS_SEPARATOR);
} else {
throw new IllegalArgumentException("Parameter type " + typeClass
+ " is not supported");
......
......@@ -90,7 +90,7 @@ public class DefaultHostBuilder implements HostBuilder, Builder {
/**
* Groups of hosts indexed by group ids.
*/
protected Map<String, List<SimHost>> groups;
protected final Map<String, List<SimHost>> groups = new LinkedHashMap<>();
protected int experimentSize;
......@@ -107,7 +107,6 @@ public class DefaultHostBuilder implements HostBuilder, Builder {
* this or force its correctness...
*/
public void setExperimentSize(int size) {
groups = new LinkedHashMap<String, List<SimHost>>(size);
this.experimentSize = size;
}
......@@ -115,7 +114,8 @@ public class DefaultHostBuilder implements HostBuilder, Builder {
* (non-Javadoc)
*
* @see de.tud.kom.p2psim.api.scenario.HostBuilder#getAllHostsWithGroupIDs()
*/
*/
@Override
public Map<String, List<SimHost>> getAllHostsWithGroupIDs() {
Map<String, List<SimHost>> hosts = new LinkedHashMap<String, List<SimHost>>(
groups);
......@@ -126,27 +126,19 @@ public class DefaultHostBuilder implements HostBuilder, Builder {
* (non-Javadoc)
*
* @see de.tud.kom.p2psim.api.scenario.HostBuilder#getAllHosts()
*/
*/
@Override
public List<SimHost> getAllHosts() {
return hosts;
}
/*
* (non-Javadoc)
*
* @see
* de.tud.kom.p2psim.api.scenario.HostBuilder#getHosts(java.lang.String)
*/
public List<SimHost> getHosts(String groupId) {
return groups.get(groupId);
}
/*
* (non-Javadoc)
*
* @see de.tud.kom.p2psim.api.scenario.HostBuilder#parse(org.dom4j.Element,
* de.tud.kom.p2psim.api.scenario.Configurator)
*/
*/
@Override
public void parse(Element elem, Configurator config) {
DefaultConfigurator defaultConfigurator = (DefaultConfigurator) config;
......@@ -234,7 +226,7 @@ public class DefaultHostBuilder implements HostBuilder, Builder {
}
for (HostComponentFactory cF : instanciatedLayers) {
HostComponent comp = cF.createComponent(host);
setComponent(host, comp);
host.registerComponent(comp);
}
}
group.add(host);
......@@ -290,10 +282,6 @@ public class DefaultHostBuilder implements HostBuilder, Builder {
*/
protected DefaultHost createNewDefaultHost() {
return new DefaultHost();
}
protected void setComponent(SimHost host, HostComponent comp) {
host.registerComponent(comp);
}
}
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