1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, 13 * software distributed under the License is distributed on an 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 * KIND, either express or implied. See the License for the 16 * specific language governing permissions and limitations 17 * under the License. 18 */ 19 package org.eclipse.aether.internal.test.util; 20 21 import org.eclipse.aether.RepositorySystemSession; 22 import org.eclipse.aether.artifact.Artifact; 23 import org.eclipse.aether.resolution.ArtifactDescriptorException; 24 import org.eclipse.aether.resolution.ArtifactDescriptorRequest; 25 import org.eclipse.aether.resolution.ArtifactDescriptorResult; 26 27 import static java.util.Objects.requireNonNull; 28 29 /** 30 * An artifact descriptor reader that gets data from a simple text file on the classpath. The data file for an artifact 31 * with the coordinates {@code gid:aid:ext:ver} is expected to be named {@code gid_aid_ver.ini} and can optionally have 32 * some prefix. The data file can have the following sections: 33 * <ul> 34 * <li>relocation</li> 35 * <li>dependencies</li> 36 * <li>managedDependencies</li> 37 * <li>repositories</li> 38 * </ul> 39 * The relocation and dependency sections contain artifact coordinates of the form: 40 * 41 * <pre> 42 * gid:aid:ext:ver[:scope][:optional] 43 * </pre> 44 * 45 * The dependency sections may also specify exclusions: 46 * 47 * <pre> 48 * -gid:aid 49 * </pre> 50 * 51 * A repository definition is of the form: 52 * 53 * <pre> 54 * id:type:url 55 * </pre> 56 * 57 * <h2>Example</h2> 58 * 59 * <pre> 60 * [relocation] 61 * gid:aid:ext:ver 62 * 63 * [dependencies] 64 * gid:aid:ext:ver:scope 65 * -exclusion:aid 66 * gid:aid2:ext:ver:scope:optional 67 * 68 * [managed-dependencies] 69 * gid:aid2:ext:ver2:scope 70 * -gid:aid 71 * -gid:aid 72 * 73 * [repositories] 74 * id:type:file:///test-repo 75 * </pre> 76 */ 77 public class IniArtifactDescriptorReader { 78 private final IniArtifactDataReader reader; 79 80 /** 81 * Use the given prefix to load the artifact descriptions from the classpath. 82 */ 83 public IniArtifactDescriptorReader(String prefix) { 84 reader = new IniArtifactDataReader(prefix); 85 } 86 87 /** 88 * Parses the resource {@code $prefix/gid_aid_ver.ini} from the request artifact as an artifact description and 89 * wraps it into an ArtifactDescriptorResult. 90 */ 91 public ArtifactDescriptorResult readArtifactDescriptor( 92 RepositorySystemSession session, ArtifactDescriptorRequest request) throws ArtifactDescriptorException { 93 requireNonNull(session, "session cannot be null"); 94 requireNonNull(request, "request cannot be null"); 95 ArtifactDescriptorResult result = new ArtifactDescriptorResult(request); 96 for (Artifact artifact = request.getArtifact(); ; ) { 97 String resourceName = String.format( 98 "%s_%s_%s.ini", artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion()); 99 try { 100 ArtifactDescription data = reader.parse(resourceName); 101 if (data.getRelocation() != null) { 102 result.addRelocation(artifact); 103 result.setArtifact(data.getRelocation()); 104 artifact = data.getRelocation(); 105 } else { 106 result.setArtifact(artifact); 107 result.setDependencies(data.getDependencies()); 108 result.setManagedDependencies(data.getManagedDependencies()); 109 result.setRepositories(data.getRepositories()); 110 return result; 111 } 112 } catch (Exception e) { 113 throw new ArtifactDescriptorException(result, e.getMessage(), e); 114 } 115 } 116 } 117 }