/*******************************************************************************
 *  Copyright (c) 2006, 2015 IBM Corporation and others.
 *
 *  This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License 2.0
 *  which accompanies this distribution, and is available at
 *  https://www.eclipse.org/legal/epl-2.0/
 *
 *  SPDX-License-Identifier: EPL-2.0
 *
 *  Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.internal.launching.environments;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.jdt.core.IAccessRule;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.internal.launching.LaunchingPlugin;
import org.eclipse.jdt.launching.IVMInstall;
import org.eclipse.jdt.launching.LibraryLocation;
import org.eclipse.jdt.launching.environments.IAccessRuleParticipant;
import org.eclipse.jdt.launching.environments.IExecutionEnvironment;

/**
 * Proxy to an access rule participant for an execution environment.
 *
 * @since 3.3
 */
class AccessRuleParticipant implements IAccessRuleParticipant {

	private IConfigurationElement fElement;

	private IAccessRuleParticipant fDelegate;

	/**
	 * Constructs a proxy to a rule participant contributed with the
	 * given configuration element. The element may be an
	 * <code>executionEnvironment</code> element or a <code>ruleParticipant</code>
	 * extension.
	 *
	 * @param element the configuration element
	 */
	AccessRuleParticipant(IConfigurationElement element) {
		fElement = element;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jdt.launching.environments.IAccessRuleParticipant#getAccessRules(org.eclipse.jdt.launching.environments.IExecutionEnvironment, org.eclipse.jdt.launching.IVMInstall, org.eclipse.jdt.launching.LibraryLocation[], org.eclipse.jdt.core.IJavaProject)
	 */
	@Override
	public IAccessRule[][] getAccessRules(IExecutionEnvironment environment, IVMInstall vm, LibraryLocation[] libraries, IJavaProject project) {
		try {
			return getDelegate().getAccessRules(environment, vm, libraries, project);
		} catch (CoreException e) {
			LaunchingPlugin.log(e.getStatus());
		}
		IAccessRule[][] rules = new IAccessRule[libraries.length][];
		for (int i = 0; i < rules.length; i++) {
			rules[i] = new IAccessRule[0];
		}
		return rules;
	}

	private IAccessRuleParticipant getDelegate() throws CoreException {
		if (fDelegate == null) {
			if (fElement.getName().equals(EnvironmentsManager.ENVIRONMENT_ELEMENT)) {
				fDelegate = (IAccessRuleParticipant) fElement.createExecutableExtension(EnvironmentsManager.RULE_PARTICIPANT_ELEMENT);
			} else {
				fDelegate = (IAccessRuleParticipant) fElement.createExecutableExtension("class"); //$NON-NLS-1$
			}
		}
		return fDelegate;
	}

	/**
	 * Returns the id of this participant.
	 *
	 * @return participant id
	 */
	String getId() {
		if (fElement.getName().equals(EnvironmentsManager.ENVIRONMENT_ELEMENT)) {
			return fElement.getAttribute(EnvironmentsManager.RULE_PARTICIPANT_ELEMENT);
		}
		return fElement.getAttribute("id"); //$NON-NLS-1$
	}

	private String getDelegateClassName() {
		if (fElement.getName().equals(EnvironmentsManager.ENVIRONMENT_ELEMENT)) {
			return fElement.getAttribute(EnvironmentsManager.RULE_PARTICIPANT_ELEMENT);
		}
		return fElement.getAttribute("class"); //$NON-NLS-1$
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (obj instanceof AccessRuleParticipant) {
			AccessRuleParticipant participant = (AccessRuleParticipant) obj;
			return participant.getDelegateClassName().equals(getDelegateClassName());
		}
		return false;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		return getDelegateClassName().hashCode();
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return getDelegateClassName();
	}
}
