| /******************************************************************************* |
| * 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.xsd.ui.internal; |
| import java.util.Vector; |
| |
| import org.eclipse.wst.common.contentmodel.CMNode; |
| import org.eclipse.wst.common.contentmodel.modelquery.ModelQuery; |
| import org.eclipse.wst.common.contentmodel.modelquery.extension.DataTypeValueExtension; |
| import org.eclipse.wst.xsd.ui.internal.util.TypesHelper; |
| import org.eclipse.xsd.XSDSchema; |
| import org.w3c.dom.Element; |
| import org.w3c.dom.Node; |
| |
| |
| /** |
| * This class is used to extend the ModelQuery behaviour so that we can contribute our own |
| * 'allowed values' for attributes or elements (e.g. the 'type' attribute). |
| */ |
| public abstract class AbstractXSDDataTypeValueExtension implements DataTypeValueExtension |
| { |
| protected ModelQuery modelQuery; |
| |
| public int getType() |
| { |
| return DATA_TYPE_VALUE_EXTENSION; |
| } |
| |
| public abstract String getId(); |
| |
| public AbstractXSDDataTypeValueExtension(ModelQuery modelQuery) |
| { |
| this.modelQuery = modelQuery; |
| if (modelQuery != null && modelQuery.getExtensionManager() != null) |
| { |
| modelQuery.getExtensionManager().addExtension(this); |
| } |
| } |
| |
| public void dispose() |
| { |
| if (modelQuery != null && modelQuery.getExtensionManager() != null) |
| { |
| modelQuery.getExtensionManager().removeExtension(this); |
| } |
| } |
| |
| protected abstract XSDSchema getEnclosingXSDSchema(Element element); |
| |
| |
| protected TypesHelper createTypesHelper(XSDSchema schema) |
| { |
| return new TypesHelper(schema); |
| } |
| |
| public java.util.List getDataTypeValues(Element element, CMNode cmNode) |
| { |
| java.util.List list = new Vector(); |
| if (cmNode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) |
| { |
| TypesHelper typesHelper = createTypesHelper(getEnclosingXSDSchema(element)); |
| String name = cmNode.getNodeName(); |
| String currentElementName = element.getLocalName(); |
| Node parentNode = element.getParentNode(); |
| String parentName = ""; |
| if (parentNode != null) |
| { |
| parentName = parentNode.getLocalName(); |
| } |
| |
| if (checkName(name, "type")) |
| { |
| if (checkName(currentElementName, "attribute")) |
| { |
| list = typesHelper.getBuiltInTypeNamesList(); |
| list.addAll(typesHelper.getUserSimpleTypeNamesList()); |
| } |
| else if (checkName(currentElementName, "element")) |
| { |
| list = typesHelper.getBuiltInTypeNamesList2(); |
| list.addAll(typesHelper.getUserSimpleTypeNamesList()); |
| list.addAll(typesHelper.getUserComplexTypeNamesList()); |
| } |
| } |
| else if (checkName(name, "itemType")) |
| { |
| if (checkName(currentElementName, "list")) |
| { |
| if (checkName(parentName, "simpleType")) |
| { |
| list = typesHelper.getBuiltInTypeNamesList(); |
| list.addAll(typesHelper.getUserSimpleTypeNamesList()); |
| } |
| } |
| } |
| else if (checkName(name, "memberTypes")) |
| { |
| if (checkName(currentElementName, "union")) |
| { |
| if (checkName(parentName, "simpleType")) |
| { |
| list = typesHelper.getBuiltInTypeNamesList(); |
| list.addAll(typesHelper.getUserSimpleTypeNamesList()); |
| } |
| } |
| } |
| else if (checkName(name, "base")) |
| { |
| if (checkName(currentElementName, "restriction")) |
| { |
| if (checkName(parentName, "simpleType")) |
| { |
| list = typesHelper.getBuiltInTypeNamesList(); |
| list.addAll(typesHelper.getUserSimpleTypeNamesList()); |
| } |
| else if (checkName(parentName, "simpleContent")) |
| { |
| list = typesHelper.getBuiltInTypeNamesList(); |
| list.addAll(typesHelper.getUserComplexTypeNamesList()); |
| } |
| else if (checkName(parentName, "complexContent")) |
| { |
| list = typesHelper.getBuiltInTypeNamesList(); |
| list.addAll(typesHelper.getUserComplexTypeNamesList()); |
| } |
| } |
| else if (checkName(currentElementName, "extension")) |
| { |
| if (checkName(parentName, "simpleContent")) |
| { |
| list = typesHelper.getBuiltInTypeNamesList(); |
| list.addAll(typesHelper.getUserComplexTypeNamesList()); |
| } |
| else if (checkName(parentName, "complexContent")) |
| { |
| list = typesHelper.getBuiltInTypeNamesList(); |
| list.addAll(typesHelper.getUserComplexTypeNamesList()); |
| } |
| } |
| } |
| else if (checkName(name, "ref")) |
| { |
| if (checkName(currentElementName, "element")) |
| { |
| list = typesHelper.getGlobalElements(); |
| } |
| else if (checkName(currentElementName, "attribute")) |
| { |
| list = typesHelper.getGlobalAttributes(); |
| } |
| else if (checkName(currentElementName, "attributeGroup")) |
| { |
| list = typesHelper.getGlobalAttributeGroups(); |
| } |
| else if (checkName(currentElementName, "group")) |
| { |
| list = typesHelper.getModelGroups(); |
| } |
| } |
| else if (checkName(name, "substitutionGroup")) |
| { |
| if (checkName(currentElementName, "element")) |
| { |
| list = typesHelper.getGlobalElements(); |
| } |
| } |
| /* else if (checkName(name, "refer")) |
| { |
| if (checkName(currentElementName, "keyref")) |
| { |
| list = typesHelper.getKeys(); |
| } |
| } */ |
| |
| |
| } |
| return list; |
| } |
| |
| protected boolean checkName(String localName, String token) |
| { |
| if (localName != null && localName.trim().equals(token)) |
| { |
| return true; |
| } |
| return false; |
| } |
| } |