diff --git a/pom.xml b/pom.xml index 3336e13c596..2083ce9a2af 100644 --- a/pom.xml +++ b/pom.xml @@ -772,6 +772,7 @@ samples/client/petstore/jaxrs-cxf-client samples/client/petstore/javascript samples/client/petstore/python + samples/client/petstore/spring-cloud samples/client/petstore/scala samples/client/petstore/typescript-fetch/builds/default samples/client/petstore/typescript-fetch/builds/es6-target @@ -784,20 +785,19 @@ samples/server/petstore/java-inflector - samples/server/petstore/undertow + samples/server/petstore/java-play-framework samples/server/petstore/jaxrs/jersey1 samples/server/petstore/jaxrs/jersey2 samples/server/petstore/jaxrs-resteasy/default samples/server/petstore/jaxrs-resteasy/joda - samples/server/petstore/scalatra - samples/server/petstore/spring-mvc - samples/client/petstore/spring-cloud - samples/server/petstore/springboot samples/server/petstore/jaxrs-cxf samples/server/petstore/jaxrs-cxf-annotated-base-path samples/server/petstore/jaxrs-cxf-cdi samples/server/petstore/jaxrs-cxf-non-spring-app - + samples/server/petstore/scalatra + samples/server/petstore/spring-mvc + samples/server/petstore/springboot + samples/server/petstore/undertow diff --git a/samples/server/petstore/java-play-framework/.swagger-codegen-ignore b/samples/server/petstore/java-play-framework/.swagger-codegen-ignore new file mode 100644 index 00000000000..c5fa491b4c5 --- /dev/null +++ b/samples/server/petstore/java-play-framework/.swagger-codegen-ignore @@ -0,0 +1,23 @@ +# Swagger Codegen Ignore +# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell Swagger Codgen to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/server/petstore/java-play-framework/LICENSE b/samples/server/petstore/java-play-framework/LICENSE new file mode 100644 index 00000000000..4baedcb95f3 --- /dev/null +++ b/samples/server/petstore/java-play-framework/LICENSE @@ -0,0 +1,8 @@ +This software is licensed under the Apache 2 license, quoted below. + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this project 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. \ No newline at end of file diff --git a/samples/server/petstore/java-play-framework/README b/samples/server/petstore/java-play-framework/README new file mode 100644 index 00000000000..2fce02950d2 --- /dev/null +++ b/samples/server/petstore/java-play-framework/README @@ -0,0 +1,4 @@ +This is your new Play application +================================= + +This file will be packaged with your application when using `activator dist`. \ No newline at end of file diff --git a/samples/server/petstore/java-play-framework/app/apimodels/Category.java b/samples/server/petstore/java-play-framework/app/apimodels/Category.java new file mode 100644 index 00000000000..bde93b1ceb8 --- /dev/null +++ b/samples/server/petstore/java-play-framework/app/apimodels/Category.java @@ -0,0 +1,96 @@ +package apimodels; + +import java.util.Objects; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.*; +import com.fasterxml.jackson.annotation.*; +/** + * Category + */ + +public class Category { + @JsonProperty("id") + private Long id = null; + + @JsonProperty("name") + private String name = null; + + public Category id(Long id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @ApiModelProperty(value = "") + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Category name(String name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + **/ + @ApiModelProperty(value = "") + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Category category = (Category) o; + return Objects.equals(this.id, category.id) && + Objects.equals(this.name, category.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Category {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/java-play-framework/app/apimodels/Order.java b/samples/server/petstore/java-play-framework/app/apimodels/Order.java new file mode 100644 index 00000000000..6d8b7abf1bc --- /dev/null +++ b/samples/server/petstore/java-play-framework/app/apimodels/Order.java @@ -0,0 +1,222 @@ +package apimodels; + +import java.util.Objects; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.time.OffsetDateTime; +import javax.validation.constraints.*; +import com.fasterxml.jackson.annotation.*; +/** + * Order + */ + +public class Order { + @JsonProperty("id") + private Long id = null; + + @JsonProperty("petId") + private Long petId = null; + + @JsonProperty("quantity") + private Integer quantity = null; + + @JsonProperty("shipDate") + private OffsetDateTime shipDate = null; + + /** + * Order Status + */ + public enum StatusEnum { + PLACED("placed"), + + APPROVED("approved"), + + DELIVERED("delivered"); + + private String value; + + StatusEnum(String value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static StatusEnum fromValue(String text) { + for (StatusEnum b : StatusEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + return null; + } + } + + @JsonProperty("status") + private StatusEnum status = null; + + @JsonProperty("complete") + private Boolean complete = null; + + public Order id(Long id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @ApiModelProperty(value = "") + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Order petId(Long petId) { + this.petId = petId; + return this; + } + + /** + * Get petId + * @return petId + **/ + @ApiModelProperty(value = "") + public Long getPetId() { + return petId; + } + + public void setPetId(Long petId) { + this.petId = petId; + } + + public Order quantity(Integer quantity) { + this.quantity = quantity; + return this; + } + + /** + * Get quantity + * @return quantity + **/ + @ApiModelProperty(value = "") + public Integer getQuantity() { + return quantity; + } + + public void setQuantity(Integer quantity) { + this.quantity = quantity; + } + + public Order shipDate(OffsetDateTime shipDate) { + this.shipDate = shipDate; + return this; + } + + /** + * Get shipDate + * @return shipDate + **/ + @ApiModelProperty(value = "") + public OffsetDateTime getShipDate() { + return shipDate; + } + + public void setShipDate(OffsetDateTime shipDate) { + this.shipDate = shipDate; + } + + public Order status(StatusEnum status) { + this.status = status; + return this; + } + + /** + * Order Status + * @return status + **/ + @ApiModelProperty(value = "Order Status") + public StatusEnum getStatus() { + return status; + } + + public void setStatus(StatusEnum status) { + this.status = status; + } + + public Order complete(Boolean complete) { + this.complete = complete; + return this; + } + + /** + * Get complete + * @return complete + **/ + @ApiModelProperty(value = "") + public Boolean getComplete() { + return complete; + } + + public void setComplete(Boolean complete) { + this.complete = complete; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Order order = (Order) o; + return Objects.equals(this.id, order.id) && + Objects.equals(this.petId, order.petId) && + Objects.equals(this.quantity, order.quantity) && + Objects.equals(this.shipDate, order.shipDate) && + Objects.equals(this.status, order.status) && + Objects.equals(this.complete, order.complete); + } + + @Override + public int hashCode() { + return Objects.hash(id, petId, quantity, shipDate, status, complete); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Order {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" petId: ").append(toIndentedString(petId)).append("\n"); + sb.append(" quantity: ").append(toIndentedString(quantity)).append("\n"); + sb.append(" shipDate: ").append(toIndentedString(shipDate)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); + sb.append(" complete: ").append(toIndentedString(complete)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/java-play-framework/app/apimodels/Pet.java b/samples/server/petstore/java-play-framework/app/apimodels/Pet.java new file mode 100644 index 00000000000..a9bf2532e7e --- /dev/null +++ b/samples/server/petstore/java-play-framework/app/apimodels/Pet.java @@ -0,0 +1,237 @@ +package apimodels; + +import java.util.Objects; +import apimodels.Category; +import apimodels.Tag; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.ArrayList; +import java.util.List; +import javax.validation.constraints.*; +import com.fasterxml.jackson.annotation.*; +/** + * Pet + */ + +public class Pet { + @JsonProperty("id") + private Long id = null; + + @JsonProperty("category") + private Category category = null; + + @JsonProperty("name") + private String name = null; + + @JsonProperty("photoUrls") + private List photoUrls = new ArrayList(); + + @JsonProperty("tags") + private List tags = new ArrayList(); + + /** + * pet status in the store + */ + public enum StatusEnum { + AVAILABLE("available"), + + PENDING("pending"), + + SOLD("sold"); + + private String value; + + StatusEnum(String value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static StatusEnum fromValue(String text) { + for (StatusEnum b : StatusEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + return null; + } + } + + @JsonProperty("status") + private StatusEnum status = null; + + public Pet id(Long id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @ApiModelProperty(value = "") + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Pet category(Category category) { + this.category = category; + return this; + } + + /** + * Get category + * @return category + **/ + @ApiModelProperty(value = "") + public Category getCategory() { + return category; + } + + public void setCategory(Category category) { + this.category = category; + } + + public Pet name(String name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + **/ + @ApiModelProperty(example = "doggie", required = true, value = "") + @NotNull + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Pet photoUrls(List photoUrls) { + this.photoUrls = photoUrls; + return this; + } + + public Pet addPhotoUrlsItem(String photoUrlsItem) { + this.photoUrls.add(photoUrlsItem); + return this; + } + + /** + * Get photoUrls + * @return photoUrls + **/ + @ApiModelProperty(required = true, value = "") + @NotNull + public List getPhotoUrls() { + return photoUrls; + } + + public void setPhotoUrls(List photoUrls) { + this.photoUrls = photoUrls; + } + + public Pet tags(List tags) { + this.tags = tags; + return this; + } + + public Pet addTagsItem(Tag tagsItem) { + this.tags.add(tagsItem); + return this; + } + + /** + * Get tags + * @return tags + **/ + @ApiModelProperty(value = "") + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + + public Pet status(StatusEnum status) { + this.status = status; + return this; + } + + /** + * pet status in the store + * @return status + **/ + @ApiModelProperty(value = "pet status in the store") + public StatusEnum getStatus() { + return status; + } + + public void setStatus(StatusEnum status) { + this.status = status; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Pet pet = (Pet) o; + return Objects.equals(this.id, pet.id) && + Objects.equals(this.category, pet.category) && + Objects.equals(this.name, pet.name) && + Objects.equals(this.photoUrls, pet.photoUrls) && + Objects.equals(this.tags, pet.tags) && + Objects.equals(this.status, pet.status); + } + + @Override + public int hashCode() { + return Objects.hash(id, category, name, photoUrls, tags, status); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Pet {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" category: ").append(toIndentedString(category)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" photoUrls: ").append(toIndentedString(photoUrls)).append("\n"); + sb.append(" tags: ").append(toIndentedString(tags)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/java-play-framework/app/apimodels/Tag.java b/samples/server/petstore/java-play-framework/app/apimodels/Tag.java new file mode 100644 index 00000000000..4c6effbdec6 --- /dev/null +++ b/samples/server/petstore/java-play-framework/app/apimodels/Tag.java @@ -0,0 +1,96 @@ +package apimodels; + +import java.util.Objects; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.*; +import com.fasterxml.jackson.annotation.*; +/** + * Tag + */ + +public class Tag { + @JsonProperty("id") + private Long id = null; + + @JsonProperty("name") + private String name = null; + + public Tag id(Long id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @ApiModelProperty(value = "") + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Tag name(String name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + **/ + @ApiModelProperty(value = "") + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Tag tag = (Tag) o; + return Objects.equals(this.id, tag.id) && + Objects.equals(this.name, tag.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Tag {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/java-play-framework/app/apimodels/User.java b/samples/server/petstore/java-play-framework/app/apimodels/User.java new file mode 100644 index 00000000000..9426d1b0356 --- /dev/null +++ b/samples/server/petstore/java-play-framework/app/apimodels/User.java @@ -0,0 +1,234 @@ +package apimodels; + +import java.util.Objects; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.*; +import com.fasterxml.jackson.annotation.*; +/** + * User + */ + +public class User { + @JsonProperty("id") + private Long id = null; + + @JsonProperty("username") + private String username = null; + + @JsonProperty("firstName") + private String firstName = null; + + @JsonProperty("lastName") + private String lastName = null; + + @JsonProperty("email") + private String email = null; + + @JsonProperty("password") + private String password = null; + + @JsonProperty("phone") + private String phone = null; + + @JsonProperty("userStatus") + private Integer userStatus = null; + + public User id(Long id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @ApiModelProperty(value = "") + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public User username(String username) { + this.username = username; + return this; + } + + /** + * Get username + * @return username + **/ + @ApiModelProperty(value = "") + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public User firstName(String firstName) { + this.firstName = firstName; + return this; + } + + /** + * Get firstName + * @return firstName + **/ + @ApiModelProperty(value = "") + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public User lastName(String lastName) { + this.lastName = lastName; + return this; + } + + /** + * Get lastName + * @return lastName + **/ + @ApiModelProperty(value = "") + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public User email(String email) { + this.email = email; + return this; + } + + /** + * Get email + * @return email + **/ + @ApiModelProperty(value = "") + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public User password(String password) { + this.password = password; + return this; + } + + /** + * Get password + * @return password + **/ + @ApiModelProperty(value = "") + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public User phone(String phone) { + this.phone = phone; + return this; + } + + /** + * Get phone + * @return phone + **/ + @ApiModelProperty(value = "") + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public User userStatus(Integer userStatus) { + this.userStatus = userStatus; + return this; + } + + /** + * User Status + * @return userStatus + **/ + @ApiModelProperty(value = "User Status") + public Integer getUserStatus() { + return userStatus; + } + + public void setUserStatus(Integer userStatus) { + this.userStatus = userStatus; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + User user = (User) o; + return Objects.equals(this.id, user.id) && + Objects.equals(this.username, user.username) && + Objects.equals(this.firstName, user.firstName) && + Objects.equals(this.lastName, user.lastName) && + Objects.equals(this.email, user.email) && + Objects.equals(this.password, user.password) && + Objects.equals(this.phone, user.phone) && + Objects.equals(this.userStatus, user.userStatus); + } + + @Override + public int hashCode() { + return Objects.hash(id, username, firstName, lastName, email, password, phone, userStatus); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class User {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" username: ").append(toIndentedString(username)).append("\n"); + sb.append(" firstName: ").append(toIndentedString(firstName)).append("\n"); + sb.append(" lastName: ").append(toIndentedString(lastName)).append("\n"); + sb.append(" email: ").append(toIndentedString(email)).append("\n"); + sb.append(" password: ").append(toIndentedString(password)).append("\n"); + sb.append(" phone: ").append(toIndentedString(phone)).append("\n"); + sb.append(" userStatus: ").append(toIndentedString(userStatus)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/java-play-framework/app/controllers/ApiDocController.java b/samples/server/petstore/java-play-framework/app/controllers/ApiDocController.java new file mode 100644 index 00000000000..60534355ae3 --- /dev/null +++ b/samples/server/petstore/java-play-framework/app/controllers/ApiDocController.java @@ -0,0 +1,15 @@ +package controllers; + +import javax.inject.*; +import play.mvc.*; + +public class ApiDocController extends Controller { + + @Inject + private ApiDocController() { + } + + public Result api() { + return redirect(String.format("/assets/lib/swagger-ui/index.html?/url=%s/api-docs", "")); + } +} diff --git a/samples/server/petstore/java-play-framework/app/controllers/PetApiController.java b/samples/server/petstore/java-play-framework/app/controllers/PetApiController.java new file mode 100644 index 00000000000..b707b720c7b --- /dev/null +++ b/samples/server/petstore/java-play-framework/app/controllers/PetApiController.java @@ -0,0 +1,248 @@ +package controllers; + +import java.io.File; +import apimodels.Pet; + +import io.swagger.annotations.*; +import play.mvc.Controller; +import play.mvc.Result; +import play.mvc.Http; +import java.util.List; +import java.util.ArrayList; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.JsonNode; +import com.google.inject.Inject; +import java.io.IOException; +import swagger.SwaggerUtils; +import javafx.util.Pair; +import com.fasterxml.jackson.core.type.TypeReference; + +import javax.validation.constraints.*; + + +@Api(value = "Pet", description = "the Pet API") +public class PetApiController extends Controller { + + private PetApiControllerImp imp; + private ObjectMapper mapper; + + @Inject + private PetApiController(PetApiControllerImp imp) { + this.imp = imp; + mapper = new ObjectMapper(); + } + + + @ApiOperation(value = "Add a new pet to the store", notes = "", authorizations = { + @Authorization(value = "petstore_auth", scopes = { + @AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), + @AuthorizationScope(scope = "read:pets", description = "read your pets") + }) + }, tags={ }) + @ApiResponses(value = { + @ApiResponse(code = 405, message = "Invalid input") }) + @ApiImplicitParams({ + @ApiImplicitParam(name = "body", value = "Pet object that needs to be added to the store", dataType = "apimodels.Pet", paramType = "body") + }) + public Result addPet() throws IOException { + JsonNode nodebody = request().body().asJson(); + Pet body; + if (nodebody != null) { + body = mapper.readValue(nodebody.toString(), Pet.class); + + } else { + body = null; + } + imp.addPet(body); + + return ok(); + } + + @ApiOperation(value = "Deletes a pet", notes = "", authorizations = { + @Authorization(value = "petstore_auth", scopes = { + @AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), + @AuthorizationScope(scope = "read:pets", description = "read your pets") + }) + }, tags={ }) + @ApiResponses(value = { + @ApiResponse(code = 400, message = "Invalid pet value") }) + @ApiImplicitParams({ + @ApiImplicitParam(name = "api_key", value = "", dataType = "String", paramType = "header") + }) + public Result deletePet(@ApiParam(value = "Pet id to delete", required = true ) Long petId) { + String valueapiKey = request().getHeader("api_key"); + String apiKey; + if (valueapiKey != null) { + apiKey = (String)valueapiKey; + + } else { + apiKey = ""; + } + imp.deletePet(petId, apiKey); + + return ok(); + } + + @ApiOperation(value = "Finds Pets by status", notes = "Multiple status values can be provided with comma separated strings", response = Pet.class, responseContainer = "List", authorizations = { + @Authorization(value = "petstore_auth", scopes = { + @AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), + @AuthorizationScope(scope = "read:pets", description = "read your pets") + }) + }, tags={ }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation", response = Pet.class), + @ApiResponse(code = 400, message = "Invalid status value", response = Pet.class) }) + @ApiImplicitParams({ + @ApiImplicitParam(name = "status", value = "Status values that need to be considered for filter", defaultValue = "available", dataType = "List", paramType = "query") + }) + public Result findPetsByStatus() { + //TODO: Maybe implement this in the future if we can support collection in the body params: see bug in swagger-play: https://github.com/swagger-api/swagger-play/issues/130 + //TODO: Tt seems it is not detected that it's a list based on the collectionFormat field? + //WIP when both bugs will be fixed + //List statusPair = SwaggerUtils.parameterToPairs("multi", "status", request().getQueryString("status")); + List status = new ArrayList(); + //for (Pair pair : statusPair) { + // status.add(pair.getValue()); + //} + List obj = imp.findPetsByStatus(status); + JsonNode result = mapper.valueToTree(obj); + return ok(result); + + } + + @ApiOperation(value = "Finds Pets by tags", notes = "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", response = Pet.class, responseContainer = "List", authorizations = { + @Authorization(value = "petstore_auth", scopes = { + @AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), + @AuthorizationScope(scope = "read:pets", description = "read your pets") + }) + }, tags={ }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation", response = Pet.class), + @ApiResponse(code = 400, message = "Invalid tag value", response = Pet.class) }) + @ApiImplicitParams({ + @ApiImplicitParam(name = "tags", value = "Tags to filter by", dataType = "List", paramType = "query") + }) + public Result findPetsByTags() { + //TODO: Maybe implement this in the future if we can support collection in the body params: see bug in swagger-play: https://github.com/swagger-api/swagger-play/issues/130 + //TODO: Tt seems it is not detected that it's a list based on the collectionFormat field? + //WIP when both bugs will be fixed + //List tagsPair = SwaggerUtils.parameterToPairs("multi", "tags", request().getQueryString("tags")); + List tags = new ArrayList(); + //for (Pair pair : tagsPair) { + // tags.add(pair.getValue()); + //} + List obj = imp.findPetsByTags(tags); + JsonNode result = mapper.valueToTree(obj); + return ok(result); + + } + + @ApiOperation(value = "Find pet by ID", notes = "Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions", response = Pet.class, authorizations = { + @Authorization(value = "petstore_auth", scopes = { + @AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), + @AuthorizationScope(scope = "read:pets", description = "read your pets") + }), + @Authorization(value = "api_key") + }, tags={ }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation", response = Pet.class), + @ApiResponse(code = 400, message = "Invalid ID supplied", response = Pet.class), + @ApiResponse(code = 404, message = "Pet not found", response = Pet.class) }) + @ApiImplicitParams({ + + }) + public Result getPetById(@ApiParam(value = "ID of pet that needs to be fetched", required = true ) Long petId) { + Pet obj = imp.getPetById(petId); + JsonNode result = mapper.valueToTree(obj); + return ok(result); + + } + + @ApiOperation(value = "Update an existing pet", notes = "", authorizations = { + @Authorization(value = "petstore_auth", scopes = { + @AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), + @AuthorizationScope(scope = "read:pets", description = "read your pets") + }) + }, tags={ }) + @ApiResponses(value = { + @ApiResponse(code = 400, message = "Invalid ID supplied"), + @ApiResponse(code = 404, message = "Pet not found"), + @ApiResponse(code = 405, message = "Validation exception") }) + @ApiImplicitParams({ + @ApiImplicitParam(name = "body", value = "Pet object that needs to be added to the store", dataType = "apimodels.Pet", paramType = "body") + }) + public Result updatePet() throws IOException { + JsonNode nodebody = request().body().asJson(); + Pet body; + if (nodebody != null) { + body = mapper.readValue(nodebody.toString(), Pet.class); + + } else { + body = null; + } + imp.updatePet(body); + + return ok(); + } + + @ApiOperation(value = "Updates a pet in the store with form data", notes = "", authorizations = { + @Authorization(value = "petstore_auth", scopes = { + @AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), + @AuthorizationScope(scope = "read:pets", description = "read your pets") + }) + }, tags={ }) + @ApiResponses(value = { + @ApiResponse(code = 405, message = "Invalid input") }) + @ApiImplicitParams({ + @ApiImplicitParam(name = "name", value = "Updated name of the pet", dataType = "String", paramType = "form"), + @ApiImplicitParam(name = "status", value = "Updated status of the pet", dataType = "String", paramType = "form") + }) + public Result updatePetWithForm(@ApiParam(value = "ID of pet that needs to be updated", required = true ) String petId) { + String valuename = ((String[]) request().body().asMultipartFormData().asFormUrlEncoded().get("name"))[0]; + String name; + if (valuename != null) { + name = (String)valuename; + + } else { + name = ""; + } + String valuestatus = ((String[]) request().body().asMultipartFormData().asFormUrlEncoded().get("status"))[0]; + String status; + if (valuestatus != null) { + status = (String)valuestatus; + + } else { + status = ""; + } + imp.updatePetWithForm(petId, name, status); + + return ok(); + } + + @ApiOperation(value = "uploads an image", notes = "", authorizations = { + @Authorization(value = "petstore_auth", scopes = { + @AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), + @AuthorizationScope(scope = "read:pets", description = "read your pets") + }) + }, tags={ }) + @ApiResponses(value = { + @ApiResponse(code = 0, message = "successful operation") }) + @ApiImplicitParams({ + @ApiImplicitParam(name = "additionalMetadata", value = "Additional data to pass to server", dataType = "String", paramType = "form"), + @ApiImplicitParam(name = "file", value = "file to upload", dataType = "apimodels.File", paramType = "form") + }) + public Result uploadFile(@ApiParam(value = "ID of pet to update", required = true ) Long petId) { + String valueadditionalMetadata = ((String[]) request().body().asMultipartFormData().asFormUrlEncoded().get("additionalMetadata"))[0]; + String additionalMetadata; + if (valueadditionalMetadata != null) { + additionalMetadata = (String)valueadditionalMetadata; + + } else { + additionalMetadata = ""; + } + Http.MultipartFormData.FilePart file = request().body().asMultipartFormData().getFile("file"); + imp.uploadFile(petId, additionalMetadata, file); + + return ok(); + } +} diff --git a/samples/server/petstore/java-play-framework/app/controllers/PetApiControllerImp.java b/samples/server/petstore/java-play-framework/app/controllers/PetApiControllerImp.java new file mode 100644 index 00000000000..70c34a3a867 --- /dev/null +++ b/samples/server/petstore/java-play-framework/app/controllers/PetApiControllerImp.java @@ -0,0 +1,53 @@ +package controllers; + +import java.io.File; +import apimodels.Pet; + +import play.mvc.Http; +import java.util.List; +import java.util.ArrayList; +import java.util.HashMap; +import javax.validation.constraints.*; + +public class PetApiControllerImp { + void addPet(Pet body) { + //Do your magic!!! + + } + + void deletePet( Long petId, String apiKey) { + //Do your magic!!! + + } + + List findPetsByStatus( List status) { + //Do your magic!!! + return new ArrayList(); + } + + List findPetsByTags( List tags) { + //Do your magic!!! + return new ArrayList(); + } + + Pet getPetById( Long petId) { + //Do your magic!!! + return new Pet(); + } + + void updatePet(Pet body) { + //Do your magic!!! + + } + + void updatePetWithForm( String petId, String name, String status) { + //Do your magic!!! + + } + + void uploadFile( Long petId, String additionalMetadata, Http.MultipartFormData.FilePart file) { + //Do your magic!!! + + } + +} diff --git a/samples/server/petstore/java-play-framework/app/controllers/PetApiControllerImpInterface.java b/samples/server/petstore/java-play-framework/app/controllers/PetApiControllerImpInterface.java new file mode 100644 index 00000000000..c52bedf522c --- /dev/null +++ b/samples/server/petstore/java-play-framework/app/controllers/PetApiControllerImpInterface.java @@ -0,0 +1,29 @@ +package controllers; + +import java.io.File; +import apimodels.Pet; + +import java.util.List; +import java.util.ArrayList; +import java.util.HashMap; + +import play.mvc.Http; + +public interface PetApiControllerImpInterface { + void addPet(Pet body); + + void deletePet( Long petId, String apiKey); + + List findPetsByStatus( List status); + + List findPetsByTags( List tags); + + Pet getPetById( Long petId); + + void updatePet(Pet body); + + void updatePetWithForm( String petId, String name, String status); + + void uploadFile( Long petId, String additionalMetadata, Http.MultipartFormData.FilePart file); + +} diff --git a/samples/server/petstore/java-play-framework/app/controllers/StoreApiController.java b/samples/server/petstore/java-play-framework/app/controllers/StoreApiController.java new file mode 100644 index 00000000000..02d1c118ec7 --- /dev/null +++ b/samples/server/petstore/java-play-framework/app/controllers/StoreApiController.java @@ -0,0 +1,97 @@ +package controllers; + +import java.util.Map; +import apimodels.Order; + +import io.swagger.annotations.*; +import play.mvc.Controller; +import play.mvc.Result; +import play.mvc.Http; +import java.util.List; +import java.util.ArrayList; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.JsonNode; +import com.google.inject.Inject; +import java.io.IOException; +import swagger.SwaggerUtils; +import javafx.util.Pair; +import com.fasterxml.jackson.core.type.TypeReference; + +import javax.validation.constraints.*; + + +@Api(value = "Store", description = "the Store API") +public class StoreApiController extends Controller { + + private StoreApiControllerImp imp; + private ObjectMapper mapper; + + @Inject + private StoreApiController(StoreApiControllerImp imp) { + this.imp = imp; + mapper = new ObjectMapper(); + } + + + @ApiOperation(value = "Delete purchase order by ID", notes = "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors", tags={ }) + @ApiResponses(value = { + @ApiResponse(code = 400, message = "Invalid ID supplied"), + @ApiResponse(code = 404, message = "Order not found") }) + @ApiImplicitParams({ + + }) + public Result deleteOrder(@ApiParam(value = "ID of the order that needs to be deleted", required = true ) String orderId) { + imp.deleteOrder(orderId); + + return ok(); + } + + @ApiOperation(value = "Returns pet inventories by status", notes = "Returns a map of status codes to quantities", response = Integer.class, responseContainer = "Map", authorizations = { + @Authorization(value = "api_key") + }, tags={ }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation", response = Integer.class) }) + public Result getInventory() { + Map obj = imp.getInventory(); + JsonNode result = mapper.valueToTree(obj); + return ok(result); + + } + + @ApiOperation(value = "Find purchase order by ID", notes = "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions", response = Order.class, tags={ }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation", response = Order.class), + @ApiResponse(code = 400, message = "Invalid ID supplied", response = Order.class), + @ApiResponse(code = 404, message = "Order not found", response = Order.class) }) + @ApiImplicitParams({ + + }) + public Result getOrderById(@ApiParam(value = "ID of pet that needs to be fetched", required = true ) String orderId) { + Order obj = imp.getOrderById(orderId); + JsonNode result = mapper.valueToTree(obj); + return ok(result); + + } + + @ApiOperation(value = "Place an order for a pet", notes = "", response = Order.class, tags={ }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation", response = Order.class), + @ApiResponse(code = 400, message = "Invalid Order", response = Order.class) }) + @ApiImplicitParams({ + @ApiImplicitParam(name = "body", value = "order placed for purchasing the pet", dataType = "apimodels.Order", paramType = "body") + }) + public Result placeOrder() throws IOException { + JsonNode nodebody = request().body().asJson(); + Order body; + if (nodebody != null) { + body = mapper.readValue(nodebody.toString(), Order.class); + + } else { + body = null; + } + Order obj = imp.placeOrder(body); + JsonNode result = mapper.valueToTree(obj); + return ok(result); + + } +} diff --git a/samples/server/petstore/java-play-framework/app/controllers/StoreApiControllerImp.java b/samples/server/petstore/java-play-framework/app/controllers/StoreApiControllerImp.java new file mode 100644 index 00000000000..d2add2ecc87 --- /dev/null +++ b/samples/server/petstore/java-play-framework/app/controllers/StoreApiControllerImp.java @@ -0,0 +1,33 @@ +package controllers; + +import java.util.Map; +import apimodels.Order; + +import play.mvc.Http; +import java.util.List; +import java.util.ArrayList; +import java.util.HashMap; +import javax.validation.constraints.*; + +public class StoreApiControllerImp { + void deleteOrder( String orderId) { + //Do your magic!!! + + } + + Map getInventory() { + //Do your magic!!! + return new HashMap(); + } + + Order getOrderById( String orderId) { + //Do your magic!!! + return new Order(); + } + + Order placeOrder(Order body) { + //Do your magic!!! + return new Order(); + } + +} diff --git a/samples/server/petstore/java-play-framework/app/controllers/StoreApiControllerImpInterface.java b/samples/server/petstore/java-play-framework/app/controllers/StoreApiControllerImpInterface.java new file mode 100644 index 00000000000..2d0f8b941a9 --- /dev/null +++ b/samples/server/petstore/java-play-framework/app/controllers/StoreApiControllerImpInterface.java @@ -0,0 +1,19 @@ +package controllers; + +import java.util.Map; +import apimodels.Order; + +import java.util.List; +import java.util.ArrayList; +import java.util.HashMap; + +public interface StoreApiControllerImpInterface { + void deleteOrder( String orderId); + + Map getInventory(); + + Order getOrderById( String orderId); + + Order placeOrder(Order body); + +} diff --git a/samples/server/petstore/java-play-framework/app/controllers/UserApiController.java b/samples/server/petstore/java-play-framework/app/controllers/UserApiController.java new file mode 100644 index 00000000000..5693ac81fbd --- /dev/null +++ b/samples/server/petstore/java-play-framework/app/controllers/UserApiController.java @@ -0,0 +1,184 @@ +package controllers; + +import java.util.List; +import apimodels.User; + +import io.swagger.annotations.*; +import play.mvc.Controller; +import play.mvc.Result; +import play.mvc.Http; +import java.util.List; +import java.util.ArrayList; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.JsonNode; +import com.google.inject.Inject; +import java.io.IOException; +import swagger.SwaggerUtils; +import javafx.util.Pair; +import com.fasterxml.jackson.core.type.TypeReference; + +import javax.validation.constraints.*; + + +@Api(value = "User", description = "the User API") +public class UserApiController extends Controller { + + private UserApiControllerImp imp; + private ObjectMapper mapper; + + @Inject + private UserApiController(UserApiControllerImp imp) { + this.imp = imp; + mapper = new ObjectMapper(); + } + + + @ApiOperation(value = "Create user", notes = "This can only be done by the logged in user.", tags={ }) + @ApiResponses(value = { + @ApiResponse(code = 0, message = "successful operation") }) + @ApiImplicitParams({ + @ApiImplicitParam(name = "body", value = "Created user object", dataType = "apimodels.User", paramType = "body") + }) + public Result createUser() throws IOException { + JsonNode nodebody = request().body().asJson(); + User body; + if (nodebody != null) { + body = mapper.readValue(nodebody.toString(), User.class); + + } else { + body = null; + } + imp.createUser(body); + + return ok(); + } + + @ApiOperation(value = "Creates list of users with given input array", notes = "", tags={ }) + @ApiResponses(value = { + @ApiResponse(code = 0, message = "successful operation") }) + @ApiImplicitParams({ + @ApiImplicitParam(name = "body", value = "List of user object", dataType = "List", paramType = "body") + }) + public Result createUsersWithArrayInput() throws IOException { + JsonNode nodebody = request().body().asJson(); + List body; + if (nodebody != null) { + body = mapper.readValue(nodebody.toString(), new TypeReference>>(){}); + + } else { + body = null; + } + imp.createUsersWithArrayInput(body); + + return ok(); + } + + @ApiOperation(value = "Creates list of users with given input array", notes = "", tags={ }) + @ApiResponses(value = { + @ApiResponse(code = 0, message = "successful operation") }) + @ApiImplicitParams({ + @ApiImplicitParam(name = "body", value = "List of user object", dataType = "List", paramType = "body") + }) + public Result createUsersWithListInput() throws IOException { + JsonNode nodebody = request().body().asJson(); + List body; + if (nodebody != null) { + body = mapper.readValue(nodebody.toString(), new TypeReference>>(){}); + + } else { + body = null; + } + imp.createUsersWithListInput(body); + + return ok(); + } + + @ApiOperation(value = "Delete user", notes = "This can only be done by the logged in user.", tags={ }) + @ApiResponses(value = { + @ApiResponse(code = 400, message = "Invalid username supplied"), + @ApiResponse(code = 404, message = "User not found") }) + @ApiImplicitParams({ + + }) + public Result deleteUser(@ApiParam(value = "The name that needs to be deleted", required = true ) String username) { + imp.deleteUser(username); + + return ok(); + } + + @ApiOperation(value = "Get user by user name", notes = "", response = User.class, tags={ }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation", response = User.class), + @ApiResponse(code = 400, message = "Invalid username supplied", response = User.class), + @ApiResponse(code = 404, message = "User not found", response = User.class) }) + @ApiImplicitParams({ + + }) + public Result getUserByName(@ApiParam(value = "The name that needs to be fetched. Use user1 for testing. ", required = true ) String username) { + User obj = imp.getUserByName(username); + JsonNode result = mapper.valueToTree(obj); + return ok(result); + + } + + @ApiOperation(value = "Logs user into the system", notes = "", response = String.class, tags={ }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation", response = String.class), + @ApiResponse(code = 400, message = "Invalid username/password supplied", response = String.class) }) + @ApiImplicitParams({ + @ApiImplicitParam(name = "username", value = "The user name for login", dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "password", value = "The password for login in clear text", dataType = "String", paramType = "query") + }) + public Result loginUser() { + String valueusername = request().getQueryString("username"); + String username; + if (valueusername != null) { + username = (String)valueusername; + + } else { + username = ""; + } + String valuepassword = request().getQueryString("password"); + String password; + if (valuepassword != null) { + password = (String)valuepassword; + + } else { + password = ""; + } + String obj = imp.loginUser(username, password); + JsonNode result = mapper.valueToTree(obj); + return ok(result); + + } + + @ApiOperation(value = "Logs out current logged in user session", notes = "", tags={ }) + @ApiResponses(value = { + @ApiResponse(code = 0, message = "successful operation") }) + public Result logoutUser() { + imp.logoutUser(); + + return ok(); + } + + @ApiOperation(value = "Updated user", notes = "This can only be done by the logged in user.", tags={ }) + @ApiResponses(value = { + @ApiResponse(code = 400, message = "Invalid user supplied"), + @ApiResponse(code = 404, message = "User not found") }) + @ApiImplicitParams({ + @ApiImplicitParam(name = "body", value = "Updated user object", dataType = "apimodels.User", paramType = "body") + }) + public Result updateUser(@ApiParam(value = "name that need to be deleted", required = true ) String username) throws IOException { + JsonNode nodebody = request().body().asJson(); + User body; + if (nodebody != null) { + body = mapper.readValue(nodebody.toString(), User.class); + + } else { + body = null; + } + imp.updateUser(username, body); + + return ok(); + } +} diff --git a/samples/server/petstore/java-play-framework/app/controllers/UserApiControllerImp.java b/samples/server/petstore/java-play-framework/app/controllers/UserApiControllerImp.java new file mode 100644 index 00000000000..2c2180af5d0 --- /dev/null +++ b/samples/server/petstore/java-play-framework/app/controllers/UserApiControllerImp.java @@ -0,0 +1,53 @@ +package controllers; + +import java.util.List; +import apimodels.User; + +import play.mvc.Http; +import java.util.List; +import java.util.ArrayList; +import java.util.HashMap; +import javax.validation.constraints.*; + +public class UserApiControllerImp { + void createUser(User body) { + //Do your magic!!! + + } + + void createUsersWithArrayInput(List body) { + //Do your magic!!! + + } + + void createUsersWithListInput(List body) { + //Do your magic!!! + + } + + void deleteUser( String username) { + //Do your magic!!! + + } + + User getUserByName( String username) { + //Do your magic!!! + return new User(); + } + + String loginUser( String username, String password) { + //Do your magic!!! + return new String(); + } + + void logoutUser() { + //Do your magic!!! + + } + + void updateUser( String username, User body) { + //Do your magic!!! + + } + +} diff --git a/samples/server/petstore/java-play-framework/app/controllers/UserApiControllerImpInterface.java b/samples/server/petstore/java-play-framework/app/controllers/UserApiControllerImpInterface.java new file mode 100644 index 00000000000..3d5f4034848 --- /dev/null +++ b/samples/server/petstore/java-play-framework/app/controllers/UserApiControllerImpInterface.java @@ -0,0 +1,27 @@ +package controllers; + +import java.util.List; +import apimodels.User; + +import java.util.List; +import java.util.ArrayList; +import java.util.HashMap; + +public interface UserApiControllerImpInterface { + void createUser(User body); + + void createUsersWithArrayInput(List body); + + void createUsersWithListInput(List body); + + void deleteUser( String username); + + User getUserByName( String username); + + String loginUser( String username, String password); + + void logoutUser(); + + void updateUser( String username, User body); + +} diff --git a/samples/server/petstore/java-play-framework/app/swagger/SwaggerUtils.java b/samples/server/petstore/java-play-framework/app/swagger/SwaggerUtils.java new file mode 100644 index 00000000000..99f8d84b739 --- /dev/null +++ b/samples/server/petstore/java-play-framework/app/swagger/SwaggerUtils.java @@ -0,0 +1,108 @@ +package swagger; + +import javafx.util.Pair; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +public class SwaggerUtils { + + /** + * Format to {@code Pair} objects. + * + * @param collectionFormat collection format (e.g. csv, tsv) + * @param name Name + * @param value Value + * @return A list of Pair objects + */ + public static List parameterToPairs(String collectionFormat, String name, Object value){ + List params = new ArrayList(); + + // preconditions + if (name == null || name.isEmpty() || value == null) return params; + + Collection valueCollection = null; + if (value instanceof Collection) { + valueCollection = (Collection) value; + } else { + params.add(new Pair(name, parameterToString(value))); + return params; + } + + if (valueCollection.isEmpty()){ + return params; + } + + // get the collection format + collectionFormat = (collectionFormat == null || collectionFormat.isEmpty() ? "csv" : collectionFormat); // default: csv + + // create the params based on the collection format + if (collectionFormat.equals("multi")) { + for (Object item : valueCollection) { + params.add(new Pair(name, parameterToString(item))); + } + + return params; + } + + String delimiter = ","; + + if (collectionFormat.equals("csv")) { + delimiter = ","; + } else if (collectionFormat.equals("ssv")) { + delimiter = " "; + } else if (collectionFormat.equals("tsv")) { + delimiter = "\t"; + } else if (collectionFormat.equals("pipes")) { + delimiter = "|"; + } + + StringBuilder sb = new StringBuilder() ; + for (Object item : valueCollection) { + sb.append(delimiter); + sb.append(parameterToString(item)); + } + + params.add(new Pair(name, sb.substring(1))); + + return params; + } + + /** + * Format the given parameter object into string. + * + * @param param Parameter + * @return String representation of the parameter + */ + public static String parameterToString(Object param) { + if (param == null) { + return ""; + } else if (param instanceof Date) { + return formatDatetime((Date) param); + } else if (param instanceof Collection) { + StringBuilder b = new StringBuilder(); + for (Object o : (Collection)param) { + if (b.length() > 0) { + b.append(","); + } + b.append(String.valueOf(o)); + } + return b.toString(); + } else { + return String.valueOf(param); + } + } + + /** + * Format the given Date object into string (Datetime format). + * + * @param date Date object + * @return Formatted datetime in string representation + */ + public static String formatDatetime(Date date) { + return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX").format(date); + } +} \ No newline at end of file diff --git a/samples/server/petstore/java-play-framework/build.sbt b/samples/server/petstore/java-play-framework/build.sbt new file mode 100644 index 00000000000..6d54164e40e --- /dev/null +++ b/samples/server/petstore/java-play-framework/build.sbt @@ -0,0 +1,16 @@ +name := """swagger-java-playframework""" + +version := "1.0-SNAPSHOT" + +lazy val root = (project in file(".")).enablePlugins(PlayJava) + +scalaVersion := "2.11.7" + +libraryDependencies ++= Seq( +javaJdbc, +cache, +javaWs, +"io.swagger" %% "swagger-play2" % "1.5.3", +"org.webjars" % "swagger-ui" % "2.2.8", +"javax.validation" % "validation-api" % "1.1.0.Final" +) diff --git a/samples/server/petstore/java-play-framework/conf/application.conf b/samples/server/petstore/java-play-framework/conf/application.conf new file mode 100644 index 00000000000..56ec60e771a --- /dev/null +++ b/samples/server/petstore/java-play-framework/conf/application.conf @@ -0,0 +1,361 @@ +springfox.documentation.swagger.v2.path=/api-docs +server.contextPath=/ +server.port=9000 +spring.jackson.date-format=io.swagger.RFC3339DateFormat +spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false + +# This is the main configuration file for the application. +# https://www.playframework.com/documentation/latest/ConfigFile +# ~~~~~ +# Play uses HOCON as its configuration file format. HOCON has a number +# of advantages over other config formats, but there are two things that +# can be used when modifying settings. +# +# You can include other configuration files in this main application.conf file: +#include "extra-config.conf" +# +# You can declare variables and substitute for them: +#mykey = ${some.value} +# +# And if an environment variable exists when there is no other subsitution, then +# HOCON will fall back to substituting environment variable: +#mykey = ${JAVA_HOME} + +## Akka +# https://www.playframework.com/documentation/latest/ScalaAkka#Configuration +# https://www.playframework.com/documentation/latest/JavaAkka#Configuration +# ~~~~~ +# Play uses Akka internally and exposes Akka Streams and actors in Websockets and +# other streaming HTTP responses. +akka { +# "akka.log-config-on-start" is extraordinarly useful because it log the complete +# configuration at INFO level, including defaults and overrides, so it s worth +# putting at the very top. +# +# Put the following in your conf/logback.xml file: +# +# +# +# And then uncomment this line to debug the configuration. +# +#log-config-on-start = true +} + +api.version="1.0" + +## Secret key +# http://www.playframework.com/documentation/latest/ApplicationSecret +# ~~~~~ +# The secret key is used to sign Play's session cookie. +# This must be changed for production, but we don't recommend you change it in this file. +play.crypto.secret = "changeme" + +## Modules +# https://www.playframework.com/documentation/latest/Modules +# ~~~~~ +# Control which modules are loaded when Play starts. Note that modules are +# the replacement for "GlobalSettings", which are deprecated in 2.5.x. +# Please see https://www.playframework.com/documentation/latest/GlobalSettings +# for more information. +# +# You can also extend Play functionality by using one of the publically available +# Play modules: https://playframework.com/documentation/latest/ModuleDirectory +play.modules { +# By default, Play will load any class called Module that is defined +# in the root package (the "app" directory), or you can define them +# explicitly below. +# If there are any built-in modules that you want to disable, you can list them here. +enabled += "play.modules.swagger.SwaggerModule" + +# If there are any built-in modules that you want to disable, you can list them here. +#disabled += "" +} + +## IDE +# https://www.playframework.com/documentation/latest/IDE +# ~~~~~ +# Depending on your IDE, you can add a hyperlink for errors that will jump you +# directly to the code location in the IDE in dev mode. The following line makes +# use of the IntelliJ IDEA REST interface: +#play.editor="http://localhost:63342/api/file/?file=%s&line=%s" + +## Internationalisation +# https://www.playframework.com/documentation/latest/JavaI18N +# https://www.playframework.com/documentation/latest/ScalaI18N +# ~~~~~ +# Play comes with its own i18n settings, which allow the user's preferred language +# to map through to internal messages, or allow the language to be stored in a cookie. +play.i18n { +# The application languages +langs = [ "en" ] + +# Whether the language cookie should be secure or not +#langCookieSecure = true + +# Whether the HTTP only attribute of the cookie should be set to true +#langCookieHttpOnly = true +} + +## Play HTTP settings +# ~~~~~ +play.http { +## Router +# https://www.playframework.com/documentation/latest/JavaRouting +# https://www.playframework.com/documentation/latest/ScalaRouting +# ~~~~~ +# Define the Router object to use for this application. +# This router will be looked up first when the application is starting up, +# so make sure this is the entry point. +# Furthermore, it's assumed your route file is named properly. +# So for an application router like `my.application.Router`, +# you may need to define a router file `conf/my.application.routes`. +# Default to Routes in the root package (aka "apps" folder) (and conf/routes) +#router = my.application.Router + +## Action Creator +# https://www.playframework.com/documentation/latest/JavaActionCreator +# ~~~~~ +#actionCreator = null + +## ErrorHandler +# https://www.playframework.com/documentation/latest/JavaRouting +# https://www.playframework.com/documentation/latest/ScalaRouting +# ~~~~~ +# If null, will attempt to load a class called ErrorHandler in the root package, +#errorHandler = null + +## Filters +# https://www.playframework.com/documentation/latest/ScalaHttpFilters +# https://www.playframework.com/documentation/latest/JavaHttpFilters +# ~~~~~ +# Filters run code on every request. They can be used to perform +# common logic for all your actions, e.g. adding common headers. +# Defaults to "Filters" in the root package (aka "apps" folder) +# Alternatively you can explicitly register a class here. +#filters = my.application.Filters + +## Session & Flash +# https://www.playframework.com/documentation/latest/JavaSessionFlash +# https://www.playframework.com/documentation/latest/ScalaSessionFlash +# ~~~~~ +session { +# Sets the cookie to be sent only over HTTPS. +#secure = true + +# Sets the cookie to be accessed only by the server. +#httpOnly = true + +# Sets the max-age field of the cookie to 5 minutes. +# NOTE: this only sets when the browser will discard the cookie. Play will consider any +# cookie value with a valid signature to be a valid session forever. To implement a server side session timeout, +# you need to put a timestamp in the session and check it at regular intervals to possibly expire it. +#maxAge = 300 + +# Sets the domain on the session cookie. +#domain = "example.com" +} + +flash { +# Sets the cookie to be sent only over HTTPS. +#secure = true + +# Sets the cookie to be accessed only by the server. +#httpOnly = true +} +} + +## Netty Provider +# https://www.playframework.com/documentation/latest/SettingsNetty +# ~~~~~ +play.server.netty { +# Whether the Netty wire should be logged +#log.wire = true + +# If you run Play on Linux, you can use Netty's native socket transport +# for higher performance with less garbage. +#transport = "native" +} + +## WS (HTTP Client) +# https://www.playframework.com/documentation/latest/ScalaWS#Configuring-WS +# ~~~~~ +# The HTTP client primarily used for REST APIs. The default client can be +# configured directly, but you can also create different client instances +# with customized settings. You must enable this by adding to build.sbt: +# +# libraryDependencies += ws // or javaWs if using java +# +play.ws { +# Sets HTTP requests not to follow 302 requests +#followRedirects = false + +# Sets the maximum number of open HTTP connections for the client. +#ahc.maxConnectionsTotal = 50 + +## WS SSL +# https://www.playframework.com/documentation/latest/WsSSL +# ~~~~~ +ssl { +# Configuring HTTPS with Play WS does not require programming. You can +# set up both trustManager and keyManager for mutual authentication, and +# turn on JSSE debugging in development with a reload. +#debug.handshake = true +#trustManager = { +# stores = [ +# { type = "JKS", path = "exampletrust.jks" } +# ] +#} +} +} + +## Cache +# https://www.playframework.com/documentation/latest/JavaCache +# https://www.playframework.com/documentation/latest/ScalaCache +# ~~~~~ +# Play comes with an integrated cache API that can reduce the operational +# overhead of repeated requests. You must enable this by adding to build.sbt: +# +# libraryDependencies += cache +# +play.cache { +# If you want to bind several caches, you can bind the individually +#bindCaches = ["db-cache", "user-cache", "session-cache"] +} + +## Filters +# https://www.playframework.com/documentation/latest/Filters +# ~~~~~ +# There are a number of built-in filters that can be enabled and configured +# to give Play greater security. You must enable this by adding to build.sbt: +# +# libraryDependencies += filters +# +play.filters { +## CORS filter configuration +# https://www.playframework.com/documentation/latest/CorsFilter +# ~~~~~ +# CORS is a protocol that allows web applications to make requests from the browser +# across different domains. +# NOTE: You MUST apply the CORS configuration before the CSRF filter, as CSRF has +# dependencies on CORS settings. +cors { +# Filter paths by a whitelist of path prefixes +#pathPrefixes = ["/some/path", ...] + +# The allowed origins. If null, all origins are allowed. +#allowedOrigins = ["http://www.example.com"] + +# The allowed HTTP methods. If null, all methods are allowed +#allowedHttpMethods = ["GET", "POST"] +} + +## CSRF Filter +# https://www.playframework.com/documentation/latest/ScalaCsrf#Applying-a-global-CSRF-filter +# https://www.playframework.com/documentation/latest/JavaCsrf#Applying-a-global-CSRF-filter +# ~~~~~ +# Play supports multiple methods for verifying that a request is not a CSRF request. +# The primary mechanism is a CSRF token. This token gets placed either in the query string +# or body of every form submitted, and also gets placed in the users session. +# Play then verifies that both tokens are present and match. +csrf { +# Sets the cookie to be sent only over HTTPS +#cookie.secure = true + +# Defaults to CSRFErrorHandler in the root package. +#errorHandler = MyCSRFErrorHandler +} + +## Security headers filter configuration +# https://www.playframework.com/documentation/latest/SecurityHeaders +# ~~~~~ +# Defines security headers that prevent XSS attacks. +# If enabled, then all options are set to the below configuration by default: +headers { +# The X-Frame-Options header. If null, the header is not set. +#frameOptions = "DENY" + +# The X-XSS-Protection header. If null, the header is not set. +#xssProtection = "1; mode=block" + +# The X-Content-Type-Options header. If null, the header is not set. +#contentTypeOptions = "nosniff" + +# The X-Permitted-Cross-Domain-Policies header. If null, the header is not set. +#permittedCrossDomainPolicies = "master-only" + +# The Content-Security-Policy header. If null, the header is not set. +#contentSecurityPolicy = "default-src 'self'" +} + +## Allowed hosts filter configuration +# https://www.playframework.com/documentation/latest/AllowedHostsFilter +# ~~~~~ +# Play provides a filter that lets you configure which hosts can access your application. +# This is useful to prevent cache poisoning attacks. +hosts { +# Allow requests to example.com, its subdomains, and localhost:9000. +#allowed = [".example.com", "localhost:9000"] +} +} + +## Evolutions +# https://www.playframework.com/documentation/latest/Evolutions +# ~~~~~ +# Evolutions allows database scripts to be automatically run on startup in dev mode +# for database migrations. You must enable this by adding to build.sbt: +# +# libraryDependencies += evolutions +# +play.evolutions { +# You can disable evolutions for a specific datasource if necessary +#db.default.enabled = false +} + +## Database Connection Pool +# https://www.playframework.com/documentation/latest/SettingsJDBC +# ~~~~~ +# Play doesn't require a JDBC database to run, but you can easily enable one. +# +# libraryDependencies += jdbc +# +play.db { +# The combination of these two settings results in "db.default" as the +# default JDBC pool: +#config = "db" +#default = "default" + +# Play uses HikariCP as the default connection pool. You can override +# settings by changing the prototype: +prototype { +# Sets a fixed JDBC connection pool size of 50 +#hikaricp.minimumIdle = 50 +#hikaricp.maximumPoolSize = 50 +} +} + +## JDBC Datasource +# https://www.playframework.com/documentation/latest/JavaDatabase +# https://www.playframework.com/documentation/latest/ScalaDatabase +# ~~~~~ +# Once JDBC datasource is set up, you can work with several different +# database options: +# +# Slick (Scala preferred option): https://www.playframework.com/documentation/latest/PlaySlick +# JPA (Java preferred option): https://playframework.com/documentation/latest/JavaJPA +# EBean: https://playframework.com/documentation/latest/JavaEbean +# Anorm: https://www.playframework.com/documentation/latest/ScalaAnorm +# +db { +# You can declare as many datasources as you want. +# By convention, the default datasource is named `default` + +# https://www.playframework.com/documentation/latest/Developing-with-the-H2-Database +#default.driver = org.h2.Driver +#default.url = "jdbc:h2:mem:play" +#default.username = sa +#default.password = "" + +# You can turn on SQL logging for any datasource +# https://www.playframework.com/documentation/latest/Highlights25#Logging-SQL-statements +#default.logSql=true +} diff --git a/samples/server/petstore/java-play-framework/conf/logback.xml b/samples/server/petstore/java-play-framework/conf/logback.xml new file mode 100644 index 00000000000..01f301ab73a --- /dev/null +++ b/samples/server/petstore/java-play-framework/conf/logback.xml @@ -0,0 +1,41 @@ + + + + + + + ${application.home:-.}/logs/application.log + + %date [%level] from %logger in %thread - %message%n%xException + + + + + + %coloredLevel %logger{15} - %message%n%xException{10} + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/server/petstore/java-play-framework/conf/routes b/samples/server/petstore/java-play-framework/conf/routes new file mode 100644 index 00000000000..25f8880e2d5 --- /dev/null +++ b/samples/server/petstore/java-play-framework/conf/routes @@ -0,0 +1,40 @@ +# Routes +# This file defines all application routes (Higher priority routes first) +# ~~~~ + +GET /api controllers.ApiDocController.api + + +#Functions for Pet API +POST /pet controllers.PetApiController.addPet() +DELETE /pet/:petId controllers.PetApiController.deletePet(petId: Long) +GET /pet/findByStatus controllers.PetApiController.findPetsByStatus() +GET /pet/findByTags controllers.PetApiController.findPetsByTags() +GET /pet/:petId controllers.PetApiController.getPetById(petId: Long) +PUT /pet controllers.PetApiController.updatePet() +POST /pet/:petId controllers.PetApiController.updatePetWithForm(petId: String) +POST /pet/:petId/uploadImage controllers.PetApiController.uploadFile(petId: Long) + +#Functions for Store API +DELETE /store/order/:orderId controllers.StoreApiController.deleteOrder(orderId: String) +GET /store/inventory controllers.StoreApiController.getInventory() +GET /store/order/:orderId controllers.StoreApiController.getOrderById(orderId: String) +POST /store/order controllers.StoreApiController.placeOrder() + +#Functions for User API +POST /user controllers.UserApiController.createUser() +POST /user/createWithArray controllers.UserApiController.createUsersWithArrayInput() +POST /user/createWithList controllers.UserApiController.createUsersWithListInput() +DELETE /user/:username controllers.UserApiController.deleteUser(username: String) +GET /user/:username controllers.UserApiController.getUserByName(username: String) +GET /user/login controllers.UserApiController.loginUser() +GET /user/logout controllers.UserApiController.logoutUser() +PUT /user/:username controllers.UserApiController.updateUser(username: String) + +# Map static resources from the /public folder to the /assets URL path +GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset) + +GET /api-docs controllers.ApiHelpController.getResources +GET /api-docs.json/Pet controllers.ApiHelpController.getResource(path = "/Pet") +GET /api-docs.json/Store controllers.ApiHelpController.getResource(path = "/Store") +GET /api-docs.json/User controllers.ApiHelpController.getResource(path = "/User") diff --git a/samples/server/petstore/java-play-framework/pom.xml b/samples/server/petstore/java-play-framework/pom.xml new file mode 100644 index 00000000000..11bbefd17f5 --- /dev/null +++ b/samples/server/petstore/java-play-framework/pom.xml @@ -0,0 +1,43 @@ + + 4.0.0 + io.swagger + PlayServerTests + pom + 1.0-SNAPSHOT + Play Petstore Server + + + + maven-dependency-plugin + + + package + + copy-dependencies + + + ${project.build.directory} + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + + Play Test + integration-test + + exec + + + ./sbt_test_jdk8_only.sh + + + + + + + diff --git a/samples/server/petstore/java-play-framework/project/build.properties b/samples/server/petstore/java-play-framework/project/build.properties new file mode 100644 index 00000000000..59e7c05b62f --- /dev/null +++ b/samples/server/petstore/java-play-framework/project/build.properties @@ -0,0 +1 @@ +sbt.version=0.13.11 \ No newline at end of file diff --git a/samples/server/petstore/java-play-framework/project/plugins.sbt b/samples/server/petstore/java-play-framework/project/plugins.sbt new file mode 100644 index 00000000000..ca73a99c721 --- /dev/null +++ b/samples/server/petstore/java-play-framework/project/plugins.sbt @@ -0,0 +1,2 @@ +// The Play plugin +addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.10") diff --git a/samples/server/petstore/java-play-framework/sbt_test_jdk8_only.sh b/samples/server/petstore/java-play-framework/sbt_test_jdk8_only.sh new file mode 100755 index 00000000000..31ad9761486 --- /dev/null +++ b/samples/server/petstore/java-play-framework/sbt_test_jdk8_only.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +java -version 2>&1 | grep "java version \"1.8" + +if [ $? -eq 0 ] +then + echo "Running JDK8" + sbt test +else + echo "Not running JDK8" +fi