diff --git a/java/java-servlet/pom.xml b/java/java-servlet/pom.xml new file mode 100644 index 00000000..12e34562 --- /dev/null +++ b/java/java-servlet/pom.xml @@ -0,0 +1,171 @@ + + + io.swagger + swagger-samples-project + 1.0.0 + ../.. + + 4.0.0 + swagger-java-servlet-sample-app + war + swagger-java-servlet-app + 1.0.0 + + src/main/java + src/test/java + + + org.apache.maven.plugins + maven-war-plugin + 2.1.1 + + + maven-failsafe-plugin + 2.6 + + + + integration-test + verify + + + + + + org.mortbay.jetty + jetty-maven-plugin + ${jetty-version} + + + / + + target/${project.artifactId}-${project.version} + ${project.basedir}/conf/jetty/webdefault.xml + 8079 + stopit + + + 8002 + 60000 + 8443 + + + + + + start-jetty + pre-integration-test + + run + + + 0 + true + + + + stop-jetty + post-integration-test + + stop + + + + + + com.googlecode.maven-download-plugin + download-maven-plugin + 1.2.1 + + + swagger-ui + + wget + + + https://github.com/swagger-api/swagger-ui/archive/master.tar.gz + true + ${project.build.directory} + + + + + + maven-resources-plugin + 2.6 + + + copy-resources + validate + + copy-resources + + + target/${project.artifactId}-${project.version} + + + ${project.build.directory}/swagger-ui-master/dist + true + + index.html + + + + + + + + + net.alchim31.maven + scala-maven-plugin + + true + + + + none + + + + + + + + io.swagger + swagger-servlet + ${swagger-version} + compile + + + ch.qos.logback + logback-classic + ${logback-version} + compile + + + ch.qos.logback + logback-core + ${logback-version} + compile + + + javax.servlet + servlet-api + + + org.testng + testng + ${testng-version} + test + + + junit + junit + ${junit-version} + test + + + + 6.9.4 + + diff --git a/java/java-servlet/src/main/java/io/swagger/sample/model/ApiResponse.java b/java/java-servlet/src/main/java/io/swagger/sample/model/ApiResponse.java new file mode 100644 index 00000000..cc532443 --- /dev/null +++ b/java/java-servlet/src/main/java/io/swagger/sample/model/ApiResponse.java @@ -0,0 +1,69 @@ +package io.swagger.sample.model; + +import javax.xml.bind.annotation.XmlTransient; + +@javax.xml.bind.annotation.XmlRootElement +public class ApiResponse { + public static final int ERROR = 1; + public static final int WARNING = 2; + public static final int INFO = 3; + public static final int OK = 4; + public static final int TOO_BUSY = 5; + + int code; + String type; + String message; + + public ApiResponse() { + } + + public ApiResponse(int code, String message) { + this.code = code; + switch (code) { + case ERROR: + setType("error"); + break; + case WARNING: + setType("warning"); + break; + case INFO: + setType("info"); + break; + case OK: + setType("ok"); + break; + case TOO_BUSY: + setType("too busy"); + break; + default: + setType("unknown"); + break; + } + this.message = message; + } + + @XmlTransient + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/java/java-servlet/src/main/java/io/swagger/sample/model/SampleData.java b/java/java-servlet/src/main/java/io/swagger/sample/model/SampleData.java new file mode 100644 index 00000000..b9350450 --- /dev/null +++ b/java/java-servlet/src/main/java/io/swagger/sample/model/SampleData.java @@ -0,0 +1,69 @@ +package io.swagger.sample.model; + +import java.util.Date; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "SampleData") +public class SampleData { + + private Integer id; + private String name; + private String email; + private Integer age; + private Date dateOfBirth; + + public SampleData(Integer id, String name, String email, Integer age, Date dateOfBirth) { + this.id = id; + this.name = name; + this.email = email; + this.age = age; + this.dateOfBirth = dateOfBirth; + } + + @XmlElement(name = "id") + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + @XmlElement(name = "name") + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @XmlElement(name = "email") + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @XmlElement(name = "age") + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + @XmlElement(name = "dateOfBirth") + public Date getDateOfBirth() { + return dateOfBirth; + } + + public void setDateOfBirth(Date dateOfBirth) { + this.dateOfBirth = dateOfBirth; + } +} diff --git a/java/java-servlet/src/main/java/io/swagger/sample/servlet/SampleServlet.java b/java/java-servlet/src/main/java/io/swagger/sample/servlet/SampleServlet.java new file mode 100644 index 00000000..1e3a63a1 --- /dev/null +++ b/java/java-servlet/src/main/java/io/swagger/sample/servlet/SampleServlet.java @@ -0,0 +1,73 @@ +package io.swagger.sample.servlet; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import io.swagger.annotations.Contact; +import io.swagger.annotations.Info; +import io.swagger.annotations.License; +import io.swagger.annotations.SwaggerDefinition; +import io.swagger.annotations.Tag; +import io.swagger.sample.model.SampleData; +import io.swagger.util.Json; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.Date; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@SwaggerDefinition( + info = @Info( + description = "This is a sample server", + version = "1.0.0", + title = "Swagger Sample Servlet", + termsOfService = "http://swagger.io/terms/", + contact = @Contact(name = "Sponge-Bob", email = "apiteam@swagger.io", url = "http://swagger.io"), + license = @License(name = "Apache 2.0", url = "http://www.apache.org/licenses/LICENSE-2.0.html") + ), + consumes = {"application/json", "application/xml"}, + produces = {"application/json", "application/xml"}, + schemes = {SwaggerDefinition.Scheme.HTTP, SwaggerDefinition.Scheme.HTTPS}, + tags = {@Tag(name = "users", description = "Operations about user")} +) +@Api(value = "/sample/users", description = "gets some data from a servlet") +public class SampleServlet extends HttpServlet { + + @ApiOperation(httpMethod = "GET", value = "Resource to get a user", response = SampleData.class, nickname = "getUser") + @ApiResponses({@ApiResponse(code = 400, message = "Invalid input", response = io.swagger.sample.model.ApiResponse + .class)}) + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "User ID", required = true, dataType = "integer", paramType = + "query"), + @ApiImplicitParam(name = "name", value = "User's name", required = true, dataType = "string", paramType = + "query"), + @ApiImplicitParam(name = "email", value = "User's email", required = true, dataType = "string", paramType + = "query"), + @ApiImplicitParam(name = "age", value = "User's age", required = true, dataType = "integer", paramType = + "query"), + @ApiImplicitParam(name = "dateOfBirth", value = "User's date of birth, in dd-MM-yyyy format", required = + true, dataType = "java.util.Date", paramType = "query")}) + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String result; + try { + final Integer id = Integer.parseInt(request.getParameter("id")); + final String name = request.getParameter("name"); + final String email = request.getParameter("email"); + final Integer age = Integer.parseInt(request.getParameter("age")); + final Date dateOfBirth = new SimpleDateFormat("dd-MM-yyyy").parse(request.getParameter("dateOfBirth")); + result = Json.pretty(new SampleData(id, name, email, age, dateOfBirth)); + } catch (Exception ex) { + result = Json.pretty(new io.swagger.sample.model.ApiResponse(400, ex.getMessage())); + } + + response.getOutputStream().write(result.getBytes(StandardCharsets.UTF_8)); + } +} diff --git a/java/java-servlet/src/main/java/io/swagger/sample/util/ApiOriginFilter.java b/java/java-servlet/src/main/java/io/swagger/sample/util/ApiOriginFilter.java new file mode 100644 index 00000000..1e981aa9 --- /dev/null +++ b/java/java-servlet/src/main/java/io/swagger/sample/util/ApiOriginFilter.java @@ -0,0 +1,34 @@ +package io.swagger.sample.util; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletResponse; + +public class ApiOriginFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, + FilterChain chain) throws IOException, ServletException { + final HttpServletResponse res = (HttpServletResponse) response; + res.addHeader("Access-Control-Allow-Origin:", "*"); + res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); + res.addHeader("Access-Control-Allow-Headers", "Content-Type"); + chain.doFilter(request, response); + } + + @Override + public void destroy() { + + } +} diff --git a/java/java-servlet/src/main/resource/logback.xml b/java/java-servlet/src/main/resource/logback.xml new file mode 100644 index 00000000..13598877 --- /dev/null +++ b/java/java-servlet/src/main/resource/logback.xml @@ -0,0 +1,12 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + diff --git a/java/java-servlet/src/main/webapp/WEB-INF/web.xml b/java/java-servlet/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..921c06af --- /dev/null +++ b/java/java-servlet/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,53 @@ + + + + + SampleServlet + io.swagger.sample.servlet.SampleServlet + + + SampleServlet + /sample/users/* + + + + + DefaultServletConfig + io.swagger.servlet.config.DefaultServletConfig + 2 + + swagger.resource.package + io.swagger.sample.servlet + + + swagger.api.basepath + http://localhost:8002 + + + api.version + 1.0.0 + + + + + + ApiDeclarationServlet + io.swagger.servlet.listing.ApiDeclarationServlet + + + ApiDeclarationServlet + /api/* + + + + ApiOriginFilter + io.swagger.sample.util.ApiOriginFilter + + + ApiOriginFilter + /* + + diff --git a/java/java-servlet/src/main/webapp/index.html b/java/java-servlet/src/main/webapp/index.html new file mode 100644 index 00000000..eeb79c5b --- /dev/null +++ b/java/java-servlet/src/main/webapp/index.html @@ -0,0 +1,102 @@ + + + + Swagger UI + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+
+ + diff --git a/java/java-servlet/src/test/java/io/swagger/sample/ResourceListingIT.java b/java/java-servlet/src/test/java/io/swagger/sample/ResourceListingIT.java new file mode 100644 index 00000000..c8ede4bc --- /dev/null +++ b/java/java-servlet/src/test/java/io/swagger/sample/ResourceListingIT.java @@ -0,0 +1,50 @@ +package io.swagger.sample; + +import io.swagger.models.Info; +import io.swagger.models.Scheme; +import io.swagger.models.Swagger; +import io.swagger.models.Tag; +import io.swagger.util.Json; + +import org.testng.Assert; +import org.testng.annotations.Test; + +import java.io.IOException; +import java.net.URL; +import java.util.Arrays; +import java.util.Collections; + +public class ResourceListingIT { + + @Test + public void readerTest() throws IOException { + final Swagger swagger = Json.mapper().readValue(new URL("http://localhost:8002/api/swagger.json"), Swagger.class); + + Assert.assertNotNull(swagger); + + final Info info = swagger.getInfo(); + Assert.assertNotNull(info); + Assert.assertEquals(info.getDescription(), "This is a sample server"); + Assert.assertEquals(info.getVersion(), "1.0.0"); + Assert.assertEquals(info.getTitle(), "Swagger Sample Servlet"); + + Assert.assertEquals(info.getContact().getName(), "Sponge-Bob"); + Assert.assertEquals(info.getContact().getUrl(), "http://swagger.io"); + Assert.assertEquals(info.getContact().getEmail(), "apiteam@swagger.io"); + + Assert.assertEquals(info.getLicense().getName(), "Apache 2.0"); + Assert.assertEquals(info.getLicense().getUrl(), "http://www.apache.org/licenses/LICENSE-2.0.html"); + + Assert.assertEquals(swagger.getHost(), "localhost:8002"); + Assert.assertEquals(swagger.getSwagger(), "2.0"); + + Assert.assertEquals(swagger.getTags(), Collections.singletonList(new Tag().name("users").description("Operations about user"))); + Assert.assertEquals(swagger.getSchemes(), Arrays.asList(Scheme.HTTP, Scheme.HTTPS)); + Assert.assertEquals(swagger.getConsumes(), Arrays.asList("application/json", "application/xml")); + Assert.assertEquals(swagger.getConsumes(), Arrays.asList("application/json", "application/xml")); + + Assert.assertNotNull(swagger.getPath("/sample/users/getUser")); + Assert.assertTrue(swagger.getDefinitions().containsKey("ApiResponse")); + Assert.assertTrue(swagger.getDefinitions().containsKey("SampleData")); + } +} diff --git a/pom.xml b/pom.xml index 388e4388..6aefc61c 100644 --- a/pom.xml +++ b/pom.xml @@ -304,6 +304,7 @@ java/java-jersey2-guice java/java-jaxrs-wink java/java-jaxrs-cxf + java/java-servlet target/site @@ -440,7 +441,6 @@ 1.6.3 2.1.3 8.1.11.v20130520 - 2.5 3.1.5 0.90 0.90