blob: f9923df5157318aa40f5f22d725f075af0de331c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2002, 2005 Object Factory Inc.
* 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:
* Object Factory Inc. - Initial implementation
*******************************************************************************/
package org.eclipse.ant.internal.ui.dtd;
/**
* A Dfm is an IModel converted to a form more appropriate for
* validation. The whole point of a Dfm is to run fast.
* @author Bob Foster
*/
public interface IDfm {
/**
* Return true if no further symbols are required.
*/
boolean isAccepting();
/**
* If the symbol represented by name is acceptable,
* return the dfm to apply to the next (child) symbol.
* Otherwise, return null.
*/
IDfm advance(String name);
/**
* If the symbol represented by the namespace,name pair is acceptable,
* return the dfm to apply to the next (child) symbol. Otherwise, return
* null.
*/
IDfm advance(String namespace, String localname);
/**
* If the symbol represented by name is acceptable
* to <code>advance()</code>
* return the corresponding atom.
* Otherwise, return null.
*/
IAtom getAtom(String name);
/**
* Return the symbols for which <code>advance()</code>
* will return a next dfm. If no symbols will
* advance this dfm or if any symbol will, returns
* an empty array. Use <code>isAny()</code> and
* <code>isEmpty()</code> to disambiguate the
* cases.
*/
String[] getAccepts();
/**
* Return the symbols for which <code>advance()</code>
* will return a next dfm. If no symbols will
* advance this dfm or if any symbol will, returns
* null. Use <code>isAny()</code> and
* <code>isEmpty()</code> to disambiguate the
* cases.
*/
Object[] getKeys();
/**
* Return true if dfm will accept any symbol
* and return itself; false otherwise.
* This interface keeps the dfm from needing
* schema knowledge, but a better way to
* process an ANY dfm for elements is use the
* schema to look up the element and use its
* dfm instead of this one.
*/
boolean isAny();
/**
* Return true if dfm will reject every symbol
* (<code>advance()</code> returns null);
* false otherwise. Included for completeness,
* so every element can have a dfm, regardless
* of its type.
*/
boolean isEmpty();
}