package com.codeaffine.example.rwt.osgi.ui.example.console; import java.io.IOException; import java.io.InputStream; import org.eclipse.rap.rwt.supplemental.fileupload.FileUploadHandler; import org.eclipse.rap.rwt.supplemental.fileupload.FileUploadReceiver; import org.eclipse.rap.rwt.supplemental.fileupload.IFileUploadDetails; import org.eclipse.rwt.lifecycle.WidgetUtil; import org.eclipse.rwt.widgets.DialogCallback; import org.eclipse.rwt.widgets.DialogUtil; import org.eclipse.rwt.widgets.FileUpload; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.MessageBox; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleException; import org.osgi.framework.FrameworkUtil; import com.codeaffine.example.rwt.osgi.ui.platform.ServiceProvider; import com.codeaffine.example.rwt.osgi.ui.platform.UIContributor; public class UploadContributor implements UIContributor { private static final int OFFSET = 5; FileUpload fileChooserButton; Label selectionLabel; FileUploadHandler handler; ServiceProvider serviceProvider; Button uploadButton; void setServiceProvider( ServiceProvider serviceProvider ) { this.serviceProvider = serviceProvider; } @Override public Control contribute( Composite parent ) { Composite result = new Composite( parent, SWT.NONE ); result.setData( WidgetUtil.CUSTOM_VARIANT, "upload-panel" ); result.setLayout( new FormLayout() ); createContent( result ); return result; } private void createContent( Composite container ) { createFileChooser( container ); createSelectionLabel( container ); createUploadButton( container ); configureFileUpload(); } private void createFileChooser( Composite container ) { fileChooserButton = new FileUpload( container, SWT.NONE ); fileChooserButton.setText( "Choose a bundle to upload" ); FormData fileChooserButtonData = new FormData(); fileChooserButton.setLayoutData( fileChooserButtonData ); fileChooserButtonData.left = new FormAttachment( 0, 5 ); fileChooserButtonData.top = new FormAttachment( 0, OFFSET ); fileChooserButtonData.bottom = new FormAttachment( 100, -OFFSET ); } private void createSelectionLabel( Composite container ) { selectionLabel = new Label( container, SWT.NONE ); selectionLabel.setData( WidgetUtil.CUSTOM_VARIANT, "upload-selection" ); selectionLabel.setText( "" ); FormData selectionLabelData = new FormData(); selectionLabel.setLayoutData( selectionLabelData ); selectionLabelData.left = new FormAttachment( fileChooserButton, OFFSET ); selectionLabelData.top = new FormAttachment( 0, OFFSET ); selectionLabelData.height = 18; selectionLabelData.width = 400; } private void createUploadButton( Composite container ) { uploadButton = new Button( container, SWT.PUSH ); uploadButton.setText( "upload" ); uploadButton.setEnabled( false ); uploadButton.setData( WidgetUtil.CUSTOM_VARIANT, "upload-button" ); FormData uploadButtonData = new FormData(); uploadButton.setLayoutData( uploadButtonData ); uploadButtonData.left = new FormAttachment( selectionLabel, 5 ); uploadButtonData.top = new FormAttachment( 0, OFFSET ); uploadButton.addSelectionListener( new SelectionAdapter() { private static final long serialVersionUID = 1L; @Override public void widgetSelected( SelectionEvent e ) { if( !selectionLabel.getText().equals( "" ) ) { fileChooserButton.submit( handler.getUploadUrl() ); uploadButton.setEnabled( false ); } } } ); } private void configureFileUpload() { FileUploadReceiver receiver = new FileUploadReceiver() { @Override public void receive( InputStream dataStream, IFileUploadDetails details ) throws IOException { installBundle( dataStream, details ); } }; handler = new FileUploadHandler( receiver ); fileChooserButton.addSelectionListener( new SelectionAdapter() { private static final long serialVersionUID = 1L; @Override public void widgetSelected( SelectionEvent e ) { handleSelectedFile(); } } ); } protected void installBundle( InputStream bundleStream, IFileUploadDetails details ) { String location = details.getFileName(); BundleContext bundleContext = getBundle().getBundleContext(); try { Bundle bundle = bundleContext.installBundle( location, bundleStream ); bundle.start(); } catch( BundleException be ) { throw new IllegalArgumentException( "Unable to register regulation bundle: " + location, be ); } } Bundle getBundle() { return FrameworkUtil.getBundle( getClass() ); } void handleSelectedFile() { String fileName = fileChooserButton.getFileName(); if( fileName.endsWith( ".jar" ) ) { handleValidFileSelection(); } else { handleInvalidFileSelection(); } } private void handleValidFileSelection() { selectionLabel.setText( fileChooserButton.getFileName() ); uploadButton.setEnabled( true ); } private void handleInvalidFileSelection() { uploadButton.setEnabled( false ); MessageBox box = new MessageBox( fileChooserButton.getShell(), SWT.ICON_ERROR | SWT.OK ); box.setMessage( "The selected file is not a jar file." ); selectionLabel.setText( "" ); DialogUtil.open( box, new DialogCallback() { private static final long serialVersionUID = 1L; @Override public void dialogClosed( int returnCode ) { // TODO [fappel]: remove this once null is allowed as dialog callback parameter } } ); } public void reenableUploadButton() { uploadButton.setEnabled( true ); } @Override public String getId() { return "Bundle-Upload"; } }