package polly.rx.parsing; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import java.util.regex.Pattern; import polly.rx.MSG; import polly.rx.entities.FleetScan; import polly.rx.entities.FleetScanShip; import de.skuzzle.polly.tools.FileUtil; public class QFleetScanParser { private final static Pattern ALIEN_KB = Pattern.compile("Reg-Nr\\. \\d+"); //$NON-NLS-1$ // TEST public static void main(String[] args) throws IOException, ParseException { final InputStream s = QFleetScanParser.class .getResourceAsStream("flottenscan2.txt"); //$NON-NLS-1$ final String scan = FileUtil.readIntoString(s, "UTF-8"); //$NON-NLS-1$ // System.out.println("'" + scan + "'"); parseFleetScan(scan); } public final static FleetScan parseFleetScan(String paste) throws ParseException { try (final Scanner s = new Scanner(paste)) { s.useDelimiter(" X:\\d+"); //$NON-NLS-1$ final String quad = s.next(); s.useDelimiter("\\D+"); //$NON-NLS-1$ final int x = s.nextInt(); final int y = s.nextInt(); final int sens = s.nextInt(); String fleetName = ""; //$NON-NLS-1$ while (fleetName.equals("")) { //$NON-NLS-1$ fleetName = s.nextLine(); } if (ALIEN_KB.matcher(fleetName).find()) { throw new ParseException(MSG.fleetScanParserAlienScan); } final String name = s.nextLine(); final String venadName = VenadHelper.getName(name); final String clan = VenadHelper.getClan(name); final String tag = s.nextLine(); while (s.hasNext() && !s.nextLine().equals("NameTechlevelBesitzer")); //$NON-NLS-1$ final List<FleetScanShip> ships = new ArrayList<>(); while (s.hasNext()) { final StringBuilder b = new StringBuilder(); b.append(s.nextLine().trim()); b.append(" "); //$NON-NLS-1$ b.append(s.nextLine().trim()); final String sl = b.toString(); // openening '(' of ship id int i = sl.lastIndexOf('('); final String shipName = sl.substring(0, i).trim(); i += 4; // skip "(ID:" int j = sl.lastIndexOf(')'); final int rxId = Integer.parseInt(sl.substring(i, j)); j += 1; // skip ")" final int tl = Integer.parseInt(sl.substring(j)); final String owner = s.nextLine().trim(); final String ownerVenadName = VenadHelper.getName(owner); final String ownerClan = VenadHelper.getClan(owner); ships.add(new FleetScanShip(rxId, shipName, tl, ownerVenadName, ownerClan, quad, x, y)); } return new FleetScan(sens, fleetName, venadName, clan, tag, ships, quad, x, y, ""); //$NON-NLS-1$ } catch (Exception e) { throw new ParseException(MSG.fleetScanParserInvalid, e); } } }