| /* |
| * 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); |
| } |
| } |