/***************************************************************************** * Copyright (c) 2008 g-Eclipse Consortium * 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 * * Initial development of the original code was made for the * g-Eclipse project founded by European Union * project number: FP6-IST-034327 http://www.geclipse.eu/ * * Contributors: * Moritz Post - initial API and implementation *****************************************************************************/ package eu.geclipse.aws.ui.wizards; import java.net.URL; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.jface.wizard.Wizard; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import eu.geclipse.aws.auth.AWSAuthToken; import eu.geclipse.aws.auth.AWSAuthTokenDescription; import eu.geclipse.aws.ui.Messages; import eu.geclipse.aws.ui.internal.Activator; import eu.geclipse.aws.vo.AWSVirtualOrganization; import eu.geclipse.core.auth.PasswordManager; import eu.geclipse.core.model.IVirtualOrganization; import eu.geclipse.core.reporting.ProblemException; import eu.geclipse.ui.wizards.VoSelectionWizardPage; /** * This wizard page provides the form elements to input the details required to * create an {@link AWSAuthToken}. * * @author Moritz Post */ public class AWSAuthTokenWizardPage extends WizardPage { /** The ID of the wizard page. */ private static final String WIZARD_PAGE_ID = "eu.geclipse.aws.ui.awsAuthTokenWizardPage"; //$NON-NLS-1$ /** The {@link Text} widget to hold the access id. */ private Text accessIdText; /** The {@link Text} widget to hold the secret id. */ private Text secretIdText; /** The initial datasource for the token. */ private AWSAuthTokenDescription awsAuthTokenDesc; /** The parent {@link Wizard} of this page. */ private AWSAuthTokenWizard authTokenWizard; /** * Create a new {@link AWSAuthTokenWizardPage} and provide initial content via * the awsAuthTokenDesc * * @param authTokenWizard the parent {@link Wizard} * @param awsAuthTokenDesc the initial {@link AWSAuthTokenDescription} */ protected AWSAuthTokenWizardPage( final AWSAuthTokenWizard authTokenWizard, final AWSAuthTokenDescription awsAuthTokenDesc ) { super( AWSAuthTokenWizardPage.WIZARD_PAGE_ID, Messages.getString( "AWSAuthTokenWizardPage.wizard_page_title" ), //$NON-NLS-1$ null ); this.awsAuthTokenDesc = awsAuthTokenDesc; this.authTokenWizard = authTokenWizard; setDescription( Messages.getString( "AWSAuthTokenWizardPage.wizard_page_description" ) ); //$NON-NLS-1$ URL imgUrl = Activator.getDefault() .getBundle() .getEntry( "icons/wizban/credentials_wiz.gif" ); //$NON-NLS-1$ setImageDescriptor( ImageDescriptor.createFromURL( imgUrl ) ); } @Override public void setVisible( final boolean visible ) { super.setVisible( visible ); this.authTokenWizard.setCanFinish( true ); if( visible ) { initPage(); } } public void createControl( final Composite parent ) { GridData gData; Composite mainComp = new Composite( parent, SWT.NONE ); mainComp.setLayout( new GridLayout( 1, false ) ); // credentials group Group credentialsGroup = new Group( mainComp, SWT.NONE ); credentialsGroup.setLayout( new GridLayout( 2, false ) ); credentialsGroup.setText( Messages.getString( "AWSAuthTokenWizardPage.group_credentials_title" ) ); //$NON-NLS-1$ gData = new GridData( GridData.FILL_HORIZONTAL ); gData.grabExcessHorizontalSpace = true; credentialsGroup.setLayoutData( gData ); // access id text Label accessIdLabel = new Label( credentialsGroup, SWT.LEFT ); accessIdLabel.setText( Messages.getString( "AWSAuthTokenWizardPage.label_access_id" ) ); //$NON-NLS-1$ gData = new GridData(); accessIdLabel.setLayoutData( gData ); this.accessIdText = new Text( credentialsGroup, SWT.LEFT | SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY ); gData = new GridData( GridData.FILL_HORIZONTAL ); gData.grabExcessHorizontalSpace = true; this.accessIdText.setLayoutData( gData ); // secret id Label secretIdLabel = new Label( credentialsGroup, SWT.LEFT ); secretIdLabel.setText( Messages.getString( "AWSAuthTokenWizardPage.label_secret_id" ) ); //$NON-NLS-1$ gData = new GridData(); secretIdLabel.setLayoutData( gData ); this.secretIdText = new Text( credentialsGroup, SWT.LEFT | SWT.SINGLE | SWT.BORDER | SWT.PASSWORD ); gData = new GridData( GridData.FILL_HORIZONTAL ); gData.grabExcessHorizontalSpace = true; this.secretIdText.setLayoutData( gData ); setControl( mainComp ); } /** * Initializes the pages form based on either a provided * {@link AWSAuthTokenDescription} or the {@link AWSVirtualOrganization} * selected in the previous wizard page. */ private void initPage() { // populate fields if possible String emptyString = ""; //$NON-NLS-1$ this.accessIdText.setText( emptyString ); this.secretIdText.setText( emptyString ); if( this.awsAuthTokenDesc != null ) { String awsAccessId = this.awsAuthTokenDesc.getAwsAccessId(); if( awsAccessId != null ) { String awsSecretId = PasswordManager.getPassword( AWSAuthTokenDescription.SECURE_STORAGE_NODE + awsAccessId ); this.accessIdText.setText( awsAccessId ); if( awsSecretId != null ) { this.secretIdText.setText( awsSecretId ); } else { this.secretIdText.setFocus(); } } } else { IVirtualOrganization[] selectedVos = getVoSelectionPage().getSelectedVos(); if( selectedVos[ 0 ] != null ) { AWSVirtualOrganization awsVo = ( AWSVirtualOrganization )selectedVos[ 0 ]; try { String awsAccessId = awsVo.getProperties().getAwsAccessId(); this.accessIdText.setText( awsAccessId ); String awsSecretId = PasswordManager.getPassword( AWSAuthTokenDescription.SECURE_STORAGE_NODE + awsAccessId ); if( awsSecretId != null ) { this.secretIdText.setText( awsSecretId ); } else { this.secretIdText.setFocus(); } } catch( ProblemException problemEx ) { Activator.log( "Could not extract aws access id from aws vo properties", //$NON-NLS-1$ problemEx ); } } else { this.accessIdText.setEnabled( true ); this.accessIdText.setFocus(); } } } /** * Construct an {@link AWSAuthTokenDescription} from the specified settings of * the UI components. * * @return A token description that holds the values that were specified using * the UI components. */ public AWSAuthTokenDescription getTokenDescription() { String accessId = this.accessIdText.getText().trim(); String secretId = this.secretIdText.getText().trim(); AWSVirtualOrganization awsVo = null; if( this.awsAuthTokenDesc == null || this.awsAuthTokenDesc.getAwsVo() == null ) { IVirtualOrganization[] selectedVos = getVoSelectionPage().getSelectedVos(); for( IVirtualOrganization virtualOrganization : selectedVos ) { awsVo = ( AWSVirtualOrganization )virtualOrganization; } } else { awsVo = this.awsAuthTokenDesc.getAwsVo(); } AWSAuthTokenDescription authTokenDesc = new AWSAuthTokenDescription( awsVo ); PasswordManager.registerPassword( AWSAuthTokenDescription.SECURE_STORAGE_NODE + accessId, secretId ); return authTokenDesc; } /** * Validate the input of this form. Check if the secret id and the access id * is present. * * @return if this pages form data is valid or not */ public boolean isValid() { String error = null; if( this.accessIdText.getText().trim().length() == 0 ) { error = Messages.getString( "AWSAuthTokenWizardPage.form_error_access_id_required" ); //$NON-NLS-1$ } if( this.secretIdText.getText().trim().length() == 0 ) { error = Messages.getString( "AWSAuthTokenWizardPage.form_error_secret_id_required" ); //$NON-NLS-1$ } if( error != null ) { setErrorMessage( error ); this.authTokenWizard.setCanFinish( false ); getWizard().getContainer().updateButtons(); return false; } setErrorMessage( null ); this.authTokenWizard.setCanFinish( true ); getWizard().getContainer().updateButtons(); return true; } /** * Fetch the vo selection page to choose a VO. * * @return the {@link VoSelectionWizardPage} */ private VoSelectionWizardPage getVoSelectionPage() { IWizardPage page = getPreviousPage(); while( page != null && !( page instanceof VoSelectionWizardPage ) ) { page = page.getPreviousPage(); } return ( VoSelectionWizardPage )page; } /** * Register listeners on the form input fields so that after a first press of * the "Finish" button, any subsequent key strokes trigger validation of the * {@link Text} input widgets. */ public void registerFormListener() { this.accessIdText.addModifyListener( new ModifyListener() { public void modifyText( final ModifyEvent e ) { isValid(); } } ); this.secretIdText.addModifyListener( new ModifyListener() { public void modifyText( final ModifyEvent e ) { isValid(); } } ); } }