001// Licensed under the Apache License, Version 2.0 (the "License");
002// you may not use this file except in compliance with the License.
003// You may obtain a copy of the License at
004//
005//     http://www.apache.org/licenses/LICENSE-2.0
006//
007// Unless required by applicable law or agreed to in writing, software
008// distributed under the License is distributed on an "AS IS" BASIS,
009// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
010// See the License for the specific language governing permissions and
011// limitations under the License.
012
013package org.apache.tapestry5;
014
015/**
016 * Due to how control names and client ids are allocated inside during an Ajax request, it is difficult to
017 * to connect input data and field validation errors to the fields, since the control name and client id are different
018 * during the processing of the submitted form data and during the subsequent render. Starting in 5.4, the
019 * key used to identify a field inside the {@link org.apache.tapestry5.ValidationTracker is this new validation id,
020 * which is assigned on first read.
021 * <p/>
022 * If a field inplements {@link org.apache.tapestry5.Field} but not Field2, then the control name is used as the
023 * validation id (which will work correctly during non-Ajax requests).
024 * <p/>
025 * This assumes a "flat" field structure, where a given component renders only once (not multiple times, inside
026 * a {@link org.apache.tapestry5.corelib.components.Loop}.
027 *
028 * @since 5.4
029 */
030public interface Field2 extends Field
031{
032    /**
033     * Returns a request-scoped unique validation id for the field. This returns the same value regardless of how
034     * many times the field is rendered, which means that the behavior will be incorrect when the
035     * field component is placed inside a loop.
036     */
037    String getValidationId();
038}