/**
   * Creates a new Maven-like repository system session by initializing the session with values
   * typical for Maven-based resolution. In more detail, this method configures settings relevant
   * for the processing of dependency graphs, most other settings remain at their generic default
   * value. Use the various setters to further configure the session with authentication, mirror,
   * proxy and other information required for your environment.
   *
   * @return The new repository system session, never {@code null}.
   */
  public static DefaultRepositorySystemSession newSession() {
    DefaultRepositorySystemSession session = new DefaultRepositorySystemSession();

    DependencyTraverser depTraverser = new FatArtifactTraverser();
    session.setDependencyTraverser(depTraverser);

    DependencyManager depManager = new ClassicDependencyManager();
    session.setDependencyManager(depManager);

    DependencySelector depFilter =
        new AndDependencySelector(
            new ScopeDependencySelector("test", "provided"),
            new OptionalDependencySelector(),
            new ExclusionDependencySelector());
    session.setDependencySelector(depFilter);

    DependencyGraphTransformer transformer =
        new ConflictResolver(
            new NearestVersionSelector(), new JavaScopeSelector(),
            new SimpleOptionalitySelector(), new JavaScopeDeriver());

    session.setDependencyGraphTransformer(
        new ChainedDependencyGraphTransformer(transformer, new JavaDependencyContextRefiner()));

    DefaultArtifactTypeRegistry stereotypes = new DefaultArtifactTypeRegistry();
    stereotypes.add(new DefaultArtifactType("pom"));
    stereotypes.add(new DefaultArtifactType("maven-plugin", "jar", "", "java"));
    stereotypes.add(new DefaultArtifactType("jar", "jar", "", "java"));
    stereotypes.add(new DefaultArtifactType("ejb", "jar", "", "java"));
    stereotypes.add(new DefaultArtifactType("ejb-client", "jar", "client", "java"));
    stereotypes.add(new DefaultArtifactType("test-jar", "jar", "tests", "java"));
    stereotypes.add(new DefaultArtifactType("javadoc", "jar", "javadoc", "java"));
    stereotypes.add(new DefaultArtifactType("java-source", "jar", "sources", "java", false, false));
    stereotypes.add(new DefaultArtifactType("war", "war", "", "java", false, true));
    stereotypes.add(new DefaultArtifactType("ear", "ear", "", "java", false, true));
    stereotypes.add(new DefaultArtifactType("rar", "rar", "", "java", false, true));
    stereotypes.add(new DefaultArtifactType("par", "par", "", "java", false, true));
    session.setArtifactTypeRegistry(stereotypes);

    session.setArtifactDescriptorPolicy(new SimpleArtifactDescriptorPolicy(true, true));

    final Properties systemProperties = new Properties();

    // MNG-5670 guard against ConcurrentModificationException
    // MNG-6053 guard against key without value
    Properties sysProp = System.getProperties();
    synchronized (sysProp) {
      systemProperties.putAll(sysProp);
    }

    session.setSystemProperties(systemProperties);
    session.setConfigProperties(systemProperties);

    return session;
  }