KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > sun > org > apache > xerces > internal > impl > xs > traversers > XSDAbstractIDConstraintTraverser


1 /*
2  * The Apache Software License, Version 1.1
3  *
4  *
5  * Copyright (c) 2001-2003 The Apache Software Foundation. All rights
6  * reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  * notice, this list of conditions and the following disclaimer.
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright
16  * notice, this list of conditions and the following disclaimer in
17  * the documentation and/or other materials provided with the
18  * distribution.
19  *
20  * 3. The end-user documentation included with the redistribution,
21  * if any, must include the following acknowledgment:
22  * "This product includes software developed by the
23  * Apache Software Foundation (http://www.apache.org/)."
24  * Alternately, this acknowledgment may appear in the software itself,
25  * if and wherever such third-party acknowledgments normally appear.
26  *
27  * 4. The names "Xerces" and "Apache Software Foundation" must
28  * not be used to endorse or promote products derived from this
29  * software without prior written permission. For written
30  * permission, please contact apache@apache.org.
31  *
32  * 5. Products derived from this software may not be called "Apache",
33  * nor may "Apache" appear in their name, without prior written
34  * permission of the Apache Software Foundation.
35  *
36  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
37  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
38  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
39  * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
40  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
42  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
43  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
44  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
45  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
46  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
47  * SUCH DAMAGE.
48  * ====================================================================
49  *
50  * This software consists of voluntary contributions made by many
51  * individuals on behalf of the Apache Software Foundation and was
52  * originally based on software copyright (c) 2001, International
53  * Business Machines, Inc., http://www.apache.org. For more
54  * information on the Apache Software Foundation, please see
55  * <http://www.apache.org/>.
56  */

57
58 package com.sun.org.apache.xerces.internal.impl.xs.traversers;
59
60 import com.sun.org.apache.xerces.internal.impl.xs.SchemaSymbols;
61
62 import com.sun.org.apache.xerces.internal.util.DOMUtil;
63 import org.w3c.dom.Element JavaDoc;
64 import com.sun.org.apache.xerces.internal.impl.xs.identity.*;
65 import com.sun.org.apache.xerces.internal.impl.xpath.*;
66
67 /**
68  * This class contains code that all three IdentityConstraint
69  * traversers (the XSDUniqueTraverser, XSDKeyTraverser and
70  * XSDKeyrefTraverser) rely upon.
71  *
72  * @version $Id: XSDAbstractIDConstraintTraverser.java,v 1.8 2003/06/23 16:35:22 neilg Exp $
73  */

74 class XSDAbstractIDConstraintTraverser extends XSDAbstractTraverser {
75
76     public XSDAbstractIDConstraintTraverser (XSDHandler handler,
77                                   XSAttributeChecker gAttrCheck) {
78         super(handler, gAttrCheck);
79     }
80
81     void traverseIdentityConstraint(IdentityConstraint ic,
82             Element JavaDoc icElem, XSDocumentInfo schemaDoc, Object JavaDoc [] icElemAttrs) {
83
84         // General Attribute Checking will have been done on icElem by caller
85

86         // check for <annotation> and get selector
87
Element JavaDoc sElem = DOMUtil.getFirstChildElement(icElem);
88         if(sElem == null) {
89             reportSchemaError("s4s-elt-must-match.2",
90                               new Object JavaDoc[]{"identity constraint", "(annotation?, selector, field+)"},
91                               icElem);
92             return;
93         }
94
95         // General Attribute Checking on sElem
96
// first child could be an annotation
97
if (DOMUtil.getLocalName(sElem).equals(SchemaSymbols.ELT_ANNOTATION)) {
98             ic.addAnnotation(traverseAnnotationDecl(sElem, icElemAttrs, false, schemaDoc));
99             sElem = DOMUtil.getNextSiblingElement(sElem);
100         }
101         // if no more children report an error
102
if(sElem == null) {
103             reportSchemaError("s4s-elt-must-match.2", new Object JavaDoc[]{"identity constraint", "(annotation?, selector, field+)"}, icElem);
104             return;
105         }
106         Object JavaDoc [] attrValues = fAttrChecker.checkAttributes(sElem, false, schemaDoc);
107         
108         // if more than one annotation report an error
109
if(!DOMUtil.getLocalName(sElem).equals(SchemaSymbols.ELT_SELECTOR)) {
110             reportSchemaError("s4s-elt-must-match.1", new Object JavaDoc[]{"identity constraint", "(annotation?, selector, field+)", SchemaSymbols.ELT_SELECTOR}, sElem);
111         }
112         // and make sure <selector>'s content is fine:
113
Element JavaDoc selChild = DOMUtil.getFirstChildElement(sElem);
114         
115         if (selChild !=null) {
116             // traverse annotation if any
117
if (DOMUtil.getLocalName(selChild).equals(SchemaSymbols.ELT_ANNOTATION)) {
118                 ic.addAnnotation(traverseAnnotationDecl(selChild, attrValues, false, schemaDoc));
119                 selChild = DOMUtil.getNextSiblingElement(selChild);
120             }
121             else {
122                 reportSchemaError("s4s-elt-must-match.1", new Object JavaDoc[]{SchemaSymbols.ELT_SELECTOR, "(annotation?)", DOMUtil.getLocalName(selChild)}, selChild);
123             }
124             if (selChild != null) {
125                 reportSchemaError("s4s-elt-must-match.1", new Object JavaDoc [] {SchemaSymbols.ELT_SELECTOR, "(annotation?)", DOMUtil.getLocalName(selChild)}, selChild);
126             }
127         }
128
129         String JavaDoc sText = ((String JavaDoc)attrValues[XSAttributeChecker.ATTIDX_XPATH]);
130         if(sText == null) {
131             reportSchemaError("s4s-att-must-appear", new Object JavaDoc [] {SchemaSymbols.ELT_SELECTOR, SchemaSymbols.ATT_XPATH}, sElem);
132             return;
133         }
134         sText = sText.trim();
135
136         Selector.XPath sXpath = null;
137         try {
138             sXpath = new Selector.XPath(sText, fSymbolTable,
139                                         schemaDoc.fNamespaceSupport);
140             Selector selector = new Selector(sXpath, ic);
141             ic.setSelector(selector);
142         }
143         catch (XPathException e) {
144             reportSchemaError(e.getKey(), new Object JavaDoc[]{sText}, sElem);
145             // put back attr values...
146
fAttrChecker.returnAttrArray(attrValues, schemaDoc);
147             return;
148         }
149
150         // put back attr values...
151
fAttrChecker.returnAttrArray(attrValues, schemaDoc);
152
153         // get fields
154
Element JavaDoc fElem = DOMUtil.getNextSiblingElement(sElem);
155         if(fElem == null) {
156             reportSchemaError("s4s-elt-must-match.2", new Object JavaDoc[]{"identity constraint", "(annotation?, selector, field+)"}, sElem);
157         }
158         while (fElem != null) {
159             // General Attribute Checking
160
attrValues = fAttrChecker.checkAttributes(fElem, false, schemaDoc);
161
162             if(!DOMUtil.getLocalName(fElem).equals(SchemaSymbols.ELT_FIELD))
163                 reportSchemaError("s4s-elt-must-match.1", new Object JavaDoc[]{"identity constraint", "(annotation?, selector, field+)", SchemaSymbols.ELT_FIELD}, fElem);
164             
165             // and make sure <field>'s content is fine:
166
Element JavaDoc fieldChild = DOMUtil.getFirstChildElement(fElem);
167             if (fieldChild != null) {
168                 // traverse annotation
169
if (DOMUtil.getLocalName(fieldChild).equals(SchemaSymbols.ELT_ANNOTATION)) {
170                     ic.addAnnotation(traverseAnnotationDecl(fieldChild, attrValues, false, schemaDoc));
171                     fieldChild = DOMUtil.getNextSiblingElement(fieldChild);
172                 }
173             }
174             if (fieldChild != null) {
175                 reportSchemaError("s4s-elt-must-match.1", new Object JavaDoc [] {SchemaSymbols.ELT_FIELD, "(annotation?)", DOMUtil.getLocalName(fieldChild)}, fieldChild);
176             }
177             String JavaDoc fText = ((String JavaDoc)attrValues[XSAttributeChecker.ATTIDX_XPATH]);
178             if(fText == null) {
179                 reportSchemaError("s4s-att-must-appear", new Object JavaDoc [] {SchemaSymbols.ELT_FIELD, SchemaSymbols.ATT_XPATH}, fElem);
180                 return;
181             }
182             fText = fText.trim();
183             try {
184                 Field.XPath fXpath = new Field.XPath(fText, fSymbolTable,
185                                                      schemaDoc.fNamespaceSupport);
186                 Field field = new Field(fXpath, ic);
187                 ic.addField(field);
188             }
189             catch (XPathException e) {
190                 reportSchemaError(e.getKey(), new Object JavaDoc[]{fText}, fElem);
191                 // put back attr values...
192
fAttrChecker.returnAttrArray(attrValues, schemaDoc);
193                 return;
194             }
195             fElem = DOMUtil.getNextSiblingElement(fElem);
196             // put back attr values...
197
fAttrChecker.returnAttrArray(attrValues, schemaDoc);
198         }
199
200     } // traverseIdentityConstraint(IdentityConstraint,Element, XSDocumentInfo)
201
} // XSDAbstractIDConstraintTraverser
202

203
Popular Tags