    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
    015import org.apache.commons.codec.net.URLCodec;
    016import org.apache.tapestry5.ioc.annotations.IncompatibleChange;
    017import org.apache.tapestry5.services.BaseURLSource;
    018import org.apache.tapestry5.services.ContextPathEncoder;
    019import org.apache.tapestry5.services.Request;
    020
    021import java.util.List;
    022
    023/**
    024 * A link is the Tapestry representation of a URL or URI that triggers dynamic behavior. This link is in three parts: a
    025 * path portion, an optional anchor, and a set of query parameters. A request for a link will ultimately be recognized
    026 * by a {@link org.apache.tapestry5.services.Dispatcher}.
    027 *
    028 * Query parameter values are kept separate from the path portion to support encoding those values into hidden form
    029 * fields (where appropriate).
    030 */
    031public interface Link
    032{
    033    /**
    034     * Returns the names of any additional query parameters for the URI. Query parameters store less regular or less
    035     * often used values that can not be expressed in the path. They also are used to store, or link to, persistent
    036     * state.
    037     *
    038     * @return list of query parameter names, is alphabetical order
    039     */
    040    List<String> getParameterNames();
    041
    042    /**
    043     * Returns the value of a specifically named query parameter, or <tt>null</tt> if no such query parameter is stored
    044     * in the link.
    045     *
    046     * Use this method only when you are sure the parameter has only one value. If the parameter might have more than
    047     * one value, use {@link #getParameterValues}.
    048     *
    049     * If you use this method with a multivalued parameter, the value returned is equal to the first value in the
    050     * array returned by <code>getParameterValues</code>.
    051     *
    052     * @return a string representing the single value of the named parameter
    053     */
    054    String getParameterValue(String name);
    055
    056    /**
    057     * Adds a parameter value. The value will be added, as is, to the URL. In many cases, the value should be URL
    058     * encoded via {@link URLCodec}.
    059     *
    060     * @param parameterName
    061     *         the name of the parameter to store
    062     * @param value
    063     *         the value to store, a null or blank value is allowed (as of Tapestry 5.3)
    064     * @return this Link, to support method chaining
    065     */
    066    @IncompatibleChange(release = "5.4", details = "changed from void to Link")
    067    Link addParameter(String parameterName, String value);
    068
    069    /**
    070     * Adds a parameter value as a value object; the value object is converted to a string via
    071     * {@link ContextPathEncoder#encodeValue(Object)} and the result is added via {@link #addParameter(String, String)}.
    072     * The Link object is returned for further configuration.
    073     *
    074     * @since 5.2.2
    075     */
    076    Link addParameterValue(String parameterName, Object value);
    077
    078    /**
    079     * Removes a parameter value, which is occasionally useful when transforming a parameter into a portion of
    080     * the path.
    081     *
    082     * @return this Link, to support method chaining
    083     * @since 5.2.0
    084     */
    085    @IncompatibleChange(release = "5.4", details = "changed from void to Link")
    086    Link removeParameter(String parameterName);
    087
    088    /**
    089     * Returns the completely unadorned base path. Other methods (such as {@link #toURI()}), may append
    090     * an anchor or query parameters.
    091     *
    092     * @since 5.2.0
    093     */
    094    String getBasePath();
    095
    096    /**
    097     * Creates a copy of this link that has the same parameters, anchor, and other attributes, but a different
    098     * {@linkplain #getBasePath() base path}.
    099     *
    100     * @return a new Link instance
    101     * @since 5.2.0
    102     */
    103    Link copyWithBasePath(String basePath);
    104
    105    /**
    106     * Returns the URI portion of the link. When the link is created for a form, this will not include query parameters.
    107     * This is the same value returned from toString().
    108     *
    109     * @return the URI, ready to be added as an element attribute
    110     */
    111    String toURI();
    112
    113    /**
    114     * Returns the link as a redirect URI. The URI includes any query parameters.
    115     */
    116    String toRedirectURI();
    117
    118    /**
    119     * Returns the link anchor. If this link does not have an anchor, this method returns <tt>null</tt>.
    120     *
    121     * @return the link anchor
    122     */
    123    String getAnchor();
    124
    125    /**
    126     * Sets the link anchor. Null and empty anchors will be ignored when building the link URI.
    127     *
    128     * @param anchor
    129     *         the link anchor
    130     * @return this Link, to support method chaining
    131     */
    132    @IncompatibleChange(release = "5.4", details = "changed from void to Link")
    133    Link setAnchor(String anchor);
    134
    135    /**
    136     * Returns the absolute URL, which includes the scheme, hostname and possibly port (as per
    137     * {@link BaseURLSource#getBaseURL(boolean)}).
    138     * By default, the scheme is chosen to match the {@linkplain Request#isSecure() security} of the current request.
    139     *
    140     * Note: the semantics of this method changed between Tapestry 5.1 and 5.2. Most code should use toString() or
    141     * {@link #toURI()} (which are equivalent) instead.
    142     *
    143     * @return the complete, qualified URL, including query parameters.
    144     */
    145    String toAbsoluteURI();
    146
    147    /**
    148     * Returns either the secure or insecure URL, with complete scheme, hostname and possibly port (as per
    149     * {@link BaseURLSource#getBaseURL(boolean)}).
    150     *
    151     * @return the complete, qualified URL, including query parameters.
    152     * @since 5.2.2
    153     */
    154    String toAbsoluteURI(boolean secure);
    155
    156    /**
    157     * Changes the link's security, which can be useful to force a link to be either secure or insecure
    158     * when normally it might not be.
    159     *
    160     * @param newSecurity
    161     *         new security value, not null, typically {@link LinkSecurity#FORCE_SECURE} or {@link LinkSecurity#FORCE_INSECURE}
    162     * @since 5.3
    163     */
    164    @IncompatibleChange(release = "5.4", details = "LinkSecurity class moved from internal package to org.apache.tapestry5.")
    165    void setSecurity(LinkSecurity newSecurity);
    166
    167    /**
    168     * Returns the current security for this link, which reflects whether the targeted page is itself secure or insecure.
    169     *
    170     * @since 5.3
    171     */
    172    @IncompatibleChange(release = "5.4", details = "LinkSecurity class moved from internal package to org.apache.tapestry5.")
    173    LinkSecurity getSecurity();
    174
    175    /**
    176     * Returns the parameter values for the given name. Returns null if no such parameter is stored in the link.
    177     */
    178    String[] getParameterValues(String parameterName);
    179
    180}