1 /*
2  * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
3  */
4 /*
5  * Licensed to the Apache Software Foundation (ASF) under one or more
6  * contributor license agreements.  See the NOTICE file distributed with
7  * this work for additional information regarding copyright ownership.
8  * The ASF licenses this file to You under the Apache License, Version 2.0
9  * (the "License"); you may not use this file except in compliance with
10  * the License.  You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */
20 
21 package com.sun.org.apache.xerces.internal.impl.dv.xs;
22 
23 import com.sun.org.apache.xerces.internal.impl.dv.XSSimpleType;
24 import com.sun.org.apache.xerces.internal.impl.dv.XSFacets;
25 import com.sun.org.apache.xerces.internal.util.SymbolHash;
26 import com.sun.org.apache.xerces.internal.xs.XSConstants;
27 
28 /**
29  * the factory to create/return built-in schema DVs and create user-defined DVs
30  *
31  * @xerces.internal
32  *
33  * @author Neeraj Bajaj, Sun Microsystems, inc.
34  * @author Sandy Gao, IBM
35  *
36  * @LastModified: Nov 2017
37  */
38 public class FullDVFactory extends BaseDVFactory {
39 
40     static final String URI_SCHEMAFORSCHEMA = "http://www.w3.org/2001/XMLSchema";
41 
42     // there are 45 types. 89 is the closest prime number to 45*2=90.
43     static SymbolHash fFullTypes = new SymbolHash(89);
44     static {
45         createBuiltInTypes(fFullTypes);
46     }
47 
48     /**
49      * Get a built-in simple type of the given name
50      * REVISIT: its still not decided within the Schema WG how to define the
51      *          ur-types and if all simple types should be derived from a
52      *          complex type, so as of now we ignore the fact that anySimpleType
53      *          is derived from anyType, and pass 'null' as the base of
54      *          anySimpleType. It needs to be changed as per the decision taken.
55      *
56      * @param name  the name of the datatype
57      * @return      the datatype validator of the given name
58      */
getBuiltInType(String name)59     public XSSimpleType getBuiltInType(String name) {
60         return (XSSimpleType)fFullTypes.get(name);
61     }
62 
63     /**
64      * get all built-in simple types, which are stored in a hashtable keyed by
65      * the name
66      *
67      * @return      a hashtable which contains all built-in simple types
68      */
getBuiltInTypes()69     public SymbolHash getBuiltInTypes() {
70         return fFullTypes.makeClone();
71     }
72 
73     // create all built-in types
createBuiltInTypes(SymbolHash types)74     static void createBuiltInTypes(SymbolHash types) {
75         // create base types first
76         BaseDVFactory.createBuiltInTypes(types);
77 
78         // full schema simple type names
79         final String DOUBLE            = "double";
80         final String DURATION          = "duration";
81         final String ENTITY            = "ENTITY";
82         final String ENTITIES          = "ENTITIES";
83         final String FLOAT             = "float";
84         final String HEXBINARY         = "hexBinary";
85         final String ID                = "ID";
86         final String IDREF             = "IDREF";
87         final String IDREFS            = "IDREFS";
88         final String NAME              = "Name";
89         final String NCNAME            = "NCName";
90         final String NMTOKEN           = "NMTOKEN";
91         final String NMTOKENS          = "NMTOKENS";
92         final String LANGUAGE          = "language";
93         final String NORMALIZEDSTRING  = "normalizedString";
94         final String NOTATION          = "NOTATION";
95         final String QNAME             = "QName";
96         final String STRING            = "string";
97         final String TOKEN             = "token";
98 
99         final XSFacets facets = new XSFacets();
100 
101         XSSimpleTypeDecl anySimpleType = XSSimpleTypeDecl.fAnySimpleType;
102         XSSimpleTypeDecl stringDV = (XSSimpleTypeDecl)types.get(STRING);
103 
104         types.put(FLOAT, new XSSimpleTypeDecl(anySimpleType, FLOAT, XSSimpleTypeDecl.DV_FLOAT, XSSimpleType.ORDERED_PARTIAL, true, true, true, true, XSConstants.FLOAT_DT));
105         types.put(DOUBLE, new XSSimpleTypeDecl(anySimpleType, DOUBLE, XSSimpleTypeDecl.DV_DOUBLE, XSSimpleType.ORDERED_PARTIAL, true, true, true, true, XSConstants.DOUBLE_DT));
106         types.put(DURATION, new XSSimpleTypeDecl(anySimpleType, DURATION, XSSimpleTypeDecl.DV_DURATION, XSSimpleType.ORDERED_PARTIAL, false, false, false, true, XSConstants.DURATION_DT));
107         types.put(HEXBINARY, new XSSimpleTypeDecl(anySimpleType, HEXBINARY, XSSimpleTypeDecl.DV_HEXBINARY, XSSimpleType.ORDERED_FALSE, false, false, false, true, XSConstants.HEXBINARY_DT));
108         types.put(QNAME, new XSSimpleTypeDecl(anySimpleType, QNAME, XSSimpleTypeDecl.DV_QNAME, XSSimpleType.ORDERED_FALSE, false, false, false, true, XSConstants.QNAME_DT));
109         types.put(NOTATION, new XSSimpleTypeDecl(anySimpleType, NOTATION, XSSimpleTypeDecl.DV_NOTATION, XSSimpleType.ORDERED_FALSE, false, false, false, true, XSConstants.NOTATION_DT));
110 
111         facets.whiteSpace =  XSSimpleType.WS_REPLACE;
112         XSSimpleTypeDecl normalizedDV = new XSSimpleTypeDecl(stringDV, NORMALIZEDSTRING , URI_SCHEMAFORSCHEMA, (short)0, false, null, XSConstants.NORMALIZEDSTRING_DT);
113         normalizedDV.applyFacets1(facets, XSSimpleType.FACET_WHITESPACE, (short)0 );
114         types.put(NORMALIZEDSTRING, normalizedDV);
115 
116         facets.whiteSpace = XSSimpleType.WS_COLLAPSE;
117         XSSimpleTypeDecl tokenDV = new XSSimpleTypeDecl(normalizedDV, TOKEN , URI_SCHEMAFORSCHEMA, (short)0, false, null, XSConstants.TOKEN_DT);
118         tokenDV.applyFacets1(facets, XSSimpleType.FACET_WHITESPACE, (short)0 );
119         types.put(TOKEN, tokenDV);
120 
121         facets.whiteSpace = XSSimpleType.WS_COLLAPSE;
122         facets.pattern  = "([a-zA-Z]{1,8})(-[a-zA-Z0-9]{1,8})*";
123         XSSimpleTypeDecl languageDV = new XSSimpleTypeDecl(tokenDV, LANGUAGE , URI_SCHEMAFORSCHEMA, (short)0, false, null, XSConstants.LANGUAGE_DT);
124         languageDV.applyFacets1(facets, (short)(XSSimpleType.FACET_WHITESPACE | XSSimpleType.FACET_PATTERN) ,(short)0);
125         types.put(LANGUAGE, languageDV);
126 
127         facets.whiteSpace =  XSSimpleType.WS_COLLAPSE;
128         XSSimpleTypeDecl nameDV = new XSSimpleTypeDecl(tokenDV, NAME , URI_SCHEMAFORSCHEMA, (short)0, false, null, XSConstants.NAME_DT);
129         nameDV.applyFacets1(facets, XSSimpleType.FACET_WHITESPACE, (short)0, XSSimpleTypeDecl.SPECIAL_PATTERN_NAME);
130         types.put(NAME, nameDV);
131 
132         facets.whiteSpace = XSSimpleType.WS_COLLAPSE;
133         XSSimpleTypeDecl ncnameDV = new XSSimpleTypeDecl(nameDV, NCNAME , URI_SCHEMAFORSCHEMA, (short)0, false, null, XSConstants.NCNAME_DT) ;
134         ncnameDV.applyFacets1(facets, XSSimpleType.FACET_WHITESPACE, (short)0, XSSimpleTypeDecl.SPECIAL_PATTERN_NCNAME);
135         types.put(NCNAME, ncnameDV);
136 
137         types.put(ID, new XSSimpleTypeDecl(ncnameDV,  ID, XSSimpleTypeDecl.DV_ID, XSSimpleType.ORDERED_FALSE, false, false, false , true, XSConstants.ID_DT));
138         XSSimpleTypeDecl idrefDV = new XSSimpleTypeDecl(ncnameDV,  IDREF , XSSimpleTypeDecl.DV_IDREF, XSSimpleType.ORDERED_FALSE, false, false, false, true, XSConstants.IDREF_DT);
139         types.put(IDREF, idrefDV);
140 
141         facets.minLength = 1;
142         XSSimpleTypeDecl tempDV = new XSSimpleTypeDecl(null, URI_SCHEMAFORSCHEMA, (short)0, idrefDV, true, null);
143         XSSimpleTypeDecl idrefsDV = new XSSimpleTypeDecl(tempDV, IDREFS, URI_SCHEMAFORSCHEMA, (short)0, false, null);
144         idrefsDV.applyFacets1(facets, XSSimpleType.FACET_MINLENGTH, (short)0);
145         types.put(IDREFS, idrefsDV);
146 
147         XSSimpleTypeDecl entityDV = new XSSimpleTypeDecl(ncnameDV, ENTITY , XSSimpleTypeDecl.DV_ENTITY, XSSimpleType.ORDERED_FALSE, false, false, false, true, XSConstants.ENTITY_DT);
148         types.put(ENTITY, entityDV);
149 
150         facets.minLength = 1;
151         tempDV = new XSSimpleTypeDecl(null, URI_SCHEMAFORSCHEMA, (short)0, entityDV, true, null);
152         XSSimpleTypeDecl entitiesDV = new XSSimpleTypeDecl(tempDV, ENTITIES, URI_SCHEMAFORSCHEMA, (short)0, false, null);
153         entitiesDV.applyFacets1(facets, XSSimpleType.FACET_MINLENGTH, (short)0);
154         types.put(ENTITIES, entitiesDV);
155 
156 
157         facets.whiteSpace  = XSSimpleType.WS_COLLAPSE;
158         XSSimpleTypeDecl nmtokenDV = new XSSimpleTypeDecl(tokenDV, NMTOKEN, URI_SCHEMAFORSCHEMA, (short)0, false, null, XSConstants.NMTOKEN_DT);
159         nmtokenDV.applyFacets1(facets, XSSimpleType.FACET_WHITESPACE, (short)0, XSSimpleTypeDecl.SPECIAL_PATTERN_NMTOKEN);
160         types.put(NMTOKEN, nmtokenDV);
161 
162         facets.minLength = 1;
163         tempDV = new XSSimpleTypeDecl(null, URI_SCHEMAFORSCHEMA, (short)0, nmtokenDV, true, null);
164         XSSimpleTypeDecl nmtokensDV = new XSSimpleTypeDecl(tempDV, NMTOKENS, URI_SCHEMAFORSCHEMA, (short)0, false, null);
165         nmtokensDV.applyFacets1(facets, XSSimpleType.FACET_MINLENGTH, (short)0);
166         types.put(NMTOKENS, nmtokensDV);
167     }//createBuiltInTypes(SymbolHash)
168 
169 }//XFormsDVFactory
170