IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Eclipse Platform Discussion :

[Equinox / DS] Problème avec SplashHandler


Sujet :

Eclipse Platform

  1. #1
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut [Equinox / DS] Problème avec SplashHandler
    Bonjour,

    Lors du lancement de mon appli, un SplashScreen demande au user de s'authentifier. J'utilise DS pour injecter le service permettant l'identification.
    J'utilise le splashScreen de PDE et son InteractiveSplashHandler.

    Mon bug: j'ai le droit à un jolie NullPointerException lorsque le user s'authentifie. J'ai identifié le problème sauf que je n'arrive pas à le résoudre

    Mon Handler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
     
    public class InteractiveSplashHandler extends AbstractSplashHandler {
     
    	private final static int F_LABEL_HORIZONTAL_INDENT = 175;
     
    	private final static int F_BUTTON_WIDTH_HINT = 80;
     
    	private final static int F_TEXT_WIDTH_HINT = 175;
     
    	private final static int F_COLUMN_COUNT = 3;
     
    	private Composite fCompositeLogin;
     
    	private Text fTextUsername;
     
    	private Text fTextPassword;
     
    	private Button fButtonOK;
     
    	private Button fButtonCancel;
     
    	private boolean fAuthenticated;
     
    	private IUserService userService;
    	private User user ;
     
     
    	/**
             * 
             */
    	public InteractiveSplashHandler() {
    		System.out.println("Consructor");
    		fCompositeLogin = null;
    		fTextUsername = null;
    		fTextPassword = null;
    		fButtonOK = null;
    		fButtonCancel = null;
    		fAuthenticated = false;
    	}
     
    	/*
    	 * (non-Javadoc)
    	 * 
    	 * @see org.eclipse.ui.splash.AbstractSplashHandler#init(org.eclipse.swt.widgets.Shell)
    	 */
    	public void init(final Shell splash) {
    		// Store the shell
    		super.init(splash);
    		// Configure the shell layout
    		configureUISplash();
    		// Create UI
    		createUI();		
    		// Create UI listeners
    		createUIListeners();
    		// Force the splash screen to layout
    		splash.layout(true);
    		// Keep the splash screen visible and prevent the RCP application from 
    		// loading until the close button is clicked.
    		doEventLoop();
     
    	}
     
    	/**
             * 
             */
    	private void doEventLoop() {
    		Shell splash = getSplash();
    		while (fAuthenticated == false) {
    			if (splash.getDisplay().readAndDispatch() == false) {
    				splash.getDisplay().sleep();
    			}
    		}
    	}
     
    	/**
             * 
             */
    	private void createUIListeners() {
    		// Create the OK button listeners
    		createUIListenersButtonOK();
    		// Create the cancel button listeners
    		createUIListenersButtonCancel();
    	}
     
    	/**
             * 
             */
    	private void createUIListenersButtonCancel() {
    		fButtonCancel.addSelectionListener(new SelectionAdapter() {
    			public void widgetSelected(SelectionEvent e) {
    				handleButtonCancelWidgetSelected();
    			}
    		});		
    	}
     
    	/**
             * 
             */
    	private void handleButtonCancelWidgetSelected() {
    		// Abort the loading of the RCP application
    		getSplash().getDisplay().close();
    		System.exit(0);		
    	}
     
    	/**
             * 
             */
    	private void createUIListenersButtonOK() {
    		fButtonOK.addSelectionListener(new SelectionAdapter() {
    			public void widgetSelected(SelectionEvent e) {
    				handleButtonOKWidgetSelected();
    			}
    		});				
    	}
     
    	/**
             * 
             */
    	private void handleButtonOKWidgetSelected() {
    		String username = fTextUsername.getText();
    		String password = fTextPassword.getText();
     
     
    		System.out.println("handleButtonOKWidgetSelected userservice= "+userService);
    		this.user = userService.findUser(1);
     
     
    		if((username.equals(user.getLogin()) ) &&
    				(password.equals(user.getPassword()) )) {
    			fAuthenticated = true;
    		} else {
    			MessageDialog.openError(
    					getSplash(),
    					"Authentication Failed",  //$NON-NLS-1$
    					"A username and password must be specified to login.");  //$NON-NLS-1$
    		}
    	}
     
    /////////////// Création de l'interface graphique
     
     
     
    	// Method will be used by DS to set the user Service
    	public synchronized void setService(IUserService userService) {
    		System.out.println("User Service was set in UI.");
    		this.userService = userService;
    		System.out.println("setService userservice= "+userService);
    	}
     
    	// Method will be used by DS to unset the user Service
    	public synchronized void unsetService(IUserService userService) {
    		System.out.println("User Service was unset in UI.");
    		if (this.userService == userService) {
    			this.userService = null;
    		}
    	}
     
     
    }

    Quelque trace dans la console :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Consructor
    User Service was set in UI.
    setService userservice= org.pegase.services.impl.UserServiceImpl@5c74cb02
    Consructor
    handleButtonOKWidgetSelected userservice= null
    user writing= admin
    user bdd= admin
    password writing= admin
    password bdd= admin
    Comme vous pouvez le constater avec la trace dans le constructeur, le handler est appelé 2 fois.
    Lors de la première instance, le service est bien injecté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setService userservice= org.pegase.services.impl.UserServiceImpl@5c74cb02
    Ensuite, le handler est instancié une seconde fois.
    Lorsque le user clique sur OK, la trace dans la méthode handleButtonOKWidgetSelected nous permet de voir que le service est null
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    handleButtonOKWidgetSelected userservice= null
    le component.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?xml version="1.0" encoding="UTF-8"?>
    <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.pegase.ui">
       <implementation class="org.pegase.ui.splashHandlers.InteractiveSplashHandler"/>
       <reference bind="setService" cardinality="1..1" interface="org.pegase.services.IUserService" name="IUserService" policy="static" unbind="unsetService"/>
    </scr:component>
    Avez-vous une idée pour éviter d'instancier le Handler deux fois et donc éviter ce NullPointerException ?

    D'avance merci

  2. #2
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Bonjour,

    J'ai un élément de réponse.

    To allow Declarative Services (DS) work, you have to ask DS to instantiate an object for you. During this process, DS injects all necessary services in this newly created object.

    However, a view object was created by RCP application launcher outside DS. What I ended up with were a view object created by RCP application launcher, and another lonely view object created by DS with SimpleService injected but not used in my RCP application launche
    Je ne voulais pas utiliser Spring DM afin d'éviter d'allourdir en technologies/packages mon appli mais je vais changer d'avis

    @++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo