/** * Copyright 2013 the original author or authors. * * 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 io.neba.core.mvc; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.request.RequestParameter; import org.apache.sling.api.request.RequestParameterMap; import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import java.util.*; import java.util.Map.Entry; import static java.util.Collections.list; /** * Translates sling's build-in support of multipart file posts * to Spring's {@link org.springframework.web.multipart.MultipartRequest}. * * @author Olaf Otto */ public class MultipartSlingHttpServletRequest extends SlingHttpServletRequestWrapper implements MultipartHttpServletRequest { static final String CONTENT_TYPE = "Content-Type"; public MultipartSlingHttpServletRequest(SlingHttpServletRequest wrappedRequest) { super(wrappedRequest); } @Override public Iterator<String> getFileNames() { RequestParameterMap requestParameterMap = getRequestParameterMap(); List<String> names = new ArrayList<>(requestParameterMap.size()); for (Entry<String, RequestParameter[]> entry : requestParameterMap.entrySet()) { RequestParameter[] params = entry.getValue(); if (params != null && params.length > 0 && !params[0].isFormField()) { names.add(entry.getKey()); } } return names.iterator(); } @Override public MultipartFile getFile(String name) { final RequestParameter requestParameter = getRequestParameter(name); MultipartFile file = null; if (requestParameter != null && !requestParameter.isFormField()) { file = new SlingMultipartFile(name, requestParameter); } return file; } @Override public List<MultipartFile> getFiles(String name) { final RequestParameter[] requestParameters = getRequestParameters(name); List<MultipartFile> files = new ArrayList<>(); if (requestParameters != null) { for (RequestParameter parameter : requestParameters) { if (!parameter.isFormField()) { files.add(new SlingMultipartFile(name, parameter)); } } } return files; } @Override public Map<String, MultipartFile> getFileMap() { RequestParameterMap requestParameterMap = getRequestParameterMap(); Map<String, MultipartFile> files = new HashMap<>(requestParameterMap.size()); for (Entry<String, RequestParameter[]> entry : requestParameterMap.entrySet()) { RequestParameter[] params = entry.getValue(); if (params != null && params.length > 0) { for (RequestParameter parameter : params) { if (!parameter.isFormField()) { files.put(entry.getKey(), new SlingMultipartFile(entry.getKey(), parameter)); } } } } return files; } @Override public MultiValueMap<String, MultipartFile> getMultiFileMap() { RequestParameterMap requestParameterMap = getRequestParameterMap(); MultiValueMap<String, MultipartFile> fileMap = new LinkedMultiValueMap<>( requestParameterMap.size()); for (Entry<String, RequestParameter[]> entry : requestParameterMap.entrySet()) { RequestParameter[] params = entry.getValue(); if (params != null && params.length > 0) { List<MultipartFile> files = new ArrayList<>(params.length); for (RequestParameter parameter : params) { if (!parameter.isFormField()) { files.add(new SlingMultipartFile(entry.getKey(), parameter)); } } if (!files.isEmpty()) { fileMap.put(entry.getKey(), files); } } } return fileMap; } @Override public String getMultipartContentType(String name) { final RequestParameter requestParameter = getRequestParameter(name); String contentType = null; if (requestParameter != null && !requestParameter.isFormField()) { contentType = requestParameter.getContentType(); } return contentType; } @Override public HttpHeaders getMultipartHeaders(String name) { String contentType = getMultipartContentType(name); if (contentType != null) { HttpHeaders headers = new HttpHeaders(); headers.add(CONTENT_TYPE, contentType); return headers; } else { return null; } } @Override @SuppressWarnings("unchecked") public HttpHeaders getRequestHeaders() { HttpHeaders headers = new HttpHeaders(); Enumeration<String> headerNames = getHeaderNames(); while (headerNames.hasMoreElements()) { String headerName = headerNames.nextElement(); headers.put(headerName, list(getHeaders(headerName))); } return headers; } @Override public HttpMethod getRequestMethod() { return HttpMethod.valueOf(getSlingRequest().getMethod()); } }