blob: 5d300e8d7ca400e792370ccadee5ab854b2038ad [file] [log] [blame]
/*******************************************************************************
* 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 v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Jens Lukowski/Innoopract - initial renaming/restructuring
*
*******************************************************************************/
package org.eclipse.wst.xml.core.internal.contentmodel.modelquery;
import java.util.List;
import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.extension.ModelQueryExtensionManager;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
* This class provides an interface for performing higher level queries based on
* a xml model (DOM) and one or more associated content models (CMDocument).
*
* The queries provided can be organized into three groups:
*
* 1) DOM Node to CMNode mapping
* Given a grammatically valid DOM Node the corresponding CMNode can be determined.
* (i.e. Element -> CMElementDeclaration, Attr -> CMAttributeDeclaration, CharacterData -> CMDataType)
*
* 2) DOM editing tests ("Can I do this?")
* Questions such as canInsert, canRemove, canReplace can assist in the editing of a DOM.
*
* The validityChecking argument determines the strictness of the validity testing that occurs.
*
* - VALIDITY_NONE : The current content of the Element is ignored.
* Only the content model is considered.
* This is most useful for codeassist related queries.
*
* - VALIDITY_STRICT : The current content of the Element is considered.
* Returns true only if the operation preserves content validity.
* This is useful when DOM editing needs to be constrained to maintain validity.
*
* - VALIDITY_PARTIAL : Some optimized compromise between the two options above.
*
* 3) DOM editing actions ("What can I do here?")
* These methods return ModelQueryActions that are relevant at some specified DOM Node.
* The actions indicate what kinds of DOM Node can be inserted where (at what index).
*/
public interface ModelQuery
{
public static final int VALIDITY_NONE = 0;
public static final int VALIDITY_PARTIAL = 1;
public static final int VALIDITY_STRICT = 2;
public static final int INCLUDE_ALL = 0xFF;
public static final int INCLUDE_ATTRIBUTES = 0x01;
public static final int INCLUDE_CHILD_NODES = 0x02;
public static final int INCLUDE_SEQUENCE_GROUPS = 0x04;
public static final int INCLUDE_TEXT_NODES = 0x08;
public static final int INCLUDE_ENCLOSING_REPLACE_ACTIONS = 0x10;
public static final int EDIT_MODE_UNCONSTRAINED = 0;
public static final int EDIT_MODE_CONSTRAINED_LENIENT= 1;
public static final int EDIT_MODE_CONSTRAINED_STRICT = 2;
void setEditMode(int editMode);
int getEditMode();
/**
* Returns the CMDocument that corresponds to the DOM Node.
* or null if no CMDocument is appropriate for the DOM Node.
*/
CMDocument getCorrespondingCMDocument(Node node);
/**
* Returns the corresponding CMNode for the DOM Node
* or null if no CMNode is appropriate for the DOM Node.
*/
CMNode getCMNode(Node node);
/**
* Returns the corresponding CMAttribute for the DOM Node
* or null if no CMNode is appropriate for the DOM Node.
*/
CMAttributeDeclaration getCMAttributeDeclaration(Attr attr);
/**
* Returns the corresponding CMAttribute for the DOM Node
* or null if no CMNode is appropriate for the DOM Node.
*/
CMElementDeclaration getCMElementDeclaration(Element element);
/**
* Returns true if the content of the element is valid
*/
boolean isContentValid(Element element);
/**
* Returns the CMNode of the parent element's content model
* that corresponds to the node
*/
CMNode getOrigin(Node node);
/**
* Returns an array of CMNodes of the parent element's content model
* that corresponds to the node
*/
CMNode[] getOriginArray(Element element);
/**
* Returns a list of all CMNode 'meta data' that may be potentially added to the element.
*/
List getAvailableContent(Element element, CMElementDeclaration ed, int includeOptions);
/**
* Can a DOM Node corresponding to the CMNode 'meta data' be added to the parent
*/
boolean canInsert(Element parent, CMNode cmNode, int index, int validityChecking);
/**
* Can multiple DOM Nodes corresponding to the list of CMNode 'meta data' be added to the parent
*/
boolean canInsert(Element parent, List cmNodeList, int index, int validityChecking);
/**
* Can the DOM Node be removed
*/
boolean canRemove(Node node, int validityChecking);
/**
* Can the list of DOM Nodes be removed
*/
boolean canRemove(List nodeList, int validityChecking);
/**
* Can the children within the indicated indices be replaced with a DOM Node corresponding to the CMNode 'meta data'
*/
boolean canReplace(Element parent, int startIndex, int endIndex, CMNode cmNode, int validityChecking);
/**
* Can the children within the indicated indices be replaced with multiple DOM Nodes corresponding to the list of CMNode 'meta data'
*/
boolean canReplace(Element parent, int startIndex, int endIndex, List cmNodeList, int validityChecking);
/**
*
*/
void getInsertActions(Element parent, CMElementDeclaration ed, int index, int includeOptions, int validityChecking, List actionList);
/**
*
*/
void getInsertActions(Document parent, CMDocument cmDocument, int index, int includeOptions, int validityChecking, List actionList);
/**
* Return a list of replace actions that can be performed on the parent's content
*/
void getReplaceActions(Element parent, CMElementDeclaration ed, int includeOptions, int validityChecking, List actionList);
/**
* Return a list of replace actions that can be performed on the selected children of that parent
*/
void getReplaceActions(Element parent, CMElementDeclaration ed, List selectedChildren, int includeOptions, int validityChecking, List actionList);
/**
* @deprecated - use getPossibleDataTypeValues()
*/
List getDataTypeValues(Element element, CMNode cmNode);
/**
* This methods return an array of possible values corresponding to the datatype of the CMNode (either an CMAttributeDeclaration or a CMElementDeclaration)
*/
String[] getPossibleDataTypeValues(Element element, CMNode cmNode);
/**
* This method may return null if a CMDocumentManager is not used by the ModelQuery
*/
CMDocumentManager getCMDocumentManager();
/**
* This method may return null the ModelQuery doesn't support the use of extensions
*/
ModelQueryExtensionManager getExtensionManager();
}