/*******************************************************************************
 * Copyright (c) 2010 Oracle.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Apache License v2.0 which accompanies this distribution. 
 * The Eclipse Public License is available at
 *     http://www.eclipse.org/legal/epl-v10.html
 * and the Apache License v2.0 is available at 
 *     http://www.opensource.org/licenses/apache2.0.php.
 * You may elect to redistribute this code under either of these licenses.
 *
 * Contributors:
 *     Bob Nettleton (Oracle) - Initial Reference Implementation
 ******************************************************************************/  

package org.eclipse.gemini.naming;

import java.security.PrivilegedExceptionAction;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.naming.Context;
import javax.naming.Name;
import javax.naming.directory.Attributes;


/**
 * Decorator for the CloseableProviderAdmin that can handle invoking methods on the 
 * underlying JNDIProviderAdmin implementation in a doPrivileged() Action.
 *
 * 
 * @version $Revision$
 */
class SecurityAwareProviderAdminImpl implements CloseableProviderAdmin {

	private static final Logger logger = 
		Logger.getLogger(SecurityAwareProviderAdminImpl.class.getName());
	
	private final CloseableProviderAdmin m_closeableProviderAdmin;
	
	public SecurityAwareProviderAdminImpl(CloseableProviderAdmin closeableProviderAdmin) {
		m_closeableProviderAdmin = closeableProviderAdmin;
	}
		
	public Object getObjectInstance(Object refInfo, Name name, Context context, Map environment) throws Exception {
		PrivilegedExceptionAction action = 
			new GetObjectInstanceAction(refInfo, name, context, environment);
		return invokePrivilegedAction(action);
	}

	public Object getObjectInstance(Object refInfo, Name name, Context context, Map environment, Attributes attributes) throws Exception {
		PrivilegedExceptionAction action = 
			new GetObjectInstanceActionWithAttributes(refInfo, name, context, environment, attributes);
		return invokePrivilegedAction(action);
	}
	
	public void close() {
		try {
			SecurityUtils.invokePrivilegedActionNoReturn(new CloseAction());
		}
		catch (Exception exception) {
			logger.log(Level.FINE, 
					   "Exception occurred while trying to close this JNDIProviderAdmin implementation",
					   exception);
		}
	}
	
	private static Object invokePrivilegedAction(final PrivilegedExceptionAction action) throws Exception {
		return SecurityUtils.invokePrivilegedAction(action);
	}
	
	
	private class GetObjectInstanceAction implements PrivilegedExceptionAction {
		protected final Object m_refInfo;
		protected final Name m_name;
		protected final Context m_context;
		protected final Map m_environment;
		
		GetObjectInstanceAction(Object refInfo, Name name, Context context, Map environment) {
			m_refInfo = refInfo;
			m_name = name;
			m_context = context;
			m_environment = environment;
		}
		
		public Object run() throws Exception {
			return m_closeableProviderAdmin.getObjectInstance(m_refInfo, 
					                                     m_name, 
					                                     m_context, 
					                                     m_environment);
		}
		
	}
	
	private class GetObjectInstanceActionWithAttributes extends GetObjectInstanceAction {
		private final Attributes m_attributes;
		
		GetObjectInstanceActionWithAttributes(Object refInfo, Name name, Context context, Map environment, Attributes attributes) {
			super(refInfo, name, context, environment);
			m_attributes = attributes;
		}
		
		
		public Object run() throws Exception {
			return m_closeableProviderAdmin.getObjectInstance(m_refInfo, 
					                                     m_name, 
					                                     m_context, 
					                                     m_environment, 
					                                     m_attributes);
		}
		
	}
	
	
	private class CloseAction implements PrivilegedExceptionAction {
		public Object run() throws Exception {
			m_closeableProviderAdmin.close();
			return null;
		}
		
	}
}
