/*******************************************************************************
 * Copyright (c) 2007, 2010 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.pde.api.tools.internal.model;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.pde.api.tools.internal.provisional.ApiPlugin;
import org.eclipse.pde.api.tools.internal.provisional.Factory;
import org.eclipse.pde.api.tools.internal.provisional.IApiDescription;
import org.eclipse.pde.api.tools.internal.provisional.IApiFilterStore;
import org.eclipse.pde.api.tools.internal.provisional.descriptors.IElementDescriptor;
import org.eclipse.pde.api.tools.internal.provisional.model.ApiTypeContainerVisitor;
import org.eclipse.pde.api.tools.internal.provisional.model.IApiBaseline;
import org.eclipse.pde.api.tools.internal.provisional.model.IApiComponent;
import org.eclipse.pde.api.tools.internal.provisional.model.IApiElement;
import org.eclipse.pde.api.tools.internal.provisional.model.IApiTypeContainer;
import org.eclipse.pde.api.tools.internal.search.IReferenceCollection;
import org.eclipse.pde.api.tools.internal.search.UseScanReferences;

/**
 * Common implementation of an API component as a composite class file
 * container.
 *
 * @since 1.0.0
 */
public abstract class Component extends AbstractApiTypeContainer implements IApiComponent {
	/**
	 * API description
	 */
	private volatile IApiDescription fApiDescription;

	/**
	 * API Filter store
	 */
	private volatile IApiFilterStore fFilterStore;

	/**
	 * References in API use scan reports
	 */
	private volatile IReferenceCollection fReferences;

	private volatile boolean disposed;

	/**
	 * Constructs an API component in the given {@link IApiBaseline}.
	 *
	 * @param baseline the parent {@link IApiBaseline}
	 */
	public Component(IApiBaseline baseline) {
		super(baseline, IApiElement.COMPONENT, null);
	}

	@Override
	public void accept(ApiTypeContainerVisitor visitor) throws CoreException {
		if (visitor.visit(this)) {
			super.accept(visitor);
		}
		visitor.end(this);
	}

	@Override
	public IApiComponent getHost() throws CoreException {
		return null;
	}

	@Override
	public IApiBaseline getBaseline() {
		return (IApiBaseline) getAncestor(IApiElement.BASELINE);
	}

	@Override
	public void dispose() {
		try {
			close();
		} catch (CoreException e) {
			ApiPlugin.log(e);
		} finally {
			synchronized (this) {
				fApiDescription = null;
				disposed = true;
			}
		}
	}

	@Override
	public IApiComponent getApiComponent() {
		return this;
	}

	@Override
	public IApiDescription getApiDescription() throws CoreException {
		if (fApiDescription != null) {
			return fApiDescription;
		}
		synchronized (this) {
			fApiDescription = createApiDescription();
		}
		return fApiDescription;
	}

	/**
	 * Returns whether this component has created an API description.
	 *
	 * @return whether this component has created an API description
	 */
	protected boolean isApiDescriptionInitialized() {
		return fApiDescription != null;
	}

	/**
	 * Returns if this component has created an API filter store
	 *
	 * @return true if a store has been created, false other wise
	 */
	protected boolean hasApiFilterStore() {
		return fFilterStore != null;
	}

	@Override
	public IApiTypeContainer[] getApiTypeContainers() throws CoreException {
		return super.getApiTypeContainers();
	}

	@Override
	public IApiTypeContainer[] getApiTypeContainers(String id) throws CoreException {
		if (this.hasFragments()) {
			return super.getApiTypeContainers(id);
		} else {
			return super.getApiTypeContainers();
		}
	}

	/**
	 * Creates and returns the API description for this component.
	 *
	 * @return newly created API description for this component
	 */
	protected abstract IApiDescription createApiDescription() throws CoreException;

	@Override
	public IApiFilterStore getFilterStore() throws CoreException {
		if (fFilterStore == null) {
			synchronized (this) {
				if (fFilterStore == null) {
					fFilterStore = createApiFilterStore();
				}
			}
		}
		return fFilterStore;
	}

	@Override
	public IElementDescriptor getHandle() {
		return Factory.componentDescriptor(this.getSymbolicName(), this.getVersion());
	}

	@Override
	public int getContainerType() {
		return IApiTypeContainer.COMPONENT;
	}

	/**
	 * Lazily creates a new {@link IApiFilterStore} when it is requested
	 *
	 * @return the current {@link IApiFilterStore} for this component
	 * @throws CoreException
	 */
	protected abstract IApiFilterStore createApiFilterStore() throws CoreException;

	@Override
	public IReferenceCollection getExternalDependencies() {
		if (fReferences == null) {
			synchronized (this) {
				if (fReferences == null) {
					fReferences = new UseScanReferences();
				}
			}
		}
		return fReferences;
	}

	@Override
	public boolean isDisposed() {
		return disposed;
	}
}
