blob: 9c3128186b0a7e93e3d94a4ac295d772d0c56830 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ant.internal.core;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.eclipse.ant.core.AntCorePlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.variables.IStringVariableManager;
import org.eclipse.core.variables.VariablesPlugin;
import org.osgi.framework.BundleContext;
public class AntCoreUtil {
private static BundleContext fgContext = null;
public static void setBundleContext(BundleContext context) {
fgContext = context;
}
public static BundleContext getBundleContext() {
return fgContext;
}
/*
* Helper method to ensure an array is converted into an ArrayList.
*/
public static ArrayList<String> getArrayList(String[] args) {
if (args == null) {
return null;
}
// We could be using Arrays.asList() here, but it does not specify
// what kind of list it will return. We need a list that
// implements the method List.remove(Object) and ArrayList does.
ArrayList<String> result = new ArrayList<>(args.length);
for (int i = 0; i < args.length; i++) {
result.add(args[i]);
}
return result;
}
/*
* From a command line list, get the argument for the given parameter. The parameter and its argument are removed from the list.
*
* @return <code>null</code> if the parameter is not found or an empty String if no arguments are found
*/
public static String getArgument(List<String> commands, String param) {
if (commands == null) {
return null;
}
int index = commands.indexOf(param);
if (index == -1) {
return null;
}
commands.remove(index);
if (index == commands.size()) {// if this is the last command
return IAntCoreConstants.EMPTY_STRING;
}
String command = commands.get(index);
if (command.startsWith("-")) { //new parameter //$NON-NLS-1$
return IAntCoreConstants.EMPTY_STRING;
}
commands.remove(index);
return command;
}
public static void processMinusDProperties(List<String> commands, Map<String, String> userProperties) {
Iterator<String> iter = commands.iterator();
while (iter.hasNext()) {
String arg = iter.next();
if (arg.startsWith("-D")) { //$NON-NLS-1$
String name = arg.substring(2, arg.length());
String value = null;
int posEq = name.indexOf("="); //$NON-NLS-1$
if (posEq == 0) {
value = name.substring(1);
name = IAntCoreConstants.EMPTY_STRING;
} else if (posEq > 0 && posEq != name.length() - 1) {
value = name.substring(posEq + 1).trim();
name = name.substring(0, posEq);
}
if (value == null) {
// the user has specified something like "-Debug"
continue;
}
userProperties.put(name, value);
iter.remove();
}
}
}
public static File getFileRelativeToBaseDir(String fileName, String base, String buildFileLocation) {
IPath path = new Path(fileName);
if (!path.isAbsolute()) {
if (base != null) {
File baseDir = new File(base);
// relative to the base dir
path = new Path(baseDir.getAbsolutePath());
} else {
// relative to the build file location
path = new Path(buildFileLocation);
path = path.removeLastSegments(1);
}
path = path.addTrailingSeparator();
path = path.append(fileName);
}
return path.toFile();
}
/**
* Returns a list of Properties contained in the list of fileNames.
*
* @param fileNames
* the names of the properties files to load from
* @param base
* the base directory name
* @param buildFileLocation
* @return a list of {@link Properties} objects for each filename
* @throws IOException
*/
public static List<Properties> loadPropertyFiles(List<String> fileNames, String base, String buildFileLocation) throws IOException {
ArrayList<Properties> allProperties = new ArrayList<>(fileNames.size());
for (int i = 0; i < fileNames.size(); i++) {
String filename = fileNames.get(i);
File file = getFileRelativeToBaseDir(filename, base, buildFileLocation);
Properties props = new Properties();
try (FileInputStream fis = new FileInputStream(file)) {
props.load(fis);
}
Enumeration<?> propertyNames = props.propertyNames();
while (propertyNames.hasMoreElements()) {
String name = (String) propertyNames.nextElement();
String value = props.getProperty(name);
props.remove(name);
IStringVariableManager stringVariableManager = VariablesPlugin.getDefault().getStringVariableManager();
try {
name = stringVariableManager.performStringSubstitution(name);
value = stringVariableManager.performStringSubstitution(value);
}
catch (CoreException e) {
AntCorePlugin.log(e);
}
props.setProperty(name, value);
}
allProperties.add(props);
}
return allProperties;
}
}