JBoss LoginContext SwingWorker

0

W aplikacji desktopowej, próbuje wykorzystać SwingWorker, aby pobierać dane (EJB) od JBossa, ale o ile działało mi wszystko ładnie pod Ubuntu to już pod Win XP rzuca EJBAccessException: Caller unauthorized, a co jeszcze dziwniejsze pod Win 7 wyjątek ten rzuca mi raz na 10 połączeń. Poradźcie coś bo już mi ręce opadają.

W wielkim uproszczeniu mam taką konstrukcję:

LoginDialog.java:

//...
private void login() {
 Session session = new Session(username, password); //login i hasło z TextField
 Client.getInstance.setSession(session);
 //kod jest uproszczony w praktyce obsługuję w ten sposób pasek postępu
 SwingWorker<Manager, Integer> worker = new SwingWorker<Manager, Integer>() {
  protected Manager doInBackground() throws Exception {
   //tutaj rzuca wspomniany wyjątek czyli rozumiem że wątek nie ma dostępu do LoginContextu?
   return Client.getInstance().getSession().getManager();
  }
 };
 worker.execute();
 Manager manager = managerWorker.get();
 //jak pominę SwingWorkera to działa poprawnie
}
//...

Session.java:

public class Session {

 private LoginContext lc;
 private Context ic;

 public Session(String username, String password) {
  System.setProperty( "java.security.manager", "" );
  System.setProperty( "java.security.policy", Session.class.getResource( "/client.policy" ).toString() );
  System.setProperty( "java.security.auth.login.config", Session.class.getResource( "/auth.conf" ).toString() );

  AuthCallbackHandler handler = new AuthCallbackHandler(username, password.toCharArray());
  lc = new LoginContext("company", handler);
  lc.login();

  Properties p = new Properties();
  p.put(Context.INITIAL_CONTEXT_FACTORY, System.getProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"));
  p.put(Context.PROVIDER_URL, System.getProperty(Context.PROVIDER_URL, "jnp://localhost:1099"));
  p.put(Context.URL_PKG_PREFIXES, System.getProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces"));
  ic = new InitialContext(p);
 }

 public Manager getManager() throws RemoteException {
  try {
   ManagerBeanRemote managerBean = (ManagerBeanRemote) ic.lookup("Company/ManagerBean/remote");
   return managerBean.getManager();
  } catch (NamingException ex) {
   throw new RemoteException(ex.getMessage(), ex);
  }
 }
}

Client.java:
przechowuje session aby był do niej dostęp statycznie z każdej klasy

client.policy:

grant {
    permission java.security.AllPermission;
};

auth.conf:

company {
    org.jboss.security.ClientLoginModule required;
};
0

Po zastąpieniu SwingWorkera zwykłym nowym wątkiem działa to wszędzie poprawnie czyli:

private void login() {
 //...
 Session session = new Session(username, password);
 Client.getInstance.setSession(session);
 new Thread() {
  private Manager manager;
  //get/setManager(...
  public void run() {
   setManager(Client.getInstance().getSession().getManager());
   SwingUtilities.invokeLater(new Runnable() {
    public void run() {
     Manager m = getManager();
     //...
    }
   }
  }
 }.start();
 //...
}

Jednak testowałem SwingWorkera na różnych komputerach (wersja javy zbliżona 1.6) z Win XP i na jednych działa a na innych rzuca wspomniany wcześniej wyjątek. Da się coś skonfigurować aby zaczęło to działać wszędzie?

1 użytkowników online, w tym zalogowanych: 0, gości: 1