/**
* Copyright (C) 2012 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jbpm.formModeler.service.bb.mvc.components;
import org.slf4j.Logger;
import org.jbpm.formModeler.service.bb.mvc.components.handling.BeanHandler;
import org.jbpm.formModeler.service.bb.mvc.controller.HTTPSettings;
import org.jbpm.formModeler.service.cdi.CDIBeanLocator;
import org.slf4j.LoggerFactory;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;
@ApplicationScoped
public class URLMarkupGenerator {
public static URLMarkupGenerator lookup() {
return (URLMarkupGenerator) CDIBeanLocator.getBeanByType(URLMarkupGenerator.class);
}
private Logger log = LoggerFactory.getLogger(URLMarkupGenerator.class);
public static final String COMMAND_RUNNER = "Controller";
/**
* Get a permanent link to a given action on a bean
*
* @param bean Bean handler that will perform the action
* @param action Bean's method that will be invoked
* @param params Extra parameters for link
* @return A link url to a bean action, independent on the page.
*/
public String getPermanentLink(String bean, String action, Map params) {
try {
StringBuffer sb = new StringBuffer();
String base = COMMAND_RUNNER;
sb.append(base).append("?");
params.put(FactoryURL.PARAMETER_BEAN, bean);
params.put(FactoryURL.PARAMETER_PROPERTY, action);
BeanHandler component = (BeanHandler) CDIBeanLocator.getBeanByNameOrType(bean);
if (component != null) {
component.setEnabledForActionHandling(true);
if (component.getExtraActionParams() != null) params.putAll(component.getExtraActionParams());
}
else log.debug("Bean @Named as '" + bean + "' not found.");
sb.append(getParamsMarkup(params));
return sb.toString();
} catch (ClassCastException cce) {
log.error("Bean " + bean + " is not a BeanHandler.");
return "#";
}
}
/**
* Get the base URI for any markup, that is, the base path plus the servlet mapping. Any uri
* constructed on top of it will go to the Controller servlet
*
* @return the base URI for any markup
*/
public String getServletMapping() {
return COMMAND_RUNNER;
}
/**
* Mapping to the controller servlet. By default it is Controller, but in case there is friendly url, can be
* replaced by workspace/<friendly_url> It is NOT preceded by "/"
*
* @return Mapping to the controller servlet.
*/
public String getBaseURI() {
return getServletMapping();
}
/**
* Get a link to executing an action on a bean.
*/
public String getMarkup(String bean, String action, Map params) {
try {
StringBuffer sb = new StringBuffer();
BeanHandler component = (BeanHandler) CDIBeanLocator.getBeanByNameOrType(bean);
params.put(FactoryURL.PARAMETER_BEAN, bean);
params.put(FactoryURL.PARAMETER_PROPERTY, component.getActionName(action));
sb.append(getServletMapping()).append("?");
if (component.getExtraActionParams() != null) params.putAll(component.getExtraActionParams());
sb.append(getParamsMarkup(params));
component.setEnabledForActionHandling(true);
return sb.toString();
} catch (ClassCastException cce) {
log.error("Bean " + bean + " is not a BeanHandler.");
return "#";
}
}
/**
* Convert a parameter map (string->string) to its URL form name1=value1&name2=value2 ...
*
* @param params parameter map to process.
* @return A String representation for the received parameter map
*/
public String getParamsMarkup(Map params) {
StringBuffer sb = new StringBuffer();
for (Iterator it = params.keySet().iterator(); it.hasNext();) {
String paramName = (String) it.next();
Object paramValue = params.get(paramName);
sb.append(getParameterMarkup(paramName, paramValue));
if (it.hasNext())
sb.append("&");
}
return sb.toString();
}
protected String getParameterMarkup(String name, Object value) {
StringBuffer sb = new StringBuffer();
try {
HTTPSettings httpSettings = HTTPSettings.lookup();
sb.append(URLEncoder.encode(name, httpSettings.getEncoding())).append("=").append(URLEncoder.encode(String.valueOf(value), httpSettings.getEncoding()));
} catch (UnsupportedEncodingException e) {
log.error("Error: ", e);
}
return sb.toString();
}
public String getContextHost(ServletRequest request) {
StringBuffer sb = new StringBuffer();
String context = ((HttpServletRequest) request).getContextPath();
String protocol = request.getScheme();
while (context.startsWith("/")) context = context.substring(1);
sb.append(protocol.toLowerCase()).append("://").append(request.getServerName());
if (request.getServerPort() != 80) sb.append(":").append(request.getServerPort());
return sb.toString();
}
}