blob: 03176dfd632b2428228346e134cb5aa68f983ba0 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cocoon.woody.formmodel;
import java.util.Locale;
import org.apache.cocoon.woody.FormContext;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
/**
* A discriminated union that references a discriminant value in another
* widget and contains one of several cases (widgets). To have a case
* hold more than one widget or to use a different id for the case than
* for the widget id, just wrap the widget(s) in a container widget named
* with the desired case id.
*
* @author Timothy Larson
* @version $Id$
*/
public class Union extends AbstractContainerWidget {
private static final String ELEMENT = "field";
private Widget caseWidget;
public Union(UnionDefinition definition) {
super(definition);
setLocation(definition.getLocation());
// TODO: Remove after moving logic to Field.
//item.enteredValue = (String)definition.getDefaultValue();
}
// TODO: This whole union mess is too dependent on undefined sequences of execution.
// These need to be ordered into a contract of sequences.
public void setParent(Widget widget) {
super.setParent(widget);
resolve();
}
// TODO: The "resolve" step currently expands each "New" into the list of widgets in the corresponding "Class".
// "resolve" should be changed to "expand", and a new step, "resolve" should be introduced which patches up any
// *widget* (not definition) references after the expansion has put all of the widgets in place.
public void resolve() {
String caseWidgetId = ((UnionDefinition)definition).getCaseWidgetId();
caseWidget = getParent().getWidget(caseWidgetId);
}
public String getElementName() {
return ELEMENT;
}
public Object getValue() {
return caseWidget.getValue();
}
public void readFromRequest(FormContext formContext) {
// Ensure the case widgets got its value
caseWidget.readFromRequest(formContext);
Widget widget;
// Read current case from request
String value = (String)getValue();
if (value != null && !value.equals(""))
if ((widget = getWidget(value)) != null)
widget.readFromRequest(formContext);
// Read union discriminant value from request
//item.readFromRequest(formContext);
}
// TODO: Simplify this logic.
public boolean validate(FormContext formContext) {
Widget widget;
boolean valid = true;
// Read current case from request
String value = (String)getValue();
if (value != null && !value.equals(""))
if ((widget = getWidget(value)) != null)
valid = valid & widget.validate(formContext);
return valid;
}
public Widget getWidget(String id) {
if (!widgets.hasWidget(id) && ((ContainerDefinition)definition).hasWidget(id))
((ContainerDefinition)definition).createWidget(this, id);
return super.getWidget(id);
}
// This method is overridden to suppress output of sub-widget sax fragments.
public void generateItemsSaxFragment(ContentHandler contentHandler, Locale locale) throws SAXException {
// Do nothing
}
public void generateSaxFragment(ContentHandler contentHandler, Locale locale) throws SAXException {
generateSaxFragment(contentHandler, locale, ELEMENT);
}
}