Java tutorial
/* * Copyright 2013- Yan Bonnel * * 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 fr.ybonnel.simpleweb4j; import fr.ybonnel.simpleweb4j.exception.HttpErrorException; import fr.ybonnel.simpleweb4j.handlers.ContentType; import fr.ybonnel.simpleweb4j.handlers.Response; import fr.ybonnel.simpleweb4j.handlers.Route; import fr.ybonnel.simpleweb4j.handlers.RouteParameters; import fr.ybonnel.simpleweb4j.handlers.resource.RestResource; import fr.ybonnel.simpleweb4j.util.MultipartUtility; import fr.ybonnel.simpleweb4j.util.SimpleWebTestUtil; import org.apache.commons.io.IOUtils; import org.eclipse.jetty.util.MultiPartInputStreamParser; import org.junit.After; import org.junit.Before; import org.junit.Test; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.util.Collections; import java.util.List; import java.util.Random; import static fr.ybonnel.simpleweb4j.SimpleWeb4j.*; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertEquals; public class MultipartIntegrationTest { public static class TestUploadImage { private String id; private byte[] image; private String imageName; private String other; } private static TestUploadImage lastCall = null; private int port; private Random random = new Random(); @Before public void startServer() { resetDefaultValues(); port = Integer.getInteger("test.http.port", random.nextInt(10000) + 10000); setPort(port); resource(new RestResource<TestUploadImage>("multipart", TestUploadImage.class) { @Override public TestUploadImage getById(String id) throws HttpErrorException { return null; } @Override public List<TestUploadImage> getAll() throws HttpErrorException { return Collections.emptyList(); } @Override public void update(String id, TestUploadImage resource) throws HttpErrorException { resource.id = id; lastCall = resource; } @Override public TestUploadImage create(TestUploadImage resource) throws HttpErrorException { lastCall = resource; return resource; } @Override public Route<TestUploadImage, TestUploadImage> routeCreate() { return new Route<TestUploadImage, TestUploadImage>("multipart", TestUploadImage.class) { @Override public Response<TestUploadImage> handle(TestUploadImage param, RouteParameters routeParams) throws HttpErrorException { return new Response<>(create(param), HttpServletResponse.SC_CREATED); } @Override protected TestUploadImage getRouteParam(HttpServletRequest request) throws IOException { try { Part dataPart = request.getPart("data"); TestUploadImage data = ContentType.GSON .fromJson(new InputStreamReader(dataPart.getInputStream()), getParamType()); Part imagePart = request.getPart("image"); if (null != imagePart) { data.imageName = ((MultiPartInputStreamParser.MultiPart) imagePart) .getContentDispositionFilename(); data.image = IOUtils.toByteArray(imagePart.getInputStream()); } return data; } catch (ServletException e) { e.printStackTrace(); return null; } } }; } @Override public Route<TestUploadImage, Void> routeUpdate() { return new Route<TestUploadImage, Void>("multipart/:id", TestUploadImage.class) { @Override public Response<Void> handle(TestUploadImage param, RouteParameters routeParams) throws HttpErrorException { update(routeParams.getParam("id"), param); return new Response<>(null); } @Override protected TestUploadImage getRouteParam(HttpServletRequest request) throws IOException { try { Part dataPart = request.getPart("data"); InputStreamReader dataReader = new InputStreamReader(dataPart.getInputStream()); TestUploadImage data = ContentType.GSON.fromJson(dataReader, getParamType()); dataReader.close(); Part imagePart = request.getPart("image"); if (null != imagePart) { data.imageName = ((MultiPartInputStreamParser.MultiPart) imagePart) .getContentDispositionFilename(); data.image = IOUtils.toByteArray(imagePart.getInputStream()); } return data; } catch (ServletException e) { e.printStackTrace(); return null; } } }; } @Override public void delete(String id) throws HttpErrorException { } }); start(false); } @After public void stopServer() { stop(); } private static String getProjectPath() { URL resource = MultipartIntegrationTest.class.getClassLoader().getResource(""); assert resource != null; String path = resource.getPath(); return path.substring(0, path.indexOf("target")); } @Test public void should_servet_create() throws Exception { lastCall = null; File image = new File(getProjectPath() + "images/logo-simpleweb4j-140.png"); MultipartUtility multipart = new MultipartUtility("POST", "http://localhost:" + port + "/multipart"); multipart.addFormField("data", "{'other':'multipartTest'}"); multipart.addFilePart("image", image); SimpleWebTestUtil.UrlResponse response = multipart.response(); assertEquals(201, response.status); assertNull(lastCall.id); assertEquals("multipartTest", lastCall.other); assertEquals(image.getName(), lastCall.imageName); assertNotNull(lastCall.image); } @Test public void should_servet_update() throws Exception { lastCall = null; File image = new File(getProjectPath() + "images/logo-simpleweb4j-140.png"); MultipartUtility multipart = new MultipartUtility("PUT", "http://localhost:" + port + "/multipart/123"); multipart.addFormField("data", "{'other':'updateTest'}"); multipart.addFilePart("image", image); SimpleWebTestUtil.UrlResponse response = multipart.response(); assertEquals(204, response.status); assertEquals("123", lastCall.id); assertEquals("updateTest", lastCall.other); assertEquals(image.getName(), lastCall.imageName); assertNotNull(lastCall.image); } }