ZorbaXQItemType.java
Go to the documentation of this file.
1 /*
2  * Copyright 2006-2012 The FLWOR Foundation.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.zorbaxquery.api.xqj;
17 
18 import java.net.URI;
19 import javax.xml.namespace.QName;
20 import javax.xml.xquery.XQException;
21 import javax.xml.xquery.XQSequenceType;
22 import org.zorbaxquery.api.IdentTypes.Kind;
23 import org.zorbaxquery.api.Item;
24 import org.zorbaxquery.api.TypeIdentifier;
25 /**
26  * The ZorbaXQItemType class represents an item type as defined in XQuery 1.0: An XML Query language.
27  * The ZorbaXQItemType extends the XQSequenceType but restricts the occurrance indicator to be exactly one. This derivation allows passing an item type wherever a sequence type is expected, but not the other way. The ZorbaXQItemType interface contains methods to represent information about the following aspects of an item type:
28  *
29  * - The kind of the item - one of XQITEMKIND_* constants
30  * - The base type of the item - one of the XQBASETYPE_* constants. For atomic types this is the closest matching built-in XML Schema type, for element and attributes the closest matching built-in XML Schema type this node is based on.
31  * - Name of the node, if any
32  * - Type name, if any. If present, then also whether the typename is an anonymous type
33  * - XML Schema URI associated with the type, if any
34  * - The nillability characteristics, if any
35  *
36  * An instance of the ZorbaXQItemType is a standalone object that is independant of the XQConnection and any XQuery static or dynamic context.
37  */
38 public class ZorbaXQItemType implements javax.xml.xquery.XQItemType {
39  public static final int ZORBA_XQITEMKIND_ANY = 0;
40  public static final int ZORBA_XQITEMKIND_DOCUMENT = 1;
41  public static final int ZORBA_XQITEMKIND_ELEMENT = 2;
42  public static final int ZORBA_XQITEMKIND_ATTRIBUTE = 3;
43  public static final int ZORBA_XQITEMKIND_TEXT = 4;
44  public static final int ZORBA_XQITEMKIND_PI = 5;
45  public static final int ZORBA_XQITEMKIND_COMMENT = 6;
46 
47  private int itemKind = 0;
48  private int baseType = 0;
49  private QName nodeName = null;
50  private QName typeName = null;
51  private URI schemaURI = null;
52  private boolean allowNill = false;
53  private String piTarget = null;
54 
55  protected TypeIdentifier getTypeIdentifier() throws XQException {
56  TypeIdentifier result = null;
57  switch (itemKind) {
58  case XQITEMKIND_ATOMIC:
59  result = TypeIdentifier.createEmptyType();
60  break;
61  case XQITEMKIND_ATTRIBUTE:
62  result = TypeIdentifier.createAttributeType(schemaURI.toString(), true, nodeName.getLocalPart(), true, TypeIdentifier.createAnyNodeType());
63  break;
64  case XQITEMKIND_COMMENT:
65  result = TypeIdentifier.createCommentType();
66  break;
67  case XQITEMKIND_DOCUMENT:
68  case XQITEMKIND_DOCUMENT_ELEMENT:
69  case XQITEMKIND_DOCUMENT_SCHEMA_ELEMENT:
70  result = TypeIdentifier.createDocumentType();
71  break;
72  case XQITEMKIND_ELEMENT:
73  result = TypeIdentifier.createElementType(schemaURI.toString(), true, nodeName.getLocalPart(), true, TypeIdentifier.createAnyNodeType());
74  break;
75  case XQITEMKIND_ITEM:
76  result = TypeIdentifier.createItemType();
77  break;
78  case XQITEMKIND_NODE:
79  result = TypeIdentifier.createAnyNodeType();
80  break;
81  case XQITEMKIND_PI:
82  result = TypeIdentifier.createPIType();
83  break;
84  case XQITEMKIND_TEXT:
85  result = TypeIdentifier.createTextType();
86  break;
87  case XQITEMKIND_SCHEMA_ATTRIBUTE:
88  case XQITEMKIND_SCHEMA_ELEMENT:
89  default:
90  throw new XQException("Item kind is not valid.");
91 
92  }
93  return result;
94  }
95 
96  public ZorbaXQItemType(TypeIdentifier typeIdentifier) {
97  switch (typeIdentifier.getKind()) {
98  case Kind.ANY_NODE_TYPE:
99  itemKind = XQITEMKIND_NODE;
100  break;
101  case Kind.ATTRIBUTE_TYPE:
102  itemKind = XQITEMKIND_ATTRIBUTE;
103  break;
104  case Kind.COMMENT_TYPE:
105  itemKind = XQITEMKIND_COMMENT;
106  break;
107  case Kind.DOCUMENT_TYPE:
108  itemKind = XQITEMKIND_DOCUMENT;
109  break;
110  case Kind.ELEMENT_TYPE:
111  itemKind = XQITEMKIND_ELEMENT;
112  break;
113  case Kind.EMPTY_TYPE:
114  case Kind.INVALID_TYPE:
115  case Kind.ITEM_TYPE:
116  case Kind.NAMED_TYPE:
117  itemKind = XQITEMKIND_ITEM;
118  break;
119  case Kind.PI_TYPE:
120  itemKind = XQITEMKIND_PI;
121  break;
122  case Kind.TEXT_TYPE:
123  itemKind = XQITEMKIND_TEXT;
124  break;
125  default:
126  itemKind = XQITEMKIND_NODE;
127  break;
128  }
129 
130  String type = typeIdentifier.getLocalName();
131  baseType = ZorbaXQItemType.XQBASETYPE_ANYTYPE;
132  if (type.indexOf("anyAtomicType")>=0){
133  baseType = ZorbaXQItemType.XQBASETYPE_ANYATOMICTYPE;
134  } else if (type.indexOf("anySimpleType")>=0){
135  baseType = ZorbaXQItemType.XQBASETYPE_ANYTYPE;
136  } else if (type.indexOf("anyType")>=0){
137  baseType = ZorbaXQItemType.XQBASETYPE_ANYTYPE;
138  } else if (type.indexOf("anyURI")>=0){
139  baseType = ZorbaXQItemType.XQBASETYPE_ANYURI;
140  } else if (type.indexOf("base64Binary")>=0){
141  baseType = ZorbaXQItemType.XQBASETYPE_BASE64BINARY;
142  } else if (type.indexOf("boolean")>=0){
143  baseType = ZorbaXQItemType.XQBASETYPE_BOOLEAN;
144  } else if (type.indexOf("byte")>=0){
145  baseType = ZorbaXQItemType.XQBASETYPE_BYTE;
146  } else if (type.indexOf("dateTime")>=0){
147  baseType = ZorbaXQItemType.XQBASETYPE_DATETIME;
148  } else if (type.indexOf("date")>=0){
149  baseType = ZorbaXQItemType.XQBASETYPE_DATE;
150  } else if (type.indexOf("dayTimeDuration")>=0){
151  baseType = ZorbaXQItemType.XQBASETYPE_DAYTIMEDURATION;
152  } else if (type.indexOf("decimal")>=0){
153  baseType = ZorbaXQItemType.XQBASETYPE_DECIMAL;
154  } else if (type.indexOf("double")>=0){
155  baseType = ZorbaXQItemType.XQBASETYPE_DOUBLE;
156  } else if (type.indexOf("duration")>=0){
157  baseType = ZorbaXQItemType.XQBASETYPE_DURATION;
158  } else if (type.indexOf("ENTITIES")>=0){
159  baseType = ZorbaXQItemType.XQBASETYPE_ENTITIES;
160  } else if (type.indexOf("ENTITY")>=0){
161  baseType = ZorbaXQItemType.XQBASETYPE_ENTITY;
162  } else if (type.indexOf("float")>=0){
163  baseType = ZorbaXQItemType.XQBASETYPE_FLOAT;
164  } else if (type.indexOf("gDay")>=0){
165  baseType = ZorbaXQItemType.XQBASETYPE_GDAY;
166  } else if (type.indexOf("gMonthDay")>=0){
167  baseType = ZorbaXQItemType.XQBASETYPE_GMONTHDAY;
168  } else if (type.indexOf("gMonth")>=0){
169  baseType = ZorbaXQItemType.XQBASETYPE_GMONTH;
170  } else if (type.indexOf("gYear")>=0){
171  baseType = ZorbaXQItemType.XQBASETYPE_GYEAR;
172  } else if (type.indexOf("hexBinary")>=0){
173  baseType = ZorbaXQItemType.XQBASETYPE_HEXBINARY;
174  } else if (type.indexOf("IDREFS")>=0){
175  baseType = ZorbaXQItemType.XQBASETYPE_IDREFS;
176  } else if (type.indexOf("IDREF")>=0){
177  baseType = ZorbaXQItemType.XQBASETYPE_IDREF;
178  } else if (type.indexOf("ID")>=0){
179  baseType = ZorbaXQItemType.XQBASETYPE_ID;
180  } else if (type.indexOf("integer")>=0){
181  baseType = ZorbaXQItemType.XQBASETYPE_INTEGER;
182  } else if (type.indexOf("int")>=0){
183  baseType = ZorbaXQItemType.XQBASETYPE_INT;
184  } else if (type.indexOf("language")>=0){
185  baseType = ZorbaXQItemType.XQBASETYPE_LANGUAGE;
186  } else if (type.indexOf("long")>=0){
187  baseType = ZorbaXQItemType.XQBASETYPE_LONG;
188  } else if (type.indexOf("QName")>=0){
189  baseType = ZorbaXQItemType.XQBASETYPE_QNAME;
190  } else if (type.indexOf("NCName")>=0){
191  baseType = ZorbaXQItemType.XQBASETYPE_NCNAME;
192  } else if (type.indexOf("Name")>=0){
193  baseType = ZorbaXQItemType.XQBASETYPE_NAME;
194  } else if (type.indexOf("negativeInteger")>=0){
195  baseType = ZorbaXQItemType.XQBASETYPE_NEGATIVE_INTEGER;
196  } else if (type.indexOf("NMTOKENS")>=0){
197  baseType = ZorbaXQItemType.XQBASETYPE_NMTOKENS;
198  } else if (type.indexOf("NMTOKEN")>=0){
199  baseType = ZorbaXQItemType.XQBASETYPE_NMTOKEN;
200  } else if (type.indexOf("nonNegativeInteger")>=0){
201  baseType = ZorbaXQItemType.XQBASETYPE_NONNEGATIVE_INTEGER;
202  } else if (type.indexOf("nonPositiveInteger")>=0){
203  baseType = ZorbaXQItemType.XQBASETYPE_NONPOSITIVE_INTEGER;
204  } else if (type.indexOf("normalizedString")>=0){
205  baseType = ZorbaXQItemType.XQBASETYPE_NORMALIZED_STRING;
206  } else if (type.indexOf("NOTATION")>=0){
207  baseType = ZorbaXQItemType.XQBASETYPE_NOTATION;
208  } else if (type.indexOf("positiveInteger")>=0){
209  baseType = ZorbaXQItemType.XQBASETYPE_POSITIVE_INTEGER;
210  } else if (type.indexOf("short")>=0){
211  baseType = ZorbaXQItemType.XQBASETYPE_SHORT;
212  } else if (type.indexOf("string")>=0){
213  baseType = ZorbaXQItemType.XQBASETYPE_STRING;
214  } else if (type.indexOf("time")>=0){
215  baseType = ZorbaXQItemType.XQBASETYPE_TIME;
216  } else if (type.indexOf("token")>=0){
217  baseType = ZorbaXQItemType.XQBASETYPE_TOKEN;
218  } else if (type.indexOf("unsignedByte")>=0){
219  baseType = ZorbaXQItemType.XQBASETYPE_UNSIGNED_BYTE;
220  } else if (type.indexOf("unsignedInt")>=0){
221  baseType = ZorbaXQItemType.XQBASETYPE_UNSIGNED_INT;
222  } else if (type.indexOf("unsignedLong")>=0){
223  baseType = ZorbaXQItemType.XQBASETYPE_UNSIGNED_LONG;
224  } else if (type.indexOf("unsignedShort")>=0){
225  baseType = ZorbaXQItemType.XQBASETYPE_UNSIGNED_SHORT;
226  } else if (type.indexOf("untypedAtomic")>=0){
227  baseType = ZorbaXQItemType.XQBASETYPE_UNTYPEDATOMIC;
228  } else if (type.indexOf("untyped")>=0){
229  baseType = ZorbaXQItemType.XQBASETYPE_UNTYPED;
230  } else if (type.indexOf("yearMonthDuration")>=0){
231  baseType = ZorbaXQItemType.XQBASETYPE_YEARMONTHDURATION;
232  }
233  generateTypeName();
234  }
235  public ZorbaXQItemType(Item zorbaItem) {
236 
237  String type = "";
238  if (zorbaItem.isNode()) {
239  switch (zorbaItem.getNodeKind()) {
241  itemKind = XQITEMKIND_ELEMENT;
242  break;
244  itemKind = XQITEMKIND_ATTRIBUTE;
245  break;
247  itemKind = XQITEMKIND_COMMENT;
248  break;
250  itemKind = XQITEMKIND_DOCUMENT;
251  break;
253  itemKind = XQITEMKIND_ELEMENT;
254  break;
255  case ZORBA_XQITEMKIND_PI:
256  itemKind = XQITEMKIND_PI;
257  break;
259  itemKind = XQITEMKIND_TEXT;
260  break;
261  default:
262  itemKind = XQITEMKIND_ELEMENT;
263  break;
264 
265  }
266  } else if (zorbaItem.isAtomic()) {
267  itemKind = XQITEMKIND_ATOMIC;
268  type = zorbaItem.getType().getStringValue();
269  }
270  baseType = ZorbaXQItemType.XQBASETYPE_ANYTYPE;
271  if (type.indexOf("anyAtomicType")>=0){
272  baseType = ZorbaXQItemType.XQBASETYPE_ANYATOMICTYPE;
273  } else if (type.indexOf("anySimpleType")>=0){
274  baseType = ZorbaXQItemType.XQBASETYPE_ANYTYPE;
275  } else if (type.indexOf("anyType")>=0){
276  baseType = ZorbaXQItemType.XQBASETYPE_ANYTYPE;
277  } else if (type.indexOf("anyURI")>=0){
278  baseType = ZorbaXQItemType.XQBASETYPE_ANYURI;
279  } else if (type.indexOf("base64Binary")>=0){
280  baseType = ZorbaXQItemType.XQBASETYPE_BASE64BINARY;
281  } else if (type.indexOf("boolean")>=0){
282  baseType = ZorbaXQItemType.XQBASETYPE_BOOLEAN;
283  } else if (type.indexOf("byte")>=0){
284  baseType = ZorbaXQItemType.XQBASETYPE_BYTE;
285  } else if (type.indexOf("dateTime")>=0){
286  baseType = ZorbaXQItemType.XQBASETYPE_DATETIME;
287  } else if (type.indexOf("date")>=0){
288  baseType = ZorbaXQItemType.XQBASETYPE_DATE;
289  } else if (type.indexOf("dayTimeDuration")>=0){
290  baseType = ZorbaXQItemType.XQBASETYPE_DAYTIMEDURATION;
291  } else if (type.indexOf("decimal")>=0){
292  baseType = ZorbaXQItemType.XQBASETYPE_DECIMAL;
293  } else if (type.indexOf("double")>=0){
294  baseType = ZorbaXQItemType.XQBASETYPE_DOUBLE;
295  } else if (type.indexOf("duration")>=0){
296  baseType = ZorbaXQItemType.XQBASETYPE_DURATION;
297  } else if (type.indexOf("ENTITIES")>=0){
298  baseType = ZorbaXQItemType.XQBASETYPE_ENTITIES;
299  } else if (type.indexOf("ENTITY")>=0){
300  baseType = ZorbaXQItemType.XQBASETYPE_ENTITY;
301  } else if (type.indexOf("float")>=0){
302  baseType = ZorbaXQItemType.XQBASETYPE_FLOAT;
303  } else if (type.indexOf("gDay")>=0){
304  baseType = ZorbaXQItemType.XQBASETYPE_GDAY;
305  } else if (type.indexOf("gMonthDay")>=0){
306  baseType = ZorbaXQItemType.XQBASETYPE_GMONTHDAY;
307  } else if (type.indexOf("gMonth")>=0){
308  baseType = ZorbaXQItemType.XQBASETYPE_GMONTH;
309  } else if (type.indexOf("gYear")>=0){
310  baseType = ZorbaXQItemType.XQBASETYPE_GYEAR;
311  } else if (type.indexOf("hexBinary")>=0){
312  baseType = ZorbaXQItemType.XQBASETYPE_HEXBINARY;
313  } else if (type.indexOf("IDREFS")>=0){
314  baseType = ZorbaXQItemType.XQBASETYPE_IDREFS;
315  } else if (type.indexOf("IDREF")>=0){
316  baseType = ZorbaXQItemType.XQBASETYPE_IDREF;
317  } else if (type.indexOf("ID")>=0){
318  baseType = ZorbaXQItemType.XQBASETYPE_ID;
319  } else if (type.indexOf("integer")>=0){
320  baseType = ZorbaXQItemType.XQBASETYPE_INTEGER;
321  } else if (type.indexOf("int")>=0){
322  baseType = ZorbaXQItemType.XQBASETYPE_INT;
323  } else if (type.indexOf("language")>=0){
324  baseType = ZorbaXQItemType.XQBASETYPE_LANGUAGE;
325  } else if (type.indexOf("long")>=0){
326  baseType = ZorbaXQItemType.XQBASETYPE_LONG;
327  } else if (type.indexOf("QName")>=0){
328  baseType = ZorbaXQItemType.XQBASETYPE_QNAME;
329  } else if (type.indexOf("NCName")>=0){
330  baseType = ZorbaXQItemType.XQBASETYPE_NCNAME;
331  } else if (type.indexOf("Name")>=0){
332  baseType = ZorbaXQItemType.XQBASETYPE_NAME;
333  } else if (type.indexOf("negativeInteger")>=0){
334  baseType = ZorbaXQItemType.XQBASETYPE_NEGATIVE_INTEGER;
335  } else if (type.indexOf("NMTOKENS")>=0){
336  baseType = ZorbaXQItemType.XQBASETYPE_NMTOKENS;
337  } else if (type.indexOf("NMTOKEN")>=0){
338  baseType = ZorbaXQItemType.XQBASETYPE_NMTOKEN;
339  } else if (type.indexOf("nonNegativeInteger")>=0){
340  baseType = ZorbaXQItemType.XQBASETYPE_NONNEGATIVE_INTEGER;
341  } else if (type.indexOf("nonPositiveInteger")>=0){
342  baseType = ZorbaXQItemType.XQBASETYPE_NONPOSITIVE_INTEGER;
343  } else if (type.indexOf("normalizedString")>=0){
344  baseType = ZorbaXQItemType.XQBASETYPE_NORMALIZED_STRING;
345  } else if (type.indexOf("NOTATION")>=0){
346  baseType = ZorbaXQItemType.XQBASETYPE_NOTATION;
347  } else if (type.indexOf("positiveInteger")>=0){
348  baseType = ZorbaXQItemType.XQBASETYPE_POSITIVE_INTEGER;
349  } else if (type.indexOf("short")>=0){
350  baseType = ZorbaXQItemType.XQBASETYPE_SHORT;
351  } else if (type.indexOf("string")>=0){
352  baseType = ZorbaXQItemType.XQBASETYPE_STRING;
353  } else if (type.indexOf("time")>=0){
354  baseType = ZorbaXQItemType.XQBASETYPE_TIME;
355  } else if (type.indexOf("token")>=0){
356  baseType = ZorbaXQItemType.XQBASETYPE_TOKEN;
357  } else if (type.indexOf("unsignedByte")>=0){
358  baseType = ZorbaXQItemType.XQBASETYPE_UNSIGNED_BYTE;
359  } else if (type.indexOf("unsignedInt")>=0){
360  baseType = ZorbaXQItemType.XQBASETYPE_UNSIGNED_INT;
361  } else if (type.indexOf("unsignedLong")>=0){
362  baseType = ZorbaXQItemType.XQBASETYPE_UNSIGNED_LONG;
363  } else if (type.indexOf("unsignedShort")>=0){
364  baseType = ZorbaXQItemType.XQBASETYPE_UNSIGNED_SHORT;
365  } else if (type.indexOf("untypedAtomic")>=0){
366  baseType = ZorbaXQItemType.XQBASETYPE_UNTYPEDATOMIC;
367  } else if (type.indexOf("untyped")>=0){
368  baseType = ZorbaXQItemType.XQBASETYPE_UNTYPED;
369  } else if (type.indexOf("yearMonthDuration")>=0){
370  baseType = ZorbaXQItemType.XQBASETYPE_YEARMONTHDURATION;
371  }
372  generateTypeName();
373  }
374 
375  public ZorbaXQItemType(int itemkind, String piTarget) {
376  this.itemKind = itemkind;
377  this.piTarget = piTarget;
378  generateTypeName();
379  }
380  public ZorbaXQItemType(int itemkind) {
381  this.itemKind = itemkind;
382  generateTypeName();
383  }
384  public ZorbaXQItemType(int itemkind, int basetype) {
385  this.itemKind = itemkind;
386  this.baseType = basetype;
387  generateTypeName();
388  }
389  public ZorbaXQItemType(int itemkind, QName nodename, int basetype) {
390  this.itemKind = itemkind;
391  this.nodeName = nodename;
392  this.baseType = basetype;
393  generateTypeName();
394  }
395  public ZorbaXQItemType(int itemkind, QName nodename, int basetype, QName typename, URI schemaURI, boolean allowNill) throws XQException {
396  this.itemKind = itemkind;
397  this.nodeName = nodename;
398  this.baseType = basetype;
399  this.typeName = typename;
400  this.schemaURI = schemaURI;
401  this.allowNill = allowNill;
402  }
403  public ZorbaXQItemType(int itemkind, QName nodename, int basetype, URI schemaURI) throws XQException {
404  this.itemKind = itemkind;
405  this.nodeName = nodename;
406  this.baseType = basetype;
407  this.schemaURI = schemaURI;
408  generateTypeName();
409  }
410 
411 
412  private void generateTypeName() {
413  String namespaceURI = "http://www.w3.org/2001/XMLSchema";
414  String localPart = "untyped";
415  String prefix = "";
416 
417  switch (baseType) {
418  case ZorbaXQItemType.XQBASETYPE_ANYATOMICTYPE:
419  localPart = "anyAtomicType";
420  break;
421  case ZorbaXQItemType.XQBASETYPE_ANYSIMPLETYPE:
422  localPart = "anySimpleType";
423  break;
424  case ZorbaXQItemType.XQBASETYPE_ANYTYPE:
425  localPart = "anyType";
426  break;
427  case ZorbaXQItemType.XQBASETYPE_ANYURI:
428  localPart = "anyURI";
429  break;
430  case ZorbaXQItemType.XQBASETYPE_BASE64BINARY:
431  localPart = "base64Binary";
432  break;
433  case ZorbaXQItemType.XQBASETYPE_BOOLEAN:
434  localPart = "boolean";
435  break;
436  case ZorbaXQItemType.XQBASETYPE_BYTE:
437  localPart = "byte";
438  break;
439  case ZorbaXQItemType.XQBASETYPE_DATE:
440  localPart = "date";
441  break;
442  case ZorbaXQItemType.XQBASETYPE_DATETIME:
443  localPart = "dateTime";
444  break;
445  case ZorbaXQItemType.XQBASETYPE_DAYTIMEDURATION:
446  localPart = "dayTimeDuration";
447  break;
448  case ZorbaXQItemType.XQBASETYPE_DECIMAL:
449  localPart = "decimal";
450  break;
451  case ZorbaXQItemType.XQBASETYPE_DOUBLE:
452  localPart = "double";
453  break;
454  case ZorbaXQItemType.XQBASETYPE_DURATION:
455  localPart = "duration";
456  break;
457  case ZorbaXQItemType.XQBASETYPE_ENTITIES:
458  localPart = "ENTITIES";
459  break;
460  case ZorbaXQItemType.XQBASETYPE_ENTITY:
461  localPart = "ENTITY";
462  break;
463  case ZorbaXQItemType.XQBASETYPE_FLOAT:
464  localPart = "float";
465  break;
466  case ZorbaXQItemType.XQBASETYPE_GDAY:
467  localPart = "gDay";
468  break;
469  case ZorbaXQItemType.XQBASETYPE_GMONTH:
470  localPart = "gMonth";
471  break;
472  case ZorbaXQItemType.XQBASETYPE_GMONTHDAY:
473  localPart = "gMonthDay";
474  break;
475  case ZorbaXQItemType.XQBASETYPE_GYEAR:
476  localPart = "gYear";
477  break;
478  case ZorbaXQItemType.XQBASETYPE_GYEARMONTH:
479  localPart = "gYearMonth";
480  break;
481  case ZorbaXQItemType.XQBASETYPE_HEXBINARY:
482  localPart = "hexBinary";
483  break;
484  case ZorbaXQItemType.XQBASETYPE_ID:
485  localPart = "ID";
486  break;
487  case ZorbaXQItemType.XQBASETYPE_IDREF:
488  localPart = "IDREF";
489  break;
490  case ZorbaXQItemType.XQBASETYPE_IDREFS:
491  localPart = "IDREFS";
492  break;
493  case ZorbaXQItemType.XQBASETYPE_INT:
494  localPart = "int";
495  break;
496  case ZorbaXQItemType.XQBASETYPE_INTEGER:
497  localPart = "integer";
498  break;
499  case ZorbaXQItemType.XQBASETYPE_LANGUAGE:
500  localPart = "language";
501  break;
502  case ZorbaXQItemType.XQBASETYPE_LONG:
503  localPart = "long";
504  break;
505  case ZorbaXQItemType.XQBASETYPE_NAME:
506  localPart = "Name";
507  break;
508  case ZorbaXQItemType.XQBASETYPE_NCNAME:
509  localPart = "NCName";
510  break;
511  case ZorbaXQItemType.XQBASETYPE_NEGATIVE_INTEGER:
512  localPart = "negativeInteger";
513  break;
514  case ZorbaXQItemType.XQBASETYPE_NMTOKEN:
515  localPart = "NMTOKEN";
516  break;
517  case ZorbaXQItemType.XQBASETYPE_NMTOKENS:
518  localPart = "NMTOKENS";
519  break;
520  case ZorbaXQItemType.XQBASETYPE_NONNEGATIVE_INTEGER:
521  localPart = "nonNegativeInteger";
522  break;
523  case ZorbaXQItemType.XQBASETYPE_NONPOSITIVE_INTEGER:
524  localPart = "nonPositiveInteger";
525  break;
526  case ZorbaXQItemType.XQBASETYPE_NORMALIZED_STRING:
527  localPart = "normalizedString";
528  break;
529  case ZorbaXQItemType.XQBASETYPE_NOTATION:
530  localPart = "NOTATION";
531  break;
532  case ZorbaXQItemType.XQBASETYPE_POSITIVE_INTEGER:
533  localPart = "positiveInteger";
534  break;
535  case ZorbaXQItemType.XQBASETYPE_QNAME:
536  localPart = "QName";
537  break;
538  case ZorbaXQItemType.XQBASETYPE_SHORT:
539  localPart = "short";
540  break;
541  case ZorbaXQItemType.XQBASETYPE_STRING:
542  localPart = "string";
543  break;
544  case ZorbaXQItemType.XQBASETYPE_TIME:
545  localPart = "time";
546  break;
547  case ZorbaXQItemType.XQBASETYPE_TOKEN:
548  localPart = "token";
549  break;
550  case ZorbaXQItemType.XQBASETYPE_UNSIGNED_BYTE:
551  localPart = "unsignedByte";
552  break;
553  case ZorbaXQItemType.XQBASETYPE_UNSIGNED_INT:
554  localPart = "unsignedInt";
555  break;
556  case ZorbaXQItemType.XQBASETYPE_UNSIGNED_LONG:
557  localPart = "unsignedLong";
558  break;
559  case ZorbaXQItemType.XQBASETYPE_UNSIGNED_SHORT:
560  localPart = "unsignedShort";
561  break;
562  case ZorbaXQItemType.XQBASETYPE_UNTYPED:
563  localPart = "untyped";
564  break;
565  case ZorbaXQItemType.XQBASETYPE_UNTYPEDATOMIC:
566  localPart = "untypedAtomic";
567  break;
568  case ZorbaXQItemType.XQBASETYPE_YEARMONTHDURATION:
569  localPart = "yearMonthDuration";
570  break;
571  default:
572  localPart = "untyped";
573  break;
574  }
575  typeName = new QName(namespaceURI, localPart, prefix);
576  }
577 
578  /** \brief Returns the base type of the item.
579  *
580  * One of the XQBASETYPE_* constants.
581  *
582  * XQJ defines a constant for each of the built-in schema types defined in XML Schema. For atomic types this is the closest matching built-in XML Schema type, for element and attributes the closest matching built-in XML Schema type this node is based on.
583  *
584  * @return int one of the XQBASETYPE_* constants indicating the basic type of the item
585  * @throw XQException - if the item kind is not one of: XQITEMKIND_DOCUMENT_ELEMENT, XQITEMKIND_DOCUMENT_SCHEMA_ELEMENT, XQITEMKIND_ELEMENT, XQITEMKIND_SCHEMA_ELEMENT, XQITEMKIND_ATTRIBUTE, XQITEMKIND_SCHEMA_ATTRIBUTE, or XQITEMKIND_ATOMIC
586  */
587  @Override
588  public int getBaseType() throws XQException {
589  if (!((itemKind==ZorbaXQItemType.XQITEMKIND_DOCUMENT_ELEMENT) ||
590  (itemKind==ZorbaXQItemType.XQITEMKIND_DOCUMENT_SCHEMA_ELEMENT) ||
591  (itemKind==ZorbaXQItemType.XQITEMKIND_ELEMENT) ||
592  (itemKind==ZorbaXQItemType.XQITEMKIND_SCHEMA_ELEMENT) ||
593  (itemKind==ZorbaXQItemType.XQITEMKIND_ATTRIBUTE) ||
594  (itemKind==ZorbaXQItemType.XQITEMKIND_SCHEMA_ATTRIBUTE) ||
595  (itemKind==ZorbaXQItemType.XQITEMKIND_ATOMIC))) {
596  throw new XQException("Item kind is not valid for a Base Type.");
597  }
598  return baseType;
599  }
600 
601  /** \brief Returns the kind of the item.
602  *
603  * One of the XQITEMKIND_* constants.
604  *
605  * @return int one of the XQITEMKIND_* constants indicating the basic kind of the item
606  */
607  @Override
608  public int getItemKind() {
609  return itemKind;
610  }
611 
612  /** \brief Returns the occurrence indicator for the item type.
613  *
614  * This method will always return the value XQSequenceType.OCC_EXACTLY_ONE.
615  *
616  * @return int indicating the occurrence indicator
617  */
618  @Override
619  public int getItemOccurrence() {
620  return XQSequenceType.OCC_EXACTLY_ONE;
621  }
622 
623  /** \brief Returns the name of the node.
624  *
625  * Returns the name of the node in case the item kind is an XQITEMKIND_DOCUMENT_ELEMENT, XQITEMKIND_DOCUMENT_SCHEMA_ELEMENT, XQITEMKIND_ELEMENT, XQITEMKIND_SCHEMA_ELEMENT, XQITEMKIND_ATTRIBUTE, or XQITEMKIND_SCHEMA_ATTRIBUTE. For example, in the case of a type for element "foo" this will return the QName foo. For wildcard entries a null value will be returned.
626  *
627  * @return QName for the name of the element, attribute, or document element node. null if it is a wildcard
628  * @throw XQException - if the item kind is not one of: XQITEMKIND_DOCUMENT_ELEMENT, XQITEMKIND_DOCUMENT_SCHEMA_ELEMENT, XQITEMKIND_ELEMENT, XQITEMKIND_SCHEMA_ELEMENT, XQITEMKIND_ATTRIBUTE, or XQITEMKIND_SCHEMA_ATTRIBUTE
629  */
630  @Override
631  public QName getNodeName() throws XQException {
632  if (!((itemKind==ZorbaXQItemType.XQITEMKIND_DOCUMENT_ELEMENT) ||
633  (itemKind==ZorbaXQItemType.XQITEMKIND_DOCUMENT_SCHEMA_ELEMENT) ||
634  (itemKind==ZorbaXQItemType.XQITEMKIND_ELEMENT) ||
635  (itemKind==ZorbaXQItemType.XQITEMKIND_SCHEMA_ELEMENT) ||
636  (itemKind==ZorbaXQItemType.XQITEMKIND_ATTRIBUTE) ||
637  (itemKind==ZorbaXQItemType.XQITEMKIND_SCHEMA_ATTRIBUTE))) {
638  throw new XQException("Item kind is not valid for a Type Name.");
639  }
640  return nodeName;
641  }
642 
643  /** \brief Returns the schema location URI of the schema that contains the item's element or type definition.
644  *
645  * This method is implementation-definied and an implementation will return a null value if it does not support retrieving the schema location URI. If the item corresponds to a validated global element in a schema, the result will be the schema location URI to the XMLSchema containing the element definition. Otherwise if the item is a schema validated node, the result will be the schema location URI of the XMLSchema containing the type definition of that node. If the item is not schema validated, the result is null.
646  *
647  * @return URI representing the schema location URI of the XMLSchema containing the global element definition or the type definition of the current item. null in case the item is not schema validated or if the implementation does not support retrieving the schema URI.
648  */
649  @Override
650  public URI getSchemaURI() {
651  return schemaURI;
652  }
653 
654  /** \brief Represents a type name (global or local).
655  *
656  * This can be used to represent specific type name such as, element foo of type hatsize. The schema type name is represented as a single QName. If the return type is an anonymous type, the actual QName value returned is implementation defined.
657  *
658  * @return the QName of the schema type in case of a user defined or anonoymous types. For a built-in type, returns a predefined type name as QName (e.g.xs:anyType, xs:decimal, etc). Cannot be null.
659  * @throw XQException - if the item kind is not one of: XQITEMKIND_DOCUMENT_ELEMENT, XQITEMKIND_DOCUMENT_SCHEMA_ELEMENT, XQITEMKIND_ATOMIC, XQITEMKIND_ELEMENT, XQITEMKIND_SCHEMA_ELEMENT, XQITEMKIND_ATTRIBUTE, or XQITEMKIND_SCHEMA_ATTRIBUTE
660  */
661  @Override
662  public QName getTypeName() throws XQException {
663  if (!((itemKind==ZorbaXQItemType.XQITEMKIND_DOCUMENT_ELEMENT) ||
664  (itemKind==ZorbaXQItemType.XQITEMKIND_DOCUMENT_SCHEMA_ELEMENT) ||
665  (itemKind==ZorbaXQItemType.XQITEMKIND_ATOMIC) ||
666  (itemKind==ZorbaXQItemType.XQITEMKIND_ELEMENT) ||
667  (itemKind==ZorbaXQItemType.XQITEMKIND_SCHEMA_ELEMENT) ||
668  (itemKind==ZorbaXQItemType.XQITEMKIND_ATTRIBUTE) ||
669  (itemKind==ZorbaXQItemType.XQITEMKIND_SCHEMA_ATTRIBUTE))) {
670  throw new XQException("Item kind is not valid for a Type Name.");
671  }
672  return typeName;
673  }
674 
675  /** \brief Represents whether the item type is an anonymous type in the schema.
676  *
677  * @return true if the item type is an anonymous type in the schema, false otherwise.
678  */
679  @Override
680  public boolean isAnonymousType() {
681  return (itemKind==0);
682  }
683 
684  /** \brief Returns whether the element type is nillable or not.
685  *
686  * @return true if the element type is nillable, false otherwise.
687  */
688  @Override
689  public boolean isElementNillable() {
690  return allowNill;
691  }
692 
693  /** \brief Returns the name of the processing instruction type.
694  *
695  * As such the item kind of this ZorbaXQItemType must be XQITEMKIND_PI.
696  *
697  * @return the name of the processing instruction type. null if it is a wildcard.
698  * @throw XQException - if the item kind is not XQITEMKIND_PI
699  */
700  @Override
701  public String getPIName() throws XQException {
702  if (itemKind!=ZorbaXQItemType.XQITEMKIND_PI) {
703  throw new XQException("Item kind is not a PI.");
704  }
705  return piTarget;
706  }
707 
708  /** \brief Returns the type of the item in the sequence type.
709  *
710  * @return ZorbaXQItemType representing the item type in the sequence. null is returned in case of an empty sequence.
711  */
712  @Override
714  return this;
715  }
716 
717  /** \brief Compares the specified object with this item type for equality.
718  *
719  * The result is true only if the argument is an item type object which represents the same XQuery item type.
720  *
721  * In order to comply with the general contract of equals and hashCode across different implementations the following algorithm must be used. Return true if and only if both objects are ZorbaXQItemType and:
722  * - getItemKind() is equal
723  * - if getBaseType() is supported for the item kind, it must be equal
724  * - if getNodeName() is supported for the item kind, it must be equal
725  * - getSchemaURI() is equal
726  * - if getTypeName() is supported for the item kind, it must be equal
727  * - isAnonymousType() is equal
728  * - isElementNillable() is equal
729  * - if getPIName() is supported for the item kind, it must be equal
730  *
731  * @param o - an ZorbaXQItemType object representing an XQuery item type
732  * @return true if the input item type object represents the same XQuery item type, false otherwise
733  */
734  @Override
735  public boolean equals(Object o) {
736  boolean result = false;
737  boolean supportBaseType = false;
738  boolean supportNodeName = false;
739  boolean supportTypeName = false;
740  boolean supportPIName = false;
741  if (o instanceof ZorbaXQItemType) {
742  if ( (getItemKind()==((ZorbaXQItemType)o).getItemKind()) &&
743  (getSchemaURI()==((ZorbaXQItemType)o).getSchemaURI()) &&
744  (isAnonymousType()==((ZorbaXQItemType)o).isAnonymousType()) &&
745  (isElementNillable()==((ZorbaXQItemType)o).isElementNillable()) ) {
746  try {
747  supportBaseType = getBaseType() == ((ZorbaXQItemType)o).getBaseType();
748  } catch (Exception e) {
749  supportBaseType = true; // Not supported
750  }
751  try {
752  supportNodeName = getNodeName() == ((ZorbaXQItemType)o).getNodeName();
753  } catch (Exception e) {
754  supportNodeName = true; // Not supported
755  }
756  try {
757  supportTypeName = getTypeName().equals(((ZorbaXQItemType)o).getTypeName());
758  } catch (Exception e) {
759  supportTypeName = true; // Not supported
760  }
761  try {
762  supportPIName = getPIName().equals(((ZorbaXQItemType)o).getPIName());
763  } catch (Exception e) {
764  supportPIName = true; // Not supported
765  }
766 
767 
768  result = supportBaseType && supportNodeName && supportTypeName && supportPIName;
769  }
770  }
771  return result;
772  }
773 
774  /** \brief Returns a hash code consistent with the definition of the equals method.
775  *
776  * In order to comply with the general contract of equals and hashCode across different implementations the following algorithm must be used:
777  * \code{.java}
778  * hashCode = this.getItemKind();
779  * if this.getSchemaURI != null
780  * hashCode = 31*hashCode + this.getSchemaURI().hashCode();
781  * if this.getBaseType() is supported for the item kind
782  * hashCode = 31*hashCode + this.getbaseType();
783  * if this.getNodeName () is supported for the item kind and
784  * this.getNodeName() != null
785  * hashCode = 31*hashCode + this.getNodeName().hashCode()
786  * if this.getTypeName () is supported for the item kind
787  * hashCode = 31*hashCode + this.getTypeName().hashCode();
788  * if this.getPIName () is supported for the item kind and
789  * this.getPIName () != null
790  * hashCode = 31*hashCode + this.getPIName().hashCode();
791  * \endcode
792  *
793  * @return hash code for this item type
794  */
795  @Override
796  public int hashCode() {
797  int hashCode = 0;
798  hashCode = this.getItemKind();
799  if (this.getSchemaURI() != null) {
800  hashCode = 31*hashCode + this.getSchemaURI().hashCode();
801  }
802  try {
803  int basetype = this.getBaseType();
804  hashCode = 31*hashCode + basetype;
805  } catch (Exception e) {}
806  try {
807  QName nodename = this.getNodeName();
808  if (nodename!=null) {
809  hashCode = 31*hashCode + nodename.hashCode();
810  }
811  } catch (Exception e) {}
812  try {
813  QName typename = this.getTypeName();
814  hashCode = 31*hashCode + typename.hashCode();
815  } catch(Exception e) {}
816  try {
817  String piname = this.getPIName();
818  if (piname != null) {
819  hashCode = 31*hashCode + piname.hashCode();
820  }
821  } catch (Exception e) {}
822  return hashCode;
823  }
824 
825  /** \brief Returns a human-readable implementation-defined string representation of the item type.
826  *
827  * @return String a string representation of the item type
828  */
829  @Override
830  public String toString() {
831  StringBuffer result = new StringBuffer();
832 
833  try {
834  for (java.lang.reflect.Field field: ZorbaXQItemType.class.getFields()) {
835  if (field.getName().startsWith("XQITEMKIND_")) {
836  if (field.getInt(this)==itemKind) {
837  result.append("Item Kind: ").append(field.getName().substring(11));
838  }
839  }
840  if (field.getName().startsWith("XQBASETYPE_")) {
841  if (field.getInt(this)==baseType) {
842  result.append(" Base Type: ").append(field.getName().substring(11));
843  }
844  }
845  }
846  } catch (Exception e){
847  result.append("Item Kind or Base Type error: ").append(e.getLocalizedMessage());
848  }
849 
850  return result.toString();
851  }
852 
853 
854 }
ZorbaXQItemType(TypeIdentifier typeIdentifier)
ZorbaXQItemType(int itemkind, QName nodename, int basetype)
ZorbaXQItemType(int itemkind, QName nodename, int basetype, URI schemaURI)
String getPIName()
Returns the name of the processing instruction type.
ZorbaXQItemType(int itemkind, String piTarget)
int hashCode()
Returns a hash code consistent with the definition of the equals method.
The ZorbaXQItemType class represents an item type as defined in XQuery 1.0: An XML Query language...
String toString()
Returns a human-readable implementation-defined string representation of the item type...
ZorbaXQItemType getItemType()
Returns the type of the item in the sequence type.
int getBaseType()
Returns the base type of the item.
int getItemKind()
Returns the kind of the item.
boolean isElementNillable()
Returns whether the element type is nillable or not.
URI getSchemaURI()
Returns the schema location URI of the schema that contains the item's element or type definition...
boolean isAnonymousType()
Represents whether the item type is an anonymous type in the schema.
ZorbaXQItemType(int itemkind, int basetype)
ZorbaXQItemType(int itemkind, QName nodename, int basetype, QName typename, URI schemaURI, boolean allowNill)
QName getNodeName()
Returns the name of the node.
boolean equals(Object o)
Compares the specified object with this item type for equality.
QName getTypeName()
Represents a type name (global or local).
int getItemOccurrence()
Returns the occurrence indicator for the item type.