/*
* Copyright 2016 Luke Imhoff
* Copyright 2000-2013 JetBrains s.r.o.
*
* 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 org.elixir_lang.jps.builder;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.PathMacros;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.ArrayUtil;
import com.intellij.util.EnvironmentUtil;
import com.intellij.util.execution.ParametersListUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.util.*;
public class ParametersList implements Cloneable {
private static final Logger LOG = Logger.getInstance("#org.elixir_lang.jps.builder.ParametersList");
private List<String> myParameters = new ArrayList<String>();
private Map<String, String> myMacroMap = null;
private List<ParamsGroup> myGroups = new ArrayList<ParamsGroup>();
@NotNull
public String[] getArray() {
return ArrayUtil.toStringArray(getList());
}
@NotNull
public List<String> getList() {
if (myGroups.isEmpty()) {
return Collections.unmodifiableList(myParameters);
}
final List<String> params = new ArrayList<String>();
params.addAll(myParameters);
for (ParamsGroup group : myGroups) {
params.addAll(group.getParameters());
}
return Collections.unmodifiableList(params);
}
public void add(@NonNls final String parameter) {
myParameters.add(expandMacros(parameter));
}
public List<String> getParameters() {
return Collections.unmodifiableList(myParameters);
}
public void set(int ind, final @NonNls String value) {
myParameters.set(ind, value);
}
public String get(int ind) {
return myParameters.get(ind);
}
public void add(@NonNls final String name, @NonNls final String value) {
add(name);
add(value);
}
public void addAll(final String... parameters) {
addAll(Arrays.asList(parameters));
}
public void addAll(final List<String> parameters) {
// Don't use myParameters.addAll(parameters) , it does not call expandMacros(parameter)
for (String parameter : parameters) {
add(parameter);
}
}
@Override
public ParametersList clone() {
try {
final ParametersList clone = (ParametersList)super.clone();
clone.myParameters = new ArrayList<String>(myParameters);
clone.myGroups = new ArrayList<ParamsGroup>(myGroups.size() + 1);
for (ParamsGroup group : myGroups) {
clone.myGroups.add(group.clone());
}
return clone;
}
catch (CloneNotSupportedException e) {
LOG.error(e);
return null;
}
}
/**
* @see ParametersListUtil#join(java.util.List)
*/
@NotNull
public static String join(@NotNull final List<String> parameters) {
return ParametersListUtil.join(parameters);
}
/**
* @see ParametersListUtil#parseToArray(String)
*/
@NotNull
public static String[] parse(@NotNull final String string) {
return ParametersListUtil.parseToArray(string);
}
public String expandMacros(String text) {
final Map<String, String> macroMap = getMacroMap();
final Set<String> set = macroMap.keySet();
for (final String from : set) {
final String to = macroMap.get(from);
text = StringUtil.replace(text, from, to, true);
}
return text;
}
private Map<String, String> getMacroMap() {
if (myMacroMap == null) {
// the insertion order is important for later iterations, so LinkedHashMap is used
myMacroMap = new LinkedHashMap<String, String>();
// ApplicationManager.getApplication() will return null if executed in ParameterListTest
final Application application = ApplicationManager.getApplication();
if (application != null) {
final PathMacros pathMacros = PathMacros.getInstance();
if (pathMacros != null) {
for (String name : pathMacros.getUserMacroNames()) {
final String value = pathMacros.getValue(name);
if (value != null) {
myMacroMap.put("${" + name + "}", value);
}
}
}
final Map<String, String> env = EnvironmentUtil.getEnvironmentMap();
for (String name : env.keySet()) {
final String key = "${" + name + "}";
if (!myMacroMap.containsKey(key)) {
myMacroMap.put(key, env.get(name));
}
}
}
}
return myMacroMap;
}
@Override
public String toString() {
return myParameters.toString();
}
}