| /******************************************************************************* |
| * Copyright (c) 2002, 2006 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$ |
| } |
| } |
| } |
| } |