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.forms.binding;
018:
019: import java.util.Collections;
020: import java.util.HashMap;
021:
022: import org.apache.avalon.framework.logger.Logger;
023:
024: import org.apache.cocoon.forms.formmodel.Widget;
025:
026: import org.apache.commons.jxpath.JXPathContext;
027:
028: /**
029: * ComposedJXPathBindingBase provides a helper base class for subclassing
030: * into specific {@link JXPathBindingBase} implementations that have nested
031: * child-bindings.
032: *
033: * @version $Id: ComposedJXPathBindingBase.java 450255 2006-09-26 23:48:43Z vgritsenko $
034: */
035: public class ComposedJXPathBindingBase extends JXPathBindingBase {
036:
037: private final JXPathBindingBase[] subBindings;
038:
039: /**
040: * Constructs ComposedJXPathBindingBase
041: *
042: * @param childBindings sets the array of childBindings
043: */
044: public ComposedJXPathBindingBase(
045: JXPathBindingBuilderBase.CommonAttributes commonAtts,
046: JXPathBindingBase[] childBindings) {
047: super (commonAtts);
048: this .subBindings = childBindings;
049: if (this .subBindings != null) {
050: for (int i = 0; i < this .subBindings.length; i++) {
051: this .subBindings[i].setParent(this );
052: }
053: }
054: }
055:
056: /**
057: * Receives the logger to use for logging activity, and hands it over to
058: * the nested children.
059: */
060: public void enableLogging(Logger logger) {
061: super .enableLogging(logger);
062: if (this .subBindings != null) {
063: for (int i = 0; i < this .subBindings.length; i++) {
064: this .subBindings[i].enableLogging(logger);
065: }
066: }
067: }
068:
069: public String getXPath() {
070: return null;
071: }
072:
073: /**
074: * Gets a binding class by id.
075: * @param id Id of binding class to get.
076: */
077: public Binding getClass(String id) {
078: if (classes == null) {
079: classes = new HashMap();
080: if (this .subBindings != null) {
081: for (int i = 0; i < this .subBindings.length; i++) {
082: Binding binding = this .subBindings[i];
083: if (binding instanceof ClassJXPathBinding) {
084: String bindingId = binding.getId();
085: if (bindingId != null)
086: classes.put(bindingId, binding);
087: }
088: }
089:
090: // Fee memory used by an empty map
091: if (classes.size() == 0) {
092: classes = Collections.EMPTY_MAP;
093: }
094: }
095: }
096: return super .getClass(id);
097: }
098:
099: /**
100: * Returns child bindings.
101: */
102: public JXPathBindingBase[] getChildBindings() {
103: return subBindings;
104: }
105:
106: /**
107: * Actively performs the binding from the ObjectModel to the CForms-form
108: * by passing the task onto it's children.
109: */
110: public void doLoad(Widget frmModel, JXPathContext jxpc)
111: throws BindingException {
112: if (this .subBindings != null) {
113: int size = this .subBindings.length;
114: for (int i = 0; i < size; i++) {
115: this .subBindings[i].loadFormFromModel(frmModel, jxpc);
116: }
117: }
118: }
119:
120: /**
121: * Actively performs the binding from the CForms-form to the ObjectModel
122: * by passing the task onto it's children.
123: */
124: public void doSave(Widget frmModel, JXPathContext jxpc)
125: throws BindingException {
126: if (this .subBindings != null) {
127: int size = this .subBindings.length;
128: for (int i = 0; i < size; i++) {
129: this.subBindings[i].saveFormToModel(frmModel, jxpc);
130: }
131: }
132: }
133: }
|