/**********************************************************************
 * Copyright (c) 2007, 2011 QNX Software Systems 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:
 *     QNX Software Systems - Initial API and implementation
 * Miwako Tokugawa (Intel Corporation) - bug 222817 (OptionCategoryApplicability)
**********************************************************************/
package org.eclipse.cdt.managedbuilder.internal.enablement;

import org.eclipse.cdt.managedbuilder.core.IConfiguration;
import org.eclipse.cdt.managedbuilder.core.IHoldsOptions;
import org.eclipse.cdt.managedbuilder.core.IManagedConfigElement;
import org.eclipse.cdt.managedbuilder.core.IOption;
import org.eclipse.cdt.managedbuilder.core.IOptionCategory;
import org.eclipse.cdt.managedbuilder.core.IResourceInfo;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;

/**
 * @author Doug Schaefer
 *
 */
public class HasNatureExpression implements IBooleanExpression {

	public static final String NAME = "hasNature"; //$NON-NLS-1$

	private static final String NATURE_ID = "natureId"; //$NON-NLS-1$

	private String natureId;

	public HasNatureExpression(IManagedConfigElement element) {
		natureId = element.getAttribute(NATURE_ID);
	}

	@Override
	public boolean evaluate(IResourceInfo rcInfo, IHoldsOptions holder, IOption option) {
		return evaluate(rcInfo);
	}

	@Override
	public boolean evaluate(IResourceInfo rcInfo, IHoldsOptions holder, IOptionCategory category) {
		return evaluate(rcInfo);
	}

	private boolean evaluate(IResourceInfo rcInfo) {
		// All null checks returns false to keep this expression
		// from accidentally turning things on. Although
		// a 'z' value would be better to avoid having any affect.
		if (natureId == null || natureId.length() == 0)
			return false;

		IConfiguration config = rcInfo.getParent();
		if (config == null)
			return false;

		IResource resource = config.getOwner();
		if (resource == null)
			return false;

		IProject project = resource.getProject();
		try {
			if (project.isAccessible())
				return project.hasNature(natureId);
		} catch (CoreException e) {
			// Project close concurrently => Nature not available.
		}
		return false;
	}
}
