home *** CD-ROM | disk | FTP | other *** search
- package com.extensibility.validation;
-
- import com.extensibility.dom.AttrOwnerCache;
- import com.extensibility.dom.DOMUtilities;
- import com.extensibility.util.Debug;
- import com.extensibility.util.HashVector;
- import com.extensibility.util.regexpr.Pattern;
- import com.extensibility.util.regexpr.PatternTerm;
- import com.extensibility.xml.AttributeDeclaration;
- import com.extensibility.xml.BaseDeclaration;
- import com.extensibility.xml.ContentModel;
- import com.extensibility.xml.ContentModelTerm;
- import com.extensibility.xml.ContentModelTermEnum;
- import com.extensibility.xml.ElementDeclaration;
- import com.extensibility.xml.SchemaIntf;
- import com.extensibility.xml.SchemaSpace;
- import com.extensibility.xml.URIResolver;
- import com.extensibility.xml.XMLTypeRef;
- import com.extensibility.xml.dt.DataType;
- import java.util.Enumeration;
- import java.util.Hashtable;
- import java.util.Vector;
- import org.w3c.dom.Attr;
- import org.w3c.dom.CharacterData;
- import org.w3c.dom.Document;
- import org.w3c.dom.Element;
- import org.w3c.dom.NamedNodeMap;
- import org.w3c.dom.Node;
- import org.w3c.dom.ProcessingInstruction;
-
- public final class Validator {
- static final ValidatorError NO_ERROR = new ValidatorError();
- SchemaSpace schemaSpace;
- boolean stopValidating;
- Hashtable elementPatternMap;
- HashVector elementAttributesMap;
- Vector globalAttributes;
-
- public Validator(SchemaIntf var1) {
- this(new SchemaSpace("", var1));
- }
-
- public Validator(SchemaSpace var1) {
- this.elementPatternMap = new Hashtable();
- this.elementAttributesMap = new HashVector();
- this.globalAttributes = new Vector();
- this.schemaSpace = var1;
- this.globalAttributes.addElement("xml:lang");
- this.globalAttributes.addElement("xmlns");
- this.globalAttributes.addElement("a-dtype");
- this.globalAttributes.addElement("e-dtype");
- }
-
- public void stop() {
- this.stopValidating = true;
- }
-
- public void reset() {
- this.stopValidating = false;
- }
-
- public ValidatorErrorList validateDocument(Document var1, AttrOwnerCache var2, URIResolver var3) {
- ValidatorErrorList var4 = new ValidatorErrorList();
- this.validateDocument(var1, var4, var2, var3);
- return var4;
- }
-
- public void validateDocument(Document var1, ValidatorErrorList var2, AttrOwnerCache var3, URIResolver var4) {
- for(Node var5 = var1.getFirstChild(); var5 != null; var5 = var5.getNextSibling()) {
- this.validateDeep(var5, var2, var3, var4);
- }
-
- }
-
- public void validateDeep(Node var1, ValidatorErrorList var2, AttrOwnerCache var3, URIResolver var4) {
- if (!this.stopValidating) {
- Thread.yield();
- if (var1.getNodeType() != 3 && var1.getNodeType() != 4) {
- if (var1.getNodeType() == 1) {
- this.validateElement((Element)var1, var2, var3, var4);
- NamedNodeMap var5;
- if (var3 != null) {
- var5 = var3.getNodeAttributes(var1);
- } else {
- var5 = var1.getAttributes();
- }
-
- for(int var6 = 0; var6 < var5.getLength(); ++var6) {
- this.validateAttribute(var1, (Attr)var5.item(var6), var2, var4);
- }
-
- for(Node var7 = var1.getFirstChild(); var7 != null; var7 = var7.getNextSibling()) {
- if (var7.getNodeType() != 3 && var7.getNodeType() != 4) {
- this.validateDeep(var7, var2, var3, var4);
- }
- }
- } else {
- Debug.assert(var1.getNodeType() != 2, "expected non-attribute");
- this.validateLeaf(var1, var2, var3, var4);
- }
- } else {
- this.validateDeep(var1.getParentNode(), var2, var3, var4);
- }
-
- }
- }
-
- public void validateElement(Element var1, ValidatorErrorList var2, AttrOwnerCache var3, URIResolver var4) {
- var2.remove(var1);
- this.validateElementAttributes(var1, var2, var3, var4);
- ValidatorError var5 = this.validateElementContent(var1, var4);
- if (var5 != NO_ERROR) {
- var2.add(var5);
- }
-
- }
-
- public void validateLeaf(Node var1, ValidatorErrorList var2, AttrOwnerCache var3, URIResolver var4) {
- if (var1.getNodeType() == 8) {
- var2.remove(var1);
- String var5 = var1.getNodeValue();
- if (var5 != null && var5.indexOf("--") >= 0) {
- var2.add(new ValidatorError((CharacterData)var1, "\"--\" not allowed in comment node"));
- }
- } else if (var1.getNodeType() == 7) {
- var2.remove(var1);
- String var6 = var1.getNodeValue();
- if (var6 == null || var6.trim().equals("")) {
- var2.add(new ValidatorError((ProcessingInstruction)var1, "processing instruction node needs target"));
- }
-
- if (var6.indexOf("?>") >= 0) {
- var2.add(new ValidatorError((ProcessingInstruction)var1, "\">?\" not allowed in processing instruction node"));
- }
- } else if (var1.getNodeType() == 3) {
- Node var7 = var1.getParentNode();
- if (var7 instanceof Element) {
- this.validateElement((Element)var7, var2, var3, var4);
- }
- }
-
- }
-
- public void validateAttribute(Node var1, Attr var2, ValidatorErrorList var3, URIResolver var4) {
- var3.remove(var2);
- String var5 = var2.getNodeName();
- String var6 = LeafValidator.getTrimmedNodeValue(var2);
- SchemaIntf var7 = DOMUtilities.getGoverningSchema(var1, var2, this.schemaSpace, var4);
- AttributeDeclaration var8 = var7 == null ? null : var7.getNamedAttribute(DOMUtilities.getUnqualifiedName(var1), DOMUtilities.getUnqualifiedName(var2));
- if (var8 != null) {
- DataType var9 = var8.getDataType();
- if (var9 != null) {
- String var10 = LeafValidator.validate(var7, var9, var6);
- if (var10 != null) {
- var3.add(new ValidatorError(var2, var1, var10));
- }
- } else if (var8.isEnumeration()) {
- Vector var11 = var8.getChoices();
- if (var11 != null && var11.indexOf(var6) < 0) {
- var3.add(new ValidatorError(var2, var1, "value doesn't match enumeration"));
- }
- }
- }
-
- }
-
- public void validateElementAttributes(Element var1, ValidatorErrorList var2, AttrOwnerCache var3, URIResolver var4) {
- String var5 = var1.getNodeName();
- NamedNodeMap var6;
- if (var3 != null) {
- var6 = var3.getNodeAttributes(var1);
- } else {
- var6 = var1.getAttributes();
- }
-
- int var7 = 0;
- SchemaIntf var8 = DOMUtilities.getGoverningSchema(var1, (Node)null, this.schemaSpace, var4);
- ElementDeclaration var9 = var8 == null ? null : var8.getNamedElement(DOMUtilities.getUnqualifiedName(var1));
- if (var9 != null) {
- Enumeration var10 = var9.getAttributes(true);
-
- while(var10.hasMoreElements()) {
- AttributeDeclaration var11 = (AttributeDeclaration)var10.nextElement();
- String var12 = ((BaseDeclaration)var11).getName();
- if (var6.getNamedItem(var12) != null) {
- ++var7;
- } else if (var11.getRequired()) {
- var2.add(new ValidatorError(var1, (Node)null, String.valueOf(String.valueOf("attribute \"").concat(String.valueOf(var12))).concat(String.valueOf("\" is required"))));
- }
- }
-
- if (var7 < var6.getLength()) {
- Vector var15;
- if (this.elementAttributesMap.get(var5) != null) {
- var15 = this.elementAttributesMap.getVector(var5);
- } else {
- var15 = new Vector();
- var10 = var9.getAttributes(true);
-
- while(var10.hasMoreElements()) {
- AttributeDeclaration var16 = (AttributeDeclaration)var10.nextElement();
- var15.addElement(((BaseDeclaration)var16).getName());
- }
-
- this.elementAttributesMap.put(var5, var15);
- }
-
- for(int var17 = 0; var17 < var6.getLength(); ++var17) {
- String var13 = var6.item(var17).getNodeName();
- if (var15.indexOf(var13) < 0 && this.globalAttributes.indexOf(var13) < 0 && var13.indexOf("xmlns") != 0) {
- var2.add(new ValidatorError(var1, var6.item(var17), String.valueOf(String.valueOf("undeclared attribute: \"").concat(String.valueOf(var13))).concat(String.valueOf("\""))));
- }
- }
- }
- }
-
- }
-
- public ValidatorError validateElementContent(Element var1, URIResolver var2) {
- SchemaIntf var3 = DOMUtilities.getGoverningSchema(var1, (Node)null, this.schemaSpace, var2);
- ElementDeclaration var4 = var3 == null ? null : var3.getNamedElement(DOMUtilities.getUnqualifiedName(var1));
- if (var4 == null) {
- String var12 = DOMUtilities.getNamePrefix(var1.getNodeName());
- return var12 != null && !var12.equals("") && !var12.equals("xml") && DOMUtilities.getPrefixDeclaredNamespace(var1, var12) == null ? new ValidatorError(var1, (Node)null, "invalid namespace prefix (no matching xmlns attribute)") : new ValidatorError(var1, (Node)null, "no declaration");
- } else {
- ContentModel var5 = var4.getContentModel();
- if (var5.isTextOnly()) {
- for(Node var13 = var1.getFirstChild(); var13 != null; var13 = var13.getNextSibling()) {
- if (var13.getNodeType() == 1) {
- return new ValidatorError(var1, var13, "elements not allowed in text-only content");
- }
- }
-
- DataType var14 = var4.getDataType();
- if (var14 != null) {
- String var15 = DOMUtilities.getTextValue(var1, var3);
- String var16 = LeafValidator.validate(var3, var14, var15);
- if (var16 != null) {
- return new ValidatorError(var1, (Node)null, var16);
- }
- }
-
- return NO_ERROR;
- } else if (var5.isAny()) {
- return this.validateANY(var1, var2);
- } else if (var5.isEmpty()) {
- return var1.getFirstChild() == null ? NO_ERROR : new ValidatorError(var1, (Node)null, "nothing allowed in empty content");
- } else {
- Pattern var6 = this.getPattern(DOMUtilities.getXMLTypeRef(var1, (Node)null, this.schemaSpace.getDefaultNS()), var5);
- NodePatternInput var7 = new NodePatternInput(var1, var5.isOpen(), this.schemaSpace.getDefaultNS());
- Vector var8 = new Vector();
- if (var6.matches(var7, var8)) {
- return NO_ERROR;
- } else {
- Node var9 = var7.hasNext() ? var7.peekNextNode() : null;
- if (var8.size() == 0) {
- return new ValidatorError(var1, var9, String.valueOf("unexpected content at ").concat(String.valueOf(var9.getNodeName())));
- } else {
- String var10 = null;
- Enumeration var11 = var8.elements();
-
- while(var11.hasMoreElements()) {
- if (var10 == null) {
- var10 = var11.nextElement().toString();
- } else {
- var10 = String.valueOf(var10).concat(String.valueOf(String.valueOf(" or ").concat(String.valueOf(var11.nextElement().toString()))));
- }
- }
-
- return new ValidatorError(var1, var9, String.valueOf("expected ").concat(String.valueOf(var10)));
- }
- }
- }
- }
- }
-
- public boolean isValidCandidate(Element var1, Node var2, String var3, URIResolver var4) {
- SchemaIntf var5 = DOMUtilities.getGoverningSchema(var1, (Node)null, this.schemaSpace, var4);
- ElementDeclaration var6 = var5 == null ? null : var5.getNamedElement(DOMUtilities.getUnqualifiedName(var1));
- if (var6 == null) {
- return false;
- } else {
- ContentModel var7 = var6.getContentModel();
- Pattern var8 = this.getPattern(DOMUtilities.getXMLTypeRef(var1, (Node)null, this.schemaSpace.getDefaultNS()), var7);
- NodePatternInput var9 = new NodePatternInput(var1, var2, var3, var7.isOpen(), this.schemaSpace.getDefaultNS());
- return var8.matches(var9);
- }
- }
-
- public Vector getPotentialChildren(Element var1, Node var2, URIResolver var3) {
- Vector var4 = new Vector();
- SchemaIntf var5 = DOMUtilities.getGoverningSchema(var1, (Node)null, this.schemaSpace, var3);
- ElementDeclaration var6 = var5 == null ? null : var5.getNamedElement(DOMUtilities.getUnqualifiedName(var1));
- if (var6 != null) {
- ContentModel var7 = var6.getContentModel();
- if (!var7.isTextOnly()) {
- if (var7.isAny()) {
- Enumeration var8 = var5.getElementDeclarations();
-
- while(var8.hasMoreElements()) {
- var4.addElement(((ElementDeclaration)var8.nextElement()).getName());
- }
- } else if (!var7.isEmpty()) {
- XMLTypeRef var19 = DOMUtilities.getXMLTypeRef(var1, (Node)null, this.schemaSpace.getDefaultNS());
- Pattern var9 = this.getPattern(var19, var7);
- NodePatternInput var10 = new NodePatternInput(var1, var2, var7.isOpen(), this.schemaSpace.getDefaultNS());
- Vector var11 = new Vector();
- var9.matches(var10, var11);
- String var12 = var19.getElementNamespace();
- if (var10.hasNext()) {
- var11 = var9.getFollowers(var2 == null ? null : var2.getNodeName());
- } else {
- String var13 = var10.getPatternNS();
- Node var14;
- if (var2 == null) {
- var14 = NodePatternInput.skipWhitespace(var1.getFirstChild(), this.schemaSpace.getDefaultNS(), var13);
- } else {
- var14 = NodePatternInput.skipWhitespace(var2.getNextSibling(), this.schemaSpace.getDefaultNS(), var13);
- }
-
- if (var14 != null && this.indexOfNode(var11, var14) >= 0) {
- String var15 = var14.getNodeName();
-
- while(true) {
- Node var16 = NodePatternInput.skipWhitespace(var14.getNextSibling(), this.schemaSpace.getDefaultNS(), var13);
- if (var16 == null || !var16.getNodeName().equals(var15)) {
- Vector var25 = new Vector();
- var9.matches(new NodePatternInput(var1, var14, var7.isOpen(), this.schemaSpace.getDefaultNS()), var25);
- if (this.indexOfNode(var25, var14) == -1) {
- var11.removeElementAt(this.indexOfNode(var11, var14));
- }
- break;
- }
-
- var14 = var16;
- }
- }
- }
-
- ContentModelTermEnum var20 = ((ContentModelTerm)var7).getLeafTerms();
- Vector var21 = new Vector();
-
- while(var20.hasMoreElements()) {
- ContentModelTerm var22 = var20.nextContentModelTerm();
- ContentModelPatternTerm var26 = new ContentModelPatternTerm(var12, var22);
- String var17 = var22.getTerm();
- String var18 = var26.getTermQualifiedName();
- if (indexOfName(var11, var18) >= 0 && var21.indexOf(var17) < 0) {
- var21.addElement(var17);
- }
- }
-
- var4 = var21;
- String var23 = DOMUtilities.getNamespacePrefix(var12, var1);
- if (var23 != null && !var23.equals("")) {
- var23 = String.valueOf(var23).concat(String.valueOf(":"));
-
- for(int var27 = 0; var27 < var4.size(); ++var27) {
- String var28 = (String)var4.elementAt(var27);
- if (var28.indexOf(":") == -1) {
- var4.setElementAt(String.valueOf(var23).concat(String.valueOf(var28)), var27);
- }
- }
- }
- }
- }
- }
-
- var4.removeElement("#PCDATA");
- return var4;
- }
-
- protected static int indexOfName(Vector var0, String var1) {
- for(int var2 = 0; var2 < var0.size(); ++var2) {
- if (((PatternTerm)var0.elementAt(var2)).matches(var1)) {
- return var2;
- }
- }
-
- return -1;
- }
-
- protected int indexOfNode(Vector var1, Node var2) {
- XMLTypeRef var3 = DOMUtilities.getXMLTypeRef(var2, (Node)null, this.schemaSpace.getDefaultNS());
- String var4 = var3.getFullName();
- return indexOfName(var1, var4);
- }
-
- protected Pattern getPattern(XMLTypeRef var1, ContentModel var2) {
- Pattern var3 = (Pattern)this.elementPatternMap.get(var1);
- if (var3 == null) {
- var3 = new Pattern(new ContentModelPatternTerm(var1.getElementNamespace(), var2));
- this.elementPatternMap.put(var1, var3);
- }
-
- return var3;
- }
-
- public ValidatorError validateANY(Element var1, URIResolver var2) {
- SchemaIntf var3 = DOMUtilities.getGoverningSchema(var1, (Node)null, this.schemaSpace, var2);
- if (var3 != null) {
- for(Node var4 = var1.getFirstChild(); var4 != null; var4 = var4.getNextSibling()) {
- if (var4.getNodeType() == 1) {
- String var5 = var4.getNodeName();
- if (var3.getNamedElement(var5) == null) {
- return new ValidatorError(var1, var4, "unrecognized member for ANY content");
- }
- }
- }
- }
-
- return NO_ERROR;
- }
- }
-