001: /*
002: * Copyright 2001-2006 C:1 Financial Services GmbH
003: *
004: * This software is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License Version 2.1, as published by the Free Software Foundation.
007: *
008: * This software is distributed in the hope that it will be useful,
009: * but WITHOUT ANY WARRANTY; without even the implied warranty of
010: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
011: * Lesser General Public License for more details.
012: *
013: * You should have received a copy of the GNU Lesser General Public
014: * License along with this library; if not, write to the Free Software
015: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
016: */
017:
018: package de.finix.contelligent.components.website;
019:
020: import java.io.IOException;
021: import java.io.Writer;
022: import java.util.Collection;
023: import java.util.Map;
024:
025: import de.finix.contelligent.CallData;
026: import de.finix.contelligent.Component;
027: import de.finix.contelligent.ComponentNotFoundException;
028: import de.finix.contelligent.ComponentPath;
029: import de.finix.contelligent.ComponentPathException;
030: import de.finix.contelligent.category.Category;
031: import de.finix.contelligent.components.Folder;
032: import de.finix.contelligent.exception.ContelligentException;
033: import de.finix.contelligent.logging.LoggingService;
034: import de.finix.contelligent.render.MissingParameterException;
035: import de.finix.contelligent.render.ParameterDescription;
036: import de.finix.contelligent.render.RenderUtils;
037: import de.finix.contelligent.render.Renderable;
038: import de.finix.contelligent.render.Renderer;
039:
040: public abstract class HTMLFormWidget extends Folder implements
041: Renderable, Renderer {
042:
043: // final static org.apache.log4j.Logger log =
044: // LoggingService.getLogger(HTMLFormWidget.class);
045: final static org.apache.log4j.Logger log = LoggingService
046: .getLogger(HTMLFormWidget.class);
047:
048: // constants for subcomponent names
049:
050: static final String PARAMETER_NAME = "paramAssoc";
051:
052: static final String OLD_VALUE = "oldValue";
053:
054: public Renderer getRenderer() {
055: return this ;
056: }
057:
058: /**
059: * Returns a array of {@link ParameterDescription} instances containing all
060: * informations about the parameters used by the {@link #render} method of
061: * this renderer. If the renderer does not need any parameters this method
062: * may return null as well as an empty array. <BR>
063: * Note that the Contelligent system <B>does not</B> check whether any
064: * {@link ParameterDescription#isRequired required} parameter is contained
065: * within the parameter map passed to the render method. If the
066: * implementation want's to check this it may either implement the check
067: * itself or use {@link RenderUtils#checkParameters}.
068: */
069: public ParameterDescription[] getParameterDescription() {
070: return new ParameterDescription[0];
071: }
072:
073: /**
074: * Actually performs the rendering, that is writing anything to the given
075: * writer.
076: *
077: * @exception IOException
078: * if an error occurs while writing anything to the writer.
079: * @exception MissingParameterException
080: * if a required parameter is not contained within the
081: * <tt>parameterMap</tt>.
082: * @exception ContelligentException
083: * to signalize any internal error during rendering.
084: */
085: public void render(Writer writer, Map parameterMap,
086: CallData callData) throws IOException,
087: MissingParameterException, ContelligentException {
088: writer.write(renderString(callData));
089: }
090:
091: /**
092: * Returns a collection containing the {@link Category categories} this
093: * renderer supports or null or an empty collection if none are supported.
094: */
095: public Collection getSensitiveCategories() {
096: return null;
097: }
098:
099: protected String getParameterName(CallData callData) {
100: try {
101: Component paramName = resolveSubcomponent(PARAMETER_NAME,
102: callData);
103: return renderComponent(paramName, callData);
104: } catch (ComponentNotFoundException e) {
105: return getComponentContext().getPath().getName();
106: } catch (Exception e) {
107: log.debug("Missing subcomponent " + PARAMETER_NAME
108: + " at component " + ctx.getPath());
109: return "";
110: }
111: }
112:
113: protected String getOldValue(CallData callData) {
114: try {
115: Component oldValue = resolveSubcomponent(OLD_VALUE,
116: callData);
117:
118: return renderComponent(oldValue, callData);
119: } catch (Exception e) {
120: log.debug("Missing subcomponent " + OLD_VALUE
121: + " at component " + ctx.getPath());
122: return "";
123: }
124: }
125:
126: protected abstract String renderString(CallData callData);
127:
128: protected Component resolve(String name, CallData callData)
129: throws ComponentNotFoundException {
130: return ctx.getCallManager().getComponent(
131: new ComponentPath(name), callData);
132: }
133:
134: protected Component resolveSubcomponent(String name,
135: CallData callData) throws ComponentNotFoundException,
136: ComponentPathException {
137: return ctx.getCallManager().getSubcomponent(this, name,
138: callData);
139: }
140: }
|