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
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package org.netbeans.modules.visualweb.jsfsupport.designtime;
043:
044: import javax.faces.el.EvaluationException;
045: import javax.faces.el.PropertyNotFoundException;
046: import javax.faces.el.PropertyResolver;
047:
048: import com.sun.rave.designtime.DesignBean;
049: import com.sun.rave.designtime.DesignProperty;
050: import javax.el.ELException;
051: import javax.el.ExpressionFactory;
052: import javax.faces.context.FacesContext;
053:
054: /**
055: * DesignTimePropertyResolver provides a JSF property resolver for design-time property lookup
056: *
057: * @author Carl Quinn
058: * @author Winston Prakash - Modifications to support JSF 1.2
059: * @version 1.0
060: */
061: public class DesignTimePropertyResolver extends PropertyResolver {
062:
063: protected PropertyResolver nested;
064:
065: public DesignTimePropertyResolver(PropertyResolver nested) {
066: this .nested = nested;
067: //Trace.trace("jsfsupport.container", "DesignTimePropertyResolver2 ");
068: }
069:
070: private DesignBean findLiveDescendent(DesignBean base, String name) {
071: // TODO Try to get access to the read only list instead
072: DesignBean[] kids = base.getDesignContext().getBeans();
073: for (int i = 0; i < kids.length; i++) {
074: if (kids[i].getInstanceName().equals(name)) {
075: //!CQ TODO: maybe verify that base is really an ancestor...
076: return kids[i];
077: }
078: }
079: return null;
080: }
081:
082: // Specified by javax.faces.el.PropertyResolver.getValue(Object, Object)
083: public Object getValue(Object base, Object property) {
084: //Trace.trace("jsfsupport.container", "MPR getValue " + base + " " + property);
085: if (base instanceof DesignBean) {
086: DesignBean lbbase = (DesignBean) base;
087: try {
088: FacesContext context = FacesContext
089: .getCurrentInstance();
090: ExpressionFactory exprFactory = context
091: .getApplication().getExpressionFactory();
092: String name = (String) exprFactory.coerceToType(
093: property, String.class);
094: DesignProperty lp = lbbase.getProperty(name);
095: if (lp != null) {
096: Object o = lp.getValue();
097: // if (o instanceof ResultSet)
098: // ResultSetPropertyResolver.initResultSet((ResultSet)o);
099: return o;
100: }
101: if (lbbase.isContainer()) {
102: DesignBean lb = findLiveDescendent(
103: ((DesignBean) base), name);
104: if (lb != null) {
105: Object o = lb.getInstance();
106: // if (o instanceof ResultSet)
107: // ResultSetPropertyResolver.initResultSet((ResultSet)o);
108: return o;
109: }
110: }
111: } catch (ELException e) {
112: // TODO Auto-generated catch block
113: e.printStackTrace();
114: }
115: throw new PropertyNotFoundException("" + property);
116: }
117: return nested.getValue(base, property);
118: }
119:
120: // Specified by javax.faces.el.PropertyResolver.getValue(Object,int)
121: public Object getValue(Object base, int index) {
122: return nested.getValue(base, index);
123: //!CQ TODO: indexed properties
124: }
125:
126: // Specified by javax.faces.el.PropertyResolver.setValue(Object,Object,Object)
127: public void setValue(Object base, Object property, Object value) {
128: //Trace.trace("jsfsupport.container", "MPR setValue " + base + " " + property + " " + value);
129: if (base instanceof DesignBean) {
130: DesignBean lbbase = (DesignBean) base;
131: try {
132: FacesContext context = FacesContext
133: .getCurrentInstance();
134: ExpressionFactory exprFactory = context
135: .getApplication().getExpressionFactory();
136: String name = (String) exprFactory.coerceToType(
137: property, String.class);
138: DesignProperty lp = lbbase.getProperty(name);
139: if (lp != null) {
140: lp.setValue(value);
141: return;
142: }
143: if (lbbase.isContainer()) {
144: DesignBean lb = findLiveDescendent(lbbase, name);
145: if (lb != null)
146: throw new EvaluationException(
147: "Illegal setting of immutable property: "
148: + base + " . " + name);
149: }
150: } catch (ELException e) {
151: }
152: throw new PropertyNotFoundException("" + property);
153: } else {
154: nested.setValue(base, property, value);
155: }
156: }
157:
158: // Specified by javax.faces.el.PropertyResolver.setValue(Object,int,Object)
159: public void setValue(Object base, int index, Object value) {
160: nested.setValue(base, index, value);
161: //!CQ TODO: indexed properties
162: }
163:
164: // Specified by javax.faces.el.PropertyResolver.isReadOnly(Object,String)
165: public boolean isReadOnly(Object base, Object property) {
166: if (base instanceof DesignBean) {
167: DesignBean lbbase = (DesignBean) base;
168: try {
169: FacesContext context = FacesContext
170: .getCurrentInstance();
171: ExpressionFactory exprFactory = context
172: .getApplication().getExpressionFactory();
173: String name = (String) exprFactory.coerceToType(
174: property, String.class);
175: DesignProperty lp = lbbase.getProperty(name);
176: if (lp != null)
177: return lp.getPropertyDescriptor().getWriteMethod() == null;
178: if (lbbase.isContainer()) {
179: DesignBean lb = findLiveDescendent(lbbase, name);
180: if (lb != null)
181: return true;
182: }
183: } catch (ELException e) {
184: }
185: throw new PropertyNotFoundException("" + property);
186: }
187: return nested.isReadOnly(base, property);
188: }
189:
190: // Specified by javax.faces.el.PropertyResolver.isReadOnly(Object,int)
191: public boolean isReadOnly(Object base, int index) {
192: return nested.isReadOnly(base, index);
193: }
194:
195: // Specified by javax.faces.el.PropertyResolver.getType(Object,String)
196: public Class getType(Object base, Object property) {
197: if (base instanceof DesignBean) {
198: DesignBean lbbase = (DesignBean) base;
199: try {
200: FacesContext context = FacesContext
201: .getCurrentInstance();
202: ExpressionFactory exprFactory = context
203: .getApplication().getExpressionFactory();
204: String name = (String) exprFactory.coerceToType(
205: property, String.class);
206: DesignProperty lp = lbbase.getProperty(name);
207: if (lp != null)
208: return lp.getPropertyDescriptor().getPropertyType();
209: if (lbbase.isContainer()) {
210: DesignBean[] kids = lbbase.getChildBeans();
211: for (int i = 0; i < kids.length; i++) {
212: if (kids[i].getInstanceName().equals(name))
213: return kids[i].getBeanInfo()
214: .getBeanDescriptor().getBeanClass();
215: }
216: }
217: } catch (ELException e) {
218: }
219: throw new PropertyNotFoundException("" + property);
220: }
221: return nested.getType(base, property);
222: }
223:
224: // Specified by javax.faces.el.PropertyResolver.getType(Object,int)
225: public Class getType(Object base, int index) {
226: return nested.getType(base, index);
227: }
228:
229: }
|