| /******************************************************************************* |
| * Copyright (c) 2007 Innoopract Informationssysteme GmbH. 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: |
| * Innoopract Informationssysteme GmbH - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.rap.ui.internal.target; |
| |
| import java.io.*; |
| import java.lang.reflect.InvocationTargetException; |
| import java.net.URL; |
| |
| import org.eclipse.core.commands.*; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.*; |
| import org.eclipse.jface.dialogs.Dialog; |
| import org.eclipse.jface.operation.IRunnableWithProgress; |
| import org.eclipse.pde.internal.core.LoadTargetOperation; |
| import org.eclipse.pde.internal.core.itarget.ITarget; |
| import org.eclipse.pde.internal.core.itarget.ITargetModel; |
| import org.eclipse.pde.internal.core.target.TargetModel; |
| import org.eclipse.rap.ui.internal.intro.ErrorUtil; |
| import org.eclipse.rap.ui.internal.intro.IntroPlugin; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.ui.IWorkbench; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.progress.IProgressService; |
| |
| // ERROR HANDLING !!!!! |
| public class InstallRAPTargetHandler extends AbstractHandler { |
| |
| private static final String TARGET_FILE = "target/rap.target"; //$NON-NLS-1$ |
| |
| public Object execute( final ExecutionEvent event ) throws ExecutionException |
| { |
| IWorkbench workbench = PlatformUI.getWorkbench(); |
| Shell shell = workbench.getActiveWorkbenchWindow().getShell(); |
| InstallTargetDialog dialog = new InstallTargetDialog( shell ); |
| int result = dialog.open(); |
| if( result == Dialog.OK ) { |
| String targetDestination = dialog.getTargetDestination(); |
| installTarget( targetDestination ); |
| // switch target if the users wants to |
| if( dialog.shouldSwitchTarget() ) { |
| switchTarget( targetDestination ); |
| } |
| } |
| return null; |
| } |
| |
| private static void installTarget( final String targetDestination ) |
| throws ExecutionException |
| { |
| IRunnableWithProgress runnable = new IRunnableWithProgress() { |
| public void run( final IProgressMonitor monitor ) |
| throws InvocationTargetException, InterruptedException |
| { |
| try { |
| TargetProvider.install( targetDestination, monitor ); |
| } catch( CoreException e ) { |
| throw new InvocationTargetException( e ); |
| } |
| } |
| }; |
| IProgressService service = PlatformUI.getWorkbench().getProgressService(); |
| try { |
| service.busyCursorWhile( runnable ); |
| } catch( InvocationTargetException e ) { |
| Throwable cause = e.getCause() == null ? e : e.getCause(); |
| String msg = "Failed to install target platform."; |
| throw new ExecutionException( msg, cause ); |
| } catch( InterruptedException e ) { |
| // TODO [rh] exception handling |
| } |
| } |
| |
| private static void switchTarget( final String targetDestination ) { |
| IRunnableWithProgress run = new IRunnableWithProgress() { |
| public void run( final IProgressMonitor monitor ) |
| throws InvocationTargetException, InterruptedException |
| { |
| try { |
| ITargetModel model = getTargetModel( targetDestination ); |
| if( model.isLoaded() ) { |
| ITarget target = model.getTarget(); |
| LoadTargetOperation operation = new LoadTargetOperation( target ); |
| ResourcesPlugin.getWorkspace().run( operation, monitor ); |
| } |
| } catch( IOException e ) { |
| throw new InvocationTargetException( e ); |
| } catch( CoreException e ) { |
| throw new InvocationTargetException( e ); |
| } catch( OperationCanceledException e ) { |
| throw new InterruptedException( e.getMessage() ); |
| } finally { |
| monitor.done(); |
| } |
| } |
| }; |
| IProgressService service = PlatformUI.getWorkbench().getProgressService(); |
| try { |
| service.runInUI( service, run, ResourcesPlugin.getWorkspace().getRoot() ); |
| } catch( InvocationTargetException e ) { |
| String msg = "Failed to switch to RAP target platform."; |
| ErrorUtil.show( msg, e ); //$NON-NLS-1$ |
| } catch( InterruptedException e ) { |
| String msg |
| = "InterruptedException occured while switching to RAP target " |
| + "platform."; //$NON-NLS-1$ |
| ErrorUtil.log( msg, e ); |
| } |
| } |
| |
| private static ITargetModel getTargetModel( final String targetDestination ) |
| throws IOException, CoreException |
| { |
| ITargetModel targetModel = new TargetModel(); |
| URL entry = IntroPlugin.getDefault().getBundle().getEntry( TARGET_FILE ); |
| InputStream is = new BufferedInputStream( entry.openStream() ); |
| try { |
| targetModel.load( is, true ); |
| } finally { |
| is.close(); |
| } |
| File path = new File( targetDestination, "eclipse" ); //$NON-NLS-N$ |
| targetModel.getTarget().getLocationInfo().setPath( path.toString() ); |
| return targetModel; |
| } |
| } |