001 /** 002 * Copyright 2010-2012 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.lang.reflect.InvocationTargetException; 019 import java.util.ArrayList; 020 import java.util.Arrays; 021 import java.util.List; 022 import java.util.Map; 023 import java.util.Properties; 024 import java.util.Set; 025 026 import org.apache.commons.beanutils.BeanUtils; 027 import org.apache.commons.lang3.StringUtils; 028 import org.kuali.common.util.property.Constants; 029 import org.slf4j.Logger; 030 import org.slf4j.LoggerFactory; 031 import org.springframework.util.PropertyPlaceholderHelper; 032 033 /** 034 * 035 */ 036 public class ProjectUtils { 037 038 private static final Logger logger = LoggerFactory.getLogger(ProjectUtils.class); 039 private static final PropertyPlaceholderHelper PPH = Constants.DEFAULT_PROPERTY_PLACEHOLDER_HELPER; 040 041 public static Project loadProject(String gav) { 042 Project project = getProject(gav); 043 Properties properties = getProperties(project); 044 return getProject(properties); 045 } 046 047 public static Project getProject(String gav) { 048 logger.debug("Processing [{}]", gav); 049 String[] tokens = StringUtils.split(gav, ":"); 050 051 Project project = new Project(); 052 if (tokens.length > 0) { 053 project.setGroupId(RepositoryUtils.toNull(tokens[0])); 054 } 055 if (tokens.length > 1) { 056 project.setArtifactId(RepositoryUtils.toNull(tokens[1])); 057 } 058 if (tokens.length > 2) { 059 project.setPackaging(RepositoryUtils.toNull(tokens[2])); 060 } 061 if (tokens.length > 3) { 062 project.setVersion(RepositoryUtils.toNull(tokens[3])); 063 } 064 if (tokens.length > 4) { 065 project.setClassifier(RepositoryUtils.toNull(tokens[4])); 066 } 067 return project; 068 } 069 070 public static List<Dependency> getDependencies(String csv) { 071 List<String> tokens = CollectionUtils.getTrimmedListFromCSV(csv); 072 List<Dependency> dependencies = new ArrayList<Dependency>(); 073 for (String token : tokens) { 074 Dependency dependency = RepositoryUtils.parseDependency(token); 075 dependencies.add(dependency); 076 } 077 return dependencies; 078 } 079 080 public static Project getProject(Properties properties) { 081 List<String> skipKeys = Arrays.asList("project.dependencies"); 082 String startsWith = "project."; 083 List<String> keys = PropertyUtils.getStartsWithKeys(properties, startsWith); 084 Project project = new Project(); 085 project.setProperties(properties); 086 Map<String, Object> description = describe(project); 087 Set<String> beanProperties = description.keySet(); 088 for (String key : keys) { 089 if (skipKeys.contains(key)) { 090 continue; 091 } 092 String value = properties.getProperty(key); 093 String beanProperty = getBeanProperty(key, startsWith); 094 if (beanProperties.contains(beanProperty)) { 095 copyProperty(project, beanProperty, value); 096 } 097 } 098 String dependenciesCSV = properties.getProperty("project.dependencies"); 099 List<Dependency> dependencies = getDependencies(dependenciesCSV); 100 project.setDependencies(dependencies); 101 return project; 102 } 103 104 protected static String getBeanProperty(String key, String startsWith) { 105 String s = StringUtils.substring(key, startsWith.length()); 106 String[] tokens = StringUtils.split(s, "."); 107 StringBuilder sb = new StringBuilder(); 108 for (int i = 0; i < tokens.length; i++) { 109 String token = tokens[i]; 110 if (i == 0) { 111 sb.append(token); 112 } else { 113 sb.append(StringUtils.capitalize(token)); 114 } 115 } 116 return sb.toString(); 117 } 118 119 public static Properties getProperties(String gav) { 120 return getProperties(getProject(gav)); 121 } 122 123 public static Properties getProperties(Project project) { 124 String location = getPropertiesLocation(project); 125 if (!LocationUtils.exists(location)) { 126 throw new IllegalArgumentException("[" + location + "] does not exist"); 127 } 128 return PropertyUtils.load(location); 129 } 130 131 public static String getPropertiesLocation(Project project) { 132 Assert.hasText(project.getGroupId(), "groupId has no text"); 133 Assert.hasText(project.getArtifactId(), "artifactId has no text"); 134 135 Properties properties = new Properties(); 136 properties.setProperty("project.groupId.path", Str.getPath(project.getGroupId())); 137 properties.setProperty("project.artifactId", project.getArtifactId()); 138 139 return PPH.replacePlaceholders(Constants.PROJECT_PROPERTIES_LOCATION, properties); 140 } 141 142 @SuppressWarnings("unchecked") 143 protected static Map<String, Object> describe(Object bean) { 144 try { 145 return BeanUtils.describe(bean); 146 } catch (IllegalAccessException e) { 147 throw new IllegalStateException(e); 148 } catch (InvocationTargetException e) { 149 throw new IllegalStateException(e); 150 } catch (NoSuchMethodException e) { 151 throw new IllegalStateException(e); 152 } 153 } 154 155 protected static void copyProperty(Object bean, String name, Object value) { 156 try { 157 BeanUtils.copyProperty(bean, name, value); 158 } catch (IllegalAccessException e) { 159 throw new IllegalStateException(e); 160 } catch (InvocationTargetException e) { 161 throw new IllegalStateException(e); 162 } 163 } 164 165 }