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.util.ArrayList; 021 import java.util.Arrays; 022 import java.util.Iterator; 023 import java.util.List; 024 import java.util.SortedSet; 025 import java.util.TreeSet; 026 import java.util.regex.Matcher; 027 import java.util.regex.Pattern; 028 029 /** 030 * @version $Rev: 476049 $ $Date: 2006-11-17 15:35:17 +1100 (Fri, 17 Nov 2006) $ 031 */ 032 public class Maven1Repository extends AbstractRepository implements WritableListableRepository { 033 034 public Maven1Repository(File rootFile) { 035 super(rootFile); 036 } 037 038 public File getLocation(Artifact artifact) { 039 File path = new File(rootFile, artifact.getGroupId()); 040 path = new File(path, artifact.getType() + "s"); 041 String ext = artifact.getType(); 042 if(ext.equals("ejb")) { 043 ext = "jar"; 044 } 045 path = new File(path, artifact.getArtifactId() + "-" + artifact.getVersion() + "." + ext); 046 047 return path; 048 } 049 050 public SortedSet list(Artifact query) { 051 SortedSet artifacts = new TreeSet(); 052 if(query.getGroupId() != null && query.getArtifactId() != null && query.getType() != null) { 053 054 File path = new File(rootFile, query.getGroupId()); 055 path = new File(path, query.getType() + "s"); 056 057 File[] files = path.listFiles(); 058 if (files != null) { 059 for (int i = 0; i < files.length; i++) { 060 File file = files[i]; 061 String fileName = file.getName(); 062 if (fileName.startsWith(query.getArtifactId() + "-") && fileName.endsWith("." + query.getType())) { 063 String version = fileName.substring(query.getArtifactId().length() + 1); 064 version = version.substring(0, version.length() - 1 - query.getType().length()); 065 if(query.getVersion() != null && !query.getVersion().toString().equals(version)) { 066 continue; 067 } 068 artifacts.add(new Artifact(query.getGroupId(), query.getArtifactId(), version, query.getType())); 069 } 070 } 071 } 072 } else { 073 // todo: not very efficient 074 SortedSet set = list(); 075 String targetGroup = query.getGroupId(); 076 String targetArtifact = query.getArtifactId(); 077 Version targetVersion = query.getVersion(); 078 String targetType = query.getType(); 079 for (Iterator it = set.iterator(); it.hasNext();) { 080 Artifact candidate = (Artifact) it.next(); 081 if(targetGroup != null && !targetGroup.equals(candidate.getGroupId())) { 082 continue; 083 } 084 if(targetArtifact != null && !targetArtifact.equals(candidate.getArtifactId())) { 085 continue; 086 } 087 if(targetType != null && !targetType.equals(candidate.getType())) { 088 continue; 089 } 090 if(targetVersion != null && !targetVersion.equals(candidate.getVersion())) { 091 continue; 092 } 093 artifacts.add(candidate); 094 } 095 } 096 return artifacts; 097 } 098 099 //thanks to Brett Porter for this regex lifted from a maven1-2 porting tool 100 private static final Pattern MAVEN_1_PATTERN = Pattern.compile("(.+)/(.+)s/(.+)-([0-9].+)\\.([^0-9]+)"); 101 102 public SortedSet list() { 103 SortedSet artifacts = new TreeSet(); 104 String[] names = getFiles(rootFile, ""); 105 Matcher matcher = MAVEN_1_PATTERN.matcher(""); 106 for (int i = 0; i < names.length; i++) { 107 matcher.reset(names[i]); 108 if (matcher.matches()) { 109 String groupId = matcher.group(1); 110 String artifactId = matcher.group(3); 111 String version = matcher.group(4); 112 String type = matcher.group(2); 113 if(groupId.indexOf('/') > -1 || artifactId.indexOf('/') > -1 || type.indexOf('/') > -1 || 114 version.indexOf('/') > -1) { 115 log.warn("could not resolve URI for malformed repository entry: " + names[i] + 116 " - the filename should look like: <groupId>/<type>s/<artifactId>-<version>.<type> "+ 117 "Perhaps you put in a file without a version number in the name?"); 118 } else { 119 artifacts.add(new Artifact(groupId, artifactId, version, type)); 120 } 121 } else { 122 log.warn("could not resolve URI for malformed repository entry: " + names[i] + 123 " - the filename should look like: <groupId>/<type>s/<artifactId>-<version>.<type> "+ 124 "Perhaps you put in a file without a version number in the name?"); 125 } 126 127 } 128 return artifacts; 129 } 130 131 public String[] getFiles(File base, String prefix) { 132 if (!base.canRead() || !base.isDirectory()) { 133 throw new IllegalArgumentException(base.getAbsolutePath()); 134 } 135 List list = new ArrayList(); 136 File[] hits = base.listFiles(); 137 for (int i = 0; i < hits.length; i++) { 138 File hit = hits[i]; 139 if (hit.canRead()) { 140 if (hit.isDirectory()) { 141 list.addAll(Arrays.asList(getFiles(hit, prefix.equals("") ? hit.getName() : prefix + "/" + hit.getName()))); 142 } else { 143 list.add(prefix.equals("") ? hit.getName() : prefix + "/" + hit.getName()); 144 } 145 } 146 } 147 return (String[]) list.toArray(new String[list.size()]); 148 } 149 150 }