/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.kernel.portlet;
import aQute.bnd.annotation.ProviderType;
import com.liferay.portal.kernel.util.StringParser;
import java.util.Map;
import java.util.Set;
/**
* Represents a single friendly URL pattern and provides the ability to either
* parse a friendly URL path or generate a friendly URL from a parameter map.
*
* @author Connor McKay
* @author Brian Wing Shun Chan
* @see Router
* @see com.liferay.portlet.RouteImpl
* @see StringParser
*/
@ProviderType
public interface Route {
/**
* Adds a generated parameter to this route.
*
* <p>
* A generated parameter is never part of the URL, but is constructed from
* one or more "virtual parameters" using a pattern string. When a URL is
* parsed, the virtual parameters are populated from the URL, and the
* generated parameter is then built from its constituent virtual
* parameters.
* </p>
*
* <p>
* When a URL is generated, the opposite process occurs. The generated
* parameter must have its value passed in through the parameter map. This
* value is parsed using the pattern string, and the virtual parameters are
* populated and made available for use in the route pattern string. The
* value of the generated parameter will not be available in the route
* pattern; only the values of the virtual parameters may be used.
* </p>
*
* <p>
* The following is an example route definition that uses a generated
* parameter to remove the .jsp extension of the current page from the URL.
* </p>
*
* <p>
* <pre>
* <code>
* <route>
* <pattern>/{jspPageName}/{id:\d+}</pattern>
* <generated-parameter name="jspPage">{jspPageName}.jsp</generated-parameter>
* </route>
* </code>
* </pre>
* </p>
*
* @param name the name of the generated parameter
* @param pattern the pattern string of the generated parameter
*/
public void addGeneratedParameter(String name, String pattern);
/**
* Adds an ignored parameter to this route.
*
* <p>
* An ignored parameter never appears in the query string regardless of its
* value. Ignored parameters have no effect on the parsing of URLs.
* </p>
*
* @param name the name of the ignored parameter
*/
public void addIgnoredParameter(String name);
/**
* Adds an implicit parameter to this route.
*
* <p>
* An implicit parameter applies in both stages of a route's lifecycle, URL
* parsing and URL generation. When a URL is parsed, the implicit parameters
* will be copied onto the parameter map. When a URL is generated from a
* parameter map, all the implicit parameters will be checked against the
* parameters in the map. If any do not match or are missing from the
* parameter map, this route will not be used for generating the URL.
* </p>
*
* <p>
* Implicit parameters are matched after all virtual parameters have been
* populated, and therefore should not match against the value of a
* generated parameter, as it will not be available.
* </p>
*
* <p>
* The most common use of implicit parameters is to specify a parameter that
* is included statically in the route pattern. For instance, if a custom
* route is specified for the JSP page "view_profile.jsp", the routes
* definition could look like the following:
* </p>
*
* <p>
* <pre>
* <code>
* <route>
* <pattern>/profile/view/{id:\d+}</pattern>
* <implicit-parameter name="jspPage">view_profile.jsp</implicit-parameter>
* </route>
* </code>
* </pre>
* </p>
*
* <p>
* Since the jspPage is specified with a implicit-parameter, this route will
* only be used to generate URLs if the jspPage is set to
* "view_profile.jsp". Likewise, when a URL in this format is recognized,
* the jspPage will automatically be set to "view_profile.jsp".
* </p>
*
* @param name the name of the implicit parameter
* @param value the value of the implicit parameter
*/
public void addImplicitParameter(String name, String value);
/**
* Adds an overridden parameter to this route.
*
* <p>
* An overridden parameter is one that should always be set to a certain
* value when a URL is parsed. Overridden parameters have no effect on the
* generating of URLs.
* </p>
*
* <p>
* If a implicit parameter and an overridden parameter share the same name,
* the overridden parameter value will take precedence when a URL is parsed.
* When a URL is generated the implicit parameter value will be checked
* against the parameter map as usual.
* </p>
*
* @param name the name of the overridden parameter
* @param value the value of the overridden parameter
*/
public void addOverriddenParameter(String name, String value);
/**
* Returns the generated parameters for this route.
*
* @return the generated parameter names and string parsers
* @see #addGeneratedParameter(String, String)
*/
public Map<String, StringParser> getGeneratedParameters();
/**
* Returns the ignored parameters for this route.
*
* @return the ignored parameter names
* @see #addIgnoredParameter(String)
*/
public Set<String> getIgnoredParameters();
/**
* Returns the implicit parameters for this route.
*
* @return the implicit parameter names and values
* @see #addImplicitParameter(String, String)
*/
public Map<String, String> getImplicitParameters();
/**
* Returns the overridden parameters for this route.
*
* @return the overridden parameter names and values
* @see #addOverriddenParameter(String, String)
*/
public Map<String, String> getOverriddenParameters();
public String getPattern();
/**
* Generates a URL from the parameter map if this route is appropriate.
*
* <p>
* A route is appropriate if:
* </p>
*
* <ol>
* <li>
* The values given in <code>parameters</code> for the route's generated
* parameters match their patterns
* </li>
* <li>
* The route's implicit parameters all match <code>parameters</code>
* </li>
* <li>
* Every fragment in the route pattern has a matching value in
* <code>parameters</code>
* </li>
* </ol>
*
* @param parameters the parameter map
* @return the URL path, or <code>null</code> if this route is not
* appropriate
*/
public String parametersToUrl(Map<String, String> parameters);
/**
* Populates the parameter map with values parsed from the URL if this route
* matches.
*
* <p>
* Generated parameters will be built and added to <code>parameters</code>
* if possible. If the pattern for a virtual parameter in the generated
* parameter does not match its pattern in the route, that generated
* parameter may not be build.
* </p>
*
* <p>
* Virtual parameters will not be present in <code>parameters</code>.
* </p>
*
* @param url the URL path
* @param parameters the parameter map. If this route does not match, the
* parameter map will not be modified.
* @return <code>true</code> if the route matches; <code>false</code>
* otherwise
*/
public boolean urlToParameters(String url, Map<String, String> parameters);
}