--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/perfinvestigator/com.nokia.carbide.cpp.pi.wizards/src/com/nokia/carbide/cpp/internal/pi/wizards/ui/ProfilerActivatorGroup.java Wed Jun 23 15:05:09 2010 +0300
@@ -0,0 +1,706 @@
+/*
+ * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+
+package com.nokia.carbide.cpp.internal.pi.wizards.ui;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.text.MessageFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.eclipse.core.resources.WorkspaceJob;
+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.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.wizard.IWizardContainer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.Text;
+
+import com.nokia.carbide.cpp.internal.pi.plugin.model.ITrace;
+import com.nokia.carbide.cpp.pi.PiPlugin;
+import com.nokia.carbide.cpp.pi.export.ITraceProvider;
+import com.nokia.carbide.cpp.pi.wizards.WizardsPlugin;
+import com.nokia.s60tools.ui.preferences.PreferenceUtils;
+
+/**
+ * Provides functionality of the profiler activator
+ */
+public class ProfilerActivatorGroup extends AbstractBaseGroup {
+
+ private TableViewer profileDataTable;
+ private Composite rightButtonsComposite;
+ private Label connectionNameInUseLabel;
+ private IWizardContainer wizardContainer;
+ private NewPIWizardPage wizardPage;
+ private TraceHandler traceHandler;
+ private PluginSelectionGroup pluginSelectionGroup;
+ private Group settingsButtonGroup;
+ private Button refreshListButton;
+ private Button connectionSettingsButton;
+ private Button tracingButton;
+
+ /**
+ * Constructor
+ *
+ * @param parent
+ * instance of the parent composite
+ * @param wizardSettings
+ * instance of the INewPIWizardSettings
+ * @param wizardPage
+ * instance of the NewPIWizardPage
+ * @param wizardContainer
+ * instance of the IWizardContainer
+ */
+ public ProfilerActivatorGroup(Composite parent,
+ INewPIWizardSettings wizardSettings, NewPIWizardPage wizardPage,
+ IWizardContainer wizardContainer) {
+ super(parent, wizardSettings, true);
+ this.wizardContainer = wizardContainer;
+ this.wizardPage = wizardPage;
+ traceHandler = new TraceHandler(this);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.nokia.carbide.cpp.internal.pi.wizards.ui.AbstractBaseGroup#createContent
+ * ()
+ */
+ protected void createContent() {
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 2;
+ this.setLayout(gridLayout);
+ this.setLayoutData(new GridData(GridData.FILL_BOTH));
+ this.setText(Messages.getString("NewPIWizardPageInputTask.fromDevice")); //$NON-NLS-1$
+
+ final Composite leftTables = new Composite(this, SWT.NONE);
+ leftTables.setLayout(new GridLayout());
+ leftTables.setLayoutData(new GridData(GridData.FILL_BOTH));
+ pluginSelectionGroup = new PluginSelectionGroup(leftTables,
+ wizardSettings, true);
+
+ new Label(leftTables, SWT.NONE).setText(Messages
+ .getString("ProfilerActivatorGroup.profilerDataTableTitle")); //$NON-NLS-1$
+ profileDataTable = new TableViewer(leftTables, SWT.BORDER | SWT.SINGLE
+ | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
+
+ TableColumn column = new TableColumn(profileDataTable.getTable(),
+ SWT.NONE);
+ column.setText(Messages.getString("ProfilerActivatorGroup.columnName")); //$NON-NLS-1$
+ column.setWidth(200);
+ column.setResizable(true);
+ column.setMoveable(true);
+ column.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ if (!(e.widget instanceof TableColumn))
+ return;
+ ((AbstractBaseSorter) profileDataTable.getSorter()).doSort(0);
+ profileDataTable.refresh();
+
+ }
+ });
+
+ column = new TableColumn(profileDataTable.getTable(), SWT.NONE);
+ column.setText(Messages.getString("ProfilerActivatorGroup.columnTime")); //$NON-NLS-1$
+ column.setWidth(120);
+ column.setResizable(true);
+ column.setMoveable(true);
+ column.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ if (!(e.widget instanceof TableColumn))
+ return;
+ ((AbstractBaseSorter) profileDataTable.getSorter()).doSort(1);
+ profileDataTable.refresh();
+
+ }
+ });
+
+ column = new TableColumn(profileDataTable.getTable(), SWT.NONE);
+ column.setText(Messages.getString("ProfilerActivatorGroup.columnSize")); //$NON-NLS-1$
+ column.setWidth(120);
+ column.setResizable(true);
+ column.setMoveable(true);
+ column.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ if (!(e.widget instanceof TableColumn))
+ return;
+ ((AbstractBaseSorter) profileDataTable.getSorter()).doSort(2);
+ profileDataTable.refresh();
+
+ }
+ });
+
+ GridData fileLogsTableGridData = new GridData(GridData.FILL_BOTH);
+ fileLogsTableGridData.minimumHeight = 120;
+ profileDataTable.getTable().setLayoutData(fileLogsTableGridData);
+ profileDataTable.getTable().setHeaderVisible(true);
+ profileDataTable.getTable().setLinesVisible(true);
+ profileDataTable.setContentProvider(new IStructuredContentProvider() {
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof List<?>) {
+ return ((List<?>) inputElement).toArray();
+ }
+ return new Object[0];
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput,
+ Object newInput) {
+ }
+
+ });
+
+ profileDataTable.setSorter(new AbstractBaseSorter(profileDataTable
+ .getTable(), 0) {
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ ProfilerDataPlugins pdp1 = (ProfilerDataPlugins) e1;
+ ProfilerDataPlugins pdp2 = (ProfilerDataPlugins) e2;
+ int returnCode = 0;
+ switch (column) {
+ case 0:
+ returnCode = pdp1
+ .getProfilerDataPath()
+ .lastSegment()
+ .compareTo(pdp2.getProfilerDataPath().lastSegment());
+ break;
+ case 1:
+ returnCode = compareNumber(pdp1.getTime(), pdp2.getTime());
+ break;
+ case 2:
+ returnCode = compareNumber(pdp1.getSize(), pdp2.getSize());
+ break;
+
+ default:
+
+ break;
+ }
+ if (!sortAscending)
+ returnCode = -returnCode;
+ return returnCode;
+ }
+ });
+
+ profileDataTable.setLabelProvider(new AbstractLabelProvider() {
+ public String getColumnText(Object element, int columnIndex) {
+ ProfilerDataPlugins plugins = (ProfilerDataPlugins) element;
+
+ switch (columnIndex) {
+ case 0:
+ return plugins.getProfilerDataPath().lastSegment();
+ case 1:
+ SimpleDateFormat formatter = new SimpleDateFormat("mm:ss"); //$NON-NLS-1$
+ return formatter.format(new Date(plugins.getTime()));
+ case 2:
+ return String.valueOf((plugins.getSize() + 512) / 1024);
+ default:
+ break;
+ }
+ return ""; //$NON-NLS-1$
+ }
+ });
+
+ rightButtonsComposite = new Composite(this, SWT.NONE);
+
+ GridData rightButtonsCompositeGridData = new GridData(
+ GridData.HORIZONTAL_ALIGN_FILL);
+ rightButtonsComposite.setLayoutData(rightButtonsCompositeGridData);
+ rightButtonsComposite.setLayout(new GridLayout());
+
+ // Connection settings button
+ settingsButtonGroup = new Group(rightButtonsComposite, SWT.NONE);
+ settingsButtonGroup.setLayout(new GridLayout());
+ settingsButtonGroup.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ refreshListButton = new Button(settingsButtonGroup, SWT.PUSH);
+ refreshListButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ refreshListButton.setText(Messages
+ .getString("ProfilerActivatorGroup.refreshButtonName")); //$NON-NLS-1$
+ refreshListButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ updatePlugins(traceHandler.fetchAvailablePlugins());
+ }
+ });
+
+ connectionSettingsButton = new Button(settingsButtonGroup, SWT.PUSH);
+ connectionSettingsButton.setLayoutData(new GridData(
+ GridData.FILL_HORIZONTAL));
+ connectionSettingsButton
+ .setText(Messages
+ .getString("ProfilerActivatorGroup.connectionSettingsButtonName")); //$NON-NLS-1$
+ connectionSettingsButton.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Shell shell = PiPlugin.getCurrentlyActiveWbWindowShell();
+ PreferenceUtils.openPreferencePage(PiPlugin.getTraceProvider()
+ .getTraceSourcePreferencePageId(), shell);
+ updateConnectionText();
+ }
+ });
+ // Connection settings labels
+ Label connectionTextLabel = new Label(settingsButtonGroup, SWT.LEFT);
+ connectionTextLabel.setText(Messages
+ .getString("ProfilerActivatorGroup.currentlyUsingTitle")); //$NON-NLS-1$
+ connectionTextLabel.setLayoutData(new GridData(
+ GridData.HORIZONTAL_ALIGN_CENTER));
+
+ connectionNameInUseLabel = new Label(settingsButtonGroup, SWT.NONE);
+ connectionNameInUseLabel.setLayoutData(new GridData(
+ GridData.HORIZONTAL_ALIGN_CENTER));
+ Group traceButtonGroup = new Group(rightButtonsComposite, SWT.NONE);
+ traceButtonGroup.setLayout(new GridLayout());
+ traceButtonGroup.setLayoutData(new GridData(GridData.FILL_BOTH));
+ new Label(traceButtonGroup, SWT.LEFT).setText(Messages
+ .getString("ProfilerActivatorGroup.filePrefixTitle")); //$NON-NLS-1$
+ final Text filePrefixText = new Text(traceButtonGroup, SWT.BORDER);
+ filePrefixText.setText("PIProfiler_#"); //$NON-NLS-1$
+ filePrefixText.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ // Start/Stop tracing button
+ tracingButton = new Button(traceButtonGroup, SWT.PUSH);
+ tracingButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ tracingButton.setText(Messages
+ .getString("ProfilerActivatorGroup.startTracingButtonName")); //$NON-NLS-1$
+ tracingButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ if (PiPlugin.getTraceProvider().isListening()) {
+ addTraceFile(traceHandler.stopTrace());
+ } else {
+ traceHandler.startTrace(filePrefixText.getText(),
+ pluginSelectionGroup.getSelectedPluginIds());
+ }
+ updateButtons();
+ }
+ });
+
+ }
+
+ /**
+ * Compare two long number
+ *
+ * @param one
+ * @param two
+ * @return result of the comparison
+ */
+ private int compareNumber(long one, long two) {
+ if (one > two) {
+ return 1;
+ } else if (one < two) {
+ return -1;
+ } else {
+ return 0;
+ }
+ }
+
+ /**
+ * updateConnectionText updates connection text to match used settings
+ */
+ private void updateConnectionText(boolean forceUpdate) {
+ traceHandler.updateCurrenConnection();
+ if (pluginSelectionGroup.getSelectedPluginIds().length <= 0
+ || forceUpdate) {
+ updatePlugins(traceHandler.fetchAvailablePlugins());
+ }
+ }
+
+ /**
+ * updateConnectionText updates connection text to match used settings
+ */
+ private void updateConnectionText() {
+ traceHandler.updateCurrenConnection();
+ }
+
+ /**
+ * Set current connection name
+ *
+ * @param connection
+ * the current connection name
+ */
+ public void setCurrentConnection(final String connection) {
+ Display.getDefault().syncExec(new Runnable() {
+ public void run() {
+ connectionNameInUseLabel.setText(connection);
+ getParent().layout(true, true);
+ }
+ });
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.nokia.carbide.cpp.internal.pi.wizards.ui.AbstractBaseGroup#getTable()
+ */
+ @Override
+ public Table getTable() {
+ return profileDataTable.getTable();
+ }
+
+ @Override
+ public IStatus validateContent(NewPIWizard wizardPage) {
+ List<ProfilerDataPlugins> dataFiles = getProfilerDataFiles();
+ if (dataFiles != null && dataFiles.size() > 0) {
+ wizardPage.setProfilerDataFiles(getProfilerDataFiles());
+ return Status.OK_STATUS;
+ } else {
+ return new Status(
+ Status.INFO,
+ WizardsPlugin.PLUGIN_ID,
+ Messages
+ .getString("ProfilerActivatorGroup.profilerGroupDescription")); //$NON-NLS-1$
+ }
+
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ if (visible) {
+ updateConnectionText(false);
+ }
+ super.setVisible(visible);
+
+ }
+
+ private void updatePlugins(final List<ITrace> plugins) {
+ pluginSelectionGroup.updateTraceIds(new ProfilerDataPlugins(
+ new Path(""), plugins)); //$NON-NLS-1$
+ updateButtons();
+ }
+
+ /**
+ * Add given trace data file to profiler data file table
+ *
+ * @param path
+ */
+ private void addTraceFile(final IPath path) {
+ if (path == null) {
+ return;
+ }
+ ProfilerDataPlugins dataPlugins = removeWithPath(path
+ .removeFileExtension().addFileExtension(
+ ITraceProvider.BASE_FILE));
+ if (dataPlugins != null) {
+ try {
+ addProfilerDataFile(path, dataPlugins.getTime(), path.toFile()
+ .length());
+ refreshTable(profileDataTable, true);
+ } catch (Exception e) {
+ wizardPage
+ .setErrorMessage(e.getMessage()
+ + " " + Messages.getString("ProfilerActivatorGroup.tryDeselectPluginsFromList")); //$NON-NLS-1$ //$NON-NLS-2$
+ wizardPage.setPageComplete(false);
+ refreshTable(profileDataTable, false);
+ path.toFile().delete();
+ }
+ }
+ }
+
+ public NewPIWizardPage getWizardPage() {
+ return wizardPage;
+ }
+
+ public IWizardContainer getWizardContainer() {
+ return wizardContainer;
+ }
+
+ /**
+ * Update trace data files
+ *
+ * @param path
+ * @param time
+ * @param size
+ */
+ public void updateTraceDataFile(final IPath path, final long time,
+ final long size) {
+ Display.getDefault().syncExec(new Runnable() {
+ public void run() {
+ // remove if both time and size are -1
+ if (time == -1 && size == -1) {
+ removeWithPath(path);
+ } else {
+ updateProfilerDataFile(path, time, size);
+ }
+ refreshTable(profileDataTable, false);
+ }
+ });
+ }
+
+ /**
+ * Update buttons
+ */
+ public void updateButtons() {
+ if (PiPlugin.getTraceProvider().isListening()) {
+ wizardPage.setErrorMessage(null);
+ refreshListButton.setEnabled(false);
+ connectionSettingsButton.setEnabled(false);
+ ((NewPIWizardPageInputTask) wizardPage)
+ .setButtonGroupEnabled(false);
+ tracingButton.setText(Messages
+ .getString("ProfilerActivatorGroup.stopTracingButtonName")); //$NON-NLS-1$
+ } else {
+ refreshListButton.setEnabled(true);
+ connectionSettingsButton.setEnabled(true);
+ ((NewPIWizardPageInputTask) wizardPage).setButtonGroupEnabled(true);
+ tracingButton
+ .setText(Messages
+ .getString("ProfilerActivatorGroup.startTracingButtonName")); //$NON-NLS-1$
+ }
+
+ if (pluginSelectionGroup.getSelectedPluginIds().length <= 0) {
+ tracingButton.setEnabled(false);
+ } else {
+ tracingButton.setEnabled(true);
+ }
+ }
+
+ /**
+ * Generate next dat file name
+ *
+ * @param path
+ * @return
+ */
+ private IPath generateDatFile(IPath path) {
+ while (path.toFile().exists()) {
+ String file = path.lastSegment();
+ String fileExtension = path.getFileExtension();
+ file = file.substring(0, file.lastIndexOf("." + fileExtension)); //$NON-NLS-1$
+ int index = file.lastIndexOf("_"); //$NON-NLS-1$
+ if (index != -1) {
+ try {
+ int count = Integer.valueOf(file.substring(index + 1));
+ count++;
+ file = file.substring(0, index + 1) + count;
+ path = path.removeLastSegments(1).append(
+ file + "." + fileExtension); //$NON-NLS-1$
+ } catch (Exception e) {
+ path = path.removeLastSegments(1).append(
+ file + "_0." + fileExtension); //$NON-NLS-1$
+ }
+
+ } else {
+ path = path.removeLastSegments(1).append(
+ file + "_0." + fileExtension); //$NON-NLS-1$
+ }
+ }
+ return path;
+
+ }
+
+ /**
+ * Handle temporary profiler data files in case user is tried to close
+ * wizard and user has traced some data from device
+ *
+ * @param forceRemove
+ */
+ public void handleTemporaryProfilerDataFiles(boolean forceRemove) {
+ final List<ProfilerDataPlugins> plugins = new ArrayList<ProfilerDataPlugins>();
+ plugins.addAll(getProfilerDataFiles());
+ getProfilerDataFiles().clear();
+ if (forceRemove) {
+ deleteProfilerDataFiles(plugins);
+ } else if (plugins.size() > 0) {
+ boolean answer = MessageDialog
+ .openQuestion(
+ Display.getDefault().getActiveShell(),
+ Messages
+ .getString("ProfilerActivatorGroup.questionDialogTitle"), Messages.getString("ProfilerActivatorGroup.questionDialogMessage")); //$NON-NLS-1$ //$NON-NLS-2$
+ if (answer) {
+ // open file dialog for selecting a crash file
+ DirectoryDialog dialog = new DirectoryDialog(Display
+ .getDefault().getActiveShell());
+ dialog
+ .setText(Messages
+ .getString("ProfilerActivatorGroup.directorySelectionDialogTitle")); //$NON-NLS-1$
+ final String result = dialog.open();
+ if (result != null) {
+ WorkspaceJob job = new WorkspaceJob(
+ Messages
+ .getString("ProfilerActivatorGroup.movingProfilerDataFilesJob") + result) { //$NON-NLS-1$
+ @Override
+ public IStatus runInWorkspace(IProgressMonitor monitor)
+ throws CoreException {
+ monitor.beginTask("", IProgressMonitor.UNKNOWN); //$NON-NLS-1$
+ for (ProfilerDataPlugins plugin : plugins) {
+ IPath dataFile = plugin.getProfilerDataPath();
+ IPath targetFile = generateDatFile(new Path(
+ result).append(dataFile.lastSegment()));
+ try {
+ moveFile(dataFile, targetFile,
+ new SubProgressMonitor(monitor,
+ IProgressMonitor.UNKNOWN));
+ } catch (Exception e) {
+ List<ProfilerDataPlugins> list = new ArrayList<ProfilerDataPlugins>();
+ list.add(plugin);
+ deleteProfilerDataFiles(list);
+ e.printStackTrace();
+ MessageDialog
+ .openError(
+ getShell(),
+ Messages
+ .getString("ProfilerActivatorGroup.errorDialogTitle"), MessageFormat.format(Messages.getString("ProfilerActivatorGroup.failedToMoveFileTo"), dataFile.lastSegment(), result)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ monitor.done();
+ return Status.OK_STATUS;
+ }
+ };
+ job.schedule();
+ } else {
+ deleteProfilerDataFiles(plugins);
+ }
+ } else {
+ deleteProfilerDataFiles(plugins);
+ }
+ }
+ }
+
+ /**
+ * Delete profiler data files
+ *
+ * @param plugins
+ */
+ private void deleteProfilerDataFiles(final List<ProfilerDataPlugins> plugins) {
+ WorkspaceJob job = new WorkspaceJob(Messages
+ .getString("ProfilerActivatorGroup.removeProfilerDataFilesJob")) { //$NON-NLS-1$
+
+ @Override
+ public IStatus runInWorkspace(IProgressMonitor monitor)
+ throws CoreException {
+ monitor.beginTask("", IProgressMonitor.UNKNOWN); //$NON-NLS-1$
+ for (ProfilerDataPlugins plugin : plugins) {
+ IPath dataFile = plugin.getProfilerDataPath();
+ monitor
+ .setTaskName(MessageFormat
+ .format(
+ Messages
+ .getString("ProfilerActivatorGroup.deletingProfilerDataFiles"), dataFile.lastSegment())); //$NON-NLS-1$
+ if (dataFile.toFile().exists()) {
+ while (!dataFile.toFile().delete()) {
+ if (monitor.isCanceled()) {
+ break;
+ }
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ }
+ ;
+ monitor.done();
+ return Status.OK_STATUS;
+ }
+
+ };
+ job.schedule();
+
+ }
+
+ /**
+ * Move profiler data file from temporary location to user selected target
+ *
+ * @param source
+ * @param target
+ * @param monitor
+ * @throws IOException
+ */
+ private void moveFile(final IPath source, IPath target,
+ IProgressMonitor monitor) throws IOException {
+ if (monitor == null) {
+ monitor = new NullProgressMonitor();
+ }
+ InputStream in = null;
+ OutputStream out = null;
+ try {
+ monitor
+ .beginTask(
+ MessageFormat
+ .format(
+ Messages
+ .getString("ProfilerActivatorGroup.copyingProfilerDataFiles"), source.lastSegment(), target.removeLastSegments(1)), IProgressMonitor.UNKNOWN); //$NON-NLS-1$
+ in = new FileInputStream(source.toFile());
+ out = new FileOutputStream(target.toFile());
+ int bufferSize = 1024;
+ byte[] buf = new byte[bufferSize];
+ int len;
+ while ((len = in.read(buf)) > 0) {
+ out.write(buf, 0, len);
+ out.flush();
+ }
+
+ } finally {
+ if (in != null) {
+ in.close();
+ }
+ if (out != null) {
+ out.close();
+ }
+ monitor
+ .setTaskName(MessageFormat
+ .format(
+ Messages
+ .getString("ProfilerActivatorGroup.deletingProfilerDataFiles"), source.lastSegment())); //$NON-NLS-1$
+ while (!source.toFile().delete()) {
+ if (monitor.isCanceled()) {
+ break;
+ }
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ monitor.done();
+ }
+ }
+}