@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 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();
    }
  }
 // injected by DS runtime
 public void setMavenContext(MavenContext mavenContext) {
   this.localRepositoryRoot = mavenContext.getLocalRepositoryRoot();
   this.logger = mavenContext.getLogger();
 }