private static void checkStatus(IStatus status) throws FacadeException {
   if (status.matches(IStatus.ERROR)) {
     throw new FacadeException(
         MIRROR_FAILURE_MESSAGE + ": " + StatusTool.collectProblems(status),
         StatusTool.findException(status));
   }
 }
  @Override
  public void mirrorStandalone(
      RepositoryReferences sources,
      DestinationRepositoryDescriptor destination,
      Collection<IUDescription> seedIUs,
      MirrorOptions mirrorOptions,
      BuildOutputDirectory tempDirectory)
      throws FacadeException {
    IProvisioningAgent agent = Activator.createProvisioningAgent(tempDirectory);
    try {
      final MirrorApplication mirrorApp =
          createMirrorApplication(sources, destination, agent, mirrorOptions.isIncludePacked());
      mirrorApp.setSlicingOptions(createSlicingOptions(mirrorOptions));
      try {
        // we want to see mirror progress as this is a possibly long-running operation
        mirrorApp.setVerbose(true);
        mirrorApp.setLog(new LogListener(mavenContext.getLogger()));
        mirrorApp.setSourceIUs(
            querySourceIus(seedIUs, mirrorApp.getCompositeMetadataRepository(), sources));
        IStatus returnStatus = mirrorApp.run(null);
        checkStatus(returnStatus);

      } catch (ProvisionException e) {
        throw new FacadeException(
            MIRROR_FAILURE_MESSAGE + ": " + StatusTool.collectProblems(e.getStatus()), e);
      }
    } finally {
      agent.stop();
    }
  }
 @Override
 public void log(IStatus status) {
   if (!status.isOK()) {
     logger.warn(MIRROR_TOOL_MESSAGE_PREFIX + StatusTool.collectProblems(status));
     hasLogged = true;
   }
 }
 @Override
 public void log(IArtifactDescriptor descriptor, IStatus status) {
   if (!status.isOK()) {
     logger.debug(MIRROR_TOOL_MESSAGE_PREFIX + StatusTool.collectProblems(status));
     hasLogged = true;
   }
 }
  /**
   * Generate p2 data for an artifact, if the artifact is an OSGI bundle.
   *
   * <p>The p2 metadata produced by this method is only determined by the artifact, and the function
   * used for this conversion must not change (significantly) even in future versions. This is
   * required because the resulting metadata can be included in p2 repositories built by Tycho, and
   * hence may be propagated into the p2 universe. Therefore the metadata generated by this method
   * shall fulfill the basic assumption of p2 that ID+version uniquely identifies a unit/artifact.
   * Assuming that distinct bundle artifacts specify unique ID+versions in their manifest (which
   * should be mostly true), and the p2 BundlesAction used in the implementation doesn't change
   * significantly (which can also be assumed), these conditions specified above a met.
   *
   * <p>In slight deviation on the principles described in the previous paragraph, the
   * implementation adds GAV properties to the generated IU. This is justified by the potential
   * benefits of tracing the origin of artifact.
   *
   * @param mavenArtifact An artifact in local file system.
   * @return the p2 metadata of the artifact, or <code>null</code> if the artifact isn't a valid
   *     OSGi bundle.
   */
  IInstallableUnit attemptToPublishBundle(IArtifactFacade mavenArtifact) {
    if (!isAvailableAsLocalFile(mavenArtifact)) {
      // this should have been ensured by the caller
      throw new IllegalArgumentException("Not an artifact file: " + mavenArtifact.getLocation());
    }
    if (isCertainlyNoBundle(mavenArtifact)) {
      return null;
    }

    PublisherRun publisherRun = new PublisherRun(mavenArtifact);
    IStatus status = publisherRun.execute();

    if (!status.isOK()) {
      /**
       * If publishing of a jar fails, it is simply not added to the resolution context. The
       * BundlesAction already ignores non-bundle JARs silently, so an error status here indicates a
       * caught exception that we at least want to see.
       */
      logger.warn(StatusTool.collectProblems(status), status.getException());
    }

    IInstallableUnit publishedIU = publisherRun.getPublishedUnitIfExists();
    if (publishedIU != null) {
      IArtifactDescriptor publishedDescriptor = publisherRun.getPublishedArtifactDescriptor();
      publishedArtifacts.addPublishedArtifact(publishedDescriptor, mavenArtifact);
    }

    return publishedIU;
  }
  @Override
  public void mirrorReactor(
      RepositoryReferences sources,
      DestinationRepositoryDescriptor destination,
      Collection<DependencySeed> projectSeeds,
      BuildContext context,
      boolean includeAllDependencies,
      boolean includePacked,
      Map<String, String> filterProperties)
      throws FacadeException {
    IProvisioningAgent agent = Activator.createProvisioningAgent(context.getTargetDirectory());
    try {
      final MirrorApplication mirrorApp =
          createMirrorApplication(sources, destination, agent, includePacked);

      // mirror scope: seed units...
      mirrorApp.setSourceIUs(
          toInstallableUnitList(projectSeeds, mirrorApp.getCompositeMetadataRepository(), sources));

      // TODO the p2 mirror tool should support mirroring multiple environments at once
      for (TargetEnvironment environment : context.getEnvironments()) {
        SlicingOptions options = new SlicingOptions();
        options.considerStrictDependencyOnly(!includeAllDependencies);
        Map<String, String> filter = options.getFilter();
        addFilterForFeatureJARs(filter);
        if (filterProperties != null) {
          filter.putAll(filterProperties);
        }
        filter.putAll(environment.toFilterProperties());
        mirrorApp.setSlicingOptions(options);

        try {
          LogListener logListener = new LogListener(mavenContext.getLogger());
          mirrorApp.setLog(logListener);

          IStatus returnStatus = mirrorApp.run(null);
          checkStatus(returnStatus);
          logListener.showHelpForLoggedMessages();

        } catch (ProvisionException e) {
          throw new FacadeException(
              MIRROR_FAILURE_MESSAGE + ": " + StatusTool.collectProblems(e.getStatus()), e);
        }
      }
    } finally {
      agent.stop();
    }
  }