blob: f9afb80347739c6c5ab27cb2f3b267ae67f16495 [file] [log] [blame]
/*
* Copyright (c) 2013-2015 Eike Stepper (Berlin, Germany) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Christian W. Damus (CEA LIST) - initial API and implementation
*/
package org.eclipse.emf.cdo.spi.server;
import java.util.concurrent.Callable;
/**
* Static utility methods for binding {@link IAuthenticationProtocol authentication protocols} to the current thread.
*
* @author Christian W. Damus (CEA LIST)
* @since 4.3
*/
public final class AuthenticationUtil
{
private static final ThreadLocal<IAuthenticationProtocol> AUTHENTICATION_PROTOCOL = new ThreadLocal<IAuthenticationProtocol>();
// Not instantiable by clients.
private AuthenticationUtil()
{
}
/**
* Obtains the authentication protocol, if any, on which the current thread should
* authenticate administrative operations in handling incoming signals.
*
* @return the authentication protocol to use, or {@code null} if authentication is not required
*/
public static IAuthenticationProtocol getAuthenticationProtocol()
{
return AUTHENTICATION_PROTOCOL.get();
}
/**
* Wrap an {@code operation} to make an authentication protocol {@linkplain #getAuthenticationProtocol() available}
* to the thread that invokes it, for the duration of the {@code operation}'s execution.
*/
public static <V> Callable<V> authenticatingOperation(IAuthenticationProtocol authenticationProtocol,
final Callable<V> operation)
{
return new AuthenticatingOperation<V>(authenticationProtocol)
{
@Override
protected V doCall() throws Exception
{
return operation.call();
}
};
}
/**
* Encapsulation of an administrative operation requiring (potentially) client
* authentication to authorize the operation.
*
* @author Christian W. Damus (CEA LIST)
*
* @since 4.3
*/
public static abstract class AuthenticatingOperation<V> implements Callable<V>
{
private final IAuthenticationProtocol authenticationProtocol;
public AuthenticatingOperation(IAuthenticationProtocol authenticationProtocol)
{
this.authenticationProtocol = authenticationProtocol;
}
public final V call() throws Exception
{
V result;
try
{
AuthenticationUtil.AUTHENTICATION_PROTOCOL.set(authenticationProtocol);
result = doCall();
}
finally
{
AuthenticationUtil.AUTHENTICATION_PROTOCOL.remove();
}
return result;
}
protected abstract V doCall() throws Exception;
}
}