package eu.dnetlib.enabling.ui.server;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Required;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

import eu.dnetlib.enabling.ui.common.services.AuthenticationService;
import eu.dnetlib.enabling.ui.server.auth.AuthenticationManager;
import eu.dnetlib.enabling.ui.server.auth.ExtendedPrincipal;
import eu.dnetlib.enabling.ui.server.auth.Principal;
import eu.dnetlib.enabling.ui.server.session.SessionManager;

/**
 * Authentication servlet allows to authenticate users.
 * 
 * @author michele
 * 
 */
public class AuthenticationServlet extends RemoteServiceServlet implements AuthenticationService {

	/**
	 * serializable.
	 */
	private static final long serialVersionUID = -418938619363750821L;

	/**
	 * logger.
	 */
	private static final Log log = LogFactory.getLog(AuthenticationServlet.class); // NOPMD by marko on 11/24/08 5:02 PM

	/**
	 * session manager.
	 */
	private SessionManager sessionManager;

	/**
	 * authentication manager.
	 */
	private AuthenticationManager authManager;

	/**
	 * {@inheritDoc}
	 * 
	 * @see eu.dnetlib.enabling.ui.common.services.AuthenticationService#authenticate(java.lang.String,
	 *      java.lang.String)
	 */
	@Override
	public String authenticate(final String login, final String password) {
		log.debug("searching user " + login);
		final Principal principal = authManager.authenticate(login, password);
		if (principal != null) {
			if (authManager.authorize(principal))
				return sessionManager.newSession(principal);
		}
		return "";
	}

	/**
	 * {@inheritDoc}
	 * 
	 * @see eu.dnetlib.enabling.ui.common.services.AuthenticationService#authorize(java.lang.String)
	 */
	@Override
	public boolean authorize(final String session) {
		return authManager.authorize(sessionManager.getPrincipal(session));
	}

	@Override
	public String getAuthenticationProperty(String session, String property) {
		Principal princ = this.sessionManager.getPrincipal(session);
		if (princ instanceof ExtendedPrincipal) {
			ExtendedPrincipal p = (ExtendedPrincipal) princ;
			return p.getProperties().get(property);
		} else
			return "";
	}

	public SessionManager getSessionManager() {
		return sessionManager;
	}

	@Required
	public void setSessionManager(final SessionManager sessionManager) {
		this.sessionManager = sessionManager;
	}

	public AuthenticationManager getAuthManager() {
		return authManager;
	}

	@Required
	public void setAuthManager(final AuthenticationManager authManager) {
		this.authManager = authManager;
	}

}
