Browse Source

same player shoot again

master
Nicolas Massé 6 years ago
parent
commit
359879a370
  1. 5
      .gitignore
  2. 4
      .s2i/environment
  3. 11
      README.md
  4. 122
      pom.xml
  5. 23
      src/main/docker/Dockerfile.jvm
  6. 22
      src/main/docker/Dockerfile.native
  7. 56
      src/main/java/io/example/library/api/AuthorsResource.java
  8. 56
      src/main/java/io/example/library/api/BooksResource.java
  9. 60
      src/main/java/io/example/library/api/beans/Author.java
  10. 93
      src/main/java/io/example/library/api/beans/Book.java
  11. 53
      src/main/java/io/example/library/api/impl/AuthorsResourceImpl.java
  12. 48
      src/main/java/io/example/library/api/impl/BooksResourceImpl.java
  13. 1
      src/main/resources/META-INF/microprofile-config.properties
  14. 308
      src/main/resources/META-INF/openapi.json
  15. 2
      src/main/resources/application.properties

5
.gitignore

@ -0,0 +1,5 @@
.vscode
.classpath
.settings
.project
target

4
.s2i/environment

@ -0,0 +1,4 @@
MAVEN_S2I_ARTIFACT_DIRS=target
S2I_SOURCE_DEPLOYMENTS_FILTER=*-runner.jar lib
JAVA_OPTIONS=-Dquarkus.http.host=0.0.0.0
AB_JOLOKIA_OFF=true

11
README.md

@ -0,0 +1,11 @@
# Library API
```
oc new-project library-api
oc create secret generic 3scale-toolbox -n library-api --from-file="$HOME/.3scalerc.yaml"
oc new-app -n library-api --template=jenkins-ephemeral --name=jenkins -p MEMORY_LIMIT=2Gi
oc set env -n library-api dc/jenkins JENKINS_OPTS=--sessionTimeout=86400
oc import-image openjdk-8-rhel8 --from=registry.redhat.io/openjdk/openjdk-8-rhel8 --confirm -n openshift --reference-policy=local
oc new-app -n library-api -i openjdk-8-rhel8 https://github.com/nmasse-itix/library-api.git --name=library-api
oc expose -n library-api svc/library-api --hostname="library-api.apps.ocp4.itix.fr"
```

122
pom.xml

@ -0,0 +1,122 @@
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>io.example.library</groupId>
<artifactId>library-api</artifactId>
<version>1.0.0</version>
<properties>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<surefire-plugin.version>2.22.0</surefire-plugin.version>
<quarkus.version>0.23.2</quarkus.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-bom</artifactId>
<version>${quarkus.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-openapi</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jackson</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-maven-plugin</artifactId>
<version>${quarkus.version}</version>
<executions>
<execution>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>${surefire-plugin.version}</version>
<configuration>
<systemProperties>
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
</systemProperties>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>native</id>
<activation>
<property>
<name>native</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-maven-plugin</artifactId>
<version>${quarkus.version}</version>
<executions>
<execution>
<goals>
<goal>native-image</goal>
</goals>
<configuration>
<enableHttpUrlHandler>true</enableHttpUrlHandler>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${surefire-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
<configuration>
<systemProperties>
<native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
</systemProperties>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>

23
src/main/docker/Dockerfile.jvm

@ -0,0 +1,23 @@
####
# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode
#
# Before building the docker image run:
#
# mvn package
#
# Then, build the image with:
#
# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/sample-application-jvm .
#
# Then run the container using:
#
# docker run -i --rm -p 8080:8080 quarkus/sample-application-jvm
#
###
FROM fabric8/java-alpine-openjdk8-jre
ENV JAVA_OPTIONS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
ENV AB_ENABLED=jmx_exporter
COPY target/lib/* /deployments/lib/
COPY target/*-runner.jar /deployments/app.jar
EXPOSE 8080
ENTRYPOINT [ "/deployments/run-java.sh" ]

22
src/main/docker/Dockerfile.native

@ -0,0 +1,22 @@
####
# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode
#
# Before building the docker image run:
#
# mvn package -Pnative -Dnative-image.docker-build=true
#
# Then, build the image with:
#
# docker build -f src/main/docker/Dockerfile.native -t quarkus/sample-application .
#
# Then run the container using:
#
# docker run -i --rm -p 8080:8080 quarkus/sample-application
#
###
FROM registry.access.redhat.com/ubi8/ubi-minimal
WORKDIR /work/
COPY target/*-runner /work/application
RUN chmod 775 /work
EXPOSE 8080
CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]

56
src/main/java/io/example/library/api/AuthorsResource.java

@ -0,0 +1,56 @@
package io.example.library.api;
import io.example.library.api.beans.Author;
import java.lang.String;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
/**
* A JAX-RS interface. An implementation of this interface must be provided.
*/
@Path("/authors")
public interface AuthorsResource {
/**
* Gets a list of all `Author` entities.
*/
@GET
@Produces("application/json")
List<Author> getauthors();
/**
* Creates a new instance of a `Author`.
*/
@POST
@Consumes("application/json")
void createAuthor(Author data);
/**
* Gets the details of a single instance of a `Author`.
*/
@Path("/{authorId}")
@GET
@Produces("application/json")
Author getAuthor(@PathParam("authorId") String authorId);
/**
* Updates an existing `Author`.
*/
@Path("/{authorId}")
@PUT
@Consumes("application/json")
void updateAuthor(@PathParam("authorId") String authorId, Author data);
/**
* Deletes an existing `Author`.
*/
@Path("/{authorId}")
@DELETE
void deleteAuthor(@PathParam("authorId") String authorId);
}

56
src/main/java/io/example/library/api/BooksResource.java

@ -0,0 +1,56 @@
package io.example.library.api;
import io.example.library.api.beans.Book;
import java.lang.String;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
/**
* A JAX-RS interface. An implementation of this interface must be provided.
*/
@Path("/books")
public interface BooksResource {
/**
* Gets a list of all `Book` entities.
*/
@GET
@Produces("application/json")
List<Book> getbooks();
/**
* Creates a new instance of a `Book`.
*/
@POST
@Consumes("application/json")
void createBook(Book data);
/**
* Gets the details of a single instance of a `Book`.
*/
@Path("/{bookId}")
@GET
@Produces("application/json")
Book getBook(@PathParam("bookId") String bookId);
/**
* Updates an existing `Book`.
*/
@Path("/{bookId}")
@PUT
@Consumes("application/json")
void updateBook(@PathParam("bookId") String bookId, Book data);
/**
* Deletes an existing `Book`.
*/
@Path("/{bookId}")
@DELETE
void deleteBook(@PathParam("bookId") String bookId);
}

60
src/main/java/io/example/library/api/beans/Author.java

@ -0,0 +1,60 @@
package io.example.library.api.beans;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
/**
* Root Type for Author
* <p>
* The author of a book.
*
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"id",
"name",
"dob"
})
public class Author {
@JsonProperty("id")
private String id;
@JsonProperty("name")
private String name;
@JsonProperty("dob")
private String dob;
@JsonProperty("id")
public String getId() {
return id;
}
@JsonProperty("id")
public void setId(String id) {
this.id = id;
}
@JsonProperty("name")
public String getName() {
return name;
}
@JsonProperty("name")
public void setName(String name) {
this.name = name;
}
@JsonProperty("dob")
public String getDob() {
return dob;
}
@JsonProperty("dob")
public void setDob(String dob) {
this.dob = dob;
}
}

93
src/main/java/io/example/library/api/beans/Book.java

@ -0,0 +1,93 @@
package io.example.library.api.beans;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
/**
* Root Type for Book
* <p>
* Information about a book.
*
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"ddsn",
"title",
"author",
"publish-date"
})
public class Book {
@JsonProperty("ddsn")
private String ddsn;
@JsonProperty("title")
private String title;
/**
* Root Type for Author
* <p>
* The author of a book.
*
*/
@JsonProperty("author")
@JsonPropertyDescription("The author of a book.")
private Author author;
@JsonProperty("publish-date")
private String publishDate;
@JsonProperty("ddsn")
public String getDdsn() {
return ddsn;
}
@JsonProperty("ddsn")
public void setDdsn(String ddsn) {
this.ddsn = ddsn;
}
@JsonProperty("title")
public String getTitle() {
return title;
}
@JsonProperty("title")
public void setTitle(String title) {
this.title = title;
}
/**
* Root Type for Author
* <p>
* The author of a book.
*
*/
@JsonProperty("author")
public Author getAuthor() {
return author;
}
/**
* Root Type for Author
* <p>
* The author of a book.
*
*/
@JsonProperty("author")
public void setAuthor(Author author) {
this.author = author;
}
@JsonProperty("publish-date")
public String getPublishDate() {
return publishDate;
}
@JsonProperty("publish-date")
public void setPublishDate(String publishDate) {
this.publishDate = publishDate;
}
}

53
src/main/java/io/example/library/api/impl/AuthorsResourceImpl.java

@ -0,0 +1,53 @@
package io.example.library.api.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.enterprise.context.ApplicationScoped;
import io.example.library.api.AuthorsResource;
import io.example.library.api.beans.Author;
@ApplicationScoped
public class AuthorsResourceImpl implements AuthorsResource {
private Map<String, Author> authorDB = new HashMap<>();
public AuthorsResourceImpl() {
Author author = new Author();
author.setId("poe");
author.setDob("1809-01-19");
author.setName("Edgar Allan Poe");
this.authorDB.put("", author);
}
@Override
public List<Author> getauthors() {
List<Author> rval = new ArrayList<>();
rval.addAll(this.authorDB.values());
return rval;
}
@Override
public void createAuthor(Author data) {
this.authorDB.put(data.getId(), data);
}
@Override
public Author getAuthor(String authorId) {
return this.authorDB.get(authorId);
}
@Override
public void updateAuthor(String authorId, Author data) {
this.authorDB.put(authorId, data);
}
@Override
public void deleteAuthor(String authorId) {
this.authorDB.remove(authorId);
}
}

48
src/main/java/io/example/library/api/impl/BooksResourceImpl.java

@ -0,0 +1,48 @@
package io.example.library.api.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.enterprise.context.ApplicationScoped;
import io.example.library.api.BooksResource;
import io.example.library.api.beans.Book;
@ApplicationScoped
public class BooksResourceImpl implements BooksResource {
private Map<String, Book> bookDB = new HashMap<>();
public BooksResourceImpl() {
}
@Override
public List<Book> getbooks() {
List<Book> rval = new ArrayList<>();
rval.addAll(this.bookDB.values());
return rval;
}
@Override
public void createBook(Book data) {
this.bookDB.put(data.getDdsn(), data);
}
@Override
public Book getBook(String bookId) {
return this.bookDB.get(bookId);
}
@Override
public void updateBook(String bookId, Book data) {
this.bookDB.put(data.getDdsn(), data);
}
@Override
public void deleteBook(String bookId) {
this.bookDB.remove(bookId);
}
}

1
src/main/resources/META-INF/microprofile-config.properties

@ -0,0 +1 @@
mp.openapi.scan.disable=true

308
src/main/resources/META-INF/openapi.json

@ -0,0 +1,308 @@
{
"openapi": "3.0.2",
"info": {
"title": "Library API",
"version": "1.0.0",
"description": "A simple API for managing authors and books.",
"contact": {
"name": "Eric Wittmann",
"email": "eric.wittmann@redhat.com"
},
"license": {
"name": "Mozilla 2.0",
"url": "https://www.mozilla.org/en-US/MPL/2.0/"
}
},
"paths": {
"/authors": {
"summary": "Path used to manage the list of authors.",
"description": "The REST endpoint/path used to list and create zero or more `Author` entities. This path contains a `GET` and `POST` operation to perform the list and create tasks, respectively.",
"get": {
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Author"
}
}
}
},
"description": "Successful response - returns an array of `Author` entities."
}
},
"operationId": "getauthors",
"summary": "List All authors",
"description": "Gets a list of all `Author` entities."
},
"post": {
"requestBody": {
"description": "A new `Author` to be created.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Author"
}
}
},
"required": true
},
"responses": {
"201": {
"description": "Successful response."
}
},
"operationId": "createAuthor",
"summary": "Create a Author",
"description": "Creates a new instance of a `Author`."
}
},
"/authors/{authorId}": {
"summary": "Path used to manage a single Author.",
"description": "The REST endpoint/path used to get, update, and delete single instances of an `Author`. This path contains `GET`, `PUT`, and `DELETE` operations used to perform the get, update, and delete tasks, respectively.",
"get": {
"tags": [
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Author"
}
}
},
"description": "Successful response - returns a single `Author`."
},
"404": {
"$ref": "#/components/responses/NotFound"
}
},
"operationId": "getAuthor",
"summary": "Get a Author",
"description": "Gets the details of a single instance of a `Author`."
},
"put": {
"requestBody": {
"description": "Updated `Author` information.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Author"
}
}
},
"required": true
},
"responses": {
"202": {
"description": "Successful response."
},
"404": {
"$ref": "#/components/responses/NotFound"
}
},
"operationId": "updateAuthor",
"summary": "Update a Author",
"description": "Updates an existing `Author`."
},
"delete": {
"responses": {
"204": {
"description": "Successful response."
},
"404": {
"$ref": "#/components/responses/NotFound"
}
},
"operationId": "deleteAuthor",
"summary": "Delete a Author",
"description": "Deletes an existing `Author`."
},
"parameters": [
{
"name": "authorId",
"description": "A unique identifier for a `Author`.",
"schema": {
"type": "string"
},
"in": "path",
"required": true
}
]
},
"/books": {
"summary": "Path used to manage the list of books.",
"description": "The REST endpoint/path used to list and create zero or more `Book` entities. This path contains a `GET` and `POST` operation to perform the list and create tasks, respectively.",
"get": {
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Book"
}
}
}
},
"description": "Successful response - returns an array of `Book` entities."
}
},
"operationId": "getbooks",
"summary": "List All books",
"description": "Gets a list of all `Book` entities."
},
"post": {
"requestBody": {
"description": "A new `Book` to be created.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Book"
}
}
},
"required": true
},
"responses": {
"201": {
"description": "Successful response."
}
},
"operationId": "createBook",
"summary": "Create a Book",
"description": "Creates a new instance of a `Book`."
}
},
"/books/{bookId}": {
"summary": "Path used to manage a single Book.",
"description": "The REST endpoint/path used to get, update, and delete single instances of an `Book`. This path contains `GET`, `PUT`, and `DELETE` operations used to perform the get, update, and delete tasks, respectively.",
"get": {
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Book"
}
}
},
"description": "Successful response - returns a single `Book`."
}
},
"operationId": "getBook",
"summary": "Get a Book",
"description": "Gets the details of a single instance of a `Book`."
},
"put": {
"requestBody": {
"description": "Updated `Book` information.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Book"
}
}
},
"required": true
},
"responses": {
"202": {
"description": "Successful response."
}
},
"operationId": "updateBook",
"summary": "Update a Book",
"description": "Updates an existing `Book`."
},
"delete": {
"responses": {
"204": {
"description": "Successful response."
}
},
"operationId": "deleteBook",
"summary": "Delete a Book",
"description": "Deletes an existing `Book`."
},
"parameters": [
{
"name": "bookId",
"description": "A unique identifier for a `Book`.",
"schema": {
"type": "string"
},
"in": "path",
"required": true
}
]
}
},
"components": {
"schemas": {
"Author": {
"title": "Root Type for Author",
"description": "The author of a book.",
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"dob": {
"format": "date",
"type": "string"
}
},
"example": {
"id": "jk-rowling",
"name": "JK Rowling",
"dob": "1968-01-01"
}
},
"Book": {
"title": "Root Type for Book",
"description": "Information about a book.",
"type": "object",
"properties": {
"ddsn": {
"type": "string"
},
"title": {
"type": "string"
},
"author": {
"$ref": "#/components/schemas/Author"
},
"publish-date": {
"format": "date",
"type": "string"
}
},
"example": {
"ddsn": "632.4",
"title": "SQL For Dummies",
"publish-date": "2001-05-13"
}
}
},
"responses": {
"NotFound": {
"content": {
"application/json": {
"schema": {
"type": "string"
}
}
},
"description": "Generic response when not found."
}
}
}
}

2
src/main/resources/application.properties

@ -0,0 +1,2 @@
# Configuration file
# key = value
Loading…
Cancel
Save