001/**
002 * Copyright 2010-2014 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 */
016package org.kuali.common.util.scm;
017
018import java.io.File;
019import java.util.ArrayList;
020import java.util.List;
021
022import org.kuali.common.util.execute.Executable;
023import org.kuali.common.util.file.DirRequest;
024import org.kuali.common.util.nullify.NullUtils;
025import org.kuali.common.util.project.ProjectUtils;
026import org.kuali.common.util.project.model.ProjectIdentifier;
027import org.kuali.common.util.spring.SpringUtils;
028import org.springframework.beans.factory.annotation.Autowired;
029import org.springframework.context.annotation.Bean;
030import org.springframework.context.annotation.Configuration;
031import org.springframework.context.annotation.Import;
032import org.springframework.core.env.Environment;
033
034@Configuration
035@Import(ScmConfig.class)
036public class ScmProjectConfig {
037
038        private static final String PROJECTS_KEY = "scm.build.projects";
039        private static final String RELATIVE_DIR_KEY = "scm.dir.relative";
040        private static final String SOURCE_DIR_KEY = "scm.dir.src";
041        private static final String INCLUDES_KEY = "scm.includes";
042        private static final String EXCLUDES_KEY = "scm.excludes";
043        private static final String SKIP_KEY = "scm.skip";
044        private static final String COMMIT_SKIP_KEY = "scm.commit.skip";
045        private static final String COMMIT_PATHS_KEY = "scm.commit.paths";
046        private static final String COMMIT_MESSAGE_KEY = "scm.commit.message";
047
048        @Autowired
049        Environment env;
050
051        @Autowired
052        ScmConfig scmConfig;
053
054        @Bean
055        public Executable projectScmConfigUpdateScmExecutable() {
056
057                boolean skip = SpringUtils.getBoolean(env, SKIP_KEY, UpdateScmExecutable.DEFAULT_SKIP_VALUE);
058                boolean skipCommit = SpringUtils.getBoolean(env, COMMIT_SKIP_KEY, UpdateScmExecutable.DEFAULT_SKIP_COMMIT_VALUE);
059                List<File> commitPaths = SpringUtils.getFilesFromCSV(env, COMMIT_PATHS_KEY, NullUtils.NONE);
060                String commitMessage = SpringUtils.getProperty(env, COMMIT_MESSAGE_KEY);
061
062                UpdateScmExecutable exec = new UpdateScmExecutable();
063                exec.setRequests(projectScmConfigDirRequests());
064                exec.setScmService(scmConfig.scmService());
065                exec.setSkip(skip);
066                exec.setSkipCommit(skipCommit);
067                exec.setCommitPaths(commitPaths);
068                exec.setMessage(commitMessage);
069                return exec;
070        }
071
072        @Bean
073        public List<DirRequest> projectScmConfigDirRequests() {
074                List<String> projectIds = SpringUtils.getNoneSensitiveListFromCSV(env, PROJECTS_KEY);
075                List<String> includes = SpringUtils.getNoneSensitiveListFromCSV(env, INCLUDES_KEY);
076                List<String> excludes = SpringUtils.getNoneSensitiveListFromCSV(env, EXCLUDES_KEY);
077                List<ProjectIdentifier> identifiers = ProjectUtils.getIdentifiers(projectIds);
078                File stagingDir = SpringUtils.getFile(env, SOURCE_DIR_KEY);
079                File relativeDir = SpringUtils.getFile(env, RELATIVE_DIR_KEY);
080                List<DirRequest> requests = new ArrayList<DirRequest>();
081                for (ProjectIdentifier identifier : identifiers) {
082                        DirRequest request = getDirRequest(identifier, stagingDir, relativeDir, includes, excludes);
083                        requests.add(request);
084                }
085                return requests;
086        }
087
088        protected DirRequest getDirRequest(ProjectIdentifier identifier, File stagingDir, File relativeDir, List<String> includes, List<String> excludes) {
089                String key = "scm.build." + identifier.getArtifactId() + ".dir";
090                // This is ${project.basedir}/src/main/resources
091                File projectResourceDir = SpringUtils.getFile(env, key);
092                File targetDir = ProjectUtils.getResourceDirectory(projectResourceDir, identifier.getGroupId(), identifier.getArtifactId());
093                File sourceDir = ProjectUtils.getResourceDirectory(stagingDir, identifier.getGroupId(), identifier.getArtifactId());
094                DirRequest request = new DirRequest();
095                request.setRelativeDir(relativeDir);
096                request.setTargetDir(targetDir);
097                request.setSourceDir(sourceDir);
098                request.setIncludes(includes);
099                request.setExcludes(excludes);
100                return request;
101        }
102
103}