package com.codeaffine.example.rwt.osgi.configurationadmin.console;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.eclipse.osgi.framework.console.ConsoleSession;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.lifecycle.UICallBack;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceRegistration;
public class OSGiConsole {
private Composite composite;
private OutputProcessor outputProcessor;
private ExecutorService executorService;
private ServiceRegistration<ConsoleSession> serviceRegistration;
private Text consoleWidget;
public void create( Composite parent ) {
composite = new Composite( parent, SWT.NONE );
composite.setLayout( new FillLayout() );
UICallBack.activate( String.valueOf( composite.hashCode() ) );
consoleWidget = new Text( composite, SWT.MULTI );
consoleWidget.setData( RWT.CUSTOM_VARIANT, "osgi_console" );
File consoleIn = createTempFile( "consoleIn" );
File consoleOut = createTempFile( "consoleOut" );
registerInputProcessor( consoleWidget, consoleIn );
registerOutputProcessor( consoleWidget, consoleOut );
registerConsoleSession( consoleIn, consoleOut );
ConsoleCloser consoleCloser = new ConsoleCloser( this );
RWT.getSessionStore().addSessionStoreListener( consoleCloser );
}
public Control getControl() {
return composite;
}
private void registerInputProcessor( Text consoleWidget, File consoleIn ) {
InputProcessor inputProcessor = new InputProcessor( consoleIn );
consoleWidget.addKeyListener( new CommandParser( inputProcessor, consoleWidget ) );
}
private void registerOutputProcessor( Text consoleWidget, File consoleOut ) {
executorService = Executors.newSingleThreadExecutor();
outputProcessor = new OutputProcessor( consoleOut, new LineWriter( consoleWidget ) );
executorService.execute( outputProcessor );
}
private void registerConsoleSession( File consoleIn, File consoleOut ) {
BundleContext context = FrameworkUtil.getBundle( getClass() ).getBundleContext();
OSGiConsoleSession session = new OSGiConsoleSession( consoleIn, consoleOut );
Hashtable<String,Boolean> properties = new Hashtable<String, Boolean>();
properties.put( "console.systemInOut", Boolean.TRUE );
serviceRegistration = context.registerService( ConsoleSession.class, session, properties );
}
private File createTempFile( String prefix ) {
try {
File result = File.createTempFile( prefix, "tmp" );
result.deleteOnExit();
return result;
} catch( IOException shouldNotHappen ) {
throw new IllegalStateException( shouldNotHappen );
}
}
public void dispose() {
if( composite != null ) {
UICallBack.deactivate( String.valueOf( composite.hashCode() ) );
outputProcessor.shutdown();
executorService.shutdownNow();
serviceRegistration.unregister();
consoleWidget = null;
if( !composite.isDisposed() ) {
composite.dispose();
}
composite = null;
}
}
}