package org.joget.commons.spring.web; import java.io.UnsupportedEncodingException; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import org.joget.commons.util.FileStore; import org.joget.commons.util.HostManager; import org.springframework.util.MultiValueMap; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter; import org.springframework.web.util.UriUtils; public class ParameterizedAnnotationMethodHandlerAdapter extends AnnotationMethodHandlerAdapter { public ParameterizedAnnotationMethodHandlerAdapter() { setPathMatcher(new ParameterizedPathMatcher()); } @Override public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (request.getAttribute(ParameterizedUrlHandlerMapping.PATH_PARAMETERS) != null) { request = new ParameterizedPathServletRequest(request); } return super.handle(request, response, handler); } private class ParameterizedPathServletRequest extends HttpServletRequestWrapper { private Map<String, String[]> parameters = null; public ParameterizedPathServletRequest(javax.servlet.http.HttpServletRequest request) { super(request); // reset profile and set hostname HostManager.initHost(); if (request instanceof MultipartHttpServletRequest) { MultipartHttpServletRequest req = (MultipartHttpServletRequest) request; FileStore.clear(); Map<String, MultipartFile[]> fileMap = new HashMap<String, MultipartFile[]>(); MultiValueMap<String, MultipartFile> multiValueFileMap= req.getMultiFileMap(); for (String fieldName : multiValueFileMap.keySet()) { fileMap.put(fieldName, multiValueFileMap.get(fieldName).toArray(new MultipartFile[]{})); } FileStore.setFileMap(fileMap); } else { FileStore.clear(); } Map<String, String> pathParameters = (Map<String, String>) super.getAttribute(ParameterizedUrlHandlerMapping.PATH_PARAMETERS); if (pathParameters != null) { setAttribute(ParameterizedUrlHandlerMapping.PATH_PARAMETERS, pathParameters); } else { parameters = super.getParameterMap(); } } @Override public String getParameter(String key) { String[] values = getParameterValues(key); if ((values == null) || (values.length < 1)) { return null; } return values[0]; } @Override public Map getParameterMap() { return parameters; } @Override public Enumeration getParameterNames() { return new IteratorEnumeration(parameters.keySet().iterator()); } @Override public String[] getParameterValues(String string) { return parameters.get(string); } @Override public void setAttribute(String key, Object value) { if ((ParameterizedUrlHandlerMapping.PATH_PARAMETERS.equals(key)) && (value instanceof Map)) { Map<String, String[]> newParameters = new HashMap<String, String[]>(); newParameters.putAll(super.getParameterMap()); for (Map.Entry<String, String> entry : ((Map<String, String>) value).entrySet()) { newParameters.put(entry.getKey(), new String[]{entry.getValue()}); } this.parameters = Collections.unmodifiableMap(newParameters); } super.setAttribute(key, value); } @Override public String getQueryString() { String queryString = super.getQueryString(); if (queryString != null) { String escapedQueryString = null; try { escapedQueryString = UriUtils.encodeQuery(queryString, "UTF-8"); } catch (UnsupportedEncodingException ex) { // ignore } return escapedQueryString; } else { return queryString; } } } private class IteratorEnumeration implements Enumeration { private Iterator it = null; public IteratorEnumeration(Iterator it) { this.it = it; } public boolean hasMoreElements() { return it.hasNext(); } public Object nextElement() { return it.next(); } } }