blob: 0a63a652b72843adfb7dbe5f99bba275735e86a6 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}