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.service; 017 018 import java.io.File; 019 import java.util.ArrayList; 020 import java.util.Collections; 021 import java.util.List; 022 import java.util.Properties; 023 024 import org.apache.commons.lang3.StringUtils; 025 import org.kuali.common.util.CollectionUtils; 026 import org.kuali.common.util.LocationUtils; 027 import org.kuali.common.util.PropertyUtils; 028 029 public 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 }