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    }