package org.marketcetera.photon.internal.product;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.marketcetera.photon.core.*;
import org.marketcetera.photon.positions.ui.IPositionLabelProvider;
import org.marketcetera.photon.ui.LoginDialog;
import org.marketcetera.util.misc.ClassVersion;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
/* $License$ */
/**
* The activator class controls the plug-in life cycle.
*
* @author <a href="mailto:will@marketcetera.com">Will Horn</a>
* @version $Id: Activator.java 16604 2013-06-26 14:49:42Z colin $
* @since 1.5.0
*/
@ClassVersion("$Id: Activator.java 16604 2013-06-26 14:49:42Z colin $")
public class Activator implements BundleActivator {
/**
* {@link ICredentialsService} that pops obtains credentials from a
* {@link LoginDialog}.
*/
@ClassVersion("$Id: Activator.java 16604 2013-06-26 14:49:42Z colin $")
private static class LoginCredentialsService implements ICredentialsService {
private volatile ICredentials mCredentials;
@Override
public synchronized boolean authenticateWithCredentials(
IAuthenticationHelper helper) {
ICredentials current = mCredentials;
if (current == null) {
Display display = PlatformUI.getWorkbench().getDisplay();
while (true) {
final AtomicBoolean cancelled = new AtomicBoolean();
final AtomicReference<Credentials> credentials = new AtomicReference<Credentials>();
display.syncExec(new Runnable() {
@Override
public void run() {
IWorkbenchWindow window = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow();
Shell parent = window == null ? null : window
.getShell();
LoginDialog dialog = new LoginDialog(parent);
if (dialog.open() == Window.OK) {
credentials.set(new Credentials(dialog
.getConnectionDetails().getUserId(),
dialog.getConnectionDetails()
.getPassword()));
} else {
cancelled.set(true);
}
}
});
if (cancelled.get()) {
break;
}
if (helper.authenticate(credentials.get())) {
mCredentials = credentials.get();
return true;
}
}
return false;
} else {
return helper.authenticate(current);
}
}
@Override
public void invalidate() {
mCredentials = null;
}
}
private LoginCredentialsService mCredentialsService;
private LogoutService mLogoutService;
private SymbolResolver mSymbolResolver;
private static Activator sInstance;
@Override
public void start(BundleContext context) throws Exception {
context.registerService(IPositionLabelProvider.class.getName(),
new PhotonPositionLabelProvider(), null);
mCredentialsService = new LoginCredentialsService();
context.registerService(ICredentialsService.class.getName(),
mCredentialsService, null);
mLogoutService = new LogoutService() {
@Override
protected void doLogout() {
mCredentialsService.invalidate();
}
};
mSymbolResolver = new SymbolResolver();
context.registerService(ILogoutService.class.getName(), mLogoutService,
null);
context.registerService(ISymbolResolver.class.getName(),
mSymbolResolver,
null);
sInstance = this;
}
@Override
public void stop(BundleContext context) throws Exception {
sInstance = null;
mCredentialsService = null;
}
/**
* @return the logout service
*/
static ILogoutService getLogoutService() {
return sInstance.mLogoutService;
}
}