001 /*
002 Licensed to the Apache Software Foundation (ASF) under one
003 or more contributor license agreements. See the NOTICE file
004 distributed with this work for additional information
005 regarding copyright ownership. The ASF licenses this file
006 to you under the Apache License, Version 2.0 (the
007 "License"); you may not use this file except in compliance
008 with the License. You may obtain a copy of the License at
009
010 http://www.apache.org/licenses/LICENSE-2.0
011
012 Unless required by applicable law or agreed to in writing,
013 software distributed under the License is distributed on an
014 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 KIND, either express or implied. See the License for the
016 specific language governing permissions and limitations
017 under the License.
018 */
019 package org.apache.wiki.forms;
020
021 import java.text.MessageFormat;
022 import java.util.Map;
023 import java.util.ResourceBundle;
024
025 import org.apache.wiki.WikiContext;
026 import org.apache.wiki.api.exceptions.PluginException;
027 import org.apache.wiki.api.plugin.WikiPlugin;
028 import org.apache.wiki.preferences.Preferences;
029
030 /**
031 * Opens a WikiForm.
032 *
033 * Builds the HTML code for opening a FORM.
034 *
035 * <p>Since we're only providing an opening FORM tag, we can't use
036 * the ECS utilities.
037 *
038 * A Form plugin line that produces one looks like this:
039 * <p><pre>
040 * [{FormOpen name='formname' handler='pluginname'
041 * submit='submitservlet'
042 * show='always'
043 * }]
044 * </pre>
045 *
046 * <p>Mandatory parameters:
047 * <br>The <i>name</i> field identifies this particular form to the
048 * Form plugin across pages.
049 * <br>The <i>handler</i> field is a WikiPlugin name; it will be
050 * invoked with the form field values.
051 *
052 * <p>Optional parameters:
053 * <p>The submitservlet is the name of a JSP/servlet capable of
054 * handling the input from this form. It is optional; the default
055 * value is the current page (which can handle the input by using
056 * this Plugin.)
057 *
058 * <p>The <i>hide</i> parameter affects the visibility of this
059 * form. If left out, the form is always shown. If set to
060 * 'onsuccess', the form is not shown if it was submitted
061 * successfully. (Note that a reload of the page would cause the
062 * context to reset, and the form would be shown again. This may
063 * be a useless option.)
064 *
065 */
066 public class FormOpen
067 extends FormElement
068 {
069 private static org.apache.log4j.Logger log =
070 org.apache.log4j.Logger.getLogger( FormOpen.class );
071
072 /** Parameter name for setting the method (GET or POST). Value is <tt>{@value}</tt>. */
073 public static final String PARAM_METHOD = "method";
074
075 /**
076 * {@inheritDoc}
077 */
078 public String execute( WikiContext ctx, Map< String, String > params )
079 throws PluginException
080 {
081 ResourceBundle rb = Preferences.getBundle( ctx, WikiPlugin.CORE_PLUGINS_RESOURCEBUNDLE );
082 String formName = params.get( PARAM_FORM );
083 if( formName == null )
084 {
085 throw new PluginException( MessageFormat.format( rb.getString( "formopen.missingparam" ), PARAM_FORM ) );
086 }
087 String hide = params.get( PARAM_HIDEFORM );
088 String sourcePage = ctx.getPage().getName();
089 String submitServlet = params.get( PARAM_SUBMITHANDLER );
090 if( submitServlet == null )
091 submitServlet = ctx.getURL( WikiContext.VIEW, sourcePage );
092
093 String method = params.get( PARAM_METHOD );
094 if( method == null ) method="post";
095
096 if( !(method.equalsIgnoreCase("get") || method.equalsIgnoreCase("post")) )
097 {
098 throw new PluginException( rb.getString( "formopen.postorgetonly" ) );
099 }
100
101 FormInfo info = getFormInfo( ctx );
102 if( info != null )
103 {
104 // Previous information may be the result of submitting
105 // this form, or of a FormSet plugin, or both. If it
106 // exists and is for this form, fine.
107 if( formName.equals( info.getName() ) )
108 {
109 log.debug( "Previous FormInfo for this form was found in context." );
110 // If the FormInfo exists, and if we're supposed to display on
111 // error only, we need to exit now.
112 if( hide != null &&
113 HIDE_SUCCESS.equals( hide ) &&
114 info.getStatus() == FormInfo.EXECUTED )
115 {
116 info.setHide( true );
117 return "<p>" + rb.getString( "formopen.noneedtoshow" ) + "</p>";
118 }
119 }
120 else
121 {
122 // This would mean that a new form was started without
123 // closing an old one. Get rid of the garbage.
124 info = new FormInfo();
125 }
126 }
127 else
128 {
129 // No previous FormInfo available; store now, so it'll be
130 // available for upcoming Form input elements.
131 info = new FormInfo();
132 storeFormInfo( ctx, info );
133 }
134
135 info.setName( formName );
136 info.setAction( submitServlet );
137
138 StringBuffer tag = new StringBuffer( 40 );
139 tag.append( "<div class=\"wikiform\">\n" );
140 tag.append( "<form action=\"" + submitServlet );
141 tag.append( "\" name=\"" + formName );
142 tag.append( "\" accept-charset=\"" + ctx.getEngine().getContentEncoding() );
143 tag.append( "\" method=\""+method+"\" enctype=\"application/x-www-form-urlencoded\">\n" );
144 tag.append( " <input type=\"hidden\" name=\"" + PARAM_FORMNAMEHIDDEN );
145 tag.append( "\" value=\"" + formName + "\"/>\n" );
146
147 return tag.toString();
148 }
149
150 }