diff --git a/src/de/tud/kom/p2psim/impl/topology/views/fiveg/ModelBasedSegmentDatabase.java b/src/de/tud/kom/p2psim/impl/topology/views/fiveg/ModelBasedSegmentDatabase.java index 6a8f1fee9f8b5ceeb816a2f68b9bc214679baf46..45f5e551cd2aa88f50eb536ebdc23411c05097d0 100644 --- a/src/de/tud/kom/p2psim/impl/topology/views/fiveg/ModelBasedSegmentDatabase.java +++ b/src/de/tud/kom/p2psim/impl/topology/views/fiveg/ModelBasedSegmentDatabase.java @@ -26,14 +26,17 @@ import java.util.HashSet; import de.tud.kom.p2psim.api.linklayer.mac.MacAddress; import de.tud.kom.p2psim.api.scenario.ConfigurationException; import de.tud.kom.p2psim.impl.topology.views.fiveg.models.AbstractModel; +import de.tud.kom.p2psim.impl.topology.views.fiveg.models.Direction; import de.tud.kom.p2psim.impl.topology.views.fiveg.models.ParameterType; import de.tudarmstadt.maki.simonstrator.api.Time; -public class ModelBasedSegmentDatabase extends AbstractGridBasedTopologyDatabase { - +public class ModelBasedSegmentDatabase + extends AbstractGridBasedTopologyDatabase { + final Integer DEFAULT_SEGMENT_ID = new Integer(-1); - HashMap> models = new HashMap<>(); + // Models[Type][SegID][Up/Down/Both] + HashMap>> models = new HashMap<>(); public ModelBasedSegmentDatabase() { super(100, true); @@ -52,29 +55,98 @@ public class ModelBasedSegmentDatabase extends AbstractGridBasedTopologyDatabase "Model is not defined for any Parameter Type. Please specify the Type for this Model."); } + Direction dir = model.getDirection(); + if (dir == null) { + throw new ConfigurationException( + "Model is not defined for any Direction. Please specify the Direction for this Model."); + } + Integer segmentID = new Integer(model.getSegmentID()); if (models.containsKey(type)) { + // There is already this Type if (models.get(type).containsKey(segmentID)) { - throw new ConfigurationException( - "Conflicting models for " + type.toString() - + " and SegementID " + segmentID.toString()); + // There is already this SegID + if (models.get(type).get(segmentID).containsKey(dir) + || (dir.equals(Direction.BOTH) && (models.get(type) + .get(segmentID).containsKey(Direction.UPLOAD) + || models.get(type).get(segmentID) + .containsKey(Direction.DOWNLOAD)))) { + // There is already a model defined + throw new ConfigurationException( + "Conflicting Models for SegmentID " + segmentID + + ", Type " + type.toString() + + " and Direction " + dir.toString()); + } else { + // Add new model + models.get(type).get(segmentID).put(dir, model); + } } else { - models.get(type).put(segmentID, model); + // Add new SegmentID + // Direction => Model + HashMap tmp1 = new HashMap<>(); + tmp1.put(dir, model); + + models.get(type).put(segmentID, tmp1); } + } else { - HashMap tmp = new HashMap<>(); - tmp.put(segmentID, model); - models.put(type, tmp); + // Add new model + // Direction => Model + HashMap tmp1 = new HashMap<>(); + tmp1.put(dir, model); + + // SegID => [Direction => Model] + HashMap> tmp2 = new HashMap<>(); + tmp2.put(segmentID, tmp1); + + models.put(type, tmp2); } } + AbstractModel getModel(int segID, ParameterType type, Boolean isUpload) { + + Integer segmentID = new Integer(segID); + + if (!this.models.containsKey(type)) { + throw new ConfigurationException( + "No Model is defined for " + type + "."); + } + + if (!this.models.get(type).containsKey(segmentID)) { + segmentID = DEFAULT_SEGMENT_ID; + } + + if (!this.models.get(type).containsKey(segmentID)) { + throw new ConfigurationException("No Model is defined for Type " + + type + " and Segment ID " + segmentID + "."); + } + + Direction dir = Direction.DOWNLOAD; + + if (isUpload) { + dir = Direction.UPLOAD; + } + + if (!this.models.get(type).get(segmentID).containsKey(dir)) { + dir = Direction.BOTH; + } + + if (!this.models.get(type).get(segmentID).containsKey(dir)) { + throw new ConfigurationException( + "No Model is defined for Type " + type + ", Segment ID " + + segmentID + " and Direction " + dir + "."); + } + + return this.models.get(type).get(segmentID).get(dir); + } + public class ModelBasedEntry implements FiveGTopologyDatabase.Entry { private final int segment; private boolean isAvailable = true; - + private HashSet hostsInSegment = new HashSet<>(); public ModelBasedEntry(int segment) { @@ -85,15 +157,13 @@ public class ModelBasedSegmentDatabase extends AbstractGridBasedTopologyDatabase public int getSegmentID() { return segment; } - + public void onHostLeavesSegment(MacAddress hostAddr) { this.hostsInSegment.remove(hostAddr); - System.out.println(this.segment + ": " + this.hostsInSegment.size()); } public void onHostEntersSegment(MacAddress hostAddr) { this.hostsInSegment.add(hostAddr); - System.out.println(this.segment + ": " + this.hostsInSegment.size()); } @Override @@ -101,23 +171,9 @@ public class ModelBasedSegmentDatabase extends AbstractGridBasedTopologyDatabase if (!isAvailable) { return 1; } - // TODO Up / Download? - Integer segmentID = new Integer(getSegmentID()); - int usersInSegment = this.hostsInSegment.size(); - - // Is there a Model for Droprate? - if (models.containsKey(ParameterType.DROPRATE)) { - // Is there a specific model for this segment - if(models.get(ParameterType.DROPRATE).containsKey(segmentID)) { - return models.get(ParameterType.DROPRATE).get(segmentID).getDouble(usersInSegment); - } else { - return models.get(ParameterType.DROPRATE).get(DEFAULT_SEGMENT_ID).getDouble(usersInSegment); - } - } else { - throw new ConfigurationException( - "No Model is defined for Droprate."); - } + return getModel(new Integer(getSegmentID()), ParameterType.DROPRATE, isUpload) + .getDouble(this.hostsInSegment.size()); } @Override @@ -125,8 +181,9 @@ public class ModelBasedSegmentDatabase extends AbstractGridBasedTopologyDatabase if (!isAvailable) { return 9999 * Time.MILLISECOND; } - // TODO Return Latency based on Model - return 0; + + return getModel(new Integer(getSegmentID()), ParameterType.LATENCY, isUpload) + .getLong(this.hostsInSegment.size()); } @Override @@ -134,8 +191,9 @@ public class ModelBasedSegmentDatabase extends AbstractGridBasedTopologyDatabase if (!isAvailable) { return 0; } - // TODO Return Bandwidth based on Model - return 0; + + return getModel(new Integer(getSegmentID()), ParameterType.BANDWIDTH, isUpload) + .getLong(this.hostsInSegment.size()); } @Override diff --git a/src/de/tud/kom/p2psim/impl/topology/views/fiveg/models/AbstractModel.java b/src/de/tud/kom/p2psim/impl/topology/views/fiveg/models/AbstractModel.java index 3264d5540249382e67ad885bc1143aeb3af4efa4..fbf572f95bdd3683541a9f2e34f905e4f31d2a96 100644 --- a/src/de/tud/kom/p2psim/impl/topology/views/fiveg/models/AbstractModel.java +++ b/src/de/tud/kom/p2psim/impl/topology/views/fiveg/models/AbstractModel.java @@ -26,6 +26,8 @@ public abstract class AbstractModel { private int segmentID = -1; private ParameterType type; + + private Direction dir = Direction.BOTH; public void setSegmentID(int segmentid) { assert segmentid > 0; @@ -55,6 +57,26 @@ public abstract class AbstractModel { public ParameterType getParameterType() { return type; } + + public void setDirection(String param) { + param = param.toUpperCase(); + try { + this.dir = Direction.valueOf(param); + } catch (IllegalArgumentException e) { + throw new ConfigurationException( + "Direction " + param + " is unknown. Please select one of " + + Direction.printTypes()); + } + if(this.type == null) { + throw new ConfigurationException( + "Direction " + param + " is unknown. Please select one of " + + Direction.printTypes()); + } + } + + public Direction getDirection() { + return dir; + } public abstract long getLong(int users); diff --git a/src/de/tud/kom/p2psim/impl/topology/views/fiveg/models/Direction.java b/src/de/tud/kom/p2psim/impl/topology/views/fiveg/models/Direction.java new file mode 100644 index 0000000000000000000000000000000000000000..2feeeef43a486bffd6bba3dbc6b0799b3cac3822 --- /dev/null +++ b/src/de/tud/kom/p2psim/impl/topology/views/fiveg/models/Direction.java @@ -0,0 +1,39 @@ +/* + * 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 . + * + */ + +package de.tud.kom.p2psim.impl.topology.views.fiveg.models; + +public enum Direction { + BOTH(), + UPLOAD(), + DOWNLOAD(); + + public static String printTypes() { + Direction[] types = values(); + String out = ""; + for (int i = 0; i < types.length; i++) { + if (i > 0) { + out += ", "; + } + out += types[i].name(); + } + return out; + } +}