/* * Copyright (C) 2010 eXo Platform SAS. * * This 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 software 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. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.web.url; import java.util.Locale; import java.util.Map; import java.util.Set; import org.exoplatform.web.controller.QualifiedName; import org.gatein.common.util.ParameterMap; /** * An URL for a resource managed by the portal. * * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> * @version $Revision$ */ public abstract class PortalURL<R, U extends PortalURL<R, U>> { /** . */ private static final ParameterMap.AccessMode ACCES_MODE = ParameterMap.AccessMode.get(false, false); /** . */ private boolean schemeUse; /** . */ private boolean authorityUse; /** . */ private boolean csrfCheck; /** . */ protected Boolean ajax; /** . */ protected String confirm; /** . */ protected ParameterMap queryParams; /** . */ protected MimeType mimeType; /** . */ private Locale locale; /** . */ private final URLContext context; /** * Create a portal URL instance. * * @param context the url context * @throws NullPointerException if the context is null */ public PortalURL(URLContext context) throws NullPointerException { if (context == null) { throw new NullPointerException("No context"); } // this.authorityUse = false; this.schemeUse = false; this.context = context; this.ajax = null; this.locale = null; this.confirm = null; this.queryParams = null; this.mimeType = null; } /** * Returns the current scheme use. * * @return the scheme use */ public boolean getSchemeUse() { return schemeUse; } /** * Control the scheme generation (<code>http</code> or <code>https</code> according to the request) of the URL. If the * scheme is enabled, the authority property will be set to true. * * @param schemeUse the scheme use value */ public void setSchemeUse(boolean schemeUse) { if (schemeUse) { this.authorityUse = true; } this.schemeUse = schemeUse; } /** * Returns the current authority use. * * @return the authority use */ public boolean getAuthorityUse() { return authorityUse; } /** * Control the authority generation (the server name appended with the port when its value is different than 80) of the URL. * If the authority is disabled, the scheme property will be set to false. * * @param authorityUse the authority use value */ public void setAuthorityUse(boolean authorityUse) { if (!authorityUse) { schemeUse = false; } this.authorityUse = authorityUse; } /** * Returns the ajax mode. * * @return the ajax mode */ public final Boolean getAjax() { return ajax; } /** * Update the ajax mode. * * @param ajax the new ajax mode * @return this object */ public final U setAjax(Boolean ajax) { this.ajax = ajax; return (U) this; } /** * Returns the confirm message. * * @return the confirm message */ public final String getConfirm() { return confirm; } /** * Updates the confirm message. * * @param confirm the new confirm message * @return this object */ public final U setConfirm(String confirm) { this.confirm = confirm; return (U) this; } /** * Returns the current resource associated with this URL. * * @return the resource */ public abstract R getResource(); /** * Set a new resource on this URL. * * @param resource the new resource * @return this object */ public abstract U setResource(R resource); /** * Returns the set of parameter names provided this url. * * @return the parameter names */ public abstract Set<QualifiedName> getParameterNames(); /** * Returns a specified parameter value or null when it is not available. * * @param parameterName the parameter name * @return the parameter value */ public abstract String getParameterValue(QualifiedName parameterName); /** * Returns the current mime type that this URL will be generated for, or null if none is set (which means there is no * guarantees about the mime type that will be used as target but it's likely to be {@link MimeType#XHTML} ). * * @return the current mime type */ public final MimeType getMimeType() { return mimeType; } /** * Set the mime type on this URL. The mime type will be used when URL is generated to encode the URL for the specified mime * type. * * @param mimeType the new mime type */ public void setMimeType(MimeType mimeType) { this.mimeType = mimeType; } public Locale getLocale() { return locale; } public void setLocale(Locale locale) { this.locale = locale; } public boolean isCSRFCheck() { return csrfCheck; } public void setCSRFCheck(boolean csrfCheck) { this.csrfCheck = csrfCheck; } /** * Reset the Portal URL state */ public void reset() { Map<String, String[]> params = getQueryParameters(); if (params != null) { params.clear(); } } /** * Returns the query parameters. Null can be returned. * * @return the query parameters */ public Map<String, String[]> getQueryParameters() { return queryParams; } /** * Returns a query parameter value or null if it does not exist. * * @param parameterName the parameter name * @return the parameter value * @throws NullPointerException if the parameter name is null */ public String getQueryParameterValue(String parameterName) throws NullPointerException { if (parameterName == null) { throw new NullPointerException("No null parameter name"); } else if (queryParams == null) { return null; } else { String[] parameterValues = queryParams.get(parameterName); return parameterValues != null ? parameterValues[0] : null; } } /** * Update the parameter value when the parameterValue argument is not null or remove it when the parameterValue argument is * null. * * @param parameterName the parameter name * @param parameterValue the parameter value * @throws NullPointerException if the parameter value is null */ public final void setQueryParameterValue(String parameterName, String parameterValue) throws NullPointerException { if (parameterName == null) { throw new NullPointerException("No null parameter name"); } if (parameterValue == null) { if (queryParams != null) { queryParams.remove(parameterName); } } else { if (queryParams == null) { queryParams = new ParameterMap(ACCES_MODE); } queryParams.setValue(parameterName, parameterValue); } } /** * Returns a query parameter value or null if it does not exist. * * @param parameterName the parameter name * @return the parameter value * @throws NullPointerException if the parameter name is null */ public final String[] getQueryParameterValues(String parameterName) throws NullPointerException { if (parameterName == null) { throw new NullPointerException("No null parameter name"); } return queryParams != null ? queryParams.getValues(parameterName) : null; } /** * Update the parameter value when the parameterValues argument is not null or remove it when the parameterValues argument * is null. * * @param parameterName the parameter name * @param parameterValues the parameter value * @throws NullPointerException if the parameter value is null */ public final void setQueryParameterValues(String parameterName, String[] parameterValues) throws NullPointerException { if (parameterName == null) { throw new NullPointerException("No null parameter name"); } if (parameterValues == null) { if (queryParams != null) { queryParams.remove(parameterName); } } else { if (queryParams == null) { queryParams = new ParameterMap(ACCES_MODE); } queryParams.setValues(parameterName, parameterValues); } } /** * Generates the URL value. * * @return the URL value */ public final String toString() { PortalURL _this = this; return context.render(_this); } }