001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.apache.cocoon.woody.formmodel;
018:
019: import org.outerj.expression.ExpressionContext;
020:
021: import java.math.BigDecimal;
022:
023: /**
024: * Implementation of the ExpressionContext required for the evaluation of
025: * expressions by xReporter expression interpreter.
026: *
027: * @version $Id: ExpressionContextImpl.java 433543 2006-08-22 06:22:54Z crossley $
028: */
029: public class ExpressionContextImpl implements ExpressionContext {
030: private Widget widget;
031: private boolean referenceChildren;
032:
033: public ExpressionContextImpl(Widget widget) {
034: this .widget = widget;
035: this .referenceChildren = false;
036: }
037:
038: /**
039: * @param referenceChildren if true, variables will be resolved among the children of the given
040: * container widget, rather than among the siblings of the widget.
041: */
042: public ExpressionContextImpl(Widget widget,
043: boolean referenceChildren) {
044: this .widget = widget;
045: this .referenceChildren = referenceChildren;
046: }
047:
048: /**
049: * Variables refer to other widgets.
050: *
051: * <p>The current implementation only allows access to sibling widgets.
052: *
053: * <p>In case the value of a widget is null but the widget is required, then a special
054: * exception will be thrown, the {@link CannotYetResolveWarning}. This is because in
055: * that case, you'll probably want to re-evaluate the expression at a later time (since
056: * the widget is required, it will eventually get a value).
057: *
058: * <p>In case the value of the widget is null but the field is not required, then simply
059: * null is returned. (TODO: a function IsNull() will provided in the expression library
060: * so that expression writers can check for the likely condition where a non-required field
061: * is null).
062: *
063: * <p>If the variable name does not refer to an existing widget, null is returned (TODO: this
064: * behaviour will probably change in the future)
065: */
066: public Object resolveVariable(String name) {
067: // TODO allow to access other widgets instead of only siblings (allow going up with ../ notation or something)
068: Widget widget;
069: if (!referenceChildren)
070: widget = this .widget.getParent().getWidget(name);
071: else
072: widget = this .widget.getWidget(name);
073: if (widget != null) {
074: Object value = widget.getValue();
075:
076: if (value == null && widget.isRequired()) {
077: // the widget currently has not yet a value, but since it is required, it will get a value sooner
078: // or later. Therefore, we throw an exception here indicating that this expression can currenlty
079: // not yet be evaluated, but will be at a later time.
080: throw new CannotYetResolveWarning();
081: }
082:
083: // do some type conversions:
084: // * the expression library only knows about BigDecimals as being numbers, so convert Longs first to BigDecimals
085: // * ...
086: if (value instanceof Long)
087: return new BigDecimal(((Long) value).longValue());
088: else if (value instanceof Integer)
089: return new BigDecimal(((Integer) value).intValue());
090: else
091: return value;
092: }
093: return null;
094: }
095:
096: public Object get(String s) {
097: return null;
098: }
099:
100: }
|