| /******************************************************************************* |
| * Copyright (c) 2004, 2008 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.html.core.internal.contentmodel; |
| |
| |
| |
| import java.lang.reflect.Field; |
| import java.util.Arrays; |
| import java.util.Enumeration; |
| import java.util.Iterator; |
| import java.util.Vector; |
| |
| import org.eclipse.wst.html.core.internal.provisional.HTMLCMProperties; |
| import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; |
| import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; |
| import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; |
| 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.CMNamedNodeMap; |
| import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; |
| |
| /** |
| * Factory for element declarations of the JSP 1.1 and 1.2. |
| */ |
| class JSPElementCollection extends DeclCollection implements JSP11Namespace.ElementName { |
| |
| |
| class TypePacket { |
| public String name = null; |
| public int content = CMElementDeclaration.EMPTY; |
| public int omit = HTMLElementDeclaration.OMIT_NONE; |
| public int lineBreak = HTMLElementDeclaration.BREAK_NONE; |
| public int layout = HTMLElementDeclaration.LAYOUT_NONE; |
| public int correct = HTMLElementDeclaration.CORRECT_NONE; |
| public int format = HTMLElementDeclaration.FORMAT_XML; |
| public boolean indentChild = false; |
| |
| public TypePacket() { |
| } |
| } |
| |
| /** JSP element declaration. */ |
| class ElemDecl extends CMContentImpl implements HTMLElementDeclaration, HTMLPropertyDeclaration { |
| private TypePacket type = null; |
| private CMGroupImpl content = null; |
| private CMNamedNodeMapImpl attributes = null; |
| |
| public ElemDecl(TypePacket t) { |
| super(t.name, 1, 1); |
| type = t; |
| } |
| |
| public void setContent(CMGroupImpl group) { |
| content = group; |
| } |
| |
| public void setAttributes(CMNamedNodeMapImpl attrs) { |
| attributes = attrs; |
| } |
| |
| // implements CMNode |
| public int getNodeType() { |
| return CMNode.ELEMENT_DECLARATION; |
| } |
| |
| public boolean supports(String propertyName) { |
| if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) { |
| return true; |
| } |
| else if (propertyName.equals(HTMLCMProperties.CONTENT_HINT)) { |
| return true; |
| } |
| else { |
| PropertyProvider pp = PropertyProviderFactory.getProvider(propertyName); |
| if (pp == null) |
| return false; |
| return pp.supports(this); |
| } |
| } |
| |
| public Object getProperty(String propertyName) { |
| if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) { |
| return Boolean.FALSE; //D208839 |
| } |
| else if (propertyName.equals(HTMLCMProperties.CONTENT_HINT)) { |
| String myName = getElementName(); |
| if (myName == JSP11Namespace.ElementName.PLUGIN) { |
| return getNamedItem(JSP11Namespace.ElementName.PARAMS); // outer class method. |
| } |
| else if (myName == JSP11Namespace.ElementName.PARAMS) { |
| return getNamedItem(JSP11Namespace.ElementName.PARAM); // outer class method. |
| } |
| else { |
| return null; |
| } |
| } |
| else { |
| PropertyProvider pp = PropertyProviderFactory.getProvider(propertyName); |
| if (pp == null) |
| return null; |
| return pp.get(this); |
| } |
| } |
| |
| // implementes CMElementDeclaration |
| public CMNamedNodeMap getAttributes() { |
| return attributes; |
| } |
| |
| public CMContent getContent() { |
| return content; |
| } |
| |
| public int getContentType() { |
| return type.content; |
| } |
| |
| public CMDataType getDataType() { |
| return null; |
| } |
| |
| public String getElementName() { |
| return getNodeName(); |
| } |
| |
| public CMNamedNodeMap getLocalElements() { |
| return null; |
| } |
| |
| // implementes HTMLElementDeclaration |
| public HTMLAttributeDeclaration getAttributeDeclaration(String attrName) { |
| if (attributes == null) |
| return null; |
| return (HTMLAttributeDeclaration) attributes.getNamedItem(attrName); |
| } |
| |
| public int getCorrectionType() { |
| return type.correct; |
| } |
| |
| public CMContent getExclusion() { |
| return null; |
| } |
| |
| public CMContent getInclusion() { |
| return null; |
| } |
| |
| public CMNamedNodeMap getProhibitedAncestors() { |
| return EMPTY_MAP; |
| } |
| |
| public int getFormatType() { |
| return type.format; |
| } |
| |
| public int getLayoutType() { |
| return type.layout; |
| } |
| |
| public int getLineBreakHint() { |
| return type.lineBreak; |
| } |
| |
| public int getOmitType() { |
| return type.omit; |
| } |
| |
| public boolean shouldTerminateAt(HTMLElementDeclaration dec) { |
| return false; |
| } |
| |
| public boolean shouldKeepSpaces() { |
| return false; |
| } |
| |
| public boolean shouldIndentChildSource() { |
| return type.indentChild; |
| } |
| |
| public boolean isJSP() { |
| return true; |
| } |
| } |
| |
| // element IDs |
| static class Ids { |
| public static final int ID_SCRIPTLET = 0; |
| public static final int ID_EXPRESSION = 1; |
| public static final int ID_DECLARATION = 2; |
| public static final int ID_DIRECTIVE_PAGE = 3; |
| public static final int ID_DIRECTIVE_INCLUDE = 4; |
| public static final int ID_DIRECTIVE_TAGLIB = 5; |
| public static final int ID_USEBEAN = 6; |
| public static final int ID_SETPROPERTY = 7; |
| public static final int ID_GETPROPERTY = 8; |
| public static final int ID_INCLUDE = 9; |
| public static final int ID_FORWARD = 10; |
| public static final int ID_PLUGIN = 11; |
| public static final int ID_PARAMS = 12; |
| public static final int ID_FALLBACK = 13; |
| public static final int ID_PARAM = 14; |
| public static final int ID_ROOT = 15; |
| public static final int ID_TEXT = 16; |
| |
| public static int getNumOfIds() { |
| if (numofids != -1) |
| return numofids; |
| |
| // NOTE: If the reflection is too slow, this method should |
| // just return the literal value, like 105. |
| // -- 5/25/2001 |
| Class clazz = Ids.class; |
| Field[] fields = clazz.getFields(); |
| numofids = 0; |
| for (int i = 0; i < fields.length; i++) { |
| String name = fields[i].getName(); |
| if (name.startsWith("ID_"))//$NON-NLS-1$ |
| numofids++; |
| } |
| return numofids; |
| } |
| |
| // chache the result of the reflection. |
| private static int numofids = -1; |
| } |
| |
| // attribute creater |
| class JACreater implements JSP11Namespace { |
| // attribute declaration |
| class AttrDecl extends CMNodeImpl implements HTMLAttributeDeclaration { |
| HTMLCMDataTypeImpl type = null; |
| int usage = CMAttributeDeclaration.OPTIONAL; |
| |
| // methods |
| public AttrDecl(String attrName) { |
| super(attrName); |
| } |
| |
| public String getAttrName() { |
| return getNodeName(); |
| } |
| |
| public CMDataType getAttrType() { |
| return type; |
| } |
| |
| /** @deprecated by superclass */ |
| public String getDefaultValue() { |
| if (type.getImpliedValueKind() != CMDataType.IMPLIED_VALUE_DEFAULT) |
| return null; |
| return type.getImpliedValue(); |
| } |
| |
| /** @deprecated by superclass */ |
| public Enumeration getEnumAttr() { |
| Vector v = new Vector(Arrays.asList(type.getEnumeratedValues())); |
| return v.elements(); |
| } |
| |
| public int getNodeType() { |
| return CMNode.ATTRIBUTE_DECLARATION; |
| } |
| |
| public int getUsage() { |
| return usage; |
| } |
| |
| public boolean shouldIgnoreCase() { |
| return false; |
| } |
| } |
| |
| CMNamedNodeMapImpl declarations = null; |
| |
| public JACreater() { |
| declarations = new CMNamedNodeMapImpl(); |
| } |
| |
| public CMNamedNodeMapImpl getDeclarations(int eid) { |
| switch (eid) { |
| case Ids.ID_DIRECTIVE_PAGE : |
| createForDirPage(); |
| break; |
| case Ids.ID_DIRECTIVE_INCLUDE : |
| createForDirInclude(); |
| break; |
| case Ids.ID_DIRECTIVE_TAGLIB : |
| createForDirTaglib(); |
| break; |
| case Ids.ID_USEBEAN : |
| createForUseBean(); |
| break; |
| case Ids.ID_SETPROPERTY : |
| createForSetProperty(); |
| break; |
| case Ids.ID_GETPROPERTY : |
| createForGetProperty(); |
| break; |
| case Ids.ID_INCLUDE : |
| createForInclude(); |
| break; |
| case Ids.ID_FORWARD : |
| createForForward(); |
| break; |
| case Ids.ID_PLUGIN : |
| createForPlugin(); |
| break; |
| case Ids.ID_PARAM : |
| createForParam(); |
| break; |
| case Ids.ID_ROOT : |
| createForRoot(); |
| break; |
| default : |
| // should warn. |
| break; |
| } |
| return declarations; |
| } |
| |
| AttrDecl createBoolType(String name, String defValue) { |
| AttrDecl adec = new AttrDecl(name); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.ENUM); |
| String[] values = {ATTR_VALUE_TRUE, ATTR_VALUE_FALSE}; |
| adec.type.setEnumValues(values); |
| adec.type.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, defValue); |
| return adec; |
| } |
| |
| private void createForDirPage() { |
| AttrDecl adec = null; |
| // ("language" CDATA DECLARED "java") |
| adec = new AttrDecl(ATTR_NAME_LANGUAGE); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| adec.type.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_JAVA); |
| declarations.putNamedItem(ATTR_NAME_LANGUAGE, adec); |
| |
| // ("extends" CDATA IMPLIED) |
| adec = new AttrDecl(ATTR_NAME_EXTENDS); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| declarations.putNamedItem(ATTR_NAME_EXTENDS, adec); |
| |
| // ("contentType" CDATA DECLARED "text/html; ISO-8859-1") |
| adec = new AttrDecl(ATTR_NAME_CONTENT_TYPE); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| adec.type.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_CT_DEFAULT); |
| declarations.putNamedItem(ATTR_NAME_CONTENT_TYPE, adec); |
| |
| // ("import" CDATA IMPLIED) |
| adec = new AttrDecl(ATTR_NAME_IMPORT); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| declarations.putNamedItem(ATTR_NAME_IMPORT, adec); |
| |
| // ("session" ENUM DECLARED (true|false) "true") |
| adec = createBoolType(ATTR_NAME_SESSION, ATTR_VALUE_TRUE); |
| if (adec != null) |
| declarations.putNamedItem(ATTR_NAME_SESSION, adec); |
| |
| // ("buffer" CDATA DECLARED "8kb") |
| adec = new AttrDecl(ATTR_NAME_BUFFER); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| adec.type.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_BUFSIZ_DEFAULT); |
| declarations.putNamedItem(ATTR_NAME_BUFFER, adec); |
| |
| // ("autoFlush" ENUM DECLARED (true|false) "true") |
| adec = createBoolType(ATTR_NAME_AUTOFLUSH, ATTR_VALUE_TRUE); |
| if (adec != null) |
| declarations.putNamedItem(ATTR_NAME_AUTOFLUSH, adec); |
| |
| // ("isThreadSafe" ENUM DECLARED (true|false) "true") |
| adec = createBoolType(ATTR_NAME_IS_THREAD_SAFE, ATTR_VALUE_TRUE); |
| if (adec != null) |
| declarations.putNamedItem(ATTR_NAME_IS_THREAD_SAFE, adec); |
| |
| // ("info" CDATA IMPLIED) |
| adec = new AttrDecl(ATTR_NAME_INFO); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| declarations.putNamedItem(ATTR_NAME_INFO, adec); |
| |
| // ("errorPage" URI IMPLIED) |
| adec = new AttrDecl(ATTR_NAME_ERROR_PAGE); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.URI); |
| declarations.putNamedItem(ATTR_NAME_ERROR_PAGE, adec); |
| |
| // ("isErrorPage" ENUM DECLARED (true|false) "false") |
| adec = createBoolType(ATTR_NAME_IS_ERROR_PAGE, ATTR_VALUE_FALSE); |
| if (adec != null) |
| declarations.putNamedItem(ATTR_NAME_IS_ERROR_PAGE, adec); |
| |
| // ("pageEncoding" CDATA IMPLIED) |
| adec = new AttrDecl(ATTR_NAME_PAGE_ENCODING); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| declarations.putNamedItem(ATTR_NAME_PAGE_ENCODING, adec); |
| |
| } |
| |
| private void createForDirInclude() { |
| // ("file" URI REQUIRED); Defect TORO:185241 |
| AttrDecl adec = new AttrDecl(ATTR_NAME_FILE); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.URI); |
| adec.usage = CMAttributeDeclaration.REQUIRED; |
| declarations.putNamedItem(ATTR_NAME_FILE, adec); |
| } |
| |
| private void createForDirTaglib() { |
| // ("uri" URI REQUIRED) |
| AttrDecl adec = new AttrDecl(ATTR_NAME_URI); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.URI); |
| adec.usage = CMAttributeDeclaration.REQUIRED; |
| declarations.putNamedItem(ATTR_NAME_URI, adec); |
| |
| // ("prefix" CDATA REQUIRED) |
| adec = new AttrDecl(ATTR_NAME_PREFIX); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| adec.usage = CMAttributeDeclaration.REQUIRED; |
| declarations.putNamedItem(ATTR_NAME_PREFIX, adec); |
| } |
| |
| private void createForUseBean() { |
| // ("id" ID REQUIRED) |
| AttrDecl adec = new AttrDecl(ATTR_NAME_ID); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.ID); |
| adec.usage = CMAttributeDeclaration.REQUIRED; |
| declarations.putNamedItem(ATTR_NAME_ID, adec); |
| |
| // ("scope" ENUM DECLARED (page|session|request|application) "page") |
| adec = new AttrDecl(ATTR_NAME_SCOPE); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.ENUM); |
| String[] values = {ATTR_VALUE_PAGE, ATTR_VALUE_SESSION, ATTR_VALUE_REQUEST, ATTR_VALUE_APPLICATION}; |
| adec.type.setEnumValues(values); |
| adec.type.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_PAGE); |
| declarations.putNamedItem(ATTR_NAME_SCOPE, adec); |
| |
| // ("class" CDATA IMPLIED) |
| adec = new AttrDecl(ATTR_NAME_CLASS); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| declarations.putNamedItem(ATTR_NAME_CLASS, adec); |
| |
| // ("beanName" CDATA IMPLIED) |
| adec = new AttrDecl(ATTR_NAME_BEAN_NAME); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| declarations.putNamedItem(ATTR_NAME_BEAN_NAME, adec); |
| |
| // ("type" CDATA IMPLIED) |
| adec = new AttrDecl(ATTR_NAME_TYPE); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| declarations.putNamedItem(ATTR_NAME_TYPE, adec); |
| } |
| |
| private void createForSetProperty() { |
| // ("name" IDREF REQUIRED) |
| AttrDecl adec = new AttrDecl(ATTR_NAME_NAME); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.IDREF); |
| adec.usage = CMAttributeDeclaration.REQUIRED; |
| declarations.putNamedItem(ATTR_NAME_NAME, adec); |
| |
| // ("property" CDATA REQUIRED) |
| adec = new AttrDecl(ATTR_NAME_PROPERTY); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| adec.usage = CMAttributeDeclaration.REQUIRED; |
| declarations.putNamedItem(ATTR_NAME_PROPERTY, adec); |
| |
| // ("value" CDATA IMPLIED) |
| adec = new AttrDecl(ATTR_NAME_VALUE); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| declarations.putNamedItem(ATTR_NAME_VALUE, adec); |
| |
| // ("param" CDATA IMPLIED) |
| adec = new AttrDecl(ATTR_NAME_PARAM); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| declarations.putNamedItem(ATTR_NAME_PARAM, adec); |
| |
| } |
| |
| private void createForGetProperty() { |
| // ("name" IDREF REQUIRED) |
| AttrDecl adec = new AttrDecl(ATTR_NAME_NAME); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.IDREF); |
| adec.usage = CMAttributeDeclaration.REQUIRED; |
| declarations.putNamedItem(ATTR_NAME_NAME, adec); |
| |
| // ("property" CDATA REQUIRED) |
| adec = new AttrDecl(ATTR_NAME_PROPERTY); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| adec.usage = CMAttributeDeclaration.REQUIRED; |
| declarations.putNamedItem(ATTR_NAME_PROPERTY, adec); |
| |
| } |
| |
| private void createForInclude() { |
| AttrDecl adec = null; |
| // ("page" URI REQUIRED) |
| adec = new AttrDecl(ATTR_NAME_PAGE); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.URI); |
| adec.usage = CMAttributeDeclaration.REQUIRED; |
| declarations.putNamedItem(ATTR_NAME_PAGE, adec); |
| |
| // ("flush" ENUM OPTIONAL (true|false)); Defect TORO:185241 |
| adec = new AttrDecl(ATTR_NAME_FLUSH); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.ENUM); |
| adec.usage = CMAttributeDeclaration.OPTIONAL; |
| String[] values = {ATTR_VALUE_TRUE, ATTR_VALUE_FALSE}; |
| adec.type.setEnumValues(values); |
| adec.type.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_FALSE); |
| declarations.putNamedItem(ATTR_NAME_FLUSH, adec); |
| } |
| |
| private void createForForward() { |
| // ("page" URI REQUIRED) |
| AttrDecl adec = new AttrDecl(ATTR_NAME_PAGE); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.URI); |
| adec.usage = CMAttributeDeclaration.REQUIRED; |
| declarations.putNamedItem(ATTR_NAME_PAGE, adec); |
| } |
| |
| private void createForPlugin() { |
| // ("type" ENUM REQUIRED (bean|applet)) |
| AttrDecl adec = new AttrDecl(ATTR_NAME_TYPE); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.ENUM); |
| adec.usage = CMAttributeDeclaration.REQUIRED; |
| String[] values = {ATTR_VALUE_BEAN, ATTR_VALUE_APPLET}; |
| adec.type.setEnumValues(values); |
| declarations.putNamedItem(ATTR_NAME_TYPE, adec); |
| |
| // ("code" CDATA REQUIRED) |
| adec = new AttrDecl(ATTR_NAME_CODE); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.URI); |
| adec.usage = CMAttributeDeclaration.REQUIRED; |
| declarations.putNamedItem(ATTR_NAME_CODE, adec); |
| |
| // ("codebase" URI REQUIRED) |
| adec = new AttrDecl(ATTR_NAME_CODEBASE); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.URI); |
| adec.usage = CMAttributeDeclaration.REQUIRED; |
| declarations.putNamedItem(ATTR_NAME_CODEBASE, adec); |
| |
| // ("align" ENUM IMPLIED (top|middle|bottom|left|right)) |
| adec = new AttrDecl(ATTR_NAME_ALIGN); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.ENUM); |
| String[] aligns = {ATTR_VALUE_TOP, ATTR_VALUE_MIDDLE, ATTR_VALUE_BOTTOM, ATTR_VALUE_LEFT, ATTR_VALUE_RIGHT}; |
| adec.type.setEnumValues(aligns); |
| declarations.putNamedItem(ATTR_NAME_ALIGN, adec); |
| |
| // ("archive" CDATA IMPLIED) |
| adec = new AttrDecl(ATTR_NAME_ARCHIVE); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| declarations.putNamedItem(ATTR_NAME_ARCHIVE, adec); |
| |
| // ("height" CDATA IMPLIED) |
| adec = new AttrDecl(ATTR_NAME_HEIGHT); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| declarations.putNamedItem(ATTR_NAME_HEIGHT, adec); |
| |
| // ("hspace" CDATA IMPLIED) |
| adec = new AttrDecl(ATTR_NAME_HSPACE); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| declarations.putNamedItem(ATTR_NAME_HSPACE, adec); |
| |
| // ("jreversion" CDATA DECLARED "1.1") |
| adec = new AttrDecl(ATTR_NAME_JREVERSION); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| adec.type.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_JVER11); |
| declarations.putNamedItem(ATTR_NAME_JREVERSION, adec); |
| |
| // ("name" CDATA IMPLIED) |
| adec = new AttrDecl(ATTR_NAME_NAME); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| declarations.putNamedItem(ATTR_NAME_NAME, adec); |
| |
| // ("vspace" CDATA IMPLIED) |
| adec = new AttrDecl(ATTR_NAME_VSPACE); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| declarations.putNamedItem(ATTR_NAME_VSPACE, adec); |
| |
| // ("width" CDATA IMPLIED) |
| adec = new AttrDecl(ATTR_NAME_WIDTH); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| declarations.putNamedItem(ATTR_NAME_WIDTH, adec); |
| |
| // ("nspluginurl" URI IMPLIED) |
| adec = new AttrDecl(ATTR_NAME_NSPLUGINURL); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.URI); |
| declarations.putNamedItem(ATTR_NAME_NSPLUGINURL, adec); |
| |
| // ("iepluginurl" URI IMPLIED) |
| adec = new AttrDecl(ATTR_NAME_IEPLUGINURL); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.URI); |
| declarations.putNamedItem(ATTR_NAME_IEPLUGINURL, adec); |
| } |
| |
| private void createForParam() { |
| // ("name" CDATA REQUIRED) |
| AttrDecl adec = new AttrDecl(ATTR_NAME_NAME); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| adec.usage = CMAttributeDeclaration.REQUIRED; |
| declarations.putNamedItem(ATTR_NAME_NAME, adec); |
| |
| // ("value" CDATA REQUIRED); Defect TORO:185241 |
| adec = new AttrDecl(ATTR_NAME_VALUE); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| adec.usage = CMAttributeDeclaration.REQUIRED; |
| declarations.putNamedItem(ATTR_NAME_VALUE, adec); |
| |
| } |
| |
| private void createForRoot() { |
| // ("xmlns:jsp" CDATA "http://java.sun.com/JSP/Page") |
| AttrDecl adec = new AttrDecl(ATTR_NAME_XMLNS_JSP); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| adec.type.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_XMLNS_JSP); |
| declarations.putNamedItem(ATTR_NAME_XMLNS_JSP, adec); |
| // ("version" CDATA REQUIRED) |
| adec = new AttrDecl(ATTR_NAME_VERSION); |
| adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); |
| adec.usage = CMAttributeDeclaration.REQUIRED; |
| declarations.putNamedItem(ATTR_NAME_VERSION, adec); |
| } |
| } |
| |
| private final static CMNamedNodeMap EMPTY_MAP = new CMNamedNodeMap() { |
| public int getLength() { |
| return 0; |
| } |
| |
| public CMNode getNamedItem(String name) { |
| return null; |
| } |
| |
| public CMNode item(int index) { |
| return null; |
| } |
| |
| public Iterator iterator() { |
| return new Iterator() { |
| public boolean hasNext() { |
| return false; |
| } |
| |
| public Object next() { |
| return null; |
| } |
| |
| public void remove() { |
| } |
| }; |
| } |
| }; |
| private static String[] names = null; |
| |
| static { |
| names = new String[Ids.getNumOfIds()]; |
| names[Ids.ID_SCRIPTLET] = SCRIPTLET; |
| names[Ids.ID_EXPRESSION] = EXPRESSION; |
| names[Ids.ID_DECLARATION] = DECLARATION; |
| names[Ids.ID_DIRECTIVE_PAGE] = DIRECTIVE_PAGE; |
| names[Ids.ID_DIRECTIVE_INCLUDE] = DIRECTIVE_INCLUDE; |
| names[Ids.ID_DIRECTIVE_TAGLIB] = DIRECTIVE_TAGLIB; |
| names[Ids.ID_USEBEAN] = USEBEAN; |
| names[Ids.ID_SETPROPERTY] = SETPROPERTY; |
| names[Ids.ID_GETPROPERTY] = GETPROPERTY; |
| names[Ids.ID_INCLUDE] = INCLUDE; |
| names[Ids.ID_FORWARD] = FORWARD; |
| names[Ids.ID_PLUGIN] = PLUGIN; |
| names[Ids.ID_PARAMS] = PARAMS; |
| names[Ids.ID_FALLBACK] = FALLBACK; |
| names[Ids.ID_PARAM] = PARAM; |
| names[Ids.ID_ROOT] = ROOT; |
| names[Ids.ID_TEXT] = TEXT; |
| } |
| |
| JSPElementCollection(String[] names, boolean tolerant) { |
| super(names, tolerant); |
| } |
| |
| /** |
| */ |
| public JSPElementCollection() { |
| super(names, TOLERANT_CASE); |
| } |
| |
| /** |
| * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNode |
| * @param elementName java.lang.String |
| */ |
| protected CMNode create(String elementName) { |
| return createElemDecl(getID(elementName)); |
| } |
| |
| /** |
| * @param eid int |
| */ |
| CMGroupImpl createContent(int eid) { |
| if (eid == ID_UNKNOWN) |
| return null; |
| |
| CMGroupImpl content = null; |
| CMNode child = null; |
| |
| switch (eid) { |
| case Ids.ID_INCLUDE : |
| case Ids.ID_FORWARD : |
| // (jsp:param)* |
| content = new CMGroupImpl(CMGroup.SEQUENCE, 0, CMContentImpl.UNBOUNDED); |
| child = item(Ids.ID_PARAM); |
| if (child != null) |
| content.appendChild(child); |
| break; |
| case Ids.ID_PLUGIN : |
| // (jsp:params | jsp:fallback)? |
| content = new CMGroupImpl(CMGroup.CHOICE, 0, 1); |
| // jsp:params |
| child = item(Ids.ID_PARAMS); |
| if (child != null) |
| content.appendChild(child); |
| // jsp:fallback |
| child = item(Ids.ID_FALLBACK); |
| if (child != null) |
| content.appendChild(child); |
| break; |
| case Ids.ID_PARAMS : |
| // (jsp:param)+ |
| content = new CMGroupImpl(CMGroup.SEQUENCE, 1, CMContentImpl.UNBOUNDED); |
| child = item(Ids.ID_PARAM); |
| if (child != null) |
| content.appendChild(child); |
| break; |
| case Ids.ID_ROOT : |
| // %Body; |
| // --> (jsp:text|%Directives;|%Scripts;|%Actions;)* |
| // %Directives --> jsp:directive.page|jsp:directive.include |
| // %Scripts; --> jsp:scriptlet|jsp:declaration|jsp:expression |
| // %Actions --> jsp:useBean|jsp.setProperty|jsp:getProperty |
| // |jsp:include|jsp:forward|jsp:plugin |
| content = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED); |
| int validChildren[] = {Ids.ID_TEXT, |
| // %Directves; |
| Ids.ID_DIRECTIVE_PAGE, Ids.ID_DIRECTIVE_INCLUDE, |
| // %Scripts; |
| Ids.ID_SCRIPTLET, Ids.ID_DECLARATION, Ids.ID_EXPRESSION, |
| // %Actions; |
| Ids.ID_USEBEAN, Ids.ID_SETPROPERTY, Ids.ID_GETPROPERTY, Ids.ID_INCLUDE, Ids.ID_FORWARD, Ids.ID_PLUGIN}; |
| for (int i = 0; i < validChildren.length; i++) { |
| child = item(validChildren[i]); |
| if (child != null) |
| content.appendChild(child); |
| } |
| break; |
| } |
| |
| return content; |
| } |
| |
| /** |
| * @param eid int |
| */ |
| HTMLElementDeclaration createElemDecl(int eid) { |
| if (eid == ID_UNKNOWN) |
| return null; |
| |
| TypePacket packet = new TypePacket(); |
| switch (eid) { |
| case Ids.ID_SCRIPTLET : |
| // content, omit, lineBreak, layout, correct, format |
| // scriptlet |
| packet.name = SCRIPTLET; |
| packet.content = CMElementDeclaration.CDATA; |
| packet.layout = HTMLElementDeclaration.LAYOUT_OBJECT; |
| packet.format = HTMLElementDeclaration.FORMAT_JSP_SCRIPT; |
| break; |
| case Ids.ID_EXPRESSION : |
| // expression |
| packet.name = EXPRESSION; |
| packet.content = CMElementDeclaration.CDATA; |
| packet.layout = HTMLElementDeclaration.LAYOUT_OBJECT; |
| packet.format = HTMLElementDeclaration.FORMAT_JSP_SCRIPT; |
| break; |
| case Ids.ID_DECLARATION : |
| // declaration |
| packet.name = DECLARATION; |
| packet.content = CMElementDeclaration.CDATA; |
| packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN; |
| packet.format = HTMLElementDeclaration.FORMAT_JSP_SCRIPT; |
| break; |
| case Ids.ID_DIRECTIVE_PAGE : |
| // directive.page |
| packet.name = DIRECTIVE_PAGE; |
| packet.omit = HTMLElementDeclaration.OMIT_END; |
| packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN; |
| packet.format = HTMLElementDeclaration.FORMAT_JSP_DIRECTIVE; |
| break; |
| case Ids.ID_DIRECTIVE_INCLUDE : |
| // directive.inlcude |
| packet.name = DIRECTIVE_INCLUDE; |
| packet.omit = HTMLElementDeclaration.OMIT_END; |
| packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN; |
| packet.format = HTMLElementDeclaration.FORMAT_JSP_DIRECTIVE; |
| break; |
| case Ids.ID_DIRECTIVE_TAGLIB : |
| // directive.taglib |
| packet.name = DIRECTIVE_TAGLIB; |
| packet.omit = HTMLElementDeclaration.OMIT_END; |
| packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN; |
| packet.format = HTMLElementDeclaration.FORMAT_JSP_DIRECTIVE; |
| break; |
| case Ids.ID_USEBEAN : |
| // useBean |
| packet.name = USEBEAN; |
| packet.content = CMElementDeclaration.ANY; |
| packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN; |
| packet.indentChild = true; |
| break; |
| case Ids.ID_SETPROPERTY : |
| // setProperty |
| packet.name = SETPROPERTY; |
| packet.omit = HTMLElementDeclaration.OMIT_END; |
| packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN; |
| break; |
| case Ids.ID_GETPROPERTY : |
| // getProperty |
| packet.name = GETPROPERTY; |
| packet.omit = HTMLElementDeclaration.OMIT_END; |
| packet.layout = HTMLElementDeclaration.LAYOUT_OBJECT; |
| break; |
| case Ids.ID_INCLUDE : |
| // include |
| packet.name = INCLUDE; |
| packet.content = CMElementDeclaration.ELEMENT; |
| packet.omit = HTMLElementDeclaration.OMIT_END; |
| packet.layout = HTMLElementDeclaration.LAYOUT_OBJECT; |
| packet.indentChild = true; |
| break; |
| case Ids.ID_FORWARD : |
| // forward |
| packet.name = FORWARD; |
| packet.content = CMElementDeclaration.ELEMENT; |
| packet.omit = HTMLElementDeclaration.OMIT_END; |
| packet.layout = HTMLElementDeclaration.LAYOUT_OBJECT; |
| packet.indentChild = true; |
| break; |
| case Ids.ID_PLUGIN : |
| // plugin |
| packet.name = PLUGIN; |
| packet.content = CMElementDeclaration.ELEMENT; |
| packet.layout = HTMLElementDeclaration.LAYOUT_OBJECT; |
| packet.indentChild = true; |
| break; |
| case Ids.ID_PARAMS : |
| // params |
| packet.name = PARAMS; |
| packet.content = CMElementDeclaration.ELEMENT; |
| packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN; |
| packet.indentChild = true; |
| break; |
| case Ids.ID_FALLBACK : |
| // fallback |
| packet.name = FALLBACK; |
| packet.content = CMElementDeclaration.CDATA; |
| packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN; |
| break; |
| case Ids.ID_PARAM : |
| // param |
| packet.name = PARAM; |
| packet.omit = HTMLElementDeclaration.OMIT_END; |
| packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN; |
| break; |
| case Ids.ID_ROOT : |
| packet.name = ROOT; |
| packet.content = CMElementDeclaration.ELEMENT; |
| packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN; // same as HTML |
| break; |
| case Ids.ID_TEXT : |
| packet.name = TEXT; |
| packet.content = CMElementDeclaration.PCDATA; |
| break; |
| default : |
| // unknown ID |
| return null; |
| } |
| |
| ElemDecl dec = new ElemDecl(packet); |
| |
| CMGroupImpl content = createContent(eid); |
| if (content != null) |
| dec.setContent(content); |
| |
| JACreater creater = new JACreater(); |
| dec.setAttributes(creater.getDeclarations(eid)); |
| |
| return dec; |
| } |
| } |