blob: 2ac59277a6f8d19d0da88e6d236853c2b51ae1dc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2002 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.internal.modelqueryimpl;
import java.util.Collection;
import java.util.Iterator;
import org.eclipse.wst.xml.core.internal.contentmodel.CMAnyElement;
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.CMGroup;
import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMAnyElementImpl;
import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMAttributeDeclarationImpl;
import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMDocumentImpl;
import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMElementDeclarationImpl;
import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMGroupImpl;
import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMNamedNodeMapImpl;
import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMNodeListImpl;
import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDescriptionBuilder;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
public class InferredGrammarFactory
{
public InferredGrammarFactory()
{
}
public CMDocument createCMDocument(String uri)
{
CMDocumentImpl cmdocument =new CMDocumentImpl(uri);
cmdocument.setInferred(true);
return cmdocument;
}
public CMElementDeclaration createCMElementDeclaration(CMDocument cmDocument, Element element, boolean isLocal)
{
String localName = element.getLocalName();
CMDocumentImpl cmDocumentImpl = (CMDocumentImpl)cmDocument;
CMNamedNodeMapImpl elementMap = isLocal ?
(CMNamedNodeMapImpl)cmDocumentImpl.getLocalElementPool() :
(CMNamedNodeMapImpl)cmDocumentImpl.getElements();
CMElementDeclarationImpl ed = (CMElementDeclarationImpl)elementMap.getNamedItem(localName);
if (ed == null)
{
//System.out.println("create ed " + localName);
ed = new CMElementDeclarationImpl(cmDocument, localName);
ed.setInferred(true);
ed.setLocal(isLocal);
ed.setMaxOccur(1);
CMGroupImpl group = new CMGroupImpl(new CMNodeListImpl(), CMGroup.CHOICE);
group.setInferred(true);
group.setMinOccur(0);
group.setMaxOccur(-1);
ed.setContent(group);
elementMap.put(ed);
}
// lookup or create the attributes
//
NamedNodeMap attributeMap = element.getAttributes();
int attributeMapLength = attributeMap.getLength();
for (int i = 0; i < attributeMapLength; i++)
{
Attr attr = (Attr)attributeMap.item(i);
CMAttributeDeclarationImpl ad = (CMAttributeDeclarationImpl)ed.getAttributeMap().getNamedItem(attr.getNodeName());
if (ad == null)
{
// todo... use an attribute pool to be more efficient?
ad = new CMAttributeDeclarationImpl(attr.getNodeName(), CMAttributeDeclaration.OPTIONAL);
ad.setInferred(true);
ed.getAttributeMap().put(ad);
}
}
return ed;
}
public void createCMContent(CMDocument parentCMDocument, CMElementDeclaration parentEd, CMDocument childCMDocument, CMElementDeclaration childEd, boolean isLocal, String uri)
{
// add element to the parent's content
// consider all content to be of the form (A | B | C)*
//
CMGroupImpl group = (CMGroupImpl)parentEd.getContent();
CMNodeListImpl groupChildNodeList = (CMNodeListImpl)group.getChildNodes();
if (parentCMDocument == childCMDocument)
{
if (!groupChildNodeList.contains(childEd))
{
groupChildNodeList.add(childEd);
}
if (isLocal)
{
CMNamedNodeMapImpl localElementMap = (CMNamedNodeMapImpl)parentEd.getLocalElements();
localElementMap.put(childEd);
}
}
else
{
CMAnyElement cmAnyElement = lookupOrCreateCMAnyElement((CMDocumentImpl)parentCMDocument, uri);
if (!groupChildNodeList.contains(cmAnyElement))
{
groupChildNodeList.add(cmAnyElement);
}
}
}
protected CMAnyElement lookupOrCreateCMAnyElement(CMDocumentImpl parentCMDocument, String uri)
{
CMNamedNodeMapImpl anyElementMap = parentCMDocument.getAnyElements();
CMAnyElementImpl anyElement = (CMAnyElementImpl)anyElementMap.getNamedItem(CMAnyElementImpl.computeNodeName(uri));
if (anyElement == null)
{
//System.out.println("create anyElement " + uri);
anyElement = new CMAnyElementImpl(uri);
anyElement.setInferred(true);
anyElementMap.put(anyElement);
}
return anyElement;
}
public void debugPrint(Collection collection)
{
for (Iterator iter = collection.iterator(); iter.hasNext(); )
{
CMDocument cmDocument = (CMDocument)iter.next();
System.out.println("-----------------------------------------------"); //$NON-NLS-1$
System.out.println("cmDocument (" + cmDocument.getProperty("http://org.eclipse.wst/cm/properties/targetNamespaceURI") +")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
CMNamedNodeMapImpl elementMap = (CMNamedNodeMapImpl)cmDocument.getElements();
int size = elementMap.getLength();
for (int i = 0; i < size; i++)
{
CMElementDeclaration ed = (CMElementDeclaration)elementMap.item(i);
CMDescriptionBuilder builder = new CMDescriptionBuilder();
System.out.println(" ELEMENT " + ed.getNodeName() + " = " + builder.buildDescription(ed)); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
}