Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clean-up and simplify Tracing-Options processing #755

Merged
merged 1 commit into from
Oct 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,17 @@
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Properties;
import java.util.Set;
import java.util.zip.ZipEntry;
Expand All @@ -36,69 +38,56 @@
import org.eclipse.pde.core.plugin.PluginRegistry;

public class TracingOptionsManager {
private Properties template;
private Map<String, String> template;

public TracingOptionsManager() {
super();
}

private Properties createTemplate() {
Properties temp = new Properties();
IPluginModelBase[] models = PluginRegistry.getAllModels();
for (IPluginModelBase model : models) {
addToTemplate(temp, model);
}
return temp;
}

private void addToTemplate(Properties temp, IPluginModelBase model) {
Properties modelOptions = getOptions(model);
if (modelOptions != null) {
temp.putAll(modelOptions);
}
}

public Hashtable<String, String> getTemplateTable(String pluginId) {
Properties tracingTemplate = getTracingTemplate();
Hashtable<String, String> defaults = new Hashtable<>();
for (Enumeration<Object> keys = tracingTemplate.keys(); keys.hasMoreElements();) {
String key = keys.nextElement().toString();
public Map<String, String> getTemplateTable(String pluginId) {
Map<String, String> tracingTemplate = getTracingTemplate();
Map<String, String> defaults = new HashMap<>();
tracingTemplate.forEach((key, value) -> {
if (belongsTo(key, pluginId)) {
defaults.put(key, tracingTemplate.get(key).toString());
defaults.put(key, value);
}
}
});
return defaults;
}

private boolean belongsTo(String option, String pluginId) {
IPath path = IPath.fromOSString(option);
String firstSegment = path.segment(0);
String firstSegment = IPath.fromOSString(option).segment(0);
return pluginId.equalsIgnoreCase(firstSegment);
}

public Properties getTracingOptions(Map<String, String> storedOptions) {
public Map<String, String> getTracingOptions(Map<String, String> storedOptions) {
// Start with the fresh template from plugins
Properties defaults = getTracingTemplateCopy();
Map<String, String> defaults = getTracingTemplateCopy();
if (storedOptions != null) {
// Load stored values, but only for existing keys
Iterator<String> iter = storedOptions.keySet().iterator();
while (iter.hasNext()) {
String key = iter.next();
storedOptions.forEach((key, value) -> {
if (defaults.containsKey(key)) {
defaults.setProperty(key, storedOptions.get(key));
defaults.put(key, value);
}
}
});
}
return defaults;
}

public Properties getTracingTemplateCopy() {
return (Properties) getTracingTemplate().clone();
public Map<String, String> getTracingTemplateCopy() {
return new HashMap<>(getTracingTemplate());
}

private synchronized Properties getTracingTemplate() {
private synchronized Map<String, String> getTracingTemplate() {
if (template == null) {
template = createTemplate();
Map<String, String> temp = new HashMap<>();
IPluginModelBase[] models = PluginRegistry.getAllModels();
Arrays.stream(models).map(TracingOptionsManager::getOptions).filter(Objects::nonNull).forEach(p -> {
@SuppressWarnings({ "rawtypes", "unchecked" })
Map<String, String> entries = (Map) p;
HannesWell marked this conversation as resolved.
Show resolved Hide resolved
temp.putAll(entries); // All entries are of String/String
});
template = temp;
}
return template;
}
Expand Down Expand Up @@ -129,32 +118,30 @@ public synchronized void reset() {
template = null;
}

private void save(String fileName, Properties properties) {
try (FileOutputStream stream = new FileOutputStream(fileName);) {
private void saveOptions(Path file, Map<String, String> entries) {
Properties properties = new Properties();
properties.putAll(entries);
try (OutputStream stream = Files.newOutputStream(file);) {
properties.store(stream, "Master Tracing Options"); //$NON-NLS-1$
stream.flush();
} catch (IOException e) {
PDECore.logException(e);
}
}

public void save(String filename, Map<String, String> map, Set<String> selected) {
Properties properties = getTracingOptions(map);
for (Enumeration<Object> keys = properties.keys(); keys.hasMoreElements();) {
String key = keys.nextElement().toString();
public void save(Path file, Map<String, String> map, Set<String> selected) {
Map<String, String> properties = getTracingOptions(map);
properties.keySet().removeIf(key -> {
IPath path = IPath.fromOSString(key);
if (path.segmentCount() < 1 || !selected.contains(path.segment(0))) {
properties.remove(key);
}
}
save(filename, properties);
return path.segmentCount() < 1 || !selected.contains(path.segment(0));
});
saveOptions(file, properties);
}

public void save(String filename, Map<String, String> map) {
save(filename, getTracingOptions(map));
public void save(Path file, Map<String, String> map) {
saveOptions(file, getTracingOptions(map));
}

private Properties getOptions(IPluginModelBase model) {
private static Properties getOptions(IPluginModelBase model) {
String location = model.getInstallLocation();
if (location == null) {
return null;
Expand Down Expand Up @@ -203,23 +190,22 @@ private Properties getOptions(IPluginModelBase model) {
* support cases when: key is split in multiple lines; key use escape
* characters; comment uses ! start char
*/
private void loadComments(InputStream stream, Properties modelOptions) throws IOException {
private static void loadComments(InputStream stream, Properties modelOptions) throws IOException {
String prevComment = ""; //$NON-NLS-1$
try (BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(stream, Charset.defaultCharset()))) {
String line;
while ((line = bufferedReader.readLine()) != null) {
// Properties.store() always uses ISO_8859_1 encoding
new InputStreamReader(stream, StandardCharsets.ISO_8859_1))) {
HannesWell marked this conversation as resolved.
Show resolved Hide resolved
for (String line; (line = bufferedReader.readLine()) != null;) {
if (line.startsWith("#") || line.trim().isEmpty()) { //$NON-NLS-1$
prevComment += "\n" + line.trim(); //$NON-NLS-1$
HannesWell marked this conversation as resolved.
Show resolved Hide resolved
} else {
if (prevComment.trim().isEmpty()) {
if (prevComment.isBlank()) {
continue;
}

int eq = line.indexOf('=');
if (eq >= 0) {
String key = line.substring(0, eq).trim();
modelOptions.put("#" + key, prevComment); //$NON-NLS-1$
modelOptions.put("#" + key, prevComment.strip()); //$NON-NLS-1$
}
prevComment = ""; //$NON-NLS-1$
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,13 @@
import java.io.FilenameFilter;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.Set;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
Expand Down Expand Up @@ -240,44 +242,41 @@ public static Map<String, Object> getVMSpecificAttributesMap(ILaunchConfiguratio
return map;
}

public static String getTracingFileArgument(ILaunchConfiguration config, String optionsFileName) {
public static String getTracingFileArgument(ILaunchConfiguration config, Path optionsFile) {
try {
TracingOptionsManager mng = PDECore.getDefault().getTracingOptionsManager();
Map<String, String> options = config.getAttribute(IPDELauncherConstants.TRACING_OPTIONS, (Map<String, String>) null);
String selected = config.getAttribute(IPDELauncherConstants.TRACING_CHECKED, (String) null);
if (selected == null) {
mng.save(optionsFileName, options);
mng.save(optionsFile, options);
} else if (!selected.equals(IPDELauncherConstants.TRACING_NONE)) {
HashSet<String> result = new HashSet<>();
StringTokenizer tokenizer = new StringTokenizer(selected, ","); //$NON-NLS-1$
while (tokenizer.hasMoreTokens()) {
result.add(tokenizer.nextToken());
}
mng.save(optionsFileName, options, result);
Set<String> result = splitElementsByComma(selected).collect(Collectors.toSet());
mng.save(optionsFile, options, result);
}
} catch (CoreException e) {
return ""; //$NON-NLS-1$
}
return optionsFileName;
return optionsFile.toString();
}

public static String[] constructClasspath(ILaunchConfiguration configuration) throws CoreException {
double targetVersion = TargetPlatformHelper.getTargetVersion();
String jarPath = targetVersion >= 3.3 ? getEquinoxStartupPath(IPDEBuildConstants.BUNDLE_EQUINOX_LAUNCHER) : getStartupJarPath();
if (jarPath == null && targetVersion < 3.3)
if (jarPath == null && targetVersion < 3.3) {
jarPath = getEquinoxStartupPath("org.eclipse.core.launcher"); //$NON-NLS-1$

if (jarPath == null)
}
if (jarPath == null) {
return null;
}
String bootstrap = configuration.getAttribute(IPDELauncherConstants.BOOTSTRAP_ENTRIES, ""); //$NON-NLS-1$
Stream<String> bootstrapElements = splitElementsByComma(getSubstitutedString(bootstrap));
return Stream.concat(Stream.of(jarPath), bootstrapElements).toArray(String[]::new);
}

ArrayList<String> entries = new ArrayList<>();
entries.add(jarPath);
private static final Pattern COMMA = Pattern.compile(","); //$NON-NLS-1$

String bootstrap = configuration.getAttribute(IPDELauncherConstants.BOOTSTRAP_ENTRIES, ""); //$NON-NLS-1$
StringTokenizer tok = new StringTokenizer(getSubstitutedString(bootstrap), ","); //$NON-NLS-1$
while (tok.hasMoreTokens())
entries.add(tok.nextToken().trim());
return entries.toArray(new String[entries.size()]);
public static Stream<String> splitElementsByComma(String value) {
return COMMA.splitAsStream(value).map(String::trim);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
Expand Down Expand Up @@ -379,7 +378,7 @@ public String[] getProgramArguments(ILaunchConfiguration configuration) throws C
// add tracing, if turned on
if (configuration.getAttribute(IPDELauncherConstants.TRACING, false) && !IPDELauncherConstants.TRACING_NONE.equals(configuration.getAttribute(IPDELauncherConstants.TRACING_CHECKED, (String) null))) {
programArgs.add("-debug"); //$NON-NLS-1$
programArgs.add(LaunchArgumentsHelper.getTracingFileArgument(configuration, getConfigDir(configuration).toString() + IPath.SEPARATOR + ICoreConstants.OPTIONS_FILENAME));
programArgs.add(LaunchArgumentsHelper.getTracingFileArgument(configuration, getConfigDir(configuration).toPath().resolve(ICoreConstants.OPTIONS_FILENAME)));
}

// add the program args specified by the user
Expand Down Expand Up @@ -459,8 +458,9 @@ protected void preLaunchCheck(ILaunchConfiguration configuration, ILaunch launch
* configuration
*/
protected File getConfigDir(ILaunchConfiguration configuration) {
if (fConfigDir == null)
if (fConfigDir == null) {
fConfigDir = LaunchConfigurationHelper.getConfigurationArea(configuration);
}
return fConfigDir;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package org.eclipse.pde.launching;

import java.io.File;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
Expand Down Expand Up @@ -46,9 +47,9 @@
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.internal.junit.launcher.ITestKind;

Check warning on line 50 in ui/org.eclipse.pde.launching/src/org/eclipse/pde/launching/JUnitLaunchConfigurationDelegate.java

View check run for this annotation

Jenkins - eclipse-pde / Java Compiler

tycho-compiler:compile

NORMAL:
import org.eclipse.jdt.internal.junit.launcher.JUnitLaunchConfigurationConstants;

Check warning on line 51 in ui/org.eclipse.pde.launching/src/org/eclipse/pde/launching/JUnitLaunchConfigurationDelegate.java

View check run for this annotation

Jenkins - eclipse-pde / Java Compiler

tycho-compiler:compile

NORMAL:
import org.eclipse.jdt.internal.junit.launcher.TestKindRegistry;

Check warning on line 52 in ui/org.eclipse.pde.launching/src/org/eclipse/pde/launching/JUnitLaunchConfigurationDelegate.java

View check run for this annotation

Jenkins - eclipse-pde / Java Compiler

tycho-compiler:compile

NORMAL:
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jdt.launching.IVMInstall;
import org.eclipse.jdt.launching.IVMRunner;
Expand Down Expand Up @@ -246,7 +247,7 @@
// Create the .options file if tracing is turned on
if (configuration.getAttribute(IPDELauncherConstants.TRACING, false) && !IPDELauncherConstants.TRACING_NONE.equals(configuration.getAttribute(IPDELauncherConstants.TRACING_CHECKED, (String) null))) {
programArgs.add("-debug"); //$NON-NLS-1$
String path = getConfigurationDirectory(configuration).getPath() + IPath.SEPARATOR + ICoreConstants.OPTIONS_FILENAME;
Path path = getConfigurationDirectory(configuration).toPath().resolve(ICoreConstants.OPTIONS_FILENAME);
programArgs.add(LaunchArgumentsHelper.getTracingFileArgument(configuration, path));
}

Expand Down
Loading
Loading