blob: c919eb4fdfd73594f561c8de70d275cada72f181 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2010 Nokia 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:
* Nokia - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.edc.internal.ui;
import java.util.concurrent.RejectedExecutionException;
import org.eclipse.cdt.dsf.concurrent.DsfRunnable;
import org.eclipse.cdt.dsf.concurrent.IDsfStatusConstants;
import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor;
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.datamodel.IDMContext;
import org.eclipse.cdt.dsf.debug.service.IProcesses;
import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext;
import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMData;
import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlShutdownDMEvent;
import org.eclipse.cdt.dsf.debug.ui.viewmodel.launch.AbstractContainerVMNode;
import org.eclipse.cdt.dsf.debug.ui.viewmodel.launch.ILaunchVMConstants;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.cdt.dsf.ui.concurrent.ViewerCountingRequestMonitor;
import org.eclipse.cdt.dsf.ui.concurrent.ViewerDataRequestMonitor;
import org.eclipse.cdt.dsf.ui.viewmodel.VMDelta;
import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.AbstractDMVMProvider;
import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.IDMVMContext;
import org.eclipse.cdt.dsf.ui.viewmodel.properties.IPropertiesUpdate;
import org.eclipse.cdt.dsf.ui.viewmodel.properties.VMDelegatingPropertiesUpdate;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
import org.eclipse.ui.IMemento;
@SuppressWarnings("restriction")
public class ContainerVMNode extends AbstractContainerVMNode implements IElementMementoProvider {
public ContainerVMNode(AbstractDMVMProvider provider, DsfSession session) {
super(provider, session);
}
@Override
public String toString() {
return "ContainerVMNode(" + getSession().getId() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
}
@Override
protected void updateElementsInSessionThread(final IChildrenUpdate update) {
IProcesses processService = getServicesTracker().getService(IProcesses.class);
if (processService == null) {
handleFailedUpdate(update);
return;
}
processService.getProcessesBeingDebugged(null,
new ViewerDataRequestMonitor<IDMContext[]>(getExecutor(), update) {
@Override
public void handleCompleted() {
if (!isSuccess()) {
handleFailedUpdate(update);
return;
}
if (getData() != null)
fillUpdateWithVMCs(update, getData());
update.done();
}
});
}
@Override
protected void updatePropertiesInSessionThread(IPropertiesUpdate[] updates) {
IPropertiesUpdate[] parentUpdates = new IPropertiesUpdate[updates.length];
for (int i = 0; i < updates.length; i++) {
final IPropertiesUpdate update = updates[i];
final ViewerCountingRequestMonitor countringRm = new ViewerCountingRequestMonitor(ImmediateExecutor
.getInstance(), updates[i]);
int count = 0;
// Create a delegating update which will let the super-class fill in
// the
// standard container properties.
parentUpdates[i] = new VMDelegatingPropertiesUpdate(updates[i], countringRm);
count++;
IProcesses processService = getServicesTracker().getService(IProcesses.class);
final IProcessDMContext procDmc = findDmcInPath(update.getViewerInput(), update.getElementPath(),
IProcessDMContext.class);
if (processService == null || procDmc == null) {
update.setStatus(EDCDebugUI.newErrorStatus(IDsfStatusConstants.INVALID_HANDLE,
"Service or handle invalid", null)); //$NON-NLS-1$
} else {
processService.getExecutionData(procDmc, new ViewerDataRequestMonitor<IThreadDMData>(getExecutor(),
update) {
@Override
public void handleCompleted() {
if (isSuccess()) {
fillThreadDataProperties(update, getData());
} else {
update.setStatus(getStatus());
}
countringRm.done();
}
});
count++;
}
countringRm.setDoneCount(count);
}
super.updatePropertiesInSessionThread(parentUpdates);
}
protected void fillThreadDataProperties(IPropertiesUpdate update, IThreadDMData data) {
update.setProperty(PROP_NAME, data.getName());
update.setProperty(ILaunchVMConstants.PROP_ID, "Process id: " + data.getId());
}
@Override
public int getDeltaFlags(Object e) {
if (e instanceof ICommandControlShutdownDMEvent) {
return IModelDelta.CONTENT;
}
return super.getDeltaFlags(e);
}
@Override
public void buildDelta(Object e, final VMDelta parentDelta, final int nodeOffset,
final RequestMonitor requestMonitor) {
if (e instanceof ICommandControlShutdownDMEvent) {
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
} else {
super.buildDelta(e, parentDelta, nodeOffset, requestMonitor);
return;
}
requestMonitor.done();
}
/*
* (non-Javadoc)
*
* @seeorg.eclipse.debug.internal.ui.viewers.model.provisional.
* IElementMementoProvider
* #compareElements(org.eclipse.debug.internal.ui.viewers
* .model.provisional.IElementCompareRequest[])
*/
private final String MEMENTO_NAME = "CONTAINER_MEMENTO_NAME"; //$NON-NLS-1$
public void compareElements(IElementCompareRequest[] requests) {
for (final IElementCompareRequest request : requests) {
Object element = request.getElement();
final IMemento memento = request.getMemento();
final String mementoName = memento.getString(MEMENTO_NAME);
if (mementoName != null) {
if (element instanceof IDMVMContext) {
IDMContext dmc = ((IDMVMContext) element).getDMContext();
if (dmc instanceof IContainerDMContext) {
final IProcessDMContext procDmc = findDmcInPath(request.getViewerInput(), request
.getElementPath(), IProcessDMContext.class);
if (procDmc != null) {
try {
getSession().getExecutor().execute(new DsfRunnable() {
public void run() {
final IProcesses processService = getServicesTracker().getService(
IProcesses.class);
if (processService != null) {
processService.getExecutionData(procDmc,
new ViewerDataRequestMonitor<IThreadDMData>(processService
.getExecutor(), request) {
@Override
protected void handleCompleted() {
if (getStatus().isOK()) {
memento
.putString(
MEMENTO_NAME,
"Container." + getData().getName() + getData().getId()); //$NON-NLS-1$
}
request.done();
}
});
} else {
request.done();
}
}
});
} catch (RejectedExecutionException e) {
request.done();
}
continue;
}
}
}
}
request.done();
}
}
/*
* (non-Javadoc)
*
* @seeorg.eclipse.debug.internal.ui.viewers.model.provisional.
* IElementMementoProvider
* #encodeElements(org.eclipse.debug.internal.ui.viewers
* .model.provisional.IElementMementoRequest[])
*/
public void encodeElements(IElementMementoRequest[] requests) {
for (final IElementMementoRequest request : requests) {
Object element = request.getElement();
final IMemento memento = request.getMemento();
if (element instanceof IDMVMContext) {
IDMContext dmc = ((IDMVMContext) element).getDMContext();
if (dmc instanceof IContainerDMContext) {
final IProcessDMContext procDmc = findDmcInPath(request.getViewerInput(), request.getElementPath(),
IProcessDMContext.class);
if (procDmc != null) {
try {
getSession().getExecutor().execute(new DsfRunnable() {
public void run() {
final IProcesses processService = getServicesTracker().getService(IProcesses.class);
if (processService != null) {
processService.getExecutionData(procDmc,
new ViewerDataRequestMonitor<IThreadDMData>(processService
.getExecutor(), request) {
@Override
protected void handleCompleted() {
if (getStatus().isOK()) {
memento
.putString(
MEMENTO_NAME,
"Container." + getData().getName() + getData().getId()); //$NON-NLS-1$
}
request.done();
}
});
} else {
request.done();
}
}
});
} catch (RejectedExecutionException e) {
request.done();
}
continue;
}
}
}
request.done();
}
}
}