001 /** 002 * Copyright 2010-2013 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.common.util; 017 018 import java.io.File; 019 import java.util.ArrayList; 020 import java.util.List; 021 022 import org.apache.commons.io.FileUtils; 023 import org.apache.commons.lang3.StringUtils; 024 import org.kuali.common.util.nullify.NullUtils; 025 026 /** 027 * @deprecated 028 */ 029 @Deprecated 030 public class RepositoryUtils { 031 032 private static final String FS = File.separator; 033 private static final String DEFAULT_MAVEN_REPO_PATH = ".m2" + FS + "repository"; 034 private static final String GAV_DELIMITER = ":"; 035 036 public static final void copyArtifact(String repository, Artifact artifact) { 037 File file = getFile(artifact); 038 copyArtifactToFile(repository, artifact, file); 039 } 040 041 public static final void copyArtifactToDirectory(String repository, Artifact artifact, File directory) { 042 String filename = getFilename(artifact); 043 File file = new File(directory, filename); 044 copyArtifactToFile(repository, artifact, file); 045 } 046 047 public static final void copyArtifactToFile(String repository, Artifact artifact, File file) { 048 String location = repository + getRepositoryPath(artifact); 049 LocationUtils.copyLocationToFile(location, file); 050 } 051 052 /** 053 * <p> 054 * Order is <code>groupId:artifactId:version:classifier:type</code>. The ordering here matches the order Maven uses to create actual files. Which is different from what the 055 * toString() method on Maven's Artifact object produces. 056 * </p> 057 * 058 * <p> 059 * Trailing <code>:</code>'s are omitted. 060 * </p> 061 * 062 * <p> 063 * If every field is left blank, <code>::::</code> is returned. 064 * </p> 065 * 066 * <pre> 067 * org.kuali.common:kuali-jdbc:1.0.0:webapp:jar - groupId + artifactId + version + classifier + type 068 * org.kuali.common:kuali-jdbc:1.0.0::jar - no classifier 069 * :::: - Every field is blank 070 * org.kuali.common - groupId only 071 * ::::jar - type only 072 * :kuali-jdbc:::jar - no groupId, version, classifier, or type 073 * org.kuali.common:kuali-jdbc - groupId + artifactId 074 * org.kuali.common:kuali-jdbc:1.0.0 - groupId + artifactId + version 075 * org.kuali.common:kuali-jdbc:1.0.0:webapp - no type 076 * org.kuali.common:kuali-jdbc:1.0.0 - no classifier or type 077 * org.kuali.common:kuali-jdbc::webapp:jar - no version 078 * </pre> 079 */ 080 public static final String toString(Artifact artifact) { 081 List<String> tokens = new ArrayList<String>(); 082 tokens.add(toEmpty(artifact.getGroupId())); 083 tokens.add(toEmpty(artifact.getArtifactId())); 084 tokens.add(toEmpty(artifact.getVersion())); 085 tokens.add(toEmpty(artifact.getClassifier())); 086 tokens.add(toEmpty(artifact.getType())); 087 int delimiterCount = getDelimiterCount(tokens); 088 return getDelimitedString(tokens, delimiterCount, GAV_DELIMITER); 089 } 090 091 /** 092 * <p> 093 * Order is <code>groupId:artifactId:version:classifier:type:scope</code>. The ordering here matches the order Maven uses to create actual files. As opposed to what the 094 * toString() method on Maven's Dependency object produces. 095 * </p> 096 * 097 * <p> 098 * Trailing <code>:</code>'s are omitted. 099 * </p> 100 * 101 * <p> 102 * If every field is left blank, <code>:::::</code> is returned. 103 * </p> 104 * 105 * <pre> 106 * org.kuali.common:kuali-jdbc:1.0.0:webapp:jar:compile - groupId + artifactId + version + classifier + type + scope 107 * org.kuali.common:kuali-jdbc:1.0.0::jar:compile - no classifier 108 * org.kuali.common:kuali-jdbc:1.0.0:webapp:jar: - no scope 109 * ::::: - Every field is blank 110 * org.kuali.common - groupId only 111 * :::::compile - scope only 112 * :kuali-jdbc:::jar - artifactId + type 113 * org.kuali.common:kuali-jdbc - groupId + artifactId 114 * org.kuali.common:kuali-jdbc:1.0.0 - groupId + artifactId + version 115 * org.kuali.common:kuali-jdbc:1.0.0:webapp - groupId + artifactId + version + classifier 116 * org.kuali.common:kuali-jdbc:1.0.0:::compile - no classifier or type 117 * org.kuali.common:kuali-jdbc::webapp:jar:compile - no version 118 * </pre> 119 */ 120 public static final String toString(Dependency dependency) { 121 List<String> tokens = new ArrayList<String>(); 122 tokens.add(toEmpty(dependency.getGroupId())); 123 tokens.add(toEmpty(dependency.getArtifactId())); 124 tokens.add(toEmpty(dependency.getVersion())); 125 tokens.add(toEmpty(dependency.getClassifier())); 126 tokens.add(toEmpty(dependency.getType())); 127 tokens.add(toEmpty(dependency.getScope())); 128 int delimiterCount = getDelimiterCount(tokens); 129 return getDelimitedString(tokens, delimiterCount, GAV_DELIMITER); 130 } 131 132 /** 133 * <p> 134 * Order is <code>groupId:artifactId:version:classifier:type:scope</code>. 135 * </p> 136 */ 137 public static final Artifact parseArtifact(String gav) { 138 Assert.hasText(gav, "gav has no text"); 139 140 String[] tokens = StringUtils.splitPreserveAllTokens(gav, GAV_DELIMITER); 141 int len = tokens.length; 142 for (int i = 0; i < len; i++) { 143 tokens[i] = toNull(tokens[i]); 144 } 145 146 Artifact a = new Artifact(); 147 if (len > 0) { 148 a.setGroupId(tokens[0]); 149 } 150 if (len > 1) { 151 a.setArtifactId(tokens[1]); 152 } 153 if (len > 2) { 154 a.setVersion(tokens[2]); 155 } 156 if (len > 3) { 157 a.setClassifier(tokens[3]); 158 } 159 if (len > 4) { 160 a.setType(tokens[4]); 161 } 162 return a; 163 } 164 165 /** 166 * <p> 167 * Order is <code>groupId:artifactId:version:classifier:type:scope</code>. 168 * </p> 169 */ 170 public static final Dependency parseDependency(String gav) { 171 Assert.hasText(gav, "gav has no text"); 172 173 String[] tokens = StringUtils.splitPreserveAllTokens(gav, GAV_DELIMITER); 174 int len = tokens.length; 175 for (int i = 0; i < len; i++) { 176 tokens[i] = toNull(tokens[i]); 177 } 178 179 Dependency d = new Dependency(); 180 if (len > 0) { 181 d.setGroupId(tokens[0]); 182 } 183 if (len > 1) { 184 d.setArtifactId(tokens[1]); 185 } 186 if (len > 2) { 187 d.setVersion(tokens[2]); 188 } 189 if (len > 3) { 190 d.setClassifier(tokens[3]); 191 } 192 if (len > 4) { 193 d.setType(tokens[4]); 194 } 195 if (len > 5) { 196 d.setScope(tokens[5]); 197 } 198 return d; 199 } 200 201 protected static final String getDelimitedString(List<String> tokens, int delimiterCount, String delimiter) { 202 StringBuilder sb = new StringBuilder(); 203 for (int i = 0; i < tokens.size(); i++) { 204 if (i != 0 && i < delimiterCount) { 205 sb.append(delimiter); 206 } 207 sb.append(tokens.get(i)); 208 } 209 return sb.toString(); 210 } 211 212 protected static final int getDelimiterCount(List<String> tokens) { 213 int count = 0; 214 for (int i = 0; i < tokens.size(); i++) { 215 String token = toEmpty(tokens.get(i)); 216 if (!StringUtils.isEmpty(token)) { 217 count = i + 1; 218 } 219 } 220 return count == 0 ? tokens.size() : count; 221 } 222 223 /** 224 * Return null if token is blank, "NULL", or "NONE" 225 */ 226 public static String toNull(String token) { 227 if (StringUtils.isBlank(token)) { 228 return null; 229 } 230 if (NullUtils.isNullOrNone(token)) { 231 return null; 232 } 233 return token; 234 } 235 236 /** 237 * Return the empty string if token is blank, "NULL", or "NONE" 238 */ 239 public static String toEmpty(String token) { 240 if (StringUtils.isBlank(token)) { 241 return ""; 242 } 243 if (NullUtils.isNullOrNone(token)) { 244 return ""; 245 } 246 return token; 247 } 248 249 public static final String getRepositoryPath(Artifact artifact) { 250 StringBuilder sb = new StringBuilder(); 251 sb.append(Str.getPath(artifact.getGroupId())); 252 sb.append(FS); 253 sb.append(artifact.getArtifactId()); 254 sb.append(FS); 255 sb.append(artifact.getVersion()); 256 return sb.toString(); 257 } 258 259 /** 260 * Return true if classifier should become part of the filename 261 */ 262 protected static boolean addClassifierToFilename(String classifier) { 263 return !StringUtils.isBlank(classifier) && !NullUtils.isNullOrNone(classifier); 264 } 265 266 public static final String getFilename(Artifact artifact) { 267 StringBuilder sb = new StringBuilder(); 268 sb.append(artifact.getArtifactId()); 269 sb.append("-"); 270 sb.append(artifact.getVersion()); 271 if (addClassifierToFilename(artifact.getClassifier())) { 272 sb.append("-"); 273 sb.append(artifact.getClassifier()); 274 } 275 sb.append("."); 276 sb.append(artifact.getType()); 277 return sb.toString(); 278 } 279 280 public static final File getDefaultLocalRepositoryDir() { 281 return new File(FileUtils.getUserDirectoryPath() + FS + DEFAULT_MAVEN_REPO_PATH); 282 } 283 284 public static final File getFile(Artifact artifact) { 285 return getFile(getDefaultLocalRepositoryDir(), artifact); 286 } 287 288 public static final File getFile(File localRepositoryDir, Artifact artifact) { 289 String path = getRepositoryPath(artifact); 290 String filename = getFilename(artifact); 291 return new File(localRepositoryDir.getAbsolutePath() + FS + path, filename); 292 } 293 294 }