/** * Copyright 2015-2016 Red Hat, Inc, and individual contributors. * * Licensed 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. */ package org.wildfly.swarm.bootstrap.util; import java.io.File; import java.io.IOException; import org.jboss.modules.maven.ArtifactCoordinates; /** * @author Bob McWhirter */ public class MavenArtifactDescriptor implements Comparable<MavenArtifactDescriptor> { private static final String INVALID_GAV_MESSAGE = "Invalid gav: "; private static final String JAR_PACKAGING = "jar"; private static final String COLON = ":"; private MavenArtifactDescriptor() { } public MavenArtifactDescriptor(String groupId, String artifactId, String version) { this(groupId, artifactId, JAR_PACKAGING, null, version); } public MavenArtifactDescriptor(String groupId, String artifactId, String type, String classifier, String version) { this.groupId = groupId; this.artifactId = artifactId; this.version = version; this.type = type; if (classifier != null && !classifier.trim().equals("")) { this.classifier = classifier; } } public static Builder build() { return new MavenArtifactDescriptor().builder().type(JAR_PACKAGING); } public static MavenArtifactDescriptor fromMscGav(String gav) throws IOException { String[] parts = gav.split(COLON); if (parts.length == 3) { return new MavenArtifactDescriptor(parts[0], parts[1], parts[2]); } else if (parts.length == 4) { return new MavenArtifactDescriptor(parts[0], parts[1], JAR_PACKAGING, parts[3], parts[2]); } else { throw new IOException(INVALID_GAV_MESSAGE + gav); } } public static MavenArtifactDescriptor fromMavenGav(String gav) throws IOException { String[] parts = gav.split(COLON); if (parts.length == 3) { return new MavenArtifactDescriptor(parts[0], parts[1], parts[2]); } else if (parts.length == 4) { return new MavenArtifactDescriptor(parts[0], parts[1], parts[2], null, parts[3]); } else if (parts.length == 5) { return new MavenArtifactDescriptor(parts[0], parts[1], parts[2], parts[3], parts[4]); } else if (parts.length == 6) { return new MavenArtifactDescriptor(parts[0], parts[1], parts[2], parts[3], parts[4]); } else { throw new IOException(INVALID_GAV_MESSAGE + gav); } } @Override public int compareTo(MavenArtifactDescriptor that) { int result = this.groupId.compareTo(that.groupId); if (result != 0) { return result; } result = this.artifactId.compareTo(that.artifactId); if (result != 0) { return result; } result = this.version.compareTo(that.version); if (result != 0) { return result; } if (this.type != null && that.type == null) { return 1; } if (this.type == null && that.type != null) { return -1; } result = this.type.compareTo(that.type); if (result != 0) { return result; } if (this.classifier != null && that.classifier == null) { return 1; } if (this.classifier == null && that.classifier != null) { return -1; } return this.classifier.compareTo(that.classifier); } public String groupId() { return this.groupId; } public String artifactId() { return this.artifactId; } public String version() { return this.version; } public String classifier() { return this.classifier; } public String type() { return this.type; } public String mscGav() { return this.groupId + COLON + this.artifactId + COLON + this.version + (this.classifier == null ? "" : COLON + this.classifier); } public ArtifactCoordinates mscCoordinates() { return new ArtifactCoordinates(this.groupId, this.artifactId, this.version, this.classifier == null ? "" : this.classifier); } public String mavenGav() { return this.groupId + COLON + this.artifactId + COLON + (this.type == null ? JAR_PACKAGING : this.type) + COLON + (this.classifier == null ? "" : this.classifier + COLON) + this.version; } public String repoPath(boolean forJar) { char delim = File.separatorChar; if (forJar) { delim = '/'; } String[] groupParts = this.groupId.split("\\."); StringBuffer p = new StringBuffer(); for (String groupPart : groupParts) { p.append(groupPart) .append(delim); } p.append(this.artifactId) .append(delim); p.append(this.version) .append(delim); p.append(this.artifactId) .append('-') .append(this.version); if (this.classifier != null) { p.append('-') .append(this.classifier); } p.append('.').append(this.type); return p.toString(); } public String toString() { return mscGav(); } private Builder builder() { return new Builder(); } private String groupId; private String artifactId; private String version; private String classifier; private String type; @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } MavenArtifactDescriptor that = (MavenArtifactDescriptor) o; if (!groupId.equals(that.groupId)) { return false; } if (!artifactId.equals(that.artifactId)) { return false; } if (version != null ? !version.equals(that.version) : that.version != null) { return false; } if (classifier != null ? !classifier.equals(that.classifier) : that.classifier != null) { return false; } return type.equals(that.type); } @Override public int hashCode() { int result = groupId.hashCode(); result = 31 * result + artifactId.hashCode(); result = 31 * result + (version != null ? version.hashCode() : 0); result = 31 * result + (classifier != null ? classifier.hashCode() : 0); result = 31 * result + type.hashCode(); return result; } public class Builder { public Builder groupId(String groupId) { MavenArtifactDescriptor.this.groupId = groupId; return this; } public Builder artifactId(String artifactId) { MavenArtifactDescriptor.this.artifactId = artifactId; return this; } public Builder version(String version) { MavenArtifactDescriptor.this.version = version; return this; } public Builder type(String type) { MavenArtifactDescriptor.this.type = type; return this; } public Builder classifier(String classifier) { MavenArtifactDescriptor.this.classifier = classifier; return this; } public MavenArtifactDescriptor build() { return MavenArtifactDescriptor.this; } } }