package polly.rx.parsing;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import de.skuzzle.polly.tools.iterators.ArrayIterator;
import polly.rx.MSG;
import polly.rx.entities.FleetScan;
import polly.rx.entities.FleetScanShip;
public class FleetScanParser {
private final static Pattern CLAN_PATTERN = Pattern.compile("\\[([^\\]]+)\\]"); //$NON-NLS-1$
private final static int CLAN_GROUP = 1;
private final static Pattern NUMBER_PATTERN = Pattern.compile("(\\d+)"); //$NON-NLS-1$
private final static int NUMBER_GROUP = 1;
private final static Pattern SHIP_PATTERN = Pattern.compile(
"(.+?)\\s+\\(ID:(\\d+)\\)\\s+(\\d+)\\s+(.+)"); //$NON-NLS-1$
private final static int SHIP_NAME_GROUP = 1;
private final static int SHIP_ID_GROUP = 2;
private final static int SHIP_TL_GROUP = 3;
private final static int SHIP_OWNER_GROUP = 4;
public final static FleetScan parseFleetScan(String paste, String quadrant,
int x, int y, String metaData) throws ParseException {
try {
return parseFleetScanHelper(paste, quadrant, x, y, metaData);
} catch (Exception e) {
throw new ParseException(MSG.fleetScanParserInvalid, e);
}
}
private final static FleetScan parseFleetScanHelper(String paste, String quadrant,
int x, int y, String metaData) throws ParseException {
String[] lines = paste.split("[\n\r]+"); //$NON-NLS-1$
int sens = 0;
String fleetName = ""; //$NON-NLS-1$
String owner = ""; //$NON-NLS-1$
String ownerClan = ""; //$NON-NLS-1$
String fleetTag = ""; //$NON-NLS-1$
List<FleetScanShip> ships = new LinkedList<FleetScanShip>();
ArrayIterator<String> it = ArrayIterator.get(lines);
while (it.hasNext()) {
String line = it.next();
if (line.startsWith("Lokale Sensor")) { //$NON-NLS-1$
Matcher m = NUMBER_PATTERN.matcher(line);
m.find();
sens = RegexUtils.subint(line, m, NUMBER_GROUP);
} else if (line.startsWith("Flotten Daten")) { //$NON-NLS-1$
line = it.next();
String parts[] = line.split("\\s+"); //$NON-NLS-1$
fleetName = parts[0];
Matcher m = CLAN_PATTERN.matcher(parts[1]);
if (m.find()) {
ownerClan = RegexUtils.substr(parts[1], m, CLAN_GROUP);
owner = RegexUtils.substr(
parts[1], 0, parts[1].length() - (ownerClan.length() + 2));
} else {
owner = parts[1];
}
String next = it.peekNext();
if (!next.equals("") && !next.startsWith("Gescannte Schiffe")) { //$NON-NLS-1$ //$NON-NLS-2$
fleetTag = it.next();
}
} else if (line.startsWith("Gescannte Schiffe")) { //$NON-NLS-1$
it.next();
while (it.hasNext()) {
line = it.next();
Matcher m = SHIP_PATTERN.matcher(line);
if (m.matches()) {
String shipName = RegexUtils.substr(line, m, SHIP_NAME_GROUP);
int shipId = RegexUtils.subint(line, m, SHIP_ID_GROUP);
int shipTl = RegexUtils.subint(line, m, SHIP_TL_GROUP);
String ownerName = RegexUtils.substr(line, m, SHIP_OWNER_GROUP);
String shipOwnerClan = ""; //$NON-NLS-1$
Matcher clanMatcher = CLAN_PATTERN.matcher(ownerName);
if (clanMatcher.find()) {
shipOwnerClan = RegexUtils.substr(
ownerName, clanMatcher, CLAN_GROUP);
ownerName = RegexUtils.substr(
ownerName, 0,
ownerName.length() - (shipOwnerClan.length() + 2));
}
FleetScanShip ship = new FleetScanShip(shipId, shipName, shipTl,
ownerName, shipOwnerClan, quadrant, x, y);
ships.add(ship);
}
}
}
}
if (fleetName.equals("") || owner.equals("") || ships.isEmpty()) { //$NON-NLS-1$ //$NON-NLS-2$
throw new ParseException(MSG.fleetScanParserInvalid);
}
return new FleetScan(sens, fleetName, owner, ownerClan, fleetTag, ships,
quadrant, x, y, metaData);
}
}