All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.tesla.maven.plugins.util.AetherUtils Maven / Gradle / Ivy

The newest version!
package io.tesla.maven.plugins.util;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
import org.apache.maven.model.Repository;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.artifact.ArtifactProperties;
import org.eclipse.aether.artifact.ArtifactType;
import org.eclipse.aether.artifact.ArtifactTypeRegistry;
import org.eclipse.aether.artifact.DefaultArtifact;
import org.eclipse.aether.artifact.DefaultArtifactType;
import org.eclipse.aether.graph.Dependency;
import org.eclipse.aether.graph.DependencyFilter;
import org.eclipse.aether.graph.DependencyNode;
import org.eclipse.aether.graph.Exclusion;
import org.eclipse.aether.repository.Authentication;
import org.eclipse.aether.repository.Proxy;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.repository.RepositoryPolicy;
import org.eclipse.aether.util.repository.AuthenticationBuilder;

/**
 * Warning: This is an internal utility class that is only public for technical reasons, it is not part
 * of the public API. In particular, this class can be changed or deleted without prior notice.
 * 
 * @author Benjamin Bentmann
 */
public class AetherUtils {

  //
  // Repository Utils
  //
  
  private static String nullify(String string) {
    return (string == null || string.length() <= 0) ? null : string;
  }

  private static org.apache.maven.artifact.Artifact toArtifact(Dependency dependency) {
    if (dependency == null) {
      return null;
    }

    org.apache.maven.artifact.Artifact result = toArtifact(dependency.getArtifact());
    result.setScope(dependency.getScope());
    result.setOptional(dependency.isOptional());

    return result;
  }

  public static org.apache.maven.artifact.Artifact toArtifact(Artifact artifact) {
    if (artifact == null) {
      return null;
    }

    ArtifactHandler handler = newHandler(artifact);

    /*
     * NOTE: From Artifact.hasClassifier(), an empty string and a null both denote "no classifier". However, some plugins only check for null, so be sure to nullify an empty classifier.
     */
    org.apache.maven.artifact.Artifact result = new org.apache.maven.artifact.DefaultArtifact(artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), null, artifact.getProperty(
        ArtifactProperties.TYPE, artifact.getExtension()), nullify(artifact.getClassifier()), handler);

    result.setFile(artifact.getFile());
    result.setResolved(artifact.getFile() != null);

    List trail = new ArrayList(1);
    trail.add(result.getId());
    result.setDependencyTrail(trail);

    return result;
  }

  public static void toArtifacts(Collection artifacts, Collection nodes, List trail, DependencyFilter filter) {
    for (DependencyNode node : nodes) {
      org.apache.maven.artifact.Artifact artifact = toArtifact(node.getDependency());

      List nodeTrail = new ArrayList(trail.size() + 1);
      nodeTrail.addAll(trail);
      nodeTrail.add(artifact.getId());

      if (filter == null || filter.accept(node, Collections. emptyList())) {
        artifact.setDependencyTrail(nodeTrail);
        artifacts.add(artifact);
      }

      toArtifacts(artifacts, node.getChildren(), nodeTrail, filter);
    }
  }

  public static Artifact toArtifact(org.apache.maven.artifact.Artifact artifact) {
    if (artifact == null) {
      return null;
    }

    String version = artifact.getVersion();
    if (version == null && artifact.getVersionRange() != null) {
      version = artifact.getVersionRange().toString();
    }

    Map props = null;
    if (org.apache.maven.artifact.Artifact.SCOPE_SYSTEM.equals(artifact.getScope())) {
      String localPath = (artifact.getFile() != null) ? artifact.getFile().getPath() : "";
      props = Collections.singletonMap(ArtifactProperties.LOCAL_PATH, localPath);
    }

    Artifact result = new DefaultArtifact(artifact.getGroupId(), artifact.getArtifactId(), artifact.getClassifier(), artifact.getArtifactHandler().getExtension(), version, props, newArtifactType(
        artifact.getType(), artifact.getArtifactHandler()));
    result = result.setFile(artifact.getFile());

    return result;
  }

  public static Dependency toDependency(org.apache.maven.artifact.Artifact artifact, Collection exclusions) {
    if (artifact == null) {
      return null;
    }

    Artifact result = toArtifact(artifact);

    List excl = null;
    if (exclusions != null) {
      excl = new ArrayList(exclusions.size());
      for (org.apache.maven.model.Exclusion exclusion : exclusions) {
        excl.add(toExclusion(exclusion));
      }
    }

    return new Dependency(result, artifact.getScope(), artifact.isOptional(), excl);
  }

  public static List toRepos(List repos) {
    if (repos == null) {
      return null;
    }

    List results = new ArrayList(repos.size());
    for (ArtifactRepository repo : repos) {
      results.add(toRepo(repo));
    }
    return results;
  }

  public static RemoteRepository toRepo(ArtifactRepository repo) {
    RemoteRepository result = null;
    if (repo != null) {
      RemoteRepository.Builder builder = new RemoteRepository.Builder(repo.getId(), getLayout(repo), repo.getUrl());
      builder.setSnapshotPolicy(toPolicy(repo.getSnapshots()));
      builder.setReleasePolicy(toPolicy(repo.getReleases()));
      builder.setAuthentication(toAuthentication(repo.getAuthentication()));
      builder.setProxy(toProxy(repo.getProxy()));
      builder.setMirroredRepositories(toRepos(repo.getMirroredRepositories()));
      result = builder.build();
    }
    return result;
  }

  public static String getLayout(ArtifactRepository repo) {
    try {
      return repo.getLayout().getId();
    } catch (LinkageError e) {
      /*
       * NOTE: getId() was added in 3.x and is as such not implemented by plugins compiled against 2.x APIs.
       */
      String className = repo.getLayout().getClass().getSimpleName();
      if (className.endsWith("RepositoryLayout")) {
        String layout = className.substring(0, className.length() - "RepositoryLayout".length());
        if (layout.length() > 0) {
          layout = Character.toLowerCase(layout.charAt(0)) + layout.substring(1);
          return layout;
        }
      }
      return "";
    }
  }

  private static RepositoryPolicy toPolicy(ArtifactRepositoryPolicy policy) {
    RepositoryPolicy result = null;
    if (policy != null) {
      result = new RepositoryPolicy(policy.isEnabled(), policy.getUpdatePolicy(), policy.getChecksumPolicy());
    }
    return result;
  }

  private static Authentication toAuthentication(org.apache.maven.artifact.repository.Authentication auth) {
    Authentication result = null;
    if (auth != null) {
      AuthenticationBuilder authBuilder = new AuthenticationBuilder();
      authBuilder.addUsername(auth.getUsername()).addPassword(auth.getPassword());
      authBuilder.addPrivateKey(auth.getPrivateKey(), auth.getPassphrase());
      result = authBuilder.build();
    }
    return result;
  }

  private static Proxy toProxy(org.apache.maven.repository.Proxy proxy) {
    Proxy result = null;
    if (proxy != null) {
      AuthenticationBuilder authBuilder = new AuthenticationBuilder();
      authBuilder.addUsername(proxy.getUserName()).addPassword(proxy.getPassword());
      result = new Proxy(proxy.getProtocol(), proxy.getHost(), proxy.getPort(), authBuilder.build());
    }
    return result;
  }

  public static ArtifactHandler newHandler(Artifact artifact) {
    String type = artifact.getProperty(ArtifactProperties.TYPE, artifact.getExtension());
    DefaultArtifactHandler handler = new DefaultArtifactHandler(type);
    handler.setExtension(artifact.getExtension());
    handler.setLanguage(artifact.getProperty(ArtifactProperties.LANGUAGE, null));
    handler.setAddedToClasspath(Boolean.parseBoolean(artifact.getProperty(ArtifactProperties.CONSTITUTES_BUILD_PATH, "")));
    handler.setIncludesDependencies(Boolean.parseBoolean(artifact.getProperty(ArtifactProperties.INCLUDES_DEPENDENCIES, "")));
    return handler;
  }

  public static ArtifactType newArtifactType(String id, ArtifactHandler handler) {
    return new DefaultArtifactType(id, handler.getExtension(), handler.getClassifier(), handler.getLanguage(), handler.isAddedToClasspath(), handler.isIncludesDependencies());
  }

  public static Dependency toDependency(org.apache.maven.model.Dependency dependency, ArtifactTypeRegistry stereotypes) {
    ArtifactType stereotype = stereotypes.get(dependency.getType());
    if (stereotype == null) {
      stereotype = new DefaultArtifactType(dependency.getType());
    }

    boolean system = dependency.getSystemPath() != null && dependency.getSystemPath().length() > 0;

    Map props = null;
    if (system) {
      props = Collections.singletonMap(ArtifactProperties.LOCAL_PATH, dependency.getSystemPath());
    }

    Artifact artifact = new DefaultArtifact(dependency.getGroupId(), dependency.getArtifactId(), dependency.getClassifier(), null, dependency.getVersion(), props, stereotype);

    List exclusions = new ArrayList(dependency.getExclusions().size());
    for (org.apache.maven.model.Exclusion exclusion : dependency.getExclusions()) {
      exclusions.add(toExclusion(exclusion));
    }

    Dependency result = new Dependency(artifact, dependency.getScope(), dependency.isOptional(), exclusions);

    return result;
  }

  private static Exclusion toExclusion(org.apache.maven.model.Exclusion exclusion) {
    return new Exclusion(exclusion.getGroupId(), exclusion.getArtifactId(), "*", "*");
  }

  public static ArtifactTypeRegistry newArtifactTypeRegistry(ArtifactHandlerManager handlerManager) {
    return new MavenArtifactTypeRegistry(handlerManager);
  }

  static class MavenArtifactTypeRegistry implements ArtifactTypeRegistry {

    private final ArtifactHandlerManager handlerManager;

    public MavenArtifactTypeRegistry(ArtifactHandlerManager handlerManager) {
      this.handlerManager = handlerManager;
    }

    public ArtifactType get(String stereotypeId) {
      ArtifactHandler handler = handlerManager.getArtifactHandler(stereotypeId);
      return newArtifactType(stereotypeId, handler);
    }
  }
  
  //
  // ArtifactDescriptor Utils
  //
  
  public static Artifact toPomArtifact(Artifact artifact) {
    Artifact pomArtifact = artifact;

    if (pomArtifact.getClassifier().length() > 0 || !"pom".equals(pomArtifact.getExtension())) {
      pomArtifact = new DefaultArtifact(artifact.getGroupId(), artifact.getArtifactId(), "pom", artifact.getVersion());
    }

    return pomArtifact;
  }

  public static RemoteRepository toRemoteRepository(Repository repository) {
    RemoteRepository.Builder builder = new RemoteRepository.Builder(repository.getId(), repository.getLayout(), repository.getUrl());
    builder.setSnapshotPolicy(toRepositoryPolicy(repository.getSnapshots()));
    builder.setReleasePolicy(toRepositoryPolicy(repository.getReleases()));
    return builder.build();
  }

  public static RepositoryPolicy toRepositoryPolicy(org.apache.maven.model.RepositoryPolicy policy) {
    boolean enabled = true;
    String checksums = RepositoryPolicy.CHECKSUM_POLICY_WARN;
    String updates = RepositoryPolicy.UPDATE_POLICY_DAILY;

    if (policy != null) {
      enabled = policy.isEnabled();
      if (policy.getUpdatePolicy() != null) {
        updates = policy.getUpdatePolicy();
      }
      if (policy.getChecksumPolicy() != null) {
        checksums = policy.getChecksumPolicy();
      }
    }

    return new RepositoryPolicy(enabled, updates, checksums);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy