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