blob: d3dc76a33d1c6211fc48a5c13afac4f2c22b46bf [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2004 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
*******************************************************************************/
package org.eclipse.wst.dtd.core.internal.emf.util;
import java.util.Enumeration;
import java.util.Iterator;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EEnumLiteral;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver;
import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverPlugin;
import org.eclipse.wst.dtd.core.internal.DTDCoreMessages;
import org.eclipse.wst.dtd.core.internal.emf.DTDAnyContent;
import org.eclipse.wst.dtd.core.internal.emf.DTDAttribute;
import org.eclipse.wst.dtd.core.internal.emf.DTDBasicType;
import org.eclipse.wst.dtd.core.internal.emf.DTDBasicTypeKind;
import org.eclipse.wst.dtd.core.internal.emf.DTDDefaultKind;
import org.eclipse.wst.dtd.core.internal.emf.DTDElement;
import org.eclipse.wst.dtd.core.internal.emf.DTDElementReferenceContent;
import org.eclipse.wst.dtd.core.internal.emf.DTDEmptyContent;
import org.eclipse.wst.dtd.core.internal.emf.DTDEntity;
import org.eclipse.wst.dtd.core.internal.emf.DTDEntityReferenceContent;
import org.eclipse.wst.dtd.core.internal.emf.DTDEnumGroupKind;
import org.eclipse.wst.dtd.core.internal.emf.DTDEnumerationType;
import org.eclipse.wst.dtd.core.internal.emf.DTDExternalEntity;
import org.eclipse.wst.dtd.core.internal.emf.DTDFactory;
import org.eclipse.wst.dtd.core.internal.emf.DTDFile;
import org.eclipse.wst.dtd.core.internal.emf.DTDGroupContent;
import org.eclipse.wst.dtd.core.internal.emf.DTDGroupKind;
import org.eclipse.wst.dtd.core.internal.emf.DTDInternalEntity;
import org.eclipse.wst.dtd.core.internal.emf.DTDNotation;
import org.eclipse.wst.dtd.core.internal.emf.DTDOccurrenceType;
import org.eclipse.wst.dtd.core.internal.emf.DTDPCDataContent;
import org.eclipse.wst.dtd.core.internal.emf.DTDParameterEntityReference;
import org.eclipse.wst.dtd.core.internal.emf.DTDType;
import org.eclipse.wst.dtd.core.internal.emf.impl.DTDFactoryImpl;
import org.eclipse.wst.dtd.core.internal.saxparser.AttNode;
import org.eclipse.wst.dtd.core.internal.saxparser.Attlist;
import org.eclipse.wst.dtd.core.internal.saxparser.CMBasicNode;
import org.eclipse.wst.dtd.core.internal.saxparser.CMGroupNode;
import org.eclipse.wst.dtd.core.internal.saxparser.CMNode;
import org.eclipse.wst.dtd.core.internal.saxparser.CMNodeType;
import org.eclipse.wst.dtd.core.internal.saxparser.CMReferenceNode;
import org.eclipse.wst.dtd.core.internal.saxparser.CMRepeatableNode;
import org.eclipse.wst.dtd.core.internal.saxparser.DTD;
import org.eclipse.wst.dtd.core.internal.saxparser.DTDSaxArtifactVisitor;
import org.eclipse.wst.dtd.core.internal.saxparser.ElementDecl;
import org.eclipse.wst.dtd.core.internal.saxparser.EntityDecl;
import org.eclipse.wst.dtd.core.internal.saxparser.ErrorMessage;
import org.eclipse.wst.dtd.core.internal.saxparser.NotationDecl;
public class DTDModelBuilder extends DTDSaxArtifactVisitor {
DTD dtd;
DTDUtil dtdUtil;
DTDFile dtdFile;
ResourceSet resources;
public DTDModelBuilder(ResourceSet resources, DTDUtil dtdUtil, DTD dtd, DTDFile dtdFile) {
this.resources = resources;
this.dtdUtil = dtdUtil;
this.dtd = dtd;
this.dtdFile = dtdFile;
}
public DTDFactoryImpl getFactory() {
return (DTDFactoryImpl) dtdUtil.getFactory();
}
public DTDFile getDTDFile() {
return dtdFile;
}
public void visitDTD(DTD dtd) {
super.visitDTD(dtd);
// - 2nd pass -
// do final processing for Attlists and adding contentModel
addAttlistAndContentModel(dtd, dtdFile);
}
public void visitElementDecl(ElementDecl element) {
// Element might have been added earlier because it is referenced
String declName = element.getNodeName();
// System.out.println("process ElementDecl:" + declName );
DTDElement dtdelement = (DTDElement) dtdUtil.getElementPool().get(declName);
if (dtdelement == null) {
// System.out.println("process ElementDecl - not found - create"
// );
dtdelement = getFactory().createDTDElement();
dtdelement.setName(declName);
dtdFile.getDTDObject().add(dtdelement);
dtdUtil.getElementPool().put(declName, dtdelement);
}
super.visitElementDecl(element);
}
public void visitNotationDecl(NotationDecl notation) {
// Notation might have been added earlier because it is referenced
// by an entity
DTDNotation dtdnot = dtdFile.findNotation(notation.getNodeName());
if (dtdnot == null) {
dtdnot = getFactory().createDTDNotation();
dtdFile.getDTDObject().add(dtdnot);
}
dtdnot.setName(notation.getNodeName());
if (notation.getSystemId() != null)
dtdnot.setSystemID(notation.getSystemId());
if (notation.getPublicId() != null)
dtdnot.setPublicID(notation.getPublicId());
if (notation.getComment() != null)
dtdnot.setComment(notation.getComment());
if (notation.getErrorMessage() != null) {
addErrorMessage(notation.getErrorMessage(), dtdnot);
}
super.visitNotationDecl(notation);
}
public void visitParameterEntityReferenceDecl(EntityDecl entity) {
// This is a parameter entity reference.
// Add the link to the real entity that it references
DTDParameterEntityReference parmEntRef = getFactory().createDTDParameterEntityReference();
dtdFile.getDTDObject().add(parmEntRef);
String entityName = entity.getNodeName();
// Add the reference to the DTDEntity
DTDEntity dtdentity = getDTDFile().findEntity(entityName);
if (dtdentity != null) {
parmEntRef.setEntity(dtdentity);
}
if (entity.getErrorMessage() != null) {
addErrorMessage(entity.getErrorMessage(), dtdentity);
}
// System.out.println("adding PE reference: " + declName);
super.visitParameterEntityReferenceDecl(entity);
}
public void visitExternalEntityDecl(EntityDecl entity) {
DTDEntity dtdEntity = createDTDEntity(entity);
// System.out.println("adding entity: " + declName);
DTDExternalEntity extEntity = getFactory().createDTDExternalEntity();
dtdEntity.setContent(extEntity);
finishExternalEntity(extEntity, entity);
// System.out.println(" ext entity toMof: " );
if (dtdEntity.isParameterEntity()) {
dtdUtil.getPEPool().put("%" + entity.getNodeName() + ";", dtdEntity); //$NON-NLS-1$ //$NON-NLS-2$
}
super.visitExternalEntityDecl(entity);
}
public void visitInternalEntityDecl(EntityDecl entity) {
DTDEntity dtdEntity = createDTDEntity(entity);
DTDInternalEntity intEntity = getFactory().createDTDInternalEntity();
dtdEntity.setContent(intEntity);
intEntity.setValue(entity.getValue());
// System.out.println(" int entity toMof: " );
if (dtdEntity.isParameterEntity()) {
dtdUtil.getPEPool().put("%" + entity.getNodeName() + ";", dtdEntity); //$NON-NLS-1$ //$NON-NLS-2$
}
super.visitInternalEntityDecl(entity);
}
private void addAttlistAndContentModel(DTD dtd, DTDFile dFile) {
// System.out.println("addAttListAndCotentModel - dtd:" +
// dtd.getName());
Enumeration en = dtd.externalElements();
while (en.hasMoreElements()) {
Object e = en.nextElement();
if (e instanceof ElementDecl) {
DTDElement dtdelement = (DTDElement) dtdUtil.getElementPool().get(((ElementDecl) e).getNodeName());
if (dtdelement == null) {
dtdelement = getFactory().createDTDElement();
dtdFile.getDTDObject().add(dtdelement);
}
finishElementDecl(dtdelement, (ElementDecl) e);
}
else if (e instanceof Attlist) {
processAttList((Attlist) e);
}
}
}
private void processAttList(Attlist attList) {
DTDElement e = (DTDElement) dtdUtil.getElementPool().get(attList.getNodeName());
if (e != null) {
// Element has been added. Add the attributes
// System.out.println(" processAttlist - adding Attlist:" +
// attList.getNodeName());
createAttributes(e, attList);
}
else {
// System.out.println("!!!!!!!!! element is null ");
}
}
// /////////////////////////////////////////////////////////////
//
// Methods for finishing the import of a DTDExternalEntity
//
// /////////////////////////////////////////////////////////////
void finishExternalEntity(DTDExternalEntity extEntity, EntityDecl entityDecl) {
updateSystemID(extEntity, entityDecl);
extEntity.setPublicID(entityDecl.getPublicId());
String notationName = entityDecl.getNotationName();
if (notationName != null) {
DTDNotation dtdNotation = createOrFindNotation(extEntity, notationName, true);
extEntity.setNotation(dtdNotation);
}
}
public DTDNotation createOrFindNotation(DTDExternalEntity extEntity, String name, boolean create) {
DTDNotation aNotation = extEntity.getDTDEntity().getDTDFile().findNotation(name);
if (aNotation != null) {
return aNotation;
}
//
// Create a notation for the reference
//
if (create) {
aNotation = getFactory().createDTDNotation();
dtdFile.getDTDObject().add(aNotation);
aNotation.setName(name);
}
return aNotation;
}
/**
* The SystemID attribute is set to whatever the user enters e.g.
* com/ibm/b2b/xmimodels/xxx.dtd.xmi
*
* In the unparse() method, parse out the DTD file name from the classpath
* name. e.g. returns xxx.dtd
*/
private void updateSystemID(DTDExternalEntity extEntity, EntityDecl entityDecl) {
String systemId = entityDecl.getSystemId();
String publicId = entityDecl.getPublicId();
if (systemId != null) {
URIResolver idResolver = URIResolverPlugin.createResolver();
String uri = idResolver.resolve(dtd.getName(), publicId, systemId);
ExternalDTDModel ed = dtdUtil.getExternalDTDModel(resources, uri);
if (ed != null) {
DTDFile referenceDtdFile = ed.getExternalDTDFile();
extEntity.setEntityReferencedFromAnotherFile(referenceDtdFile);
extEntity.setSystemID(systemId);
}
else {
if (entityDecl.getErrorMessage() == null) {
ErrorMessage dtdError = new ErrorMessage();
dtdError.setErrorMessage(DTDCoreMessages._ERROR_INCL_FILE_LOAD_FAILURE + " '" + systemId + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
addErrorMessage(dtdError, extEntity.getDTDEntity());
}
if (systemId != null) {
extEntity.setSystemID(systemId);
}
else {
extEntity.setSystemID(""); //$NON-NLS-1$
}
}
} // end of if ()
else {
// set the system id to be ""
extEntity.setSystemID(""); //$NON-NLS-1$
}
}
public DTDEntity createDTDEntity(EntityDecl entity) {
// create and do what we can to fill in some basic things
DTDEntity dtdEntity = getFactory().createDTDEntity();
dtdFile.getDTDObject().add(dtdEntity);
dtdEntity.setName(entity.getNodeName());
dtdEntity.setParameterEntity(entity.isParameter());
if (entity.getComment() != null) {
dtdEntity.setComment(entity.getComment());
}
if (entity.getErrorMessage() != null) {
addErrorMessage(entity.getErrorMessage(), dtdEntity);
}
return dtdEntity;
}
// /////////////////////////////////////////////////////////////
//
// Methods for finishing the import of a DTDElement
//
// /////////////////////////////////////////////////////////////
public void finishElementDecl(DTDElement dtdElement, ElementDecl ed) {
dtdElement.setName(ed.getNodeName());
CMNode cmNode = ed.getContentModelNode();
if (ed.getComment() != null) {
dtdElement.setComment(ed.getComment());
}
if (ed.getErrorMessage() != null) {
addErrorMessage(ed.getErrorMessage(), dtdElement);
}
if (cmNode instanceof CMBasicNode) {
CMBasicNode bn = (CMBasicNode) cmNode;
switch (bn.getType()) {
case CMNodeType.EMPTY :
DTDEmptyContent emptyContent = getFactory().createDTDEmptyContent();
dtdElement.setContent(emptyContent);
break;
case CMNodeType.ANY :
DTDAnyContent anyContent = getFactory().createDTDAnyContent();
dtdElement.setContent(anyContent);
break;
case CMNodeType.PCDATA :
DTDPCDataContent pcData = getFactory().createDTDPCDataContent();
dtdElement.setContent(pcData);
}
}
else if (cmNode instanceof CMReferenceNode) {
CMReferenceNode rn = (CMReferenceNode) cmNode;
if (rn.getType() == CMNodeType.ENTITY_REFERENCE) {
String entityName = rn.getName().trim();
DTDEntity anEntity = (DTDEntity) dtdUtil.getPEPool().get(entityName);
if (anEntity != null) {
//
// Create an DTDEntityReference and set its referenced
// element
//
DTDEntityReferenceContent enRef = getFactory().createDTDEntityReferenceContent();
enRef.setElementReferencedEntity(anEntity);
DTDOccurrenceType occurrenceType = DTDOccurrenceType.get(computeMofOccurrence(rn));
enRef.setOccurrence(occurrenceType);
dtdElement.setContent(enRef);
}
else { // create default content
DTDEmptyContent emptyContent = getFactory().createDTDEmptyContent();
dtdElement.setContent(emptyContent);
}
}
else {
//
// Find the real element for this element references
// If the real element does not yet exist, create it
//
DTDElement anElement = createOrFindElement(rn.getName(), dtdElement);
//
// Create an DTDElementReference and set its referenced
// element
//
DTDElementReferenceContent elemRef = getFactory().createDTDElementReferenceContent();
elemRef.setReferencedElement(anElement);
DTDOccurrenceType occurrenceType = DTDOccurrenceType.get(computeMofOccurrence(rn));
elemRef.setOccurrence(occurrenceType);
// setContent to DTDElementReference
dtdElement.setContent(elemRef);
}
}
else if (cmNode instanceof CMGroupNode) {
CMGroupNode grpNode = (CMGroupNode) cmNode;
DTDGroupContent groupContent = getFactory().createDTDGroupContent();
DTDGroupKind groupKind = DTDGroupKind.get(computeMofGroupKind(grpNode.getGroupKind()));
groupContent.setGroupKind(groupKind);
DTDOccurrenceType occurrenceType = DTDOccurrenceType.get(computeMofOccurrence(grpNode));
groupContent.setOccurrence(occurrenceType);
// just use the locator for the element as the closest guess
processGroupContent(groupContent, grpNode);
dtdElement.setContent(groupContent);
}
else if (cmNode == null) {
// bad thing happened here, just create a pcdata
DTDEmptyContent emptyContent = getFactory().createDTDEmptyContent();
dtdElement.setContent(emptyContent);
}
}
/**
* Add a new group to the current group
*
* @param parent -
* the parent node for this group element
* @param op1Node -
* the group e.g. (a,b)
* @param op2Node -
* set only if called by processCM1op e.g. (a,b)+
*/
void processGroupContent(DTDGroupContent parent, CMGroupNode grpNode) {
Enumeration children = grpNode.getChildren().elements();
DTDFactory factory = getFactory();
while (children.hasMoreElements()) {
CMNode cnode = (CMNode) children.nextElement();
if (cnode instanceof CMGroupNode) {
CMGroupNode gNode = (CMGroupNode) cnode;
DTDGroupContent groupContent = factory.createDTDGroupContent();
DTDGroupKind groupKind = DTDGroupKind.get(computeMofGroupKind(gNode.getGroupKind()));
groupContent.setGroupKind(groupKind);
DTDOccurrenceType occurrenceType = DTDOccurrenceType.get(computeMofOccurrence(gNode));
groupContent.setOccurrence(occurrenceType);
parent.getContent().add(groupContent);
processGroupContent(groupContent, gNode);
}
else if (cnode instanceof CMBasicNode) {
CMBasicNode n = (CMBasicNode) cnode;
if (n.getType() == CMNodeType.PCDATA) {
// Create a DTDPCDataContent for a leaf PCData node
//
DTDPCDataContent pcData = factory.createDTDPCDataContent();
// Add #PCDATA to the Group, i.e Mixed content model
parent.getContent().add(pcData);
}
}
else if (cnode instanceof CMReferenceNode) {
CMReferenceNode rn = (CMReferenceNode) cnode;
if (rn.getType() == CMNodeType.ELEMENT_REFERENCE) {
// System.out.println("CM Element Ref name: " +
// rn.getName());
//
// Create an DTDElementReference and set its referenced
// element
//
DTDElementReferenceContent elemRef = factory.createDTDElementReferenceContent();
//
// Find the real element for this element references
// If the real element does not yet exist, create it
//
DTDElement anElement = createOrFindElement(rn.getName(), elemRef);
elemRef.setReferencedElement(anElement);
DTDOccurrenceType occurrenceType = DTDOccurrenceType.get(computeMofOccurrence(rn));
elemRef.setOccurrence(occurrenceType);
// Add DTDElementReference to the Group
parent.getContent().add(elemRef);
}
else // PE Reference
{
String entityName = rn.getName().trim();
// System.out.println("CM PE Ref name: " + entityName);
DTDEntity anEntity = (DTDEntity) dtdUtil.getPEPool().get(entityName);
if (anEntity != null) {
//
// Create an DTDEntityReference and set its referenced
// element
//
DTDEntityReferenceContent enRef = factory.createDTDEntityReferenceContent();
enRef.setElementReferencedEntity(anEntity);
DTDOccurrenceType occurrenceType = DTDOccurrenceType.get(computeMofOccurrence(rn));
enRef.setOccurrence(occurrenceType);
// Add DTDEntityReference to the Group
parent.getContent().add(enRef);
}
}
}
}
}
/**
* Find the real element that is referenced by the current element
*/
private DTDElement createOrFindElement(String name, Object obj) {
// DTDElement aElement = getDTDFile().findElement(name);
DTDElement aElement = (DTDElement) dtdUtil.getElementPool().get(name);
if (aElement != null) {
return aElement;
}
String errorMsg = DTDCoreMessages._ERROR_UNDECLARED_ELEMENT_1; //$NON-NLS-1$
errorMsg += "\"" + name + "\""; //$NON-NLS-1$ //$NON-NLS-2$
errorMsg += DTDCoreMessages._UI_ERRORPART_UNDECLARED_ELEMENT_2; //$NON-NLS-1$
ErrorMessage dtdError = new ErrorMessage();
dtdError.setErrorMessage(errorMsg);
addErrorMessage(dtdError, obj);
// System.out.println(errorMsg);
// setDTDErrorMessage(errorMsg);
getDTDFile().setParseError(true);
//
// Create an empty element for the reference to make it valid
//
DTDFactory factory = getFactory();
DTDElement dtdelement = factory.createDTDElement();
dtdelement.setName(name);
DTDEmptyContent emptyContent = factory.createDTDEmptyContent();
dtdelement.setContent(emptyContent);
getDTDFile().getDTDObject().add(dtdelement);
dtdUtil.getElementPool().put(name, dtdelement);
return dtdelement;
}
/**
* Compute the MOF occurrence from the xml4j occurrence
*/
private int computeMofOccurrence(CMRepeatableNode rnode) {
int occurrence = rnode.getOccurrence();
int mofoccur = DTDOccurrenceType.ONE;
if (occurrence == CMNodeType.ZERO_OR_MORE) {
mofoccur = DTDOccurrenceType.ZERO_OR_MORE;
}
else if (occurrence == CMNodeType.ONE_OR_MORE) {
mofoccur = DTDOccurrenceType.ONE_OR_MORE;
}
else if (occurrence == CMNodeType.OPTIONAL) {
mofoccur = DTDOccurrenceType.OPTIONAL;
}
return mofoccur;
}
/**
* Compute the MOF model group from the xml4j model group
*/
private int computeMofGroupKind(int type) {
if (type == CMNodeType.GROUP_CHOICE) {
return DTDGroupKind.CHOICE;
}
else {
return DTDGroupKind.SEQUENCE;
}
}
// /////////////////////////////////////////////////////////////
//
// Methods for creating the attributes of a DTDElement
//
// /////////////////////////////////////////////////////////////
public void createAttributes(DTDElement element, Attlist attList) {
if (attList.getErrorMessage() != null) {
addErrorMessage(attList.getErrorMessage(), element);
}
for (int i = 0; i < attList.size(); i++) {
AttNode ad = attList.elementAt(i);
// DTDAttributeElement dtdAtt=
// getDTDAttributeElement(a.getName());
// only add the AttDef if it is not added yet
// ignore the dup AttDef as documented in the XML 1.0 specs
// if( dtdAtt==null)
addAttribute(element, ad);
}
}
/**
* Create a DTDAttribute from the xml4j attribute
*/
public void addAttribute(DTDElement dtdelement, AttNode ad) {
DTDAttribute dtdattr = getFactory().createDTDAttribute();
dtdelement.getDTDAttribute().add(dtdattr);
finishAttribute(dtdattr, ad);
}
// Stuff for populating attribute
public void finishAttribute(DTDAttribute dtdattr, AttNode attdef) {
boolean parseError = false;
if (attdef.name.startsWith("%")) { //$NON-NLS-1$
String peName = attdef.name.trim();
DTDEntity en = (DTDEntity) dtdUtil.getPEPool().get(peName);
if (en != null) {
dtdattr.setAttributeNameReferencedEntity(en);
}
}
dtdattr.setName(attdef.name);
int attrType = attdef.getDeclaredType();
if (attrType == AttNode.PEREFERENCE && attdef.type != null) {
String peName = attdef.type.trim();
DTDEntity en = (DTDEntity) dtdUtil.getPEPool().get(peName);
if (en != null) {
dtdattr.setAttributeTypeReferencedEntity(en);
setAttrDTDType(dtdattr, getFactory().getDTDBasicType_CDATA()); // hack,
// so
// we
// can
// get
// back
// the
// default
// value
}
else
// set default type
setAttrDTDType(dtdattr, getFactory().getDTDBasicType_CDATA());
}
else {
switch (attrType) {
case AttNode.CDATA :
setAttrDTDType(dtdattr, getFactory().getDTDBasicType_CDATA());
break;
case AttNode.ENTITIES :
setAttrDTDType(dtdattr, getFactory().getDTDBasicType_ENTITIES());
break;
case AttNode.ENTITY :
setAttrDTDType(dtdattr, getFactory().getDTDBasicType_ENTITY());
break;
case AttNode.ID :
// check for duplicate ID attribute
if (hasIDAttribute(dtdattr)) {
String errMsg = DTDCoreMessages._ERROR_DUP_ID_ATTRIBUTE_1; //$NON-NLS-1$
errMsg += attdef.name + DTDCoreMessages._UI_ERRORPART_DUP_ID_ATTRIBUTE_2; //$NON-NLS-1$
// dtdattr.getDTDElement().getIElement().setDTDErrorMessage(errMsg);
// dtdattr.getDTDElement().getDTDFile().setParseError(true);
parseError = true;
}
setAttrDTDType(dtdattr, getFactory().getDTDBasicType_ID());
break;
case AttNode.IDREF :
setAttrDTDType(dtdattr, getFactory().getDTDBasicType_IDREF());
break;
case AttNode.IDREFS :
setAttrDTDType(dtdattr, getFactory().getDTDBasicType_IDREFS());
break;
case AttNode.ENUMERATION :
setAttrDTDType(dtdattr, createDTDEnumeration(dtdattr, attdef, DTDEnumGroupKind.NAME_TOKEN_GROUP));
break;
case AttNode.NOTATION :
setAttrDTDType(dtdattr, createDTDEnumeration(dtdattr, attdef, DTDEnumGroupKind.NOTATION_GROUP));
break;
case AttNode.NMTOKEN :
setAttrDTDType(dtdattr, getFactory().getDTDBasicType_NMTOKEN());
break;
case AttNode.NMTOKENS :
setAttrDTDType(dtdattr, getFactory().getDTDBasicType_NMTOKENS());
break;
default :
// System.out.println("DTDATTR '" +attdef.name + "'Unknown
// type..." + attrType);
}
}
int attrDefault = attdef.getDefaultType();
int defaultKind = DTDDefaultKind.IMPLIED;
switch (attrDefault) {
case AttNode.FIXED :
defaultKind = DTDDefaultKind.FIXED;
break;
case AttNode.IMPLIED :
defaultKind = DTDDefaultKind.IMPLIED;
break;
case AttNode.REQUIRED :
defaultKind = DTDDefaultKind.REQUIRED;
break;
case AttNode.NOFIXED :
defaultKind = DTDDefaultKind.NOFIXED;
break;
default :
// System.out.println("DTDATTR '" +attdef.name + "' Unknown default
// type... " + attrDefault);
}
DTDDefaultKind defaultKindObj = DTDDefaultKind.get(defaultKind);
dtdattr.setDefaultKind(defaultKindObj);
if (parseError) {
return;
}
String defaultValue = attdef.defaultValue;
if (defaultValue != null) {
if (attrType == AttNode.ENUMERATION || attrType == AttNode.NOTATION) {
if (!isDefaultEnumValueValid(attdef, defaultValue)) {
String typeString = (attrType == AttNode.ENUMERATION ? "enumeration" : "notation"); //$NON-NLS-1$ //$NON-NLS-2$
String errMsg = DTDCoreMessages._ERROR_INVALID_DEFAULT_ATTR_VALUE_1; //$NON-NLS-1$
errMsg += typeString + DTDCoreMessages._UI_ERRORPART_INVALID_DEFAULT_ATTR_VALUE_2; //$NON-NLS-1$
errMsg += attdef.name + "'"; //$NON-NLS-1$
// dtdattr.getDTDElement().getIElement().setDTDErrorMessage(errMsg);
// dtdattr.getDTDElement().getDTDFile().setParseError(true);
return;
}
}
dtdattr.setDefaultValueString(defaultValue);
}
// System.out.println("DTDAttr - toMof getDefaultValueString " +
// getDefaultValueString());
// System.out.println("DTDAttr - toMof getDefaultValue: " +
// getDefaultValue());
}
public boolean hasIDAttribute(DTDAttribute dtdattr) {
boolean hasID = false;
DTDElement element = dtdattr.getDTDElement();
EList attrs = element.getDTDAttribute();
Iterator i = attrs.iterator();
while (i.hasNext()) {
DTDAttribute attr = (DTDAttribute) i.next();
DTDType dType = attr.getDTDType();
if (dType instanceof DTDBasicType) {
if (((DTDBasicType) dType).getKind().getValue() == DTDBasicTypeKind.ID) {
hasID = true;
break;
}
}
}
return hasID;
}
public DTDEnumerationType createDTDEnumeration(DTDAttribute dtdattr, String[] enumValues, int enumKind) {
DTDEnumerationType enumeration = getFactory().createDTDEnumerationType();
DTDEnumGroupKind groupKind = DTDEnumGroupKind.get(enumKind);
enumeration.setKind(groupKind);
// Enumeration values
if (enumValues != null) {
for (int i = 0; i < enumValues.length; i++) {
EEnumLiteral enumLiteral = createEEnumLiteral();
// enumVal.setXMIDocument(dtdattr.getXMIDocument());
// MOF2EMF Port
// enumLiteral.refSetLiteral(enumValues[i]);
enumLiteral.setName(enumValues[i]);
// enumLiteral.setNumber(i);
enumeration.getEnumLiterals().add(enumLiteral);
}
}
dtdattr.getDTDElement().getDTDFile().getDTDEnumerationType().add(enumeration);
return enumeration;
}
private EEnumLiteral createEEnumLiteral() {
EcorePackage ePackage = (EcorePackage) EPackage.Registry.INSTANCE.getEPackage(EcorePackage.eNS_URI);
// MOF2EMF Port
// return ((EcoreFactory)ePackage.getFactory()).createEEnumLiteral();
return ePackage.getEcoreFactory().createEEnumLiteral();
}
private DTDEnumerationType createDTDEnumeration(DTDAttribute dtdattr, AttNode attdef, int enumKind) {
DTDEnumerationType enumeration = getFactory().createDTDEnumerationType();
DTDEnumGroupKind groupKind = DTDEnumGroupKind.get(enumKind);
enumeration.setKind(groupKind);
dtdattr.getDTDElement().getDTDFile().getDTDEnumerationType().add(enumeration);
// Enumeration values
Enumeration tokenIter = attdef.elements();
if (tokenIter != null) {
while (tokenIter.hasMoreElements()) {
String val = (String) tokenIter.nextElement();
EEnumLiteral enumLiteral = createEEnumLiteral();
// enumLiteral.setXMIDocument(dtdattr.getXMIDocument());
// MOF2EMF Port
// enumLiteral.refSetLiteral(val);
enumLiteral.setName(val);
// enumLiteral.setNumber(i++);
enumeration.getEnumLiterals().add(enumLiteral);
}
}
return enumeration;
}
private boolean isDefaultEnumValueValid(AttNode attdef, String defaultValue) {
boolean valid = false;
boolean containsPercent = false;
// Enumeration values
Enumeration enumValues = attdef.elements();
while (enumValues.hasMoreElements()) {
String val = (String) enumValues.nextElement();
if (val.equals(defaultValue)) {
valid = true;
break;
}
if (val.indexOf('%') >= 0) {
containsPercent = true;
}
}
return valid || containsPercent;
}
public void setAttrDTDType(DTDAttribute dtdattr, DTDType type) {
dtdattr.setDTDType(type);
}
protected void addErrorMessage(ErrorMessage errMsg, Object obj) {
errMsg.setObject(obj);
dtdUtil.addErrorMessage(errMsg);
}
// /**
// * @generated
// */
// protected DTDFactoryImpl getFactoryGen() {
//
// return (DTDFactoryImpl)dtdUtil.getFactory();
// }
// /**
// * @generated
// */
// protected DTDFile getDTDFileGen() {
//
// return dtdFile;
// }
// /**
// * @generated
// */
// protected void visitDTDGen(DTD dtd) {
//
// super.visitDTD(dtd);
//
//
// // - 2nd pass -
// // do final processing for Attlists and adding contentModel
// addAttlistAndContentModel(dtd,dtdFile);
// }
// /**
// * @generated
// */
// protected void visitElementDeclGen(ElementDecl element) {
//
// // Element might have been added earlier because it is referenced
// String declName = element.getNodeName() ;
// // System.out.println("process ElementDecl:" + declName );
// DTDElement dtdelement = (DTDElement)
// dtdUtil.getElementPool().get(declName);
// if (dtdelement == null)
// {
// // System.out.println("process ElementDecl - not found - create" );
// dtdelement = getFactory().createDTDElement();
// dtdelement.setName(declName);
// dtdFile.getDTDObject().add(dtdelement);
// dtdUtil.getElementPool().put(declName,dtdelement);
// }
//
//
// super.visitElementDecl(element);
// }
// /**
// * @generated
// */
// protected void visitNotationDeclGen(NotationDecl notation) {
//
// // Notation might have been added earlier because it is referenced
// // by an entity
// DTDNotation dtdnot = dtdFile.findNotation( notation.getNodeName() );
// if (dtdnot == null)
// {
// dtdnot = getFactory().createDTDNotation();
// dtdFile.getDTDObject().add(dtdnot);
// }
// dtdnot.setName(notation.getNodeName());
//
//
// if (notation.getSystemId()!= null )
// dtdnot.setSystemID(notation.getSystemId());
// if (notation.getPublicId()!= null )
// dtdnot.setPublicID(notation.getPublicId());
//
//
// if (notation.getComment()!=null)
// dtdnot.setComment(notation.getComment());
// if (notation.getErrorMessage()!=null)
// {
// addErrorMessage(notation.getErrorMessage(), dtdnot);
// }
//
//
// super.visitNotationDecl(notation);
// }
// /**
// * @generated
// */
// protected void visitParameterEntityReferenceDeclGen(EntityDecl entity)
// {
//
// // This is a parameter entity reference.
// // Add the link to the real entity that it references
// DTDParameterEntityReference parmEntRef =
// getFactory().createDTDParameterEntityReference();
// dtdFile.getDTDObject().add(parmEntRef);
//
//
// String entityName = entity.getNodeName();
//
//
// // Add the reference to the DTDEntity
// DTDEntity dtdentity = getDTDFile().findEntity(entityName);
// if (dtdentity != null)
// {
// parmEntRef.setEntity(dtdentity);
// }
// if (entity.getErrorMessage()!=null)
// {
// addErrorMessage(entity.getErrorMessage(), dtdentity);
// }
// // System.out.println("adding PE reference: " + declName);
//
//
// super.visitParameterEntityReferenceDecl(entity);
// }
// /**
// * @generated
// */
// protected void visitExternalEntityDeclGen(EntityDecl entity) {
//
// DTDEntity dtdEntity = createDTDEntity(entity);
// // System.out.println("adding entity: " + declName);
// DTDExternalEntity extEntity = getFactory().createDTDExternalEntity();
// dtdEntity.setContent(extEntity);
//
//
// finishExternalEntity(extEntity, entity);
// // System.out.println(" ext entity toMof: " );
// if (dtdEntity.isParameterEntity())
// {
//
//
// dtdUtil.getPEPool().put("%"+entity.getNodeName()+";", dtdEntity);
// }
//
//
// super.visitExternalEntityDecl(entity);
// }
// /**
// * @generated
// */
// protected void visitInternalEntityDeclGen(EntityDecl entity) {
//
// DTDEntity dtdEntity = createDTDEntity(entity);
//
//
// DTDInternalEntity intEntity = getFactory().createDTDInternalEntity();
// dtdEntity.setContent(intEntity);
// intEntity.setValue(entity.getValue());
// // System.out.println(" int entity toMof: " );
// if (dtdEntity.isParameterEntity())
// {
// dtdUtil.getPEPool().put("%"+entity.getNodeName()+";", dtdEntity);
// }
//
//
// super.visitInternalEntityDecl(entity);
// }
// /**
// * @generated
// */
// protected void addAttlistAndContentModelGen(DTD dtd, DTDFile dFile) {
//
// //System.out.println("addAttListAndCotentModel - dtd:" +
// dtd.getName());
// Enumeration en = dtd.externalElements();
// while (en.hasMoreElements())
// {
// Object e = en.nextElement();
// if ( e instanceof ElementDecl )
// {
// DTDElement dtdelement = (DTDElement) dtdUtil.getElementPool().get(
// ((ElementDecl)e).getNodeName() );
// if (dtdelement == null)
// {
// dtdelement = getFactory().createDTDElement();
// dtdFile.getDTDObject().add(dtdelement);
// }
// finishElementDecl(dtdelement, (ElementDecl) e);
// }
// else if ( e instanceof Attlist )
// {
// processAttList((Attlist) e);
// }
// }
// }
// /**
// * @generated
// */
// protected void processAttListGen(Attlist attList) {
//
// DTDElement e = (DTDElement)
// dtdUtil.getElementPool().get(attList.getNodeName());
// if ( e != null )
// {
// // Element has been added. Add the attributes
// //System.out.println(" processAttlist - adding Attlist:" +
// attList.getNodeName());
// createAttributes(e, attList);
// }
// else
// {
// //System.out.println("!!!!!!!!! element is null ");
// }
// }
// /**
// * @generated
// */
// protected void finishExternalEntityGen(DTDExternalEntity extEntity,
// EntityDecl entityDecl) {
//
// updateSystemID(extEntity, entityDecl);
// extEntity.setPublicID(entityDecl.getPublicId());
//
//
// String notationName = entityDecl.getNotationName();
// if (notationName != null)
// {
// DTDNotation dtdNotation = createOrFindNotation(extEntity,
// notationName,true);
// extEntity.setNotation(dtdNotation);
// }
// }
// /**
// * @generated
// */
// protected DTDNotation createOrFindNotationGen(DTDExternalEntity
// extEntity, String name, boolean create) {
//
// DTDNotation aNotation =
// extEntity.getDTDEntity().getDTDFile().findNotation(name);
// if (aNotation != null)
// {
// return aNotation;
// }
//
//
// //
// // Create a notation for the reference
// //
// if (create)
// {
// aNotation = getFactory().createDTDNotation();
// dtdFile.getDTDObject().add(aNotation);
// aNotation.setName(name);
// }
// return aNotation;
// }
// /**
// * The SystemID attribute is set to whatever the user enters
// * e.g. com/ibm/b2b/xmimodels/xxx.dtd.xmi
// *
// * In the unparse() method, parse out the DTD file name from
// * the classpath name.
// * e.g. returns xxx.dtd
// */
// protected void updateSystemIDGen(DTDExternalEntity extEntity,
// EntityDecl entityDecl) {
//
// String systemId = entityDecl.getSystemId();
// String publicId = entityDecl.getPublicId();
// if (systemId != null)
// {
// IdResolver idResolver = new IdResolverImpl(dtd.getName());
// String uri = idResolver.resolveId(publicId, systemId);
// ExternalDTDModel ed = dtdUtil.getExternalDTDModel(resources, uri);
// if (ed != null)
// {
// DTDFile referenceDtdFile = ed.getExternalDTDFile();
// extEntity.setEntityReferencedFromAnotherFile(referenceDtdFile);
// extEntity.setSystemID(systemId);
// }
// else
// {
// if (entityDecl.getErrorMessage() == null)
// {
// ErrorMessage dtdError = new ErrorMessage();
// dtdError.setErrorMessage(DTDCoreMessages.getString("_ERROR_INCL_FILE_LOAD_FAILURE")
// + " '" + systemId + "'");
// addErrorMessage(dtdError, extEntity.getDTDEntity());
// }
//
// if (systemId != null)
// {
// extEntity.setSystemID(systemId);
// }
// else
// {
// extEntity.setSystemID("");
// }
// }
// } // end of if ()
// else
// {
// // set the system id to be ""
// extEntity.setSystemID("");
// }
// }
// /**
// * @generated
// */
// protected DTDEntity createDTDEntityGen(EntityDecl entity) {
//
// // create and do what we can to fill in some basic things
// DTDEntity dtdEntity = getFactory().createDTDEntity();
// dtdFile.getDTDObject().add(dtdEntity);
//
//
// dtdEntity.setName(entity.getNodeName());
// dtdEntity.setParameterEntity(entity.isParameter());
// if (entity.getComment()!=null)
// {
// dtdEntity.setComment(entity.getComment());
// }
// if (entity.getErrorMessage()!=null)
// {
// addErrorMessage(entity.getErrorMessage(), dtdEntity);
// }
//
//
// return dtdEntity;
// }
// /**
// * @generated
// */
// protected void finishElementDeclGen(DTDElement dtdElement, ElementDecl
// ed) {
//
// dtdElement.setName(ed.getNodeName());
//
//
// CMNode cmNode = ed.getContentModelNode();
//
//
// if (ed.getComment()!=null)
// {
// dtdElement.setComment(ed.getComment());
// }
// if (ed.getErrorMessage()!=null)
// {
// addErrorMessage(ed.getErrorMessage(), dtdElement);
// }
//
//
// if (cmNode instanceof CMBasicNode)
// {
// CMBasicNode bn = (CMBasicNode)cmNode;
// switch (bn.getType())
// {
// case CMNodeType.EMPTY :
// DTDEmptyContent emptyContent = getFactory().createDTDEmptyContent();
// dtdElement.setContent(emptyContent);
// break;
//
//
// case CMNodeType.ANY :
// DTDAnyContent anyContent = getFactory().createDTDAnyContent();
// dtdElement.setContent(anyContent);
// break;
//
//
// case CMNodeType.PCDATA:
// DTDPCDataContent pcData = getFactory().createDTDPCDataContent();
// dtdElement.setContent(pcData);
// }
//
//
// }
// else if (cmNode instanceof CMReferenceNode)
// {
// CMReferenceNode rn = (CMReferenceNode) cmNode;
// if (rn.getType() == CMNodeType.ENTITY_REFERENCE)
// {
// String entityName = rn.getName().trim();
//
//
// DTDEntity anEntity = (DTDEntity) dtdUtil.getPEPool().get(entityName);
// if (anEntity!=null)
// {
// //
// // Create an DTDEntityReference and set its referenced element
// //
// DTDEntityReferenceContent enRef =
// getFactory().createDTDEntityReferenceContent();
// enRef.setElementReferencedEntity(anEntity);
//
// DTDOccurrenceType occurrenceType =
// DTDOccurrenceType.get(computeMofOccurrence(rn));
// enRef.setOccurrence(occurrenceType);
//
// dtdElement.setContent(enRef);
// }
// else
// { // create default content
// DTDEmptyContent emptyContent = getFactory().createDTDEmptyContent();
// dtdElement.setContent(emptyContent);
// }
// }
// else
// {
// //
// // Find the real element for this element references
// // If the real element does not yet exist, create it
// //
// DTDElement anElement = createOrFindElement(rn.getName(), dtdElement);
//
//
// //
// // Create an DTDElementReference and set its referenced element
// //
// DTDElementReferenceContent elemRef =
// getFactory().createDTDElementReferenceContent();
// elemRef.setReferencedElement(anElement);
//
// DTDOccurrenceType occurrenceType =
// DTDOccurrenceType.get(computeMofOccurrence(rn));
// elemRef.setOccurrence(occurrenceType);
//
// // setContent to DTDElementReference
// dtdElement.setContent(elemRef);
//
//
// }
// }
// else if (cmNode instanceof CMGroupNode)
// {
// CMGroupNode grpNode = (CMGroupNode)cmNode;
// DTDGroupContent groupContent = getFactory().createDTDGroupContent();
// DTDGroupKind groupKind =
// DTDGroupKind.get(computeMofGroupKind(grpNode.getGroupKind()));
// groupContent.setGroupKind(groupKind);
// DTDOccurrenceType occurrenceType =
// DTDOccurrenceType.get(computeMofOccurrence(grpNode));
// groupContent.setOccurrence(occurrenceType);
//
// // just use the locator for the element as the closest guess
// processGroupContent(groupContent, grpNode);
// dtdElement.setContent(groupContent);
// }
// else if (cmNode == null)
// {
// // bad thing happened here, just create a pcdata
// DTDEmptyContent emptyContent = getFactory().createDTDEmptyContent();
// dtdElement.setContent(emptyContent);
// }
// }
// /**
// * Add a new group to the current group
// * @param parent - the parent node for this group element
// * @param op1Node - the group
// * e.g. (a,b)
// * @param op2Node - set only if called by processCM1op
// * e.g. (a,b)+
// */
// protected void processGroupContentGen(DTDGroupContent parent,
// CMGroupNode grpNode) {
//
// Enumeration children = grpNode.getChildren().elements();
// DTDFactory factory = getFactory();
// while (children.hasMoreElements())
// {
// CMNode cnode = (CMNode) children.nextElement();
//
//
// if (cnode instanceof CMGroupNode)
// {
// CMGroupNode gNode = (CMGroupNode)cnode;
// DTDGroupContent groupContent = factory.createDTDGroupContent();
// DTDGroupKind groupKind =
// DTDGroupKind.get(computeMofGroupKind(gNode.getGroupKind()));
// groupContent.setGroupKind(groupKind);
// DTDOccurrenceType occurrenceType =
// DTDOccurrenceType.get(computeMofOccurrence(gNode));
// groupContent.setOccurrence(occurrenceType);
//
// parent.getContent().add(groupContent);
// processGroupContent(groupContent,gNode);
// }
// else if (cnode instanceof CMBasicNode)
// {
// CMBasicNode n = (CMBasicNode)cnode;
// if (n.getType() == CMNodeType.PCDATA)
// {
// // Create a DTDPCDataContent for a leaf PCData node
// //
// DTDPCDataContent pcData = factory.createDTDPCDataContent();
// // Add #PCDATA to the Group, i.e Mixed content model
// parent.getContent().add(pcData);
// }
// }
// else if (cnode instanceof CMReferenceNode)
// {
// CMReferenceNode rn = (CMReferenceNode)cnode;
// if (rn.getType()==CMNodeType.ELEMENT_REFERENCE)
// {
// // System.out.println("CM Element Ref name: " + rn.getName());
// //
// // Create an DTDElementReference and set its referenced element
// //
// DTDElementReferenceContent elemRef =
// factory.createDTDElementReferenceContent();
//
//
// //
// // Find the real element for this element references
// // If the real element does not yet exist, create it
// //
// DTDElement anElement = createOrFindElement(rn.getName(), elemRef);
//
//
// elemRef.setReferencedElement(anElement);
// DTDOccurrenceType occurrenceType =
// DTDOccurrenceType.get(computeMofOccurrence(rn));
// elemRef.setOccurrence(occurrenceType);
//
// // Add DTDElementReference to the Group
// parent.getContent().add(elemRef);
// }
// else // PE Reference
// {
// String entityName = rn.getName().trim();
//
//
// // System.out.println("CM PE Ref name: " + entityName);
// DTDEntity anEntity = (DTDEntity) dtdUtil.getPEPool().get(entityName);
// if (anEntity!=null)
// {
// //
// // Create an DTDEntityReference and set its referenced element
// //
// DTDEntityReferenceContent enRef =
// factory.createDTDEntityReferenceContent();
// enRef.setElementReferencedEntity(anEntity);
//
// DTDOccurrenceType occurrenceType =
// DTDOccurrenceType.get(computeMofOccurrence(rn));
// enRef.setOccurrence(occurrenceType);
//
//
// // Add DTDEntityReference to the Group
// parent.getContent().add(enRef);
//
//
// }
// }
// }
// }
// }
// /**
// * Find the real element that is referenced by the current element
// */
// protected DTDElement createOrFindElementGen(String name, Object obj) {
//
// // DTDElement aElement = getDTDFile().findElement(name);
//
//
// DTDElement aElement = (DTDElement) dtdUtil.getElementPool().get(name);
//
//
// if (aElement != null)
// {
// return aElement;
// }
//
//
// String errorMsg =
// DTDCoreMessages.getString("_ERROR_UNDECLARED_ELEMENT_1");
// errorMsg += "\"" + name + "\"";
// errorMsg +=
// DTDCoreMessages.getString("_UI_ERRORPART_UNDECLARED_ELEMENT_2");
//
//
// ErrorMessage dtdError = new ErrorMessage();
//
// dtdError.setErrorMessage(errorMsg);
// addErrorMessage(dtdError, obj);
// // System.out.println(errorMsg);
// // setDTDErrorMessage(errorMsg);
// getDTDFile().setParseError(true);
//
//
// //
// // Create an empty element for the reference to make it valid
// //
//
//
// DTDFactory factory = getFactory();
// DTDElement dtdelement = factory.createDTDElement();
// dtdelement.setName(name);
//
//
// DTDEmptyContent emptyContent = factory.createDTDEmptyContent();
// dtdelement.setContent(emptyContent);
//
//
// getDTDFile().getDTDObject().add(dtdelement);
// dtdUtil.getElementPool().put(name,dtdelement);
// return dtdelement;
// }
// /**
// * Compute the MOF occurrence from the xml4j occurrence
// */
// protected int computeMofOccurrenceGen(CMRepeatableNode rnode) {
//
// int occurrence = rnode.getOccurrence();
// int mofoccur = DTDOccurrenceType.ONE;
//
//
// if (occurrence == CMNodeType.ZERO_OR_MORE)
// {
// mofoccur = DTDOccurrenceType.ZERO_OR_MORE;
// }
// else if (occurrence == CMNodeType.ONE_OR_MORE)
// {
// mofoccur = DTDOccurrenceType.ONE_OR_MORE;
// }
// else if (occurrence == CMNodeType.OPTIONAL)
// {
// mofoccur = DTDOccurrenceType.OPTIONAL;
// }
// return mofoccur;
// }
// /**
// * Compute the MOF model group from the xml4j model group
// */
// protected int computeMofGroupKindGen(int type) {
//
// if (type == CMNodeType.GROUP_CHOICE)
// {
// return DTDGroupKind.CHOICE;
// }
// else
// {
// return DTDGroupKind.SEQUENCE;
// }
// }
// /**
// * @generated
// */
// protected void createAttributesGen(DTDElement element, Attlist attList)
// {
//
// if (attList.getErrorMessage()!=null)
// {
// addErrorMessage(attList.getErrorMessage(), element);
// }
//
//
// for (int i=0;i<attList.size();i++)
// {
// AttNode ad = (AttNode) attList.elementAt(i);
// // DTDAttributeElement dtdAtt= getDTDAttributeElement(a.getName());
//
//
// // only add the AttDef if it is not added yet
// // ignore the dup AttDef as documented in the XML 1.0 specs
// //if( dtdAtt==null)
// addAttribute(element, ad);
// }
// }
// /**
// * Create a DTDAttribute from the xml4j attribute
// */
// protected void addAttributeGen(DTDElement dtdelement, AttNode ad) {
//
// DTDAttribute dtdattr = getFactory().createDTDAttribute();
// dtdelement.getDTDAttribute().add(dtdattr);
// finishAttribute(dtdattr, ad);
// }
// /**
// * @generated
// */
// protected void finishAttributeGen(DTDAttribute dtdattr, AttNode attdef)
// {
//
// boolean parseError = false;
//
//
// if (attdef.name.startsWith("%"))
// {
// String peName = attdef.name.trim();
// DTDEntity en = (DTDEntity) dtdUtil.getPEPool().get(peName);
// if (en!=null)
// {
// dtdattr.setAttributeNameReferencedEntity(en);
// }
// }
//
//
// dtdattr.setName(attdef.name);
//
//
// int attrType = attdef.getDeclaredType();
//
//
// if (attrType==AttNode.PEREFERENCE && attdef.type!=null)
// {
// String peName = attdef.type.trim();
// DTDEntity en = (DTDEntity) dtdUtil.getPEPool().get(peName);
// if (en!=null)
// {
// dtdattr.setAttributeTypeReferencedEntity(en);
// setAttrDTDType(dtdattr, getFactory().getDTDBasicType_CDATA()); // hack,
// so we can get back the default value
// }
// else //set default type
// setAttrDTDType(dtdattr, getFactory().getDTDBasicType_CDATA());
//
//
// }
// else
// {
// switch (attrType)
// {
// case AttNode.CDATA:
// setAttrDTDType(dtdattr, getFactory().getDTDBasicType_CDATA());
// break;
//
//
// case AttNode.ENTITIES:
// setAttrDTDType(dtdattr, getFactory().getDTDBasicType_ENTITIES());
// break;
//
//
// case AttNode.ENTITY:
// setAttrDTDType(dtdattr, getFactory().getDTDBasicType_ENTITY());
// break;
//
//
// case AttNode.ID:
// // check for duplicate ID attribute
// if (hasIDAttribute(dtdattr))
// {
// String errMsg = DTDCoreMessages.getString("_ERROR_DUP_ID_ATTRIBUTE_1");
// errMsg += attdef.name +
// DTDCoreMessages.getString("_UI_ERRORPART_DUP_ID_ATTRIBUTE_2");
// // dtdattr.getDTDElement().getIElement().setDTDErrorMessage(errMsg);
// // dtdattr.getDTDElement().getDTDFile().setParseError(true);
// parseError = true;
// }
// setAttrDTDType(dtdattr, getFactory().getDTDBasicType_ID());
// break;
//
//
// case AttNode.IDREF:
// setAttrDTDType(dtdattr, getFactory().getDTDBasicType_IDREF());
// break;
//
//
// case AttNode.IDREFS:
// setAttrDTDType(dtdattr, getFactory().getDTDBasicType_IDREFS());
// break;
//
//
// case AttNode.ENUMERATION:
// setAttrDTDType(dtdattr, createDTDEnumeration(dtdattr, attdef,
// DTDEnumGroupKind.NAME_TOKEN_GROUP));
// break;
//
//
// case AttNode.NOTATION:
// setAttrDTDType(dtdattr, createDTDEnumeration(dtdattr, attdef,
// DTDEnumGroupKind.NOTATION_GROUP));
// break;
//
//
// case AttNode.NMTOKEN:
// setAttrDTDType(dtdattr, getFactory().getDTDBasicType_NMTOKEN());
// break;
//
//
// case AttNode.NMTOKENS:
// setAttrDTDType(dtdattr, getFactory().getDTDBasicType_NMTOKENS());
// break;
//
//
// default:
// // System.out.println("DTDATTR '" +attdef.name + "'Unknown type..." +
// attrType);
// }
// }
//
//
// int attrDefault = attdef.getDefaultType();
// int defaultKind = DTDDefaultKind.IMPLIED;
// switch (attrDefault)
// {
// case AttNode.FIXED:
// defaultKind = DTDDefaultKind.FIXED;
// break;
//
//
// case AttNode.IMPLIED:
// defaultKind = DTDDefaultKind.IMPLIED;
// break;
//
//
// case AttNode.REQUIRED:
// defaultKind = DTDDefaultKind.REQUIRED;
// break;
//
//
// case AttNode.NOFIXED:
// defaultKind = DTDDefaultKind.NOFIXED;
// break;
//
//
// default:
// // System.out.println("DTDATTR '" +attdef.name + "' Unknown default
// type... " + attrDefault);
// }
//
// DTDDefaultKind defaultKindObj = DTDDefaultKind.get(defaultKind);
// dtdattr.setDefaultKind(defaultKindObj);
//
// if (parseError)
// {
// return;
// }
//
//
// String defaultValue = attdef.defaultValue;
// if (defaultValue != null)
// {
// if (attrType == AttNode.ENUMERATION || attrType == AttNode.NOTATION)
// {
// if (! isDefaultEnumValueValid(attdef,defaultValue))
// {
// String typeString =
// (attrType==AttNode.ENUMERATION?"enumeration":"notation");
// String errMsg =
// DTDCoreMessages.getString("_ERROR_INVALID_DEFAULT_ATTR_VALUE_1");
// errMsg += typeString +
// DTDCoreMessages.getString("_UI_ERRORPART_INVALID_DEFAULT_ATTR_VALUE_2");
// errMsg += attdef.name + "'";
//
//
// // dtdattr.getDTDElement().getIElement().setDTDErrorMessage(errMsg);
// // dtdattr.getDTDElement().getDTDFile().setParseError(true);
// return;
// }
// }
// dtdattr.setDefaultValueString(defaultValue);
// }
// // System.out.println("DTDAttr - toMof getDefaultValueString " +
// getDefaultValueString());
// // System.out.println("DTDAttr - toMof getDefaultValue: " +
// getDefaultValue());
// }
// /**
// * @generated
// */
// protected boolean hasIDAttributeGen(DTDAttribute dtdattr) {
//
// boolean hasID = false;
//
//
// DTDElement element = dtdattr.getDTDElement();
// EList attrs = element.getDTDAttribute();
//
//
// Iterator i = attrs.iterator();
// while (i.hasNext())
// {
// DTDAttribute attr = (DTDAttribute) i.next();
// DTDType dType = attr.getDTDType();
// if (dType instanceof DTDBasicType)
// {
// if ( ((DTDBasicType)dType).getKind().getValue() == DTDBasicTypeKind.ID)
// {
// hasID = true;
// break;
// }
// }
// }
// return hasID;
// }
// /**
// * @generated
// */
// protected DTDEnumerationType createDTDEnumerationGen(DTDAttribute
// dtdattr, String[] enumValues, int enumKind) {
//
// DTDEnumerationType enum = getFactory().createDTDEnumerationType();
// // This is gross, but this is what was done before.
// DTDAttributeImpl dtdattrimpl = (DTDAttributeImpl) dtdattr;
// // enum.setID("Enum_" +
// ((DTDElement)dtdattrimpl.getMOFDomain()).getName() + "_" +
// dtdattr.getName());
// DTDEnumGroupKind groupKind = DTDEnumGroupKind.get(enumKind);
// enum.setKind(groupKind);
// // Enumeration values
// if (enumValues!=null)
// {
// for(int i=0;i<enumValues.length;i++)
// {
// EEnumLiteral enumLiteral = createEEnumLiteral();
// // enumVal.setXMIDocument(dtdattr.getXMIDocument());
// enumLiteral.refSetLiteral(enumValues[i]);
// // enumLiteral.setNumber(i);
// enum.getEnumLiterals().add(enumLiteral);
// }
// }
// dtdattr.getDTDElement().getDTDFile().getDTDEnumerationType().add(enum);
// return enum;
// }
// /**
// * @generated
// */
// protected EEnumLiteral createEEnumLiteralGen() {
//
// EcorePackage ePackage =
// (EcorePackage)EPackage.Registry.INSTANCE.getEPackage(EcorePackage.eNS_URI);
// return ((EcoreFactory)ePackage.getFactory()).createEEnumLiteral();
// }
// /**
// * @generated
// */
// protected DTDEnumerationType createDTDEnumerationGen(DTDAttribute
// dtdattr, AttNode attdef, int enumKind) {
//
// DTDEnumerationType enum = getFactory().createDTDEnumerationType();
// // This is gross, but this is what was done before.
// DTDAttributeImpl dtdattrimpl = (DTDAttributeImpl) dtdattr;
// // enum.setID("Enum_" +
// ((DTDElement)dtdattrimpl.getMOFDomain()).getName() + "_" +
// dtdattr.getName());
// DTDEnumGroupKind groupKind = DTDEnumGroupKind.get(enumKind);
// enum.setKind(groupKind);
// dtdattr.getDTDElement().getDTDFile().getDTDEnumerationType().add(enum);
//
//
// // Enumeration values
// Enumeration tokenIter = attdef.elements();
// if (tokenIter != null) {
// int i=0;
// while (tokenIter.hasMoreElements())
// {
// String val = (String)tokenIter.nextElement();
// EEnumLiteral enumLiteral = createEEnumLiteral();
// // enumLiteral.setXMIDocument(dtdattr.getXMIDocument());
//
//
// enumLiteral.refSetLiteral(val);
// // enumLiteral.setNumber(i++);
// enum.getEnumLiterals().add(enumLiteral);
// }
// }
//
//
// return enum;
// }
// /**
// * @generated
// */
// protected boolean isDefaultEnumValueValidGen(AttNode attdef, String
// defaultValue) {
//
// boolean valid = false;
// boolean containsPercent = false;
//
//
// // Enumeration values
// Enumeration enumValues = attdef.elements();
// while (enumValues.hasMoreElements())
// {
// String val = (String)enumValues.nextElement();
// if (val.equals(defaultValue))
// {
// valid = true;
// break;
// }
// if (val.indexOf('%') >= 0)
// {
// containsPercent = true;
// }
// }
// return valid || containsPercent;
// }
// /**
// * @generated
// */
// protected void setAttrDTDTypeGen(DTDAttribute dtdattr, DTDType type) {
//
// dtdattr.setDTDType(type);
// }
// /**
// * @generated
// */
// protected void addErrorMessageGen(ErrorMessage errMsg, Object obj) {
//
// errMsg.setObject(obj);
// dtdUtil.addErrorMessage(errMsg);
// }
}