/*
* 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.movement.modularosm.attraction;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import de.tud.kom.p2psim.api.topology.Topology;
import de.tud.kom.p2psim.impl.topology.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.Binder;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.AttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/**
* Generates a given number of {@link AttractionPoint}s and sets the Position
* according to a given CSV file.
*
* @author Nils Richerzhagen
* @version 1.0, 16.07.2014
*/
public class CsvAttractionGenerator implements IAttractionGenerator {
private PositionVector worldDimensions;
private String file;
private final String SEP = ";";
private List attractionPoints;
/**
*
* @param file
*/
@XMLConfigurableConstructor({ "placementFile" })
public CsvAttractionGenerator(String placementFile) {
this.worldDimensions = Binder.getComponentOrNull(Topology.class)
.getWorldDimensions();
this.file = placementFile;
}
@Override
public List getAttractionPoints() {
if (attractionPoints == null) {
attractionPoints = new LinkedList<>();
readData();
}
return attractionPoints;
}
private void readData() {
boolean entrySuccessfullyRead = false;
BufferedReader csv = null;
try {
csv = new BufferedReader(new FileReader(file));
int i = 0;
while (csv.ready()) {
String line = csv.readLine();
if (line.indexOf(SEP) > -1) {
String[] parts = line.split(SEP);
if (parts.length == 2) {
try {
Double x = Double.parseDouble(parts[0]);
Double y = Double.parseDouble(parts[1]);
if (x > worldDimensions.getX()
|| y > worldDimensions.getY() || x < 0
|| y < 0) {
System.err.println("Skipped entry " + x + ";"
+ y);
continue;
}
attractionPoints.add(new AttractionPointImpl("AP"+i, new PositionVector(x,
y)));
i++;
entrySuccessfullyRead = true;
} catch (NumberFormatException e) {
// Ignore leading comments
if (entrySuccessfullyRead) {
// System.err.println("CSV ParseError " + line);
}
}
}
} else {
throw new AssertionError("To many columns in CSV.");
}
}
} catch (Exception e) {
System.err.println(e.toString());
} finally {
if (csv != null) {
try {
csv.close();
} catch (IOException e) {
//
}
}
}
}
}