blob: 0c6b3d49e4c8dd3cba3271359677f6ecc387e3b2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2015 Wind River Systems 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:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.launching;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.concurrent.Sequence;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.service.IDsfService;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
public class ShutdownSequence extends Sequence {
class ServiceShutdownStep extends Step {
private IDsfService fService;
ServiceShutdownStep( IDsfService service ) {
super();
fService = service;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.dsf.concurrent.Sequence.Step#execute(org.eclipse.cdt.dsf.concurrent.RequestMonitor)
*/
@Override
public void execute( final RequestMonitor rm ) {
fService.shutdown( new RequestMonitor( getExecutor(), rm ) {
/* (non-Javadoc)
* @see org.eclipse.cdt.dsf.concurrent.RequestMonitor#handleCompleted()
*/
@Override
protected void handleCompleted() {
if ( !isSuccess() ) {
GdbPlugin.getDefault().getLog().log( getStatus() );
}
rm.done();
}
} );
}
}
private String fSessionId;
private Step[] fSteps;
public ShutdownSequence(DsfExecutor executor, String sessionId, RequestMonitor requestMonitor) {
super(executor, requestMonitor);
fSessionId = sessionId;
fSteps = createSteps();
}
@Override
public Step[] getSteps() {
return fSteps;
}
private Step[] createSteps() {
IDsfService[] services = getServices();
ServiceShutdownStep[] steps = new ServiceShutdownStep[services.length];
for ( int i = 0; i < steps.length; ++i ) {
steps[i] = new ServiceShutdownStep( services[i] );
}
return steps;
}
private IDsfService[] getServices() {
IDsfService[] result = new IDsfService[0];
try {
ServiceReference<?>[] serviceRefs = GdbPlugin.getBundleContext().getServiceReferences(
IDsfService.class.getName(),
String.format( "(%s=%s)", IDsfService.PROP_SESSION_ID, fSessionId ).intern() ); //$NON-NLS-1$
if (serviceRefs != null) {
List<IDsfService> services = new ArrayList<IDsfService>( serviceRefs.length );
for ( ServiceReference<?> ref : serviceRefs ) {
Object serviceObj = GdbPlugin.getBundleContext().getService( ref );
if ( serviceObj instanceof IDsfService ) {
services.add( (IDsfService)serviceObj );
}
}
Collections.sort( services, new Comparator<IDsfService>() {
@Override
public int compare( IDsfService o1, IDsfService o2 ) {
return o2.getStartupNumber() - o1.getStartupNumber();
}
} );
result = services.toArray( new IDsfService[services.size()] );
}
}
catch( InvalidSyntaxException e ) {
// Shouldn't happen
}
return result;
}
}