package com.google.sitebricks.transport; import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Multimap; import com.google.inject.Provider; import com.google.inject.TypeLiteral; import com.google.sitebricks.headless.Request; import com.google.sitebricks.validation.SitebricksValidator; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import javax.validation.ValidationException; import java.io.IOException; import java.io.OutputStream; import java.util.Iterator; import java.util.List; import java.util.Set; public class MultiPartRequest implements Request { private final HttpServletRequest httpServletRequest; private SitebricksValidator validator; private Multimap<String, FileItem> params; @Inject public MultiPartRequest(Provider<HttpServletRequest> requestProvider, SitebricksValidator validator) throws FileUploadException { this.httpServletRequest = requestProvider.get(); this.validator = validator; this.params = params(this.httpServletRequest); } @Override public <E> RequestRead<E> read(Class<E> type) { throw new UnsupportedOperationException(); } @Override public <E> RequestRead<E> read(TypeLiteral<E> type) { throw new UnsupportedOperationException(); } @Override public void readTo(OutputStream out) throws IOException { throw new UnsupportedOperationException(); } @Override public Multimap<String, String> headers() { throw new UnsupportedOperationException(); } @Override public Multimap<String, String> params() { return ImmutableMultimap.of(); } @Override public Multimap<String, String> matrix() { throw new UnsupportedOperationException(); } @Override public String matrixParam(String name) { throw new UnsupportedOperationException(); } @Override public String param(String name) { throw new UnsupportedOperationException(); } @Override public String header(String name) { throw new UnsupportedOperationException(); } @Override public String uri() { throw new UnsupportedOperationException(); } @Override public String path() { throw new UnsupportedOperationException(); } @Override public String context() { throw new UnsupportedOperationException(); } @Override public String method() { throw new UnsupportedOperationException(); } @Override public void validate(Object object) { Set<? extends ConstraintViolation<?>> cvs = validator.validate(object); if ((cvs != null) && (! cvs.isEmpty())) { throw new ValidationException(new ConstraintViolationException((Set<ConstraintViolation<?>>) cvs)); } } private Multimap<String, FileItem> params(HttpServletRequest request) throws FileUploadException { ImmutableMultimap.Builder<String, FileItem> builder = ImmutableMultimap.builder(); FileItemFactory fileItemFactory = new DiskFileItemFactory(1000, null); ServletFileUpload upload = new ServletFileUpload(fileItemFactory); upload.setHeaderEncoding(request.getCharacterEncoding()); List<FileItem> items = upload.parseRequest(request); Iterator<FileItem> iter = items.iterator(); while (iter.hasNext()) { FileItem fileItem = (FileItem) iter.next(); builder.put(fileItem.getFieldName(), fileItem); } return builder.build(); } }