public static synchronized String getNextDraftID(VFS vfs, String speciesID) {
    int nextID = 0;
    VFSPath rootURI;

    try {
      rootURI = VFSUtils.parseVFSPath(ServerPaths.getDraftAssessmentRootURL(speciesID));
    } catch (VFSPathParseException e) {
      e.printStackTrace();
      return null;
    }

    if (vfs.exists(rootURI)) { // If there's already regionals for this guy,
      // get the next
      VFSPathToken[] tokens;
      try {
        tokens = vfs.list(rootURI);
        for (VFSPathToken curToken : tokens) {
          String filename = curToken.toString();
          filename = filename.replaceAll(".xml", "");
          if (!SISContainerApp.amIOnline()) filename = filename.replaceAll("offline", "");

          System.out.println("Crawling file " + curToken + " for new regional ID.");

          try {
            int value = Integer.valueOf(filename.split("_")[1]);
            nextID = Math.max(value, nextID);
          } catch (NumberFormatException e) {
            SysDebugger.getNamedInstance(SISContainerApp.SEVERE_LOG)
                .println(
                    "Annoying file in path "
                        + curToken
                        + " non-conformant "
                        + "to standard region assessment file name pattern.");
          }
        }
      } catch (NotFoundException e) {
        SysDebugger.getNamedInstance(SISContainerApp.SEVERE_LOG)
            .println("Big WTF. " + "List failed on existing path " + rootURI.toString());
        return null;
      }

      nextID++; // Increment it one past the highest found.
    }

    String assessmentID = speciesID + "_" + nextID;
    return assessmentID;
  }
  public Document doImport(final ZipInputStream zis, final ImportMode mode)
      throws ResourceException {
    final Document document = BaseDocumentUtils.impl.newDocument();
    final Element root = document.createElement("results");
    root.setAttribute("mode", mode.toString());

    ZipEntry ze;
    try {
      ze = zis.getNextEntry();
    } catch (IOException e) {
      throw new ResourceException(Status.SERVER_ERROR_INTERNAL, e);
    }
    byte[] buf = new byte[1024];
    while (ze != null) {
      final VFSPath path;
      try {
        path = VFSUtils.parseVFSPath(ze.getName());
      } catch (VFSUtils.VFSPathParseException e) {
        e.printStackTrace();
        try {
          ze = zis.getNextEntry();
          continue;
        } catch (IOException f) {
          throw new ResourceException(Status.SERVER_ERROR_INTERNAL, f);
        }
      }

      if (isRestricted(path)) {
        if (restrictionListener != null && !ze.isDirectory()) {
          try {
            final VFSPath restrictedUri = VFSUtils.parseVFSPath(ze.getName());
            final ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] in_bytes = buf;
            int n;
            while ((n = zis.read(in_bytes, 0, 1024)) > -1) baos.write(in_bytes, 0, n);
            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());

            restrictionListener.handle(restrictedUri, bais);
          } catch (Exception e) {
            e.printStackTrace();
            TrivialExceptionHandler.ignore(this, e);
          }
        }
        try {
          ze = zis.getNextEntry();
          continue;
        } catch (IOException f) {
          throw new ResourceException(Status.SERVER_ERROR_INTERNAL, f);
        }
      }

      final Element el;

      if (ze.isDirectory()) {
        el = document.createElement("folder");
        el.setAttribute("path", path.toString());

        if (!vfs.exists(path)) {
          try {
            vfs.makeCollections(path);
          } catch (IOException e) {
            // Let it fail below for proper iteration behavior
            TrivialExceptionHandler.ignore(this, e);
          }
        } else {
          try {
            el.setAttribute("status", "skipped");
            root.appendChild(el);
            ze = zis.getNextEntry();
            continue;
          } catch (IOException e) {
            throw new ResourceException(Status.SERVER_ERROR_INTERNAL, e);
          }
        }
      } else {
        el = document.createElement("file");
        el.setAttribute("path", path.toString());

        if (ImportMode.FRESHEN.equals(mode) && vfs.exists(path)) {
          try {
            long localTime = vfs.getLastModified(path);
            long remoteTime = ze.getTime();

            if (localTime >= remoteTime) {
              el.setAttribute("status", "skipped");
              root.appendChild(el);
              ze = zis.getNextEntry();
              continue;
            }
          } catch (Exception e) {
            TrivialExceptionHandler.ignore(this, e);
          }
        }

        // Create parent dir if it does not already exist
        if (!vfs.exists(path.getCollection())) {
          try {
            vfs.makeCollections(path.getCollection());
          } catch (IOException e) {
            // Let it fail below for proper iteration behavior
            TrivialExceptionHandler.ignore(this, e);
          }
        }

        final OutputStream os;
        try {
          os = vfs.getOutputStream(path);
        } catch (IOException e) {
          try {
            ze = zis.getNextEntry();
            el.setAttribute("status", "error");
            root.appendChild(el);
            continue;
          } catch (IOException f) {
            throw new ResourceException(Status.SERVER_ERROR_INTERNAL, f);
          }
        }

        int n;
        try {
          while ((n = zis.read(buf, 0, 1024)) > -1) os.write(buf, 0, n);
        } catch (IOException e) {
          el.setAttribute("status", "error");
          root.appendChild(el);
          continue;
        } finally {
          try {
            os.close();
          } catch (IOException e) {
            TrivialExceptionHandler.ignore(this, e);
          }
        }
      }

      el.setAttribute("status", "success");
      root.appendChild(el);

      try {
        ze = zis.getNextEntry();
      } catch (IOException e) {
        throw new ResourceException(Status.SERVER_ERROR_INTERNAL, e);
      }
    }

    try {
      zis.close();
    } catch (IOException e) {
      TrivialExceptionHandler.ignore(this, e);
    }

    document.appendChild(root);

    return document;
  }