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 package org.apache.geronimo.kernel.repository;
018
019 import java.io.File;
020 import java.io.FilenameFilter;
021 import java.util.ArrayList;
022 import java.util.List;
023 import java.util.SortedSet;
024 import java.util.TreeSet;
025
026 /**
027 * @version $Rev: 476049 $ $Date: 2006-11-17 15:35:17 +1100 (Fri, 17 Nov 2006) $
028 */
029 public class Maven2Repository extends AbstractRepository implements WritableListableRepository {
030
031 public Maven2Repository(File rootFile) {
032 super(rootFile);
033 }
034
035 public File getLocation(Artifact artifact) {
036 if(!artifact.isResolved()) {
037 throw new IllegalArgumentException("Artifact "+artifact+" is not fully resolved");
038 }
039 File path = new File(rootFile, artifact.getGroupId().replace('.', File.separatorChar));
040 path = new File(path, artifact.getArtifactId());
041 path = new File(path, artifact.getVersion().toString());
042 path = new File(path, artifact.getArtifactId() + "-" + artifact.getVersion() + "." + artifact.getType());
043
044 return path;
045 }
046
047 public SortedSet list() {
048 return listInternal(null, null, null);
049 }
050
051 public SortedSet list(Artifact query) {
052 if(query.getGroupId() != null) { // todo: see if more logic can be shared with the other case
053 File path = new File(rootFile, query.getGroupId().replace('.', File.separatorChar));
054 path = new File(path, query.getArtifactId());
055 if(!path.canRead() || !path.isDirectory()) {
056 return new TreeSet();
057 }
058
059 SortedSet artifacts = new TreeSet();
060
061 File[] versionDirs = path.listFiles();
062 for (int i = 0; i < versionDirs.length; i++) {
063 File versionDir = versionDirs[i];
064 if (versionDir.canRead() && versionDir.isDirectory()) {
065 String version = versionDir.getName();
066 if(query.getVersion() != null && !query.getVersion().toString().equals(version)) {
067 continue;
068 }
069 // Assumes that artifactId is set
070 final String filePrefix = query.getArtifactId() + "-" + version + ".";
071 File[] list = versionDir.listFiles(new FilenameFilter() {
072 public boolean accept(File dir, String name) {
073 return name.startsWith(filePrefix);
074 }
075 });
076 for (int j = 0; j < list.length; j++) {
077 File file = list[j];
078 String end = file.getName().substring(filePrefix.length());
079 if(query.getType() != null && !query.getType().equals(end)) {
080 continue;
081 }
082 if(end.indexOf('.') < 0) {
083 artifacts.add(new Artifact(query.getGroupId(), query.getArtifactId(), version, end));
084 }
085 }
086 }
087 }
088 return artifacts;
089 } else {
090 return listInternal(query.getArtifactId(), query.getType(), query.getVersion() == null ? null : query.getVersion().toString());
091 }
092 }
093
094 private SortedSet listInternal(String artifactMatch, String typeMatch, String versionMatch) {
095 SortedSet artifacts = new TreeSet();
096 File[] groupIds = rootFile.listFiles();
097 for (int i = 0; i < groupIds.length; i++) {
098 File groupId = groupIds[i];
099 if (groupId.canRead() && groupId.isDirectory()) {
100 File[] versionDirs = groupId.listFiles();
101 for (int j = 0; j < versionDirs.length; j++) {
102 File versionDir = versionDirs[j];
103 if (versionDir.canRead() && versionDir.isDirectory()) {
104 artifacts.addAll(getArtifacts(null, versionDir, artifactMatch, typeMatch, versionMatch));
105 }
106 }
107 }
108 }
109 return artifacts;
110 }
111
112 private List getArtifacts(String groupId, File versionDir, String artifactMatch, String typeMatch, String versionMatch) {
113 // org/apache/xbean/xbean-classpath/2.2-SNAPSHOT/xbean-classpath-2.2-SNAPSHOT.jar
114 List artifacts = new ArrayList();
115 String artifactId = versionDir.getParentFile().getName();
116
117 File[] files = versionDir.listFiles();
118 for (int i = 0; i < files.length; i++) {
119 File file = files[i];
120 if (file.canRead()) {
121 if (file.isDirectory()) {
122 File test = new File(file, "META-INF");
123 if(test.exists() && test.isDirectory() && test.canRead() && groupId != null) {
124 String version = versionDir.getName();
125 String fileHeader = artifactId + "-" + version + ".";
126
127 String fileName = file.getName();
128 if (fileName.startsWith(fileHeader)) {
129 // type is everything after the file header
130 String type = fileName.substring(fileHeader.length());
131
132 if (!type.endsWith(".sha1") && !type.endsWith(".md5")) {
133 if(artifactMatch != null && !artifactMatch.equals(artifactId)) {
134 continue;
135 }
136 if(typeMatch != null && !typeMatch.equals(type)) {
137 continue;
138 }
139 if(versionMatch != null && !versionMatch.equals(version)) {
140 continue;
141 }
142 artifacts.add(new Artifact(groupId,
143 artifactId,
144 version,
145 type));
146 }
147 }
148 } else { // this is just part of the path to the artifact
149 String nextGroupId;
150 if (groupId == null) {
151 nextGroupId = artifactId;
152 } else {
153 nextGroupId = groupId + "." + artifactId;
154 }
155
156 artifacts.addAll(getArtifacts(nextGroupId, file, artifactMatch, typeMatch, versionMatch));
157 }
158 } else if (groupId != null) {
159 String version = versionDir.getName();
160 String fileHeader = artifactId + "-" + version + ".";
161
162 String fileName = file.getName();
163 if (fileName.startsWith(fileHeader)) {
164 // type is everything after the file header
165 String type = fileName.substring(fileHeader.length());
166
167 if (!type.endsWith(".sha1") && !type.endsWith(".md5")) {
168 if(artifactMatch != null && !artifactMatch.equals(artifactId)) {
169 continue;
170 }
171 if(typeMatch != null && !typeMatch.equals(type)) {
172 continue;
173 }
174 if(versionMatch != null && !versionMatch.equals(version)) {
175 continue;
176 }
177 artifacts.add(new Artifact(groupId,
178 artifactId,
179 version,
180 type
181 ));
182 }
183 }
184 }
185 }
186 }
187 return artifacts;
188 }
189
190 }