blob: 985bbc0ad4cd81fca215d3383c9489750e126da4 [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
* IBM Corporation - fix for Bug 40951
*******************************************************************************/
package org.eclipse.ant.internal.ui.dtd.schema;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.ant.internal.ui.dtd.IAttribute;
import org.eclipse.ant.internal.ui.dtd.IDfm;
import org.eclipse.ant.internal.ui.dtd.IElement;
import org.eclipse.ant.internal.ui.dtd.IModel;
import org.eclipse.ant.internal.ui.dtd.ParseError;
public class Element extends Atom implements IElement {
private boolean fUndefined = true;
private boolean fText;
private IModel fModel;
private Map fMap = new HashMap(4);
private Dfm fElementDfm;
/**
* Constructor
* @param name QName of element.
*/
public Element(String name) {
super(ELEMENT, name);
}
/**
* Set undefined property.
* @param undefined False if defined; otherwise true (default).
*/
public void setUndefined(boolean undefined) {
fUndefined = undefined;
}
/**
* Set text property.
* @param text True if text only; otherwise false (default).
*/
public void setText(boolean text) {
fText = text;
}
/**
* Set model property.
* @param model Dfm describing content model.
*/
public void setContentModel(IModel model) {
fModel = model;
}
/**
* Add an attribute to the attribute map.
* @param attribute Attribute to add.
*/
public void addAttribute(IAttribute attribute) {
fMap.put(attribute.getName(), attribute);
}
/**
* @see org.eclipse.ant.internal.ui.dtd.IElement#getAttributes()
*/
public Map getAttributes() {
return fMap;
}
/* (non-Javadoc)
* @see org.eclipse.ant.internal.ui.dtd.IElement#isMixed()
*/
public IModel getContentModel() {
return fModel;
}
/**
* @see org.eclipse.ant.internal.ui.dtd.IElement#isText()
*/
public boolean isText() {
return fText;
}
/**
* @see org.eclipse.ant.internal.ui.dtd.IElement#isUndefined()
*/
public boolean isUndefined() {
return fUndefined;
}
/**
* @see org.eclipse.ant.internal.ui.dtd.IElement#getDfm()
*/
public IDfm getDfm() {
Dfm dfm = fElementDfm;
if (dfm == null) {
dfm = parseElementDfm();
fElementDfm = dfm;
}
return dfm;
}
private Dfm parseElementDfm() {
Dfm dfm;
if (fAny) {
dfm = Dfm.dfm(true);
dfm.any = true;
}
else if (fEmpty || fText) {
dfm = Dfm.dfm(true);
dfm.empty = true;
}
else {
dfm = parseModel(fModel);
}
return dfm;
}
private Dfm parseModel(IModel model) {
Dfm dfm;
Nfm nfm = model.toNfm();
if (nfm != null) {
try {
dfm = fNfmParser.parse(nfm);
} catch (ParseError e) {
//??? this would be the place to log the error
dfm = Dfm.dfm(false);
}
}
else {
dfm = Dfm.dfm(false);
}
return dfm;
}
private static final NfmParser fNfmParser = new NfmParser();
private boolean fAny;
private boolean fEmpty;
/**
* @see org.eclipse.ant.internal.ui.dtd.IElement#isAny()
*/
public boolean isAny() {
return fAny;
}
/**
* @see org.eclipse.ant.internal.ui.dtd.IElement#isEmpty()
*/
public boolean isEmpty() {
return fEmpty;
}
/**
* Sets the any.
* @param any The any to set
*/
public void setAny(boolean any) {
fAny = any;
}
/**
* Sets the empty.
* @param empty The empty to set
*/
public void setEmpty(boolean empty) {
fEmpty = empty;
}
}