/**
 * Copyright (c) 2002-2006 IBM Corporation and others.
 * All rights reserved.   This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 * 
 * Contributors: 
 *   IBM - Initial API and implementation
 */
package org.eclipse.xsd;


import java.util.Collection;

import org.w3c.dom.Element;

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;


/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>Concrete Component</b></em>'.
 * It is the root of all concrete components.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.xsd.XSDConcreteComponent#getElement <em>Element</em>}</li>
 *   <li>{@link org.eclipse.xsd.XSDConcreteComponent#getContainer <em>Container</em>}</li>
 *   <li>{@link org.eclipse.xsd.XSDConcreteComponent#getRootContainer <em>Root Container</em>}</li>
 *   <li>{@link org.eclipse.xsd.XSDConcreteComponent#getSchema <em>Schema</em>}</li>
 *   <li>{@link org.eclipse.xsd.XSDConcreteComponent#getDiagnostics <em>Diagnostics</em>}</li>
 * </ul>
 *
 * @see org.eclipse.xsd.XSDPackage#getXSDConcreteComponent()
 * @model abstract="true"
 * @generated
 */
public interface XSDConcreteComponent extends EObject
{
  /**
   * Returns the value of the '<em><b>Element</b></em>' attribute.
   * <!-- begin-user-doc -->
   * <p>
   * This is the underlying DOM element associated with this component, 
   * i.e., the {@link #updateElement() serialization} of this component.
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>Element</em>' attribute.
   * @see #setElement(Element)
   * @see org.eclipse.xsd.XSDPackage#getXSDConcreteComponent_Element()
   * @model dataType="org.eclipse.xsd.DOMElement"
   * @generated
   */
  Element getElement();

  /**
   * Sets the value of the '{@link org.eclipse.xsd.XSDConcreteComponent#getElement <em>Element</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Element</em>' attribute.
   * @see #getElement()
   * @generated
   */
  void setElement(Element value);

  /**
   * Ensures that the underlying DOM {@link #getElement element} both exists and is up-to-date with respect to the model,
   * i.e., it serializes the component and maintains an association with that serialization.
   * @see #updateElement(boolean)
   * @see #getElement
   */
  void updateElement();

  /**
   * Ensures that the underlying DOM {@link #getElement element} both exists and is up-to-date with respect to the model,
   * i.e., it serializes the component and maintains an association with that serialization.
   * For <code>deep == true</code>, 
   * or when <code>{@link #getElement getElement()} == null</code>, 
   * this does the same thing as {@link #updateElement()};
   * otherwise, it updates just the DOM element associated with this component to reflect the current state.
   * @see #updateElement()
   * @see #getElement
   */
  void updateElement(boolean deep);

  /**
   * Returns the value of the '<em><b>Container</b></em>' reference.
   * <!-- begin-user-doc -->
   * <p>
   * This represents the concrete container of this component, 
   * i.e., the inverse of the black diamond relations in the UML model.
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>Container</em>' reference.
   * @see org.eclipse.xsd.XSDPackage#getXSDConcreteComponent_Container()
   * @model resolveProxies="false" transient="true" changeable="false" volatile="true"
   * @generated
   */
  XSDConcreteComponent getContainer();

  /**
   * Returns the value of the '<em><b>Root Container</b></em>' reference.
   * <!-- begin-user-doc -->
   * <p>
   * This walks the {@link #getContainer() containers}
   * until it hits one that has no container.
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>Root Container</em>' reference.
   * @see org.eclipse.xsd.XSDPackage#getXSDConcreteComponent_RootContainer()
   * @model resolveProxies="false" required="true" transient="true" changeable="false" volatile="true"
   * @generated
   */
  XSDConcreteComponent getRootContainer();

  /**
   * Returns the value of the '<em><b>Schema</b></em>' reference.
   * <!-- begin-user-doc -->
   * <p>
   * This walks the {@link #getContainer() containers}
   * until it reaches a schema.
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>Schema</em>' reference.
   * @see org.eclipse.xsd.XSDPackage#getXSDConcreteComponent_Schema()
   * @model resolveProxies="false" transient="true" changeable="false" volatile="true"
   * @generated
   */
  XSDSchema getSchema();

  /**
   * Returns the value of the '<em><b>Diagnostics</b></em>' containment reference list.
   * The list contents are of type {@link org.eclipse.xsd.XSDDiagnostic}.
   * <!-- begin-user-doc -->
   * <p>
   * These diagnostics are produced by {@link #validate() validation}.
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>Diagnostics</em>' containment reference list.
   * @see org.eclipse.xsd.XSDPackage#getXSDConcreteComponent_Diagnostics()
   * @model containment="true" transient="true"
   * @generated
   */
  EList<XSDDiagnostic> getDiagnostics();

  /**
   * Called to indicate that the given element has changed;
   * the element should typically be the same as the one returned {@link #getElement}.
   * It is expected that clients will not call this themselves 
   * since the DOM event listeners attached to the underlying DOM will invoke these automatically.
   */
  void elementChanged(Element changedElement);

  /**
   * Called to indicate that the given element has changed attributes;
   * the element should typically be the same as the one returned {@link #getElement}.
   * It is expected that clients will not call this themselves 
   * since the DOM event listeners attached to the underlying DOM will invoke these automatically.
   */
  void elementAttributesChanged(Element changedElement);

  /**
   * Called to indicate that the given element has changed contents;
   * the element should typically be the same as the one returned {@link #getElement}.
   * It is expected that clients will not call this themselves 
   * since the DOM event listeners attached to the underlying DOM will invoke these automatically.
   */
  void elementContentsChanged(Element changedElement);

  /**
   * Returns the resolved type definition of the given {@link org.eclipse.xsd.XSDNamedComponent#getURI() URI}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #resolveTypeDefinition(java.lang.String, java.lang.String)
   * @see #resolveTypeDefinition(java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getURI()
   * @param uri the URI to resolve.
   * @return the resolved type definition.
   */
  XSDTypeDefinition resolveTypeDefinitionURI(String uri);

  /**
   * Returns the resolved type definition of the given  
   * {@link org.eclipse.xsd.XSDNamedComponent#getTargetNamespace() namespace} and {@link org.eclipse.xsd.XSDNamedComponent#getName() name}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #resolveTypeDefinitionURI(java.lang.String)
   * @see #resolveTypeDefinition(java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getTargetNamespace()
   * @see org.eclipse.xsd.XSDNamedComponent#getName()
   * @param namespace the namespace to resolve.
   * @param localName the name to resolve.
   * @return the resolved type definition.
   */
  XSDTypeDefinition resolveTypeDefinition(String namespace, String localName);

  /**
   * Returns the resolved type definition of the given {@link org.eclipse.xsd.XSDNamedComponent#getName() name} 
   * within the {@link #getSchema() schema}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #getSchema()
   * @see org.eclipse.xsd.XSDSchema#getTargetNamespace()
   * @see #resolveTypeDefinitionURI(java.lang.String)
   * @see #resolveTypeDefinition(java.lang.String, java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getName()
   * @param localName the name to resolve.
   * @return the resolved type definition.
   */
  XSDTypeDefinition resolveTypeDefinition(String localName);
  
  /**
   * Returns the resolved simple type definition of the given {@link org.eclipse.xsd.XSDNamedComponent#getURI() URI}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #resolveSimpleTypeDefinition(java.lang.String, java.lang.String)
   * @see #resolveSimpleTypeDefinition(java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getURI()
   * @param uri the URI to resolve.
   * @return the resolved simple type definition.
   */
  XSDSimpleTypeDefinition resolveSimpleTypeDefinitionURI(String uri);

  /**
   * Returns the resolved simple type definition of the given  
   * {@link org.eclipse.xsd.XSDNamedComponent#getTargetNamespace() namespace} and {@link org.eclipse.xsd.XSDNamedComponent#getName() name}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #resolveSimpleTypeDefinitionURI(java.lang.String)
   * @see #resolveSimpleTypeDefinition(java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getTargetNamespace()
   * @see org.eclipse.xsd.XSDNamedComponent#getName()
   * @param namespace the namespace to resolve.
   * @param localName the name to resolve.
   * @return the resolved simple type definition.
   */
  XSDSimpleTypeDefinition resolveSimpleTypeDefinition(String namespace, String localName);

  /**
   * Returns the resolved simple type definition of the given {@link org.eclipse.xsd.XSDNamedComponent#getName() name} 
   * within the {@link #getSchema() schema}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #getSchema()
   * @see org.eclipse.xsd.XSDSchema#getTargetNamespace()
   * @see #resolveSimpleTypeDefinitionURI(java.lang.String)
   * @see #resolveSimpleTypeDefinition(java.lang.String, java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getName()
   * @param localName the name to resolve.
   * @return the resolved simple type definition.
   */
  XSDSimpleTypeDefinition resolveSimpleTypeDefinition(String localName);
  
  /**
   * Returns the resolved complex type definition of the given {@link org.eclipse.xsd.XSDNamedComponent#getURI() URI}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #resolveComplexTypeDefinition(java.lang.String, java.lang.String)
   * @see #resolveComplexTypeDefinition(java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getURI()
   * @param uri the URI to resolve.
   * @return the resolved complex type definition.
   */
  XSDComplexTypeDefinition resolveComplexTypeDefinitionURI(String uri);

  /**
   * Returns the resolved complex type definition of the given  
   * {@link org.eclipse.xsd.XSDNamedComponent#getTargetNamespace() namespace} and {@link org.eclipse.xsd.XSDNamedComponent#getName() name}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #resolveComplexTypeDefinitionURI(java.lang.String)
   * @see #resolveComplexTypeDefinition(java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getTargetNamespace()
   * @see org.eclipse.xsd.XSDNamedComponent#getName()
   * @param namespace the namespace to resolve.
   * @param localName the name to resolve.
   * @return the resolved complex type definition.
   */
  XSDComplexTypeDefinition resolveComplexTypeDefinition(String namespace, String localName);

  /**
   * Returns the resolved complex type definition of the given {@link org.eclipse.xsd.XSDNamedComponent#getName() name} 
   * within the {@link #getSchema() schema}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #getSchema()
   * @see org.eclipse.xsd.XSDSchema#getTargetNamespace()
   * @see #resolveComplexTypeDefinitionURI(java.lang.String)
   * @see #resolveComplexTypeDefinition(java.lang.String, java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getName()
   * @param localName the name to resolve.
   * @return the resolved complex type definition.
   */
  XSDComplexTypeDefinition resolveComplexTypeDefinition(String localName);

  /**
   * Returns the resolved attribute declaration of the given {@link org.eclipse.xsd.XSDNamedComponent#getURI() URI}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #resolveAttributeDeclaration(java.lang.String, java.lang.String)
   * @see #resolveAttributeDeclaration(java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getURI()
   * @param uri the URI to resolve.
   * @return the resolved attribute declaration.
   */
  XSDAttributeDeclaration resolveAttributeDeclarationURI(String uri);

  /**
   * Returns the resolved attribute declaration of the given  
   * {@link org.eclipse.xsd.XSDNamedComponent#getTargetNamespace() namespace} and {@link org.eclipse.xsd.XSDNamedComponent#getName() name}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #resolveAttributeDeclarationURI(java.lang.String)
   * @see #resolveAttributeDeclaration(java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getTargetNamespace()
   * @see org.eclipse.xsd.XSDNamedComponent#getName()
   * @param namespace the namespace to resolve.
   * @param localName the name to resolve.
   * @return the resolved attribute declaration.
   */
  XSDAttributeDeclaration resolveAttributeDeclaration(String namespace, String localName);

  /**
   * Returns the resolved attribute declaration of the given {@link org.eclipse.xsd.XSDNamedComponent#getName() name} 
   * within the {@link #getSchema() schema}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #getSchema()
   * @see org.eclipse.xsd.XSDSchema#getTargetNamespace()
   * @see #resolveAttributeDeclarationURI(java.lang.String)
   * @see #resolveAttributeDeclaration(java.lang.String, java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getName()
   * @param localName the name to resolve.
   * @return the resolved attribute declaration.
   */
  XSDAttributeDeclaration resolveAttributeDeclaration(String localName);

  /**
   * Returns the resolved element declaration of the given {@link org.eclipse.xsd.XSDNamedComponent#getURI() URI}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #resolveElementDeclaration(java.lang.String, java.lang.String)
   * @see #resolveElementDeclaration(java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getURI()
   * @param uri the URI to resolve.
   * @return the resolved element declaration.
   */
  XSDElementDeclaration resolveElementDeclarationURI(String uri);

  /**
   * Returns the resolved element declaration of the given  
   * {@link org.eclipse.xsd.XSDNamedComponent#getTargetNamespace() namespace} and {@link org.eclipse.xsd.XSDNamedComponent#getName() name}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #resolveElementDeclarationURI(java.lang.String)
   * @see #resolveElementDeclaration(java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getTargetNamespace()
   * @see org.eclipse.xsd.XSDNamedComponent#getName()
   * @param namespace the namespace to resolve.
   * @param localName the name to resolve.
   * @return the resolved element declaration.
   */
  XSDElementDeclaration resolveElementDeclaration(String namespace, String localName);

  /**
   * Returns the resolved element declaration of the given {@link org.eclipse.xsd.XSDNamedComponent#getName() name} 
   * within the {@link #getSchema() schema}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #getSchema()
   * @see org.eclipse.xsd.XSDSchema#getTargetNamespace()
   * @see #resolveElementDeclarationURI(java.lang.String)
   * @see #resolveElementDeclaration(java.lang.String, java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getName()
   * @param localName the name to resolve.
   * @return the resolved element declaration.
   */
  XSDElementDeclaration resolveElementDeclaration(String localName);
  
  /**
   * Returns the resolved attribute group definition of the given {@link org.eclipse.xsd.XSDNamedComponent#getURI() URI}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #resolveAttributeGroupDefinition(java.lang.String, java.lang.String)
   * @see #resolveAttributeGroupDefinition(java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getURI()
   * @param uri the URI to resolve.
   * @return the resolved attribute group definition.
   */
  XSDAttributeGroupDefinition resolveAttributeGroupDefinitionURI(String uri);

  /**
   * Returns the resolved attribute group definition the given  
   * {@link org.eclipse.xsd.XSDNamedComponent#getTargetNamespace() namespace} and {@link org.eclipse.xsd.XSDNamedComponent#getName() name}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #resolveAttributeGroupDefinitionURI(java.lang.String)
   * @see #resolveAttributeGroupDefinition(java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getTargetNamespace()
   * @see org.eclipse.xsd.XSDNamedComponent#getName()
   * @param namespace the namespace to resolve.
   * @param localName the name to resolve.
   * @return the resolved attribute group definition
   */
  XSDAttributeGroupDefinition resolveAttributeGroupDefinition(String namespace, String localName);

  /**
   * Returns the resolved attribute group definition of the given {@link org.eclipse.xsd.XSDNamedComponent#getName() name} 
   * within the {@link #getSchema() schema}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #getSchema()
   * @see org.eclipse.xsd.XSDSchema#getTargetNamespace()
   * @see #resolveAttributeGroupDefinitionURI(java.lang.String)
   * @see #resolveAttributeGroupDefinition(java.lang.String, java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getName()
   * @param localName the name to resolve.
   * @return the resolved attribute group definition.
   */
  XSDAttributeGroupDefinition resolveAttributeGroupDefinition(String localName);
  
  /**
   * Returns the resolved model group definition of the given {@link org.eclipse.xsd.XSDNamedComponent#getURI() URI}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #resolveModelGroupDefinition(java.lang.String, java.lang.String)
   * @see #resolveModelGroupDefinition(java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getURI()
   * @param uri the URI to resolve.
   * @return the resolved model group definition.
   */
  XSDModelGroupDefinition resolveModelGroupDefinitionURI(String uri);

  /**
   * Returns the resolved model group definition of the given  
   * {@link org.eclipse.xsd.XSDNamedComponent#getTargetNamespace() namespace} and {@link org.eclipse.xsd.XSDNamedComponent#getName() name}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #resolveModelGroupDefinitionURI(java.lang.String)
   * @see #resolveModelGroupDefinition(java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getTargetNamespace()
   * @see org.eclipse.xsd.XSDNamedComponent#getName()
   * @param namespace the namespace to resolve.
   * @param localName the name to resolve.
   * @return the resolved model group definition.
   */
  XSDModelGroupDefinition resolveModelGroupDefinition(String namespace, String localName);

  /**
   * Returns the resolved model group definition of the given {@link org.eclipse.xsd.XSDNamedComponent#getName() name} 
   * within the {@link #getSchema() schema}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #getSchema()
   * @see org.eclipse.xsd.XSDSchema#getTargetNamespace()
   * @see #resolveModelGroupDefinitionURI(java.lang.String)
   * @see #resolveModelGroupDefinition(java.lang.String, java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getName()
   * @param localName the name to resolve.
   * @return the resolved model group definition.
   */
  XSDModelGroupDefinition resolveModelGroupDefinition(String localName);

  /**
   * Returns the resolved identity constraint definition of the given {@link org.eclipse.xsd.XSDNamedComponent#getURI() URI}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #resolveIdentityConstraintDefinition(java.lang.String, java.lang.String)
   * @see #resolveIdentityConstraintDefinition(java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getURI()
   * @param uri the URI to resolve.
   * @return the resolved identity constraint definition.
   */
  XSDIdentityConstraintDefinition resolveIdentityConstraintDefinitionURI(String uri);

  /**
   * Returns the resolved identity constraint definition of the given  
   * {@link org.eclipse.xsd.XSDNamedComponent#getTargetNamespace() namespace} and {@link org.eclipse.xsd.XSDNamedComponent#getName() name}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #resolveIdentityConstraintDefinitionURI(java.lang.String)
   * @see #resolveIdentityConstraintDefinition(java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getTargetNamespace()
   * @see org.eclipse.xsd.XSDNamedComponent#getName()
   * @param namespace the namespace to resolve.
   * @param localName the name to resolve.
   * @return the resolved identity constraint definition.
   */
  XSDIdentityConstraintDefinition resolveIdentityConstraintDefinition(String namespace, String localName);

  /**
   * Returns the resolved identity constraint definition of the given {@link org.eclipse.xsd.XSDNamedComponent#getName() name} 
   * within the {@link #getSchema() schema}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #getSchema()
   * @see org.eclipse.xsd.XSDSchema#getTargetNamespace()
   * @see #resolveIdentityConstraintDefinitionURI(java.lang.String)
   * @see #resolveIdentityConstraintDefinition(java.lang.String, java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getName()
   * @param localName the name to resolve.
   * @return the resolved identity constraint definition.
   */
  XSDIdentityConstraintDefinition resolveIdentityConstraintDefinition(String localName);

  /**
   * Returns the resolved notation declaration of the given {@link org.eclipse.xsd.XSDNamedComponent#getURI() URI}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #resolveNotationDeclaration(java.lang.String, java.lang.String)
   * @see #resolveNotationDeclaration(java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getURI()
   * @param uri the URI to resolve.
   * @return the resolved notation declaration.
   */
  XSDNotationDeclaration resolveNotationDeclarationURI(String uri);

  /**
   * Returns the resolved notation declaration of the given  
   * {@link org.eclipse.xsd.XSDNamedComponent#getTargetNamespace() namespace} and {@link org.eclipse.xsd.XSDNamedComponent#getName() name}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #resolveNotationDeclarationURI(java.lang.String)
   * @see #resolveNotationDeclaration(java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getTargetNamespace()
   * @see org.eclipse.xsd.XSDNamedComponent#getName()
   * @param namespace the namespace to resolve.
   * @param localName the name to resolve.
   * @return the resolved notation declaration.
   */
  XSDNotationDeclaration resolveNotationDeclaration(String namespace, String localName);

  /**
   * Returns the resolved notation declaration the given {@link org.eclipse.xsd.XSDNamedComponent#getName() name} 
   * within the {@link #getSchema() schema}.
   * An unresolved instance is synthesized to hold the namespace and name if an existing instance cannot be found.
   * @see #getSchema()
   * @see org.eclipse.xsd.XSDSchema#getTargetNamespace()
   * @see #resolveNotationDeclarationURI(java.lang.String)
   * @see #resolveNotationDeclaration(java.lang.String, java.lang.String)
   * @see org.eclipse.xsd.XSDNamedComponent#getName()
   * @param localName the name to resolve.
   * @return the resolved notation declaration
   */
  XSDNotationDeclaration resolveNotationDeclaration(String localName);

  /**
   * Returns the collection of components that have an {@link org.eclipse.xsd.XSDAnnotation annotation} 
   * containing an {@link org.eclipse.xsd.XSDAnnotation#getApplicationInformation() appinfo} with given source URI.
   * @see org.eclipse.xsd.XSDAnnotation#getApplicationInformationSources()
   * @param sourceURI the source URI to match.
   * @return the collection of matching components.
   */
  Collection<XSDConcreteComponent> getComponentsWithApplicationInformation(String sourceURI);

  /**
   * Returns the collection of components that have an {@link org.eclipse.xsd.XSDAnnotation annotation} 
   * containing a {@link org.eclipse.xsd.XSDAnnotation#getUserInformation() documentation} with given source URI.
   * @see org.eclipse.xsd.XSDAnnotation#getApplicationInformationSources()
   * @param sourceURI the source URI to match.
   * @return the collection of matching components.
   */
  Collection<XSDConcreteComponent> getComponentsWithUserInformation(String sourceURI);

  /**
   * Validates whether this component conforms to the constraints defined in the XML Schema standard.
   * {@link #getDiagnostics() Diagnostics} are produced to report any problems.
   * The effect of calling this for a component not directly or indirectly contained by a {@link org.eclipse.xsd.XSDSchema schema}
   * is undefined, and is likely to result in null pointer exceptions.
   * @see #getDiagnostics()
   * @see #clearDiagnostics()
   */
  void validate();

  /**
   * Clears any {@link #getDiagnostics() diagnostics} associated with the component and all those it contains.
   * @see #validate()
   * @see #getDiagnostics()
   */
  void clearDiagnostics();

  /**
   * Creates a clone of the component.
   * The clone may be deep and may share the DOM of this component.
   * @param deep whether the clone should be deep.
   * @param shareDOM whether the clone should share the original DOM
   * @return a clone of the component.
   */
  XSDConcreteComponent cloneConcreteComponent(boolean deep, boolean shareDOM);

  /**
   * Returns whether the given component is contained by this component.
   * @param xsdConcreteComponent a component.
   * @return whether the component is contained by this component.
   */
  boolean contains(XSDConcreteComponent xsdConcreteComponent);
}
