// Copyright 2015 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.devtools.build.lib.rules.android;

import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public final class AndroidManifestMergeHelper {

  private AndroidManifestMergeHelper() {}

  public static void createMergeManifestAction(RuleContext ruleContext,
      Artifact merger, Iterable<Artifact> mergees,
      Collection<String> excludePermissions, Artifact mergedManifest) {
    List<String> args = new ArrayList<>();
    args.add("--merger=" + merger.getExecPathString());

    for (Artifact mergee : mergees) {
      args.add("--mergee=" + mergee.getExecPathString());
    }

    for (String excludePermission : excludePermissions) {
      args.add("--exclude_permission=" + excludePermission);
    }

    args.add("--output=" + mergedManifest.getExecPathString());

    ruleContext.registerAction(new SpawnAction.Builder()
        .addInput(merger)
        .addInputs(mergees)
        .addOutput(mergedManifest)
        .setExecutable(ruleContext.getPrerequisite("$android_manifest_merge_tool", Mode.HOST))
        .addArguments(args)
        .setProgressMessage("Merging Android Manifests")
        .setMnemonic("AndroidManifestMerger")
        .build(ruleContext));
  }
}


@@ -907,48 +907,92 @@
 ons.
-SpawnAction;%0A%0Aimport java.util.ArrayList
+CustomCommandLine;%0Aimport com.google.devtools.build.lib.analysis.actions.SpawnAction
 ;%0Aim
@@ -1021,31 +1021,8 @@
 ion;
-%0Aimport java.util.List;
 %0A%0Apu
@@ -1314,59 +1314,112 @@
     
-List%3CString%3E args = new ArrayList%3C%3E();%0A    args.add
+CustomCommandLine.Builder commandLine = CustomCommandLine.builder();%0A    commandLine.addPrefixedExecPath
 (%22--
@@ -1430,41 +1430,19 @@
 er=%22
- +
+,
  merger
-.getExecPathString()
 );%0A
-%0A
     
@@ -1477,32 +1477,55 @@
 es) %7B%0A      
-args.add
+commandLine.addPrefixedExecPath
 (%22--mergee=%22
@@ -1528,37 +1528,16 @@
 ee=%22
- +
+,
  mergee
-.getExecPathString()
 );%0A 
@@ -1602,31 +1602,46 @@
 ns) %7B%0A      
-args.ad
+commandLine.addPrefixe
 d(%22--exclude
@@ -1653,18 +1653,17 @@
 ission=%22
- +
+,
  exclude
@@ -1690,16 +1690,39 @@
     
-args.add
+commandLine.addPrefixedExecPath
 (%22--
@@ -1733,10 +1733,9 @@
 ut=%22
- +
+,
  mer
@@ -1749,28 +1749,8 @@
 fest
-.getExecPathString()
 );%0A%0A
@@ -1780,16 +1780,25 @@
 rAction(
+%0A        
 new Spaw
@@ -1815,32 +1815,36 @@
 ilder()%0A        
+    
 .addInput(merger
@@ -1845,32 +1845,36 @@
 merger)%0A        
+   
+ 
 .addInputs(merge
@@ -1877,16 +1877,20 @@
 ergees)%0A
+    
         
@@ -1916,16 +1916,20 @@
 nifest)%0A
+    
         
@@ -2023,32 +2023,8 @@
     
-    .addArguments(args)%0A
     
@@ -2080,24 +2080,28 @@
 s%22)%0A        
+    
 .setMnemonic
@@ -2126,16 +2126,69 @@
 erger%22)%0A
+            .setCommandLine(commandLine.build())%0A    
         

Use CustomCommandLine directly instead of via SpawnAction.Builder.