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.project;
017
018 import java.nio.charset.Charset;
019 import java.util.Properties;
020
021 import org.kuali.common.util.Assert;
022 import org.kuali.common.util.PropertyUtils;
023 import org.kuali.common.util.Str;
024 import org.kuali.common.util.cache.Cache;
025 import org.kuali.common.util.cache.SimpleCache;
026 import org.kuali.common.util.maven.MavenConstants;
027 import org.kuali.common.util.project.model.ImmutableProject;
028 import org.kuali.common.util.project.model.Project;
029 import org.kuali.common.util.project.model.ProjectIdentifier;
030 import org.kuali.common.util.property.Constants;
031 import org.kuali.common.util.spring.env.EnvironmentService;
032 import org.springframework.util.PropertyPlaceholderHelper;
033
034 public class DefaultProjectService implements ProjectService {
035
036 private static final Cache<String, Project> CACHE = new SimpleCache<String, Project>();
037 private static final PropertyPlaceholderHelper PPH = Constants.DEFAULT_PROPERTY_PLACEHOLDER_HELPER;
038 private static final String PROPERTIES_ENCODING_KEY = "project.properties.encoding";
039 private static final String PROPERTIES_ENCODING_DEFAULT = Charset.defaultCharset().toString();
040
041 private final EnvironmentService env;
042
043 public DefaultProjectService(EnvironmentService env) {
044 Assert.noNulls(env);
045 this.env = env;
046 }
047
048 /**
049 * @deprecated Use ProjectUtils.getProject(properties) instead
050 */
051 @Deprecated
052 @Override
053 public Project getProject(Properties properties) {
054 String groupId = properties.getProperty(MavenConstants.GROUP_ID_KEY);
055 String artifactId = properties.getProperty(MavenConstants.ARTIFACT_ID_KEY);
056 String version = properties.getProperty(MavenConstants.VERSION_KEY);
057 return new ImmutableProject(groupId, artifactId, version, properties);
058 }
059
060 @Override
061 public Project getProject(ProjectIdentifier identifier) {
062 return getProject(identifier.getGroupId(), identifier.getArtifactId());
063 }
064
065 @Override
066 public Project getProject(String groupId, String artifactId) {
067
068 // Both of these are required
069 Assert.noBlanks("groupId and artifactId are required", groupId, artifactId);
070
071 // Construct the cache key
072 String cacheKey = groupId + ":" + artifactId;
073
074 // Check the cache
075 Project project = CACHE.get(cacheKey);
076 if (project == null) {
077 // Construct a project object from project.properties
078 project = load(groupId, artifactId);
079 // Cache it
080 CACHE.put(cacheKey, project);
081 }
082 return project;
083 }
084
085 protected void clearCache() {
086 CACHE.clear();
087 }
088
089 protected Project load(String groupId, String artifactId) {
090
091 // Get the unique path to the project.properties file
092 String location = getPropertiesFileLocation(groupId, artifactId);
093
094 // If that location doesn't exist, we have issues
095 Assert.exists(location, "[" + location + "] does not exist");
096
097 // Use platform default encoding to load project.properties
098 // Set the system property "project.properties.encoding" or the environment variable "PROJECT_PROPERTIES_ENCODING" to override
099 String encoding = env.getString(PROPERTIES_ENCODING_KEY, PROPERTIES_ENCODING_DEFAULT);
100
101 // Load the properties from disk
102 Properties properties = PropertyUtils.load(location, encoding);
103
104 // Convert the properties into a project
105 return getProject(properties);
106 }
107
108 protected String getPropertiesFileLocation(String groupId, String artifactId) {
109 Properties properties = new Properties();
110 properties.setProperty(Constants.GROUP_ID_PATH_KEY, Str.getPath(groupId));
111 properties.setProperty(Constants.ARTIFACT_ID_KEY, artifactId);
112 return PPH.replacePlaceholders(Constants.PROJECT_PROPERTIES_LOCATION, properties);
113 }
114
115 public EnvironmentService getEnv() {
116 return env;
117 }
118
119 }