@SuppressWarnings("unchecked")
  private void internalRead(
      InputStream buffer, List<NavigationFormat> formats, ParserContext context)
      throws IOException {
    int routeCountBefore = context.getRoutes().size();
    NavigationFormat firstSuccessfulFormat = null;

    try {
      for (NavigationFormat<BaseRoute> format : formats) {
        notifyReading(format);

        log.fine(format("Trying to read with %s", format));
        try {
          format.read(buffer, context);

          // if no route has been read, take the first that didn't throw an exception
          if (firstSuccessfulFormat == null) firstSuccessfulFormat = format;
        } catch (Exception e) {
          log.severe(format("Error reading with %s: %s, %s", format, e.getClass(), e));
        }

        if (context.getRoutes().size() > routeCountBefore) {
          context.addFormat(format);
          break;
        }

        try {
          buffer.reset();
        } catch (IOException e) {
          log.severe("Cannot reset() stream to mark()");
          break;
        }
      }
    } finally {
      //noinspection ThrowFromFinallyBlock
      buffer.close();
    }

    if (context.getRoutes().size() == 0 && firstSuccessfulFormat != null)
      context.addFormat(firstSuccessfulFormat);
  }
 @SuppressWarnings("unchecked")
 private ParserResult createResult(ParserContext<BaseRoute> context) throws IOException {
   List<BaseRoute> source = context.getRoutes();
   // if (source != null && source.size() > 0) {
   if (source != null && context.getFormats().size() > 0) {
     NavigationFormat format = determineFormat(source, context.getFormats().get(0));
     List<BaseRoute> destination = convertRoute(source, format);
     log.info(
         "Detected '"
             + format.getName()
             + "' with "
             + destination.size()
             + " route(s) and "
             + getPositionCounts(destination)
             + " positions");
     if (destination.size() == 0)
       destination.add(format.createRoute(RouteCharacteristics.Route, null, new ArrayList<>()));
     commentRoutes(destination);
     return new ParserResult(new FormatAndRoutes(format, destination));
   } else return new ParserResult(null);
 }