/* * JBoss, Home of Professional Open Source. * Copyright 2012, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * 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.simple; import org.exoplatform.commons.utils.I18N; import org.exoplatform.container.PortalContainer; import org.exoplatform.web.WebAppController; import org.exoplatform.web.controller.QualifiedName; import org.exoplatform.web.controller.router.Router; import org.exoplatform.web.controller.router.URIWriter; import org.exoplatform.web.url.PortalURL; import org.exoplatform.web.url.URLContext; import org.gatein.common.io.UndeclaredIOException; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.HashMap; import java.util.Locale; import java.util.Map; /** * @author <a href="mailto:nscavell@redhat.com">Nick Scavelli</a> */ public class SimpleURLContext implements URLContext { private static final String HTTP_SCHEME = "http"; private static final String DEFAULT_HOST = "localhost"; private static final int DEFAULT_PORT = 8080; private static final String DEFAULT_REQUEST_HANDLER = "portal"; private URIWriter writer; private StringBuilder buffer; private Router router; protected String scheme; protected String host; protected int port; protected String servletContext; protected String requestHandler; public SimpleURLContext(String scheme, String host, int port, String servletContext, String requestHandler, Router router) { if (router == null) { throw new IllegalArgumentException("Router cannot be null"); } this.router = router; this.scheme = scheme; this.host = host; this.port = port; this.servletContext = servletContext; this.requestHandler = requestHandler; this.buffer = new StringBuilder(); this.writer = new URIWriter(buffer); } public SimpleURLContext(String servletContext, Router router) { this(HTTP_SCHEME, DEFAULT_HOST, DEFAULT_PORT, servletContext, DEFAULT_REQUEST_HANDLER, router); } public SimpleURLContext(HttpServletRequest httpRequest, PortalContainer container, WebAppController controller) { this(httpRequest.getScheme(), httpRequest.getRemoteHost(), httpRequest.getServerPort(), container.getName(), DEFAULT_REQUEST_HANDLER, controller.getRouter()); } public SimpleURLContext(PortalContainer container, WebAppController controller) { this(container.getName(), controller.getRouter()); } public <R, U extends PortalURL<R, U>> String render(U url) { try { return _render(url); } catch (IOException e) { throw new UndeclaredIOException(e); } } private <R, U extends PortalURL<R, U>> String _render(U url) throws IOException { if (url.getResource() == null) { throw new IllegalStateException("No resource set on portal URL"); } // if (writer == null) { writer = new URIWriter(buffer = new StringBuilder()); } else { buffer.setLength(0); writer.reset(buffer); } if (url.getSchemeUse()) { buffer.append(scheme).append("://"); } if (url.getAuthorityUse()) { buffer.append(host); if (port != 80) { buffer.append(':').append(port); } } // writer.setMimeType(url.getMimeType()); // String confirm = url.getConfirm(); boolean hasConfirm = confirm != null && confirm.length() > 0; // boolean ajax = url.getAjax() != null && url.getAjax(); if (ajax) { writer.append("javascript:"); if (hasConfirm) { writer.append("if(confirm('"); writer.append(confirm.replaceAll("'", "\\\\'")); writer.append("'))"); } writer.append("ajaxGet('"); } else { if (hasConfirm) { writer.append("javascript:"); writer.append("if(confirm('"); writer.append(confirm.replaceAll("'", "\\\\'")); writer.append("'))"); writer.append("window.location=\'"); } } // Map<QualifiedName, String> parameters = new HashMap<QualifiedName, String>(); parameters.put(WebAppController.HANDLER_PARAM, requestHandler); // String lang = ""; Locale locale = url.getLocale(); if (locale != null && locale.getLanguage().length() > 0) { lang = I18N.toTagIdentifier(locale); } parameters.put(SimpleURL.LANG, lang); // for (QualifiedName parameterName : url.getParameterNames()) { String parameterValue = url.getParameterValue(parameterName); if (parameterValue != null) { parameters.put(parameterName, parameterValue); } } // This replaces logic typically handled by ControllerContext writer.append("/"); writer.appendSegment(servletContext); router.render(parameters, writer); // Now append generic query parameters Map<String, String[]> queryParameters = url.getQueryParameters(); if (queryParameters != null) { for (Map.Entry<String, String[]> entry : queryParameters.entrySet()) { for (String value : entry.getValue()) { writer.appendQueryParameter(entry.getKey(), value); } } } // if (ajax) { writer.appendQueryParameter("ajaxRequest", "true"); writer.append("')"); } else { if (hasConfirm) { writer.append("\'"); } } // return buffer.toString(); } }