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.service;
017
018import java.io.File;
019import java.util.ArrayList;
020import java.util.Collections;
021import java.util.List;
022import java.util.Properties;
023
024import org.apache.commons.lang3.StringUtils;
025import org.kuali.common.util.CollectionUtils;
026import org.kuali.common.util.LocationUtils;
027import org.kuali.common.util.PropertyUtils;
028
029public class DefaultMavenService extends DefaultExecService implements MavenService {
030
031        @Override
032        public void execute(MavenContext context) {
033
034                // Update options with MavenContext attributes
035                handleOptions(context);
036
037                // Convert options/goals/phases into an args list
038                List<String> args = getArgs(context);
039
040                // Create an execution context
041                DefaultExecContext dec = new DefaultExecContext();
042                dec.setExecutable(context.getExecutable());
043                dec.setWorkingDirectory(context.getWorkingDir());
044                dec.setArgs(args);
045
046                // TODO Re-factor things so only MAVEN_OPTS gets inherited instead of everything
047                if (context.isInheritMavenOpts()) {
048                        dec.setAddSystemEnvironment(true);
049                }
050
051                // Execute Maven making sure we get 0 as a return value
052                executeAndValidate(dec);
053        }
054
055        @Override
056        public void execute(File workingDir, List<String> options, List<String> goals, List<String> phases) {
057                MavenContext context = new MavenContext();
058                context.setWorkingDir(workingDir);
059                context.setOptions(options);
060                context.setGoals(goals);
061                context.setPhases(phases);
062                execute(context);
063        }
064
065        protected List<String> getOptions(MavenContext context) {
066                List<String> options = new ArrayList<String>();
067                if (context.isBatchMode()) {
068                        options.add("--batch-mode");
069                }
070                if (context.isDebug()) {
071                        options.add("--debug");
072                }
073                if (context.isErrors()) {
074                        options.add("--errors");
075                }
076                if (context.isOffline()) {
077                        options.add("--offline");
078                }
079                if (context.isQuiet()) {
080                        options.add("--quiet");
081                }
082                if (context.getPom() != null) {
083                        String cpath = LocationUtils.getCanonicalPath(context.getPom());
084                        options.add("--file");
085                        options.add(cpath);
086                }
087                if (!CollectionUtils.isEmpty(context.getProfiles())) {
088                        String csv = CollectionUtils.getCSV(context.getProfiles());
089                        options.add("--activate-profiles");
090                        options.add(csv);
091                }
092                return options;
093        }
094
095        protected void handleOptions(MavenContext context) {
096                List<String> options = getOptions(context);
097                if (context.getOptions() == null) {
098                        context.setOptions(options);
099                } else {
100                        context.getOptions().addAll(options);
101                }
102        }
103
104        protected List<String> getArgs(MavenContext context) {
105                List<String> args = new ArrayList<String>();
106                if (!CollectionUtils.isEmpty(context.getOptions())) {
107                        args.addAll(context.getOptions());
108                }
109                if (!CollectionUtils.isEmpty(context.getGoals())) {
110                        args.addAll(context.getGoals());
111                }
112                if (!CollectionUtils.isEmpty(context.getPhases())) {
113                        args.addAll(context.getPhases());
114                }
115                if (!CollectionUtils.isEmpty(context.getPassThroughPropertyKeys())) {
116                        Properties p = getPassThroughProperties(context);
117                        List<String> keys = PropertyUtils.getSortedKeys(p);
118                        for (String key : keys) {
119                                String value = p.getProperty(key);
120                                String arg = "-D" + key + "=" + value;
121                                args.add(arg);
122                        }
123                }
124                return args;
125        }
126
127        protected Properties getPassThroughProperties(MavenContext context) {
128                List<String> keys = context.getPassThroughPropertyKeys();
129                Properties properties = new Properties();
130                Collections.sort(keys);
131                Properties global = PropertyUtils.getGlobalProperties(context.getProperties());
132                for (String key : keys) {
133                        String value = global.getProperty(key);
134                        if (!StringUtils.isBlank(value)) {
135                                properties.setProperty(key, value);
136                        }
137                }
138                return properties;
139        }
140
141}