blob: 5283ab3ddcecb275d74a911859d2df6ae3215d92 [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.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import org.apache.cocoon.woody.Constants;
import org.apache.cocoon.woody.FormContext;
import org.apache.cocoon.woody.event.WidgetEvent;
import org.apache.cocoon.woody.validation.WidgetValidator;
import org.apache.cocoon.xml.AttributesImpl;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
/**
* Abstract base class for Widget implementations. Provides functionality
* common to many widgets.
*
* @version $Id$
*/
public abstract class AbstractWidget implements Widget {
private String location;
private Widget parent;
private Form form;
protected AbstractWidgetDefinition definition;
private List validators;
/**
* Sets the definition of this widget.
*/
protected void setDefinition(AbstractWidgetDefinition definition) {
this.definition = definition;
}
/**
* Gets the id of this widget.
*/
public String getId() {
return definition.getId();
}
/**
* Sets the source location of this widget.
*/
protected void setLocation(String location) {
this.location = location;
}
/**
* Gets the source location of this widget.
*/
public String getLocation() {
return this.location;
}
public Widget getParent() {
return parent;
}
public void setParent(Widget widget) {
this.parent = widget;
}
public Form getForm() {
if (this.form == null) {
if (parent == null) {
this.form = (Form)this;
} else {
this.form = parent.getForm();
}
}
return this.form;
}
public String getNamespace() {
if (getParent() != null && getParent().getNamespace().length() > 0) {
return getParent().getNamespace() + "." + getId();
} else {
return getId();
}
}
public String getFullyQualifiedId() {
if (parent != null) {
String namespace = parent.getNamespace();
if (namespace.length() > 0) {
return namespace + "." + getId();
}
}
return getId();
}
public Object getValue() {
return null;
}
public void setValue(Object object) {
throw new RuntimeException("Cannot set the value of widget " + getFullyQualifiedId());
}
public boolean isRequired() {
return false;
}
public Widget getWidget(String id) {
return null;
}
public void broadcastEvent(WidgetEvent event) {
throw new UnsupportedOperationException("Widget " + this.getFullyQualifiedId() + " doesn't handle events.");
}
/**
* Add a validator to this widget instance.
*
* @param validator
*/
public void addValidator(WidgetValidator validator) {
if (this.validators == null) {
this.validators = new ArrayList();
}
this.validators.add(validator);
}
/**
* Remove a validator from this widget instance
*
* @param validator
* @return <code>true</code> if the validator was found.
*/
public boolean removeValidator(WidgetValidator validator) {
return (this.validators == null)? false : this.validators.remove(validator);
}
public boolean validate(FormContext context) {
// Test validators from the widget definition
if (!this.definition.validate(this, context)) {
// Failed
return false;
} else {
// Definition sussessful, test local validators
if (this.validators == null) {
// No local validators
return true;
} else {
// Iterate on local validators
Iterator iter = this.validators.iterator();
while(iter.hasNext()) {
WidgetValidator validator = (WidgetValidator)iter.next();
if (!validator.validate(this, context)) {
return false;
}
}
// All local iterators successful
return true;
}
}
}
public void generateLabel(ContentHandler contentHandler) throws SAXException {
if (definition != null) {
definition.generateDisplayData("label", contentHandler);
}
}
public void generateItemSaxFragment(ContentHandler contentHandler, Locale locale) throws SAXException {
// Do nothing
}
public void generateSaxFragment(ContentHandler contentHandler, Locale locale, String element, WidgetDefinition definition)
throws SAXException {
AttributesImpl attrs = new AttributesImpl();
attrs.addCDATAAttribute("id", getFullyQualifiedId());
contentHandler.startElement(Constants.WI_NS, element, Constants.WI_PREFIX_COLON + element, attrs);
generateItemSaxFragment(contentHandler, locale);
contentHandler.endElement(Constants.WI_NS, element, Constants.WI_PREFIX_COLON + element);
}
}