@Override
  public void unimportXAR(File xarFile, PackageConfiguration configuration)
      throws IOException, XWikiException {
    if (configuration.getWiki() == null) {
      XWikiContext context = getXWikiContext();
      if (context.getWiki().isVirtualMode()) {
        List<String> wikis = getXWikiContext().getWiki().getVirtualWikisDatabaseNames(context);

        if (!wikis.contains(context.getMainXWiki())) {
          unimportXARFromWiki(xarFile, context.getMainXWiki(), configuration);
        }

        for (String subwiki : wikis) {
          unimportXARFromWiki(xarFile, subwiki, configuration);
        }
      } else {
        unimportXARFromWiki(xarFile, context.getMainXWiki(), configuration);
      }
    } else {
      unimportXARFromWiki(xarFile, configuration.getWiki(), configuration);
    }
  }
  @Override
  public void unimportPages(Collection<XarEntry> pages, PackageConfiguration configuration)
      throws XWikiException {
    if (configuration.getWiki() == null) {
      XWikiContext context = getXWikiContext();
      if (context.getWiki().isVirtualMode()) {
        List<String> wikis = getXWikiContext().getWiki().getVirtualWikisDatabaseNames(context);

        if (!wikis.contains(context.getMainXWiki())) {
          unimportPagesFromWiki(pages, context.getMainXWiki(), configuration);
        }

        for (String subwiki : wikis) {
          unimportPagesFromWiki(pages, subwiki, configuration);
        }
      } else {
        unimportPagesFromWiki(pages, context.getMainXWiki(), configuration);
      }
    } else {
      unimportPagesFromWiki(pages, configuration.getWiki(), configuration);
    }
  }
  private XarMergeResult importXARToWiki(
      XarFile previousXarFile,
      InputStream xarInputStream,
      String wiki,
      PackageConfiguration configuration)
      throws IOException {
    XarMergeResult mergeResult = new XarMergeResult();

    ZipArchiveInputStream zis = new ZipArchiveInputStream(xarInputStream);

    XWikiContext xcontext = getXWikiContext();

    String currentWiki = xcontext.getDatabase();
    try {
      xcontext.setDatabase(wiki);

      this.observation.notify(new XARImportingEvent(), null, xcontext);

      for (ArchiveEntry entry = zis.getNextEntry(); entry != null; entry = zis.getNextEntry()) {
        if (!entry.isDirectory()) {
          DocumentImporterHandler documentHandler =
              new DocumentImporterHandler(this, this.componentManager, wiki);

          try {
            documentHandler.setPreviousXarFile(previousXarFile);
            documentHandler.setConfiguration(configuration);

            parseDocument(zis, documentHandler);

            if (documentHandler.getMergeResult() != null) {
              mergeResult.addMergeResult(documentHandler.getMergeResult());
            }

            if (configuration.isLogEnabled()) {
              this.logger.info(
                  "Successfully imported document [{}] in language [{}]",
                  documentHandler.getDocument().getDocumentReference(),
                  documentHandler.getDocument().getRealLanguage());
            }
          } catch (NotADocumentException e) {
            // Impossible to know that before parsing
            this.logger.debug("Entry [" + entry + "] is not a document", e);
          } catch (Exception e) {
            this.logger.error("Failed to parse document [" + entry.getName() + "]", e);

            if (configuration.isLogEnabled()) {
              this.logger.info(
                  "Failed to import document [{}] in language [{}]",
                  documentHandler.getDocument().getDocumentReference(),
                  documentHandler.getDocument().getRealLanguage());
            }
          }
        }
      }
    } finally {
      this.observation.notify(new XARImportedEvent(), null, xcontext);

      xcontext.setDatabase(currentWiki);
    }

    return mergeResult;
  }