/******************************************************************************* * Copyright (c) 2003, 2007 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.ui.internal.about; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.Comparator; import java.util.Iterator; import java.util.LinkedList; import java.util.Properties; import java.util.SortedSet; import java.util.TreeSet; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IBundleGroup; import org.eclipse.core.runtime.IBundleGroupProvider; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.IPreferencesService; import org.eclipse.osgi.util.NLS; import org.eclipse.ui.about.ISystemSummarySection; import org.eclipse.ui.internal.WorkbenchMessages; import org.eclipse.ui.internal.WorkbenchPlugin; import org.eclipse.ui.internal.util.Util; import org.osgi.framework.Bundle; /** * This class puts basic platform information into the system summary log. This * includes sections for the java properties, the ids of all installed features * and plugins, as well as a the current contents of the preferences service. * * @since 3.0 */ public class ConfigurationLogDefaultSection implements ISystemSummarySection { private static final String ECLIPSE_PROPERTY_PREFIX = "eclipse."; //$NON-NLS-1$ /* (non-Javadoc) * @see org.eclipse.ui.about.ISystemSummarySection#write(java.io.PrintWriter) */ public void write(PrintWriter writer) { appendProperties(writer); appendFeatures(writer); appendRegistry(writer); appendUserPreferences(writer); } /** * Appends the <code>System</code> properties. */ private void appendProperties(PrintWriter writer) { writer.println(); writer.println(WorkbenchMessages.SystemSummary_systemProperties); Properties properties = System.getProperties(); SortedSet set = new TreeSet(new Comparator() { public int compare(Object o1, Object o2) { String s1 = (String) o1; String s2 = (String) o2; return s1.compareTo(s2); } }); set.addAll(properties.keySet()); Iterator i = set.iterator(); while (i.hasNext()) { String key = (String)i.next(); String value = properties.getProperty(key); writer.print(key); writer.print('='); // some types of properties have special characters embedded if (key.startsWith(ECLIPSE_PROPERTY_PREFIX)) { printEclipseProperty(writer, value); } else if (key.toUpperCase().indexOf("PASSWORD") != -1) { //$NON-NLS-1$ // We should obscure any property that may be a password for (int j = 0; j < value.length(); j++) { writer.print('*'); } writer.println(); } else { writer.println(value); } } } private static void printEclipseProperty(PrintWriter writer, String value) { String[] lines = Util.getArrayFromList(value, "\n"); //$NON-NLS-1$ for (int i = 0; i < lines.length; ++i) { writer.println(lines[i]); } } /** * Appends the installed and configured features. */ private void appendFeatures(PrintWriter writer) { writer.println(); writer.println(WorkbenchMessages.SystemSummary_features); IBundleGroupProvider[] providers = Platform.getBundleGroupProviders(); LinkedList groups = new LinkedList(); if (providers != null) { for (int i = 0; i < providers.length; ++i) { IBundleGroup[] bundleGroups = providers[i].getBundleGroups(); for (int j = 0; j < bundleGroups.length; ++j) { groups.add(new AboutBundleGroupData(bundleGroups[j])); } } } AboutBundleGroupData[] bundleGroupInfos = (AboutBundleGroupData[]) groups .toArray(new AboutBundleGroupData[0]); AboutData.sortById(false, bundleGroupInfos); for (int i = 0; i < bundleGroupInfos.length; ++i) { AboutBundleGroupData info = bundleGroupInfos[i]; String[] args = new String[] { info.getId(), info.getVersion(), info.getName() }; writer.println(NLS.bind(WorkbenchMessages.SystemSummary_featureVersion, args)); } } /** * Appends the contents of the Plugin Registry. */ private void appendRegistry(PrintWriter writer) { writer.println(); writer.println(WorkbenchMessages.SystemSummary_pluginRegistry); Bundle[] bundles = WorkbenchPlugin.getDefault().getBundles(); AboutBundleData[] bundleInfos = new AboutBundleData[bundles.length]; for (int i = 0; i < bundles.length; ++i) { bundleInfos[i] = new AboutBundleData(bundles[i]); } AboutData.sortById(false, bundleInfos); for (int i = 0; i < bundleInfos.length; ++i) { AboutBundleData info = bundleInfos[i]; String[] args = new String[] { info.getId(), info.getVersion(), info.getName(), info.getStateName() }; writer.println(NLS.bind(WorkbenchMessages.SystemSummary_descriptorIdVersionState, args)); } } /** * Appends the preferences */ private void appendUserPreferences(PrintWriter writer) { // write the prefs to a byte array IPreferencesService service = Platform.getPreferencesService(); IEclipsePreferences node = service.getRootNode(); ByteArrayOutputStream stm = new ByteArrayOutputStream(); try { service.exportPreferences(node, stm, null); } catch (CoreException e) { writer.println("Error reading preferences " + e.toString());//$NON-NLS-1$ } // copy the prefs from the byte array to the writer writer.println(); writer.println(WorkbenchMessages.SystemSummary_userPreferences); BufferedReader reader = null; try { ByteArrayInputStream in = new ByteArrayInputStream(stm .toByteArray()); reader = new BufferedReader(new InputStreamReader(in, "8859_1")); //$NON-NLS-1$ char[] chars = new char[8192]; while (true) { int read = reader.read(chars); if (read <= 0) { break; } writer.write(chars, 0, read); } } catch (IOException e) { writer.println("Error reading preferences " + e.toString());//$NON-NLS-1$ } // ByteArray streams don't need to be closed } }