package org.jbpm.ui.orgfunctions;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import javax.security.auth.Subject;
import org.ietf.jgss.GSSContext;
import org.ietf.jgss.GSSCredential;
import org.ietf.jgss.GSSManager;
import org.ietf.jgss.GSSName;
import org.ietf.jgss.Oid;
import org.jbpm.ui.sync.RunaWFESyncResources;
import org.jbpm.ui.sync.RunaWFESyncSettingsPage;
import org.jbpm.ui.sync.SyncResources;
import org.jbpm.ui.sync.SyncSettingsWizardPage;
import ru.runa.af.Executor;
import ru.runa.af.Group;
import ru.runa.af.presentation.AFProfileStrategy;
import ru.runa.af.service.impl.interfaces.AuthenticationService;
import ru.runa.af.service.impl.interfaces.AuthenticationServiceHome;
import ru.runa.af.service.impl.interfaces.ExecutorService;
import ru.runa.af.service.impl.interfaces.ExecutorServiceHome;
import ru.runa.af.service.impl.interfaces.Service;
import ru.runa.af.service.impl.interfaces.ServiceHome;
public class RunaWFEExecutorsImporter extends ExecutorsImporter {
private InitialContext remoteContext;
private Subject subject;
private static RunaWFEExecutorsImporter instance;
private RunaWFEExecutorsImporter() {
super(RunaWFESyncResources.INSTANCE);
}
public static synchronized RunaWFEExecutorsImporter getInstance() {
if (instance == null) {
instance = new RunaWFEExecutorsImporter();
}
return instance;
}
@Override
public RunaWFESyncResources getResources() {
return (RunaWFESyncResources) super.getResources();
}
@Override
public void connect() throws Exception {
Hashtable<String, String> environment = new Hashtable<String, String>();
environment.put(Context.INITIAL_CONTEXT_FACTORY, getResources().getInitialCtxFactory());
environment.put(Context.URL_PKG_PREFIXES, getResources().getUrlPkgPrefixes());
environment.put(Context.PROVIDER_URL, getResources().getProviderUrl());
remoteContext = new InitialContext(environment);
AuthenticationService service = getService(AuthenticationServiceHome.JNDI_NAME, AuthenticationServiceHome.class);
if (SyncResources.LOGIN_MODE_LOGIN_PASSWORD.equals(getResources().getLoginMode())) {
subject = service.authenticate(getResources().getLogin(), getResources().getPassword());
} else {
GSSManager manager = GSSManager.getInstance();
GSSCredential clientCred = manager.createCredential(GSSCredential.INITIATE_ONLY);
GSSName peerName = manager.createName("WFServer", null);
GSSContext context = manager.createContext(peerName, (Oid) null, clientCred, GSSContext.DEFAULT_LIFETIME);
context.requestMutualAuth(false);
byte[] token = new byte[0];
token = context.initSecContext(token, 0, token.length);
subject = service.authenticate(token);
}
}
@Override
protected void loadRemoteData() throws Exception {
ExecutorService executorService = getService(ExecutorServiceHome.JNDI_NAME, ExecutorServiceHome.class);
Executor[] loaded = executorService.getAll(subject, AFProfileStrategy.EXECUTOR_DEAFAULT_BATCH_PRESENTATOIN_FACTORY.getDefaultBatchPresentation());
for (Executor executor : loaded) {
executors.put(executor.getName(), executor instanceof Group);
}
}
private <T extends Service> T getService(String jndiName, Class<? extends ServiceHome> homeClass) throws Exception {
Object homeRef = remoteContext.lookup(jndiName);
ServiceHome home = (ServiceHome) PortableRemoteObject.narrow(homeRef, homeClass);
Service service = (Service) home.getClass().getMethod("create", new Class[0]).invoke(home, new Object[0]);
return (T) service;
}
@Override
public SyncSettingsWizardPage createConnectionSettingsWizardPage() {
return new RunaWFESyncSettingsPage();
}
}