protected String parseZipEntry(
      ZipEntry zipEntry,
      ZipInputStream zipStream,
      Task task,
      String contestId,
      ContestManager contestManager) {
    String fileName = new File(zipEntry.getName()).getName().toLowerCase();
    if (fileName.equals(task.getName() + ".txt")) {
      return null;
    }

    String[] fileNameParts = fileName.split("\\.");

    if (fileNameParts.length != 3) {
      return getErrorMessage(zipEntry, "is not named properly and will be ignored.");
    }
    if (!fileNameParts[0].equals(task.getName())) {
      return getErrorMessage(
          zipEntry,
          "seems like a test case but does not seem to start with the task name:" + task.getName());
    }
    Task.TestType testType;
    if ("in".equals(fileNameParts[2])) {
      testType = Task.TestType.IN;
    } else if ("sol".equals(fileNameParts[2])) {
      testType = Task.TestType.SOL;
    } else {
      return getErrorMessage(
          zipEntry, " is neither .in nor .sol file but is ." + fileNameParts[2] + " ?");
    }

    int testNumber = -1;
    try {
      testNumber = Integer.parseInt(fileNameParts[1]);
      if (testNumber < 1 || testNumber > task.getNumberOfTests()) {
        testNumber = -1;
      }
    } catch (NumberFormatException e) {
    } finally {
      if (testNumber < 0) {
        return getErrorMessage(
            zipEntry,
            " has incorrect value for a test number :"
                + fileNameParts[1]
                + " . Must be an integer between 1 and "
                + Integer.toString(task.getNumberOfTests()));
      }
    }

    if (contestManager.uploadTaskData(contestId, task, testNumber, testType, zipStream)) {
      return null;
    } else {
      return getErrorMessage(
          zipEntry, " was recognized as a test data file but the server was unable to store it.");
    }
  }