Troublesome codes about authentication


LoginWindow.java

package com.example.smsapp;

import com.vaadin.terminal.ExternalResource;
import com.vaadin.ui.Window;
import com.vaadin.ui.Button;
import com.vaadin.ui.TextField;
import com.vaadin.ui.Label;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Button.ClickEvent;;

public class LoginWindow extends Window
{
private Button btnLogin = new Button(“Login”);
private TextField login = new TextField ( “Uername”);
private TextField password = new TextField ( “Password”);

SmsappApplication smsapp=new SmsappApplication();

public LoginWindow ()
{
    super("Authentication Required !");
    setName ( "login" );
    initUI();
}

private void initUI ()
{
    password.setSecret ( true );

    addComponent ( new Label ("Please login in order to use the application") );
    addComponent ( new Label () );
    addComponent ( login );
    addComponent ( password );
    addComponent ( btnLogin );
    btnLogin.addListener ( new Button.ClickListener()
    {
        public void buttonClick ( Button.ClickEvent event )
        {
            try
            {
            	
                (smsapp.getInstance()).authenticate((String)login.getValue (), (String)password.getValue ());
                open ( new ExternalResource((smsapp.getInstance()).getURL()));
            }
            catch ( Exception e )
            {
                showNotification ( e.toString ());
            }
        }
    });

}

}


SmsappApplication.java

package com.example.smsapp;

import com.vaadin.Application;
import com.vaadin.service.ApplicationContext;
import com.vaadin.ui.*;

public class SmsappApplication extends Application implements ApplicationContext.TransactionListener{
private static ThreadLocal currentApplication =new ThreadLocal ();

@Override
 public void init ()
{
 setMainWindow (new LoginWindow());
 }

 public void transactionStart ( Application application, Object o )
    {
        if ( application == SmsappApplication.this )
        {
            currentApplication.set ( this );
        }
    }

    public void transactionEnd ( Application application, Object o )
    {
        if ( application == SmsappApplication.this )
        {
            currentApplication.set ( null );
            currentApplication.remove ();
        }
    }
    public  SmsappApplication getInstance()
    {
        return currentApplication.get();
    }
    
    public   void authenticate( String login, String password) throws Exception
    {
        if ( !"user".equals ( login ) && !password.equals ( "qwerty" ))
        {
            throw new Exception ("Login failed !");
            
        }
        
        loadProtectedResources();
        
    }
    private  void loadProtectedResources ()
    {
        setMainWindow (new LoginWindow());
    }

}

when I ran it in my eclipse ,problem came:NULLPOINTEREXCEPTION.I have tried lots of ways,but failed.
I don’t know what’s wrong.

Hi,

The problem is that your application doesn’t listen transaction events and that’s why getInstance() returns always null. So add to init() the following lines:

currentApplication.set(this);
if (getContext() != null) {
	getContext().addTransactionListener(this);
}

-Henri

Henri,thank you.But a new problem came,it didn’t reach the aim of authentication.Following are my latest codes:

SmsappApplication.java


package com.example.smsapp;

import com.vaadin.Application;
import com.vaadin.service.ApplicationContext.TransactionListener;
import com.vaadin.ui.*;

public class SmsappApplication extends Application {
private static ThreadLocal currentApplication =new ThreadLocal ();

@Override
 public void init ()
{
currentApplication.set(this);

if(getContext()!=null)
 {
	getContext().addTransactionListener(new TransactionListener()
	{
		public void transactionStart ( Application application, Object o )
	    {
	        if ( application == SmsappApplication.this )
	        {
	            currentApplication.set ( SmsappApplication.this );
	        }
	    }
		
		public void transactionEnd ( Application application, Object o )
	    {
	        if ( application == SmsappApplication.this )
	        {
	            currentApplication.set ( null );
	            currentApplication.remove ();
	        }
	    }
	});
 }

 setMainWindow (new LoginWindow());
 }

public  SmsappApplication getInstance()
    {
        return currentApplication.get();
    }
    
public   void authenticate( String login, String password) throws Exception
    {
        if ( !"user".equals ( login ) && !password.equals ( "qwerty" ))
        {
            throw new Exception ("Login failed !");
            
        }
        
        loadProtectedResources();
        
    }
 private  void loadProtectedResources ()
    {
        setMainWindow (new LoginWindow());
    }

}