001    /**
002     *  Licensed to the Apache Software Foundation (ASF) under one or more
003     *  contributor license agreements.  See the NOTICE file distributed with
004     *  this work for additional information regarding copyright ownership.
005     *  The ASF licenses this file to You under the Apache License, Version 2.0
006     *  (the "License"); you may not use this file except in compliance with
007     *  the License.  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     *  Unless required by applicable law or agreed to in writing, software
012     *  distributed under the License is distributed on an "AS IS" BASIS,
013     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     *  See the License for the specific language governing permissions and
015     *  limitations under the License.
016     */
017    
018    package org.apache.geronimo.kernel.repository;
019    
020    import java.io.Serializable;
021    
022    /**
023     * @version $Rev: 560100 $ $Date: 2007-07-27 01:00:38 -0400 (Fri, 27 Jul 2007) $
024     */
025    public class Artifact implements Comparable, Serializable {
026        private static final long serialVersionUID = -3459638899709893444L;
027        public static final String DEFAULT_GROUP_ID = "default";
028    
029        private final String groupId;
030        private final String artifactId;
031        private final Version version;
032        private final String type;
033    
034        public Artifact(String groupId, String artifactId, String version, String type) {
035            this(groupId, artifactId, version == null ? null : new Version(version), type);
036        }
037    
038        public Artifact(String groupId, String artifactId, Version version, String type) {
039            if (artifactId == null) throw new NullPointerException("artifactId is null: groupId: " + groupId + ", version: " + version + ", type: " + type);
040            this.groupId = groupId;
041            this.artifactId = artifactId;
042            this.version = version;
043            this.type = type;
044        }
045    
046        public static Artifact create(String id) {
047            String[] parts = id.split("/", -1);
048            if (parts.length != 4) {
049                throw new IllegalArgumentException("Invalid id: " + id);
050            }
051            for (int i = 0; i < parts.length; i++) {
052                if (parts[i].equals("")) {
053                    parts[i] = null;
054                }
055            }
056            return new Artifact(parts[0], parts[1], parts[2], parts[3]);
057        }
058    
059        public String getGroupId() {
060            return groupId;
061        }
062    
063        public String getArtifactId() {
064            return artifactId;
065        }
066    
067        public Version getVersion() {
068            return version;
069        }
070    
071        public String getType() {
072            return type;
073        }
074    
075        public boolean isResolved() {
076            return groupId != null && artifactId != null && version != null && type != null;
077        }
078    
079        public int compareTo(Object object) {
080            Artifact artifact = (Artifact) object;
081    
082            int i = safeCompare(groupId, artifact.groupId);
083            if (i != 0) return i;
084    
085            i = safeCompare(artifactId, artifact.artifactId);
086            if (i != 0) return i;
087    
088            i = safeCompare(version, artifact.version);
089            if (i != 0) return i;
090    
091            i = safeCompare(type, artifact.type);
092            return i;
093        }
094    
095        private static int GREATER = 1;
096        private static int LESS = -1;
097    
098        private static int safeCompare(Comparable left, Comparable right) {
099            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    }