01: /*
02: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
03: *
04: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
05: *
06: * The contents of this file are subject to the terms of either the GNU
07: * General Public License Version 2 only ("GPL") or the Common Development
08: * and Distribution License("CDDL") (collectively, the "License"). You
09: * may not use this file except in compliance with the License. You can obtain
10: * a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
11: * or glassfish/bootstrap/legal/LICENSE.txt. See the License for the specific
12: * language governing permissions and limitations under the License.
13: *
14: * When distributing the software, include this License Header Notice in each
15: * file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
16: * Sun designates this particular file as subject to the "Classpath" exception
17: * as provided by Sun in the GPL Version 2 section of the License file that
18: * accompanied this code. If applicable, add the following below the License
19: * Header, with the fields enclosed by brackets [] replaced by your own
20: * identifying information: "Portions Copyrighted [year]
21: * [name of copyright owner]"
22: *
23: * Contributor(s):
24: *
25: * If you wish your version of this file to be governed by only the CDDL or
26: * only the GPL Version 2, indicate your decision by adding "[Contributor]
27: * elects to include this software in this distribution under the [CDDL or GPL
28: * Version 2] license." If you don't indicate a single choice of license, a
29: * recipient has the option to distribute your version of this file under
30: * either the CDDL, the GPL Version 2 or to extend the choice of license to
31: * its licensees as provided above. However, if you add GPL Version 2 code
32: * and therefore, elected the GPL Version 2 license, then the option applies
33: * only if the new code is made subject to such option by the copyright
34: * holder.
35: */
36:
37: package com.sun.tools.xjc.reader.xmlschema.ct;
38:
39: import com.sun.tools.xjc.model.CBuiltinLeafInfo;
40: import com.sun.tools.xjc.model.CPropertyInfo;
41: import com.sun.tools.xjc.reader.RawTypeSet;
42: import com.sun.tools.xjc.reader.xmlschema.RawTypeSetBuilder;
43: import com.sun.tools.xjc.reader.xmlschema.bindinfo.BIProperty;
44: import static com.sun.tools.xjc.reader.xmlschema.ct.ComplexTypeBindingMode.FALLBACK_CONTENT;
45: import com.sun.xml.xsom.XSComplexType;
46: import com.sun.xml.xsom.XSContentType;
47: import com.sun.xml.xsom.XSType;
48:
49: /**
50: * @author Kohsuke Kawaguchi
51: */
52: final class MixedComplexTypeBuilder extends CTBuilder {
53:
54: public boolean isApplicable(XSComplexType ct) {
55: XSType bt = ct.getBaseType();
56: if (bt == schemas.getAnyType() && ct.isMixed())
57: return true; // fresh mixed complex type
58:
59: // see issue 148. handle complex type extended from another and added mixed=true.
60: // the current implementation only works when the base type doesn't define
61: // any elements, and we should ideally warn it.
62: //
63: // also see issue #356 where complex type with simple content can have pointless mixed.
64: if (bt.isComplexType() && !bt.asComplexType().isMixed()
65: && ct.isMixed()
66: && ct.getDerivationMethod() == XSType.EXTENSION
67: && ct.getContentType().asParticle() != null)
68: return true;
69:
70: return false;
71: }
72:
73: public void build(XSComplexType ct) {
74: XSContentType contentType = ct.getContentType();
75:
76: // if mixed, we fallback immediately
77: builder.recordBindingMode(ct, FALLBACK_CONTENT);
78:
79: BIProperty prop = BIProperty.getCustomization(ct);
80:
81: CPropertyInfo p;
82:
83: if (contentType.asEmpty() != null) {
84: p = prop.createValueProperty("Content", false, ct,
85: CBuiltinLeafInfo.STRING, null);
86: } else {
87: RawTypeSet ts = RawTypeSetBuilder.build(contentType
88: .asParticle(), false);
89: p = prop.createReferenceProperty("Content", false, ct, ts,
90: true);
91: }
92:
93: selector.getCurrentBean().addProperty(p);
94:
95: // adds attributes and we are through.
96: green.attContainer(ct);
97: }
98:
99: }
|