package org.eclipse.core.runtime.model;

/*
 * (c) Copyright IBM Corp. 2000, 2001.
 * All Rights Reserved.
 */

import org.eclipse.core.runtime.*;
import org.eclipse.core.internal.runtime.InternalPlatform;
import org.eclipse.core.runtime.model.*;
import org.eclipse.core.internal.plugins.RegistryResolver;

/**
 * An object which can create plug-in related model objects (typically when
 * parsing plug-in manifest files).
 * <p>
 * This class may be instantiated, or further subclassed.
 * </p>
 */

public class Factory {
	private MultiStatus status;
/**
 * Creates a factory which can be used to create plug-in model objects.
 * Errors and warnings during parsing etc. can be logged to the given 
 * status via the <code>error</code> method.
 *
 * @param status the status to which errors should be logged
 */
public Factory(MultiStatus status) {
	super();
	this.status = status;
}

/**
 * Returns a new component model which is not initialized.
 *
 * @return a new component model
 */
public ComponentModel createComponentModel() {
	return new ComponentModel();
}

/**
 * Returns a new configuration model which is not initialized.
 *
 * @return a new configuration model
 */
public ConfigurationModel createConfiguration() {
	return new ConfigurationModel();
}

/**
 * Returns a new configuration element model which is not initialized.
 *
 * @return a new configuration element model
 */
public ConfigurationElementModel createConfigurationElement() {
	return new ConfigurationElementModel();
}
/**
 * Returns a new configuration property model which is not initialized.
 *
 * @return a new configuration property model
 */
public ConfigurationPropertyModel createConfigurationProperty() {
	return new ConfigurationPropertyModel();
}
/**
 * Returns a new extension model which is not initialized.
 *
 * @return a new extension model
 */
public ExtensionModel createExtension() {
	return new ExtensionModel();
}
/**
 * Returns a new extension point model which is not initialized.
 *
 * @return a new extension point model
 */
public ExtensionPointModel createExtensionPoint() {
	return new ExtensionPointModel();
}
/**
 * Returns a new library model which is initialized to not export any
 * of its code.
 *
 * @return a new library model
 */
public LibraryModel createLibrary() {
	return new LibraryModel();
}
/**
 * Returns a new plug-in descriptor model which is not initialized.
 *
 * @return a new plug-in descriptor model
 */
public PluginDescriptorModel createPluginDescriptor() {
	return new PluginDescriptorModel();
}
/**
 * Returns a new plug-in fragment model which is not initialized.
 *
 * @return a new plug-in fragment model
 */
public PluginFragmentModel createPluginFragment() {
	return new PluginFragmentModel();
}
/**
 * Returns a new plug-in prerequisite model which is initialized to
 * not export its code and to not require an exact match.
 *
 * @return a new plug-in prerequisite model
 */
public PluginPrerequisiteModel createPluginPrerequisite() {
	return new PluginPrerequisiteModel();
}
/**
 * Returns a new plug-in registry model with an empty plug-in table.
 *
 * @return a new plug-in registry model
 */
public PluginRegistryModel createPluginRegistry() {
	return new PluginRegistryModel();
}

/**
 * Returns a new URL model which is not initialized.
 *
 * @return a new URL model
 */
public URLModel createURL() {
	return new URLModel();
}

/**
 * Handles an error state specified by the status.  The collection of all logged status
 * objects can be accessed using <code>getStatus()</code>.
 *
 * @param error a status detailing the error condition
 */
public void error(IStatus error) {
	status.add(error);
	if (InternalPlatform.DEBUG && InternalPlatform.DEBUG_PLUGINS)
		System.out.println(error.toString());
}
/**
 * Returns all of the status objects logged thus far by this factory.
 *
 * @return a multi-status containing all of the logged status objects
 */
public MultiStatus getStatus() {
	return status;
}
}
