1 /**
2 *
3 * Copyright 2006 The Apache Software Foundation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 package org.apache.geronimo.kernel.repository;
19
20 import java.io.Serializable;
21
22 /**
23 * @version $Rev: 430508 $ $Date: 2006-08-10 12:56:47 -0700 (Thu, 10 Aug 2006) $
24 */
25 public class Artifact implements Comparable, Serializable {
26 private static final long serialVersionUID = -3459638899709893444L;
27 public static final String DEFAULT_GROUP_ID = "default";
28
29 private final String groupId;
30 private final String artifactId;
31 private final Version version;
32 private final String type;
33
34 public Artifact(String groupId, String artifactId, String version, String type) {
35 this(groupId, artifactId, version == null ? null : new Version(version), type);
36 }
37
38 public Artifact(String groupId, String artifactId, Version version, String type) {
39 if (artifactId == null) throw new NullPointerException("artifactId is null");
40 this.groupId = groupId;
41 this.artifactId = artifactId;
42 this.version = version;
43 this.type = type;
44 }
45
46 public static Artifact create(String id) {
47 String[] parts = id.split("/", -1);
48 if (parts.length != 4) {
49 throw new IllegalArgumentException("Invalid id: " + id);
50 }
51 for (int i = 0; i < parts.length; i++) {
52 if (parts[i].equals("")) {
53 parts[i] = null;
54 }
55 }
56 return new Artifact(parts[0], parts[1], parts[2], parts[3]);
57 }
58
59 public String getGroupId() {
60 return groupId;
61 }
62
63 public String getArtifactId() {
64 return artifactId;
65 }
66
67 public Version getVersion() {
68 return version;
69 }
70
71 public String getType() {
72 return type;
73 }
74
75 public boolean isResolved() {
76 return groupId != null && artifactId != null && version != null && type != null;
77 }
78
79 public int compareTo(Object object) {
80 Artifact artifact = (Artifact) object;
81
82 int i = safeCompare(groupId, artifact.groupId);
83 if (i != 0) return i;
84
85 i = safeCompare(artifactId, artifact.artifactId);
86 if (i != 0) return i;
87
88 i = safeCompare(version, artifact.version);
89 if (i != 0) return i;
90
91 i = safeCompare(type, artifact.type);
92 return i;
93 }
94
95 private static int GREATER = 1;
96 private static int LESS = -1;
97
98 private static int safeCompare(Comparable left, Comparable right) {
99 if (left == null) {
100 if (right != null) return LESS;
101 return 0;
102 }
103 if (right == null) return GREATER;
104 return left.compareTo(right);
105 }
106
107 public boolean equals(Object o) {
108 if (this == o) return true;
109 if (o == null || getClass() != o.getClass()) return false;
110
111 final Artifact artifact = (Artifact) o;
112
113 if (!artifactId.equals(artifact.artifactId)) {
114 return false;
115 }
116
117 if (groupId != null ? !groupId.equals(artifact.groupId) : artifact.groupId != null) {
118 return false;
119 }
120
121 if (type != null ? !type.equals(artifact.type) : artifact.type != null) {
122 return false;
123 }
124
125 return !(version != null ? !version.equals(artifact.version) : artifact.version != null);
126
127 }
128
129 public int hashCode() {
130 int result;
131 result = (groupId != null ? groupId.hashCode() : 0);
132 result = 29 * result + artifactId.hashCode();
133 result = 29 * result + (version != null ? version.hashCode() : 0);
134 result = 29 * result + (type != null ? type.hashCode() : 0);
135 return result;
136 }
137
138 public String toString() {
139 StringBuffer buffer = new StringBuffer();
140
141 if (groupId != null) {
142 buffer.append(groupId);
143 }
144 buffer.append("/");
145
146 buffer.append(artifactId);
147 buffer.append("/");
148
149 if (version != null) {
150 buffer.append(version);
151 }
152 buffer.append("/");
153
154 if (type != null) {
155 buffer.append(type);
156 }
157 return buffer.toString();
158 }
159
160 /**
161 * see if this artifact matches the other artifact (which is more specific than this one)
162 *
163 * @param otherArtifact the more specific artifact we are comparing with
164 * @return whether the other artifact is consistent with everything specified in this artifact.
165 */
166 public boolean matches(Artifact otherArtifact) {
167 if (groupId != null && !groupId.equals(otherArtifact.groupId)) {
168 return false;
169 }
170 if (artifactId != null && !artifactId.equals(otherArtifact.artifactId)) {
171 return false;
172 }
173 if (version != null && !version.equals(otherArtifact.version)) {
174 return false;
175 }
176 return (type == null || type.equals(otherArtifact.type));
177 }
178 }