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 java.util.Locale;
020:
021: import org.apache.cocoon.woody.FormContext;
022: import org.xml.sax.ContentHandler;
023: import org.xml.sax.SAXException;
024:
025: /**
026: * A discriminated union that references a discriminant value in another
027: * widget and contains one of several cases (widgets). To have a case
028: * hold more than one widget or to use a different id for the case than
029: * for the widget id, just wrap the widget(s) in a container widget named
030: * with the desired case id.
031: *
032: * @author Timothy Larson
033: * @version $Id: Union.java 433543 2006-08-22 06:22:54Z crossley $
034: */
035: public class Union extends AbstractContainerWidget {
036: private static final String ELEMENT = "field";
037: private Widget caseWidget;
038:
039: public Union(UnionDefinition definition) {
040: super (definition);
041: setLocation(definition.getLocation());
042: // TODO: Remove after moving logic to Field.
043: //item.enteredValue = (String)definition.getDefaultValue();
044: }
045:
046: // TODO: This whole union mess is too dependent on undefined sequences of execution.
047: // These need to be ordered into a contract of sequences.
048:
049: public void setParent(Widget widget) {
050: super .setParent(widget);
051: resolve();
052: }
053:
054: // TODO: The "resolve" step currently expands each "New" into the list of widgets in the corresponding "Class".
055: // "resolve" should be changed to "expand", and a new step, "resolve" should be introduced which patches up any
056: // *widget* (not definition) references after the expansion has put all of the widgets in place.
057: public void resolve() {
058: String caseWidgetId = ((UnionDefinition) definition)
059: .getCaseWidgetId();
060: caseWidget = getParent().getWidget(caseWidgetId);
061: }
062:
063: public String getElementName() {
064: return ELEMENT;
065: }
066:
067: public Object getValue() {
068: return caseWidget.getValue();
069: }
070:
071: public void readFromRequest(FormContext formContext) {
072: // Ensure the case widgets got its value
073: caseWidget.readFromRequest(formContext);
074: Widget widget;
075: // Read current case from request
076: String value = (String) getValue();
077: if (value != null && !value.equals(""))
078: if ((widget = getWidget(value)) != null)
079: widget.readFromRequest(formContext);
080:
081: // Read union discriminant value from request
082: //item.readFromRequest(formContext);
083: }
084:
085: // TODO: Simplify this logic.
086: public boolean validate(FormContext formContext) {
087: Widget widget;
088: boolean valid = true;
089: // Read current case from request
090: String value = (String) getValue();
091: if (value != null && !value.equals(""))
092: if ((widget = getWidget(value)) != null)
093: valid = valid & widget.validate(formContext);
094: return valid;
095: }
096:
097: public Widget getWidget(String id) {
098: if (!widgets.hasWidget(id)
099: && ((ContainerDefinition) definition).hasWidget(id))
100: ((ContainerDefinition) definition).createWidget(this , id);
101: return super .getWidget(id);
102: }
103:
104: // This method is overridden to suppress output of sub-widget sax fragments.
105: public void generateItemsSaxFragment(ContentHandler contentHandler,
106: Locale locale) throws SAXException {
107: // Do nothing
108: }
109:
110: public void generateSaxFragment(ContentHandler contentHandler,
111: Locale locale) throws SAXException {
112: generateSaxFragment(contentHandler, locale, ELEMENT);
113: }
114: }
|