blob: 4746dc873260c3e064beb00f0a75e9404d2c0920 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2002, 2005 Object Factory Inc.
*
* 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:
* 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();
}