001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common Development
008: * and Distribution License("CDDL") (collectively, the "License"). You
009: * may not use this file except in compliance with the License. You can obtain
010: * a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
011: * or glassfish/bootstrap/legal/LICENSE.txt. See the License for the specific
012: * language governing permissions and limitations under the License.
013: *
014: * When distributing the software, include this License Header Notice in each
015: * file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
016: * Sun designates this particular file as subject to the "Classpath" exception
017: * as provided by Sun in the GPL Version 2 section of the License file that
018: * accompanied this code. If applicable, add the following below the License
019: * Header, with the fields enclosed by brackets [] replaced by your own
020: * identifying information: "Portions Copyrighted [year]
021: * [name of copyright owner]"
022: *
023: * Contributor(s):
024: *
025: * If you wish your version of this file to be governed by only the CDDL or
026: * only the GPL Version 2, indicate your decision by adding "[Contributor]
027: * elects to include this software in this distribution under the [CDDL or GPL
028: * Version 2] license." If you don't indicate a single choice of license, a
029: * recipient has the option to distribute your version of this file under
030: * either the CDDL, the GPL Version 2 or to extend the choice of license to
031: * its licensees as provided above. However, if you add GPL Version 2 code
032: * and therefore, elected the GPL Version 2 license, then the option applies
033: * only if the new code is made subject to such option by the copyright
034: * holder.
035: */
036: package com.sun.tools.xjc.generator.bean.field;
037:
038: import com.sun.codemodel.JBlock;
039: import com.sun.codemodel.JCodeModel;
040: import com.sun.codemodel.JExpr;
041: import com.sun.codemodel.JExpression;
042: import com.sun.codemodel.JType;
043: import com.sun.codemodel.JVar;
044: import com.sun.tools.xjc.generator.bean.ClassOutlineImpl;
045: import com.sun.tools.xjc.generator.bean.MethodWriter;
046: import com.sun.tools.xjc.model.CPropertyInfo;
047: import com.sun.tools.xjc.outline.FieldAccessor;
048: import com.sun.tools.xjc.outline.FieldOutline;
049:
050: /**
051: *
052: *
053: * @author
054: * Kohsuke Kawaguchi (kohsuke.kawaguchi@sun.com)
055: */
056: public class IsSetField extends AbstractField {
057:
058: private final FieldOutline core;
059:
060: private final boolean generateUnSetMethod;
061: private final boolean generateIsSetMethod;
062:
063: protected IsSetField(ClassOutlineImpl outline, CPropertyInfo prop,
064: FieldOutline core, boolean unsetMethod, boolean issetMethod) {
065: super (outline, prop);
066: this .core = core;
067: this .generateIsSetMethod = issetMethod;
068: this .generateUnSetMethod = unsetMethod;
069:
070: generate(outline, prop);
071: }
072:
073: private void generate(ClassOutlineImpl outline, CPropertyInfo prop) {
074: // add isSetXXX and unsetXXX.
075: MethodWriter writer = outline.createMethodWriter();
076:
077: JCodeModel codeModel = outline.parent().getCodeModel();
078:
079: FieldAccessor acc = core.create(JExpr._this ());
080:
081: if (generateIsSetMethod) {
082: // [RESULT] boolean isSetXXX()
083: JExpression hasSetValue = acc.hasSetValue();
084: if (hasSetValue == null) {
085: // this field renderer doesn't support the isSet/unset methods generation.
086: // issue an error
087: throw new UnsupportedOperationException();
088: }
089: writer.declareMethod(codeModel.BOOLEAN,
090: "isSet" + this .prop.getName(true)).body()._return(
091: hasSetValue);
092: }
093:
094: if (generateUnSetMethod) {
095: // [RESULT] void unsetXXX()
096: acc.unsetValues(writer.declareMethod(codeModel.VOID,
097: "unset" + this .prop.getName(true)).body());
098: }
099: }
100:
101: public JType getRawType() {
102: return core.getRawType();
103: }
104:
105: public FieldAccessor create(JExpression targetObject) {
106: return new Accessor(targetObject);
107: }
108:
109: private class Accessor extends AbstractField.Accessor {
110:
111: private final FieldAccessor core;
112:
113: Accessor(JExpression $target) {
114: super ($target);
115: this .core = IsSetField.this .core.create($target);
116: }
117:
118: public void unsetValues(JBlock body) {
119: core.unsetValues(body);
120: }
121:
122: public JExpression hasSetValue() {
123: return core.hasSetValue();
124: }
125:
126: public void toRawValue(JBlock block, JVar $var) {
127: core.toRawValue(block, $var);
128: }
129:
130: public void fromRawValue(JBlock block, String uniqueName,
131: JExpression $var) {
132: core.fromRawValue(block, uniqueName, $var);
133: }
134: }
135: }
|