diff --git a/curlstatements.txt b/curlstatements.txt
index 8e51317..059004c 100644
--- a/curlstatements.txt
+++ b/curlstatements.txt
@@ -1,4 +1,6 @@
-curl -w "\n" http://localhost:8080/mocktail/search/getrecipesall
-curl --header "Content-Type: application/json" --request POST --data "{\"id\":\"0\",\"name\":\"Peter\",\"ingredients\":\"guelle\",\"recipe\":\"ruehren\"}" http://localhost:8080/mocktail/create/single
-curl --header "Content-Type: application/json" --request PUT --data "{\"id\":\"4\",\"name\":\"Peter\",\"ingredients\":\"guelle\",\"recipe\":\"ruehren\"}" http://localhost:8080/mocktail/update/single
-curl --header "Content-Type: application/json" --request DELETE --data "{\"id\":\"4\"}" http://localhost:8080/mocktail/delete/single
+curl -w "\n" http://localhost:8080/mocktail/v2/search/caipi
+curl --header "Content-Type: application/json" --request POST --data "{\"id\":\"0\",\"name\":\"Peter\",\"ingredients\":\"guelle\",\"recipe\":\"ruehren\"}" http://localhost:8080/mocktail/v2/create
+curl --header "Content-Type: application/json" --request PUT --data "{\"id\":\"4\",\"name\":\"Peter\",\"ingredients\":\"guelle\",\"recipe\":\"ruehren\"}" http://localhost:8080/mocktail/v2/update/1
+curl --header "Content-Type: application/json" --request DELETE --data "{\"id\":\"4\"}" http://localhost:8080/mocktail/v2/delete/3
+curl http://localhost:8080/swagger
+curl --header "Content-Type: application/json" localhost:8080/metrics/application
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index e0133b7..0f1aa97 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,17 +6,17 @@
code-with-quarkus
1.0.0-SNAPSHOT
- 2.22.1
- 11
- 1.9.1.Final
- 11
- UTF-8
- quarkus-universe-bom
- UTF-8
- true
- 1.9.1.Final
3.8.1
+ true
+ 11
+ 11
+ UTF-8
+ UTF-8
+ 1.9.1.Final
+ quarkus-universe-bom
io.quarkus
+ 1.9.1.Final
+ 2.22.1
@@ -42,6 +42,10 @@
io.quarkus
quarkus-arc
+
+ org.jboss.logmanager
+ log4j2-jboss-logmanager
+
io.quarkus
quarkus-junit5
@@ -52,6 +56,22 @@
rest-assured
test
+
+ io.quarkus
+ quarkus-smallrye-openapi
+
+
+ io.quarkus
+ quarkus-smallrye-metrics
+
+
+ io.quarkus
+ quarkus-smallrye-fault-tolerance
+
+
+ io.quarkus
+ quarkus-rest-client
+
diff --git a/src/main/java/de/hsos/swa/ma/api/al/Barkeeper.java b/src/main/java/de/hsos/swa/ma/api/al/Barkeeper.java
index 58b74e5..affe37e 100644
--- a/src/main/java/de/hsos/swa/ma/api/al/Barkeeper.java
+++ b/src/main/java/de/hsos/swa/ma/api/al/Barkeeper.java
@@ -2,64 +2,120 @@ package de.hsos.swa.ma.api.al;
import java.util.ArrayList;
-import javax.inject.Inject;
-/* import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.DELETE; */
-import javax.ws.rs.Path;
-/* import javax.ws.rs.Produces;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.core.MediaType; */
+import org.jboss.logging.Logger;
-@Path("/mocktail")
-public class Barkeeper implements ISearch, ICreate, IUpdate, IDelete{
+import javax.inject.Inject;
+// import org.eclipse.microprofile.*;
+
+// import org.eclipse.microprofile.openapi.annotations.OpenAPIDefinition;
+// import org.eclipse.microprofile.openapi.annotations.info.Contact;
+// import org.eclipse.microprofile.openapi.annotations.info.Info;
+// import org.eclipse.microprofile.openapi.annotations.info.License;
+// import org.eclipse.microprofile.openapi.annotations.tags.Tag;
+
+import org.eclipse.microprofile.metrics.MetricUnits;
+import org.eclipse.microprofile.metrics.annotation.Counted;
+import org.eclipse.microprofile.metrics.annotation.Gauge;
+import org.eclipse.microprofile.metrics.annotation.Timed;
+
+import org.eclipse.microprofile.faulttolerance.Retry;
+import org.eclipse.microprofile.faulttolerance.Timeout;
+import org.eclipse.microprofile.faulttolerance.Fallback;
+
+// import javax.ws.rs.GET;
+// import javax.ws.rs.POST;
+// import javax.ws.rs.PUT;
+// import javax.ws.rs.DELETE;
+// import javax.ws.rs.Path;
+// import javax.ws.rs.Produces;
+// import javax.ws.rs.Consumes;
+// import javax.ws.rs.core.MediaType;
+
+// import org.jboss.resteasy.annotations.jaxrs.PathParam;
+
+//@Path("/mocktail")
+// @OpenAPIDefinition(
+// tags = {
+// @Tag(name="widget", description="Widget operations."),
+// @Tag(name="gasket", description="Operations related to gaskets")
+// },
+// info = @Info(
+// title="Example API",
+// version = "1.0.1",
+// contact = @Contact(
+// name = "Example API Support",
+// url = "http://exampleurl.com/contact",
+// email = "techsupport@example.com"),
+// license = @License(
+// name = "Apache 2.0",
+// url = "http://www.apache.org/licenses/LICENSE-2.0.html"))
+// )
+
+public class Barkeeper implements BarkeeperInterface{
+
+ private static final Logger logger = Logger.getLogger(Barkeeper.class);
@Inject
StorageTransport st;
- //@GET
- //@Produces (MediaType.APPLICATION_JSON)
- //@Path("/getrecipesall")
- public ArrayList getRecipesAll() {
- ArrayList mts = st.getRecipesAll();
+ //Metrics
+ @Counted(name = "performedSearchesByName", description = "How many searches by name have been performed.")
+ @Timed(name = "searchTimer", description = "A measure of how long it takes to perform the search.", unit = MetricUnits.MILLISECONDS)
+ //@Gauge(name = "highestPrimeNumberSoFar", unit = MetricUnits.NONE, description = "Highest prime number so far.")
+ //Fault-Tolerance
+ @Retry(maxRetries = 3)
+ @Timeout(250)
+ @Fallback(fallbackMethod = "fallbackGetMocktailByName")
+ public ArrayList getMocktailByName(String name) {
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->getMocktailByName: started");
+ ArrayList mts = st.getMocktailByName(name);
+ logger.trace(System.currentTimeMillis() + ": Barkeeper->getMocktailByName: get mocktail by name by REST-CLIENT");
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->getMocktailByName: ended");
return mts;
}
- /* @POST
- @Produces (MediaType.TEXT_PLAIN)
- @Consumes (MediaType.APPLICATION_JSON)
- @Path("/create") */
- public String createMocktail(Mocktail m) {
- System.out.println("action-create -> index: "+ m.id);
- if(this.st.addMocktail(m)) {
- return "Mocktail wurde erstellt.";
- }
- return "Mocktail konnte nicht erstellt werden.";
+ public ArrayList fallbackGetMocktailByName(String name) {
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->getMocktailByName: started");
+ ArrayList mts = st.getAllMocktails();
+ logger.trace(System.currentTimeMillis() + ": Barkeeper->getMocktailByName: get mocktail by name by REST-CLIENT");
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->getMocktailByName: ended");
+ return mts;
+ }
+
+ //Metrics
+ @Counted(name = "performedCreates", description = "How many creates have been performed.")
+ @Timed(name = "createTimer", description = "A measure of how long it takes to perform the mocktail creation.", unit = MetricUnits.MILLISECONDS)
+ //Fault-Tolerance
+ @Retry(maxRetries = 3)
+ public void createMocktail(Mocktail m) {
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->createMocktail: started");
+ this.st.addMocktail(m);
+ logger.trace(System.currentTimeMillis() + ": Barkeeper->createMocktail: create mocktail by REST-CLIENT");
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->createMocktail: ended");
}
- /* @PUT
- @Produces (MediaType.TEXT_PLAIN)
- @Consumes (MediaType.APPLICATION_JSON)
- @Path("/update") */
- public String updateMocktail(Mocktail m) {
- System.out.println("action-update -> index: "+ m.id);
- if(this.st.updateMocktail(m)) {
- return "Mocktail wurde geupdatet.";
- }
- return "Mocktail konnte nicht geupdatet werden...";
+ //Metrics
+ @Counted(name = "performedUpdates", description = "How many updates have been performed.")
+ @Timed(name = "updateTimer", description = "A measure of how long it takes to perform the update of a mocktail.", unit = MetricUnits.MILLISECONDS)
+ //Fault-Tolerance
+ @Retry(maxRetries = 3)
+ public void updateMocktail(Mocktail m, long number) {
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->updateMocktail: started");
+ this.st.updateMocktail(m, number);
+ logger.trace(System.currentTimeMillis() + ": Barkeeper->updateMocktail: update mocktail by REST-CLIENT");
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->updateMocktail: ended");
}
- /* @DELETE
- @Consumes (MediaType.APPLICATION_JSON)
- @Path("/delete") */
- public String deleteMocktail(Mocktail m) {
- System.out.println("action-delete -> index: "+ m.id);
- if(this.st.deleteMocktail(m.id)){
- return "Mocktail wurde entfernt.";
- }
- return "Objekt konnte nicht entfernt werden...";
+ //Metrics
+ @Counted(name = "performedDeletions", description = "How many deletes have been performed.")
+ @Timed(name = "deleteTimer", description = "A measure of how long it takes to delete a mocktail.", unit = MetricUnits.MILLISECONDS)
+ //Fault-Tolerance
+ @Retry(maxRetries = 3)
+ public void deleteMocktail(long id) {
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->deleteMocktail: started");
+ this.st.deleteMocktail(id);
+ logger.trace(System.currentTimeMillis() + ": Barkeeper->deleteMocktail: delete mocktail by REST-CLIENT");
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->deleteMocktail: ended");
}
-
}
\ No newline at end of file
diff --git a/src/main/java/de/hsos/swa/ma/api/al/BarkeeperInterface.java b/src/main/java/de/hsos/swa/ma/api/al/BarkeeperInterface.java
new file mode 100644
index 0000000..e07002b
--- /dev/null
+++ b/src/main/java/de/hsos/swa/ma/api/al/BarkeeperInterface.java
@@ -0,0 +1,37 @@
+package de.hsos.swa.ma.api.al;
+
+import java.util.ArrayList;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+
+import org.jboss.resteasy.annotations.jaxrs.PathParam;
+
+@Path("/mocktail/v2")
+public interface BarkeeperInterface {
+
+ @GET
+ @Produces (MediaType.APPLICATION_JSON)
+ @Path("/search/{name}")
+ public ArrayList getMocktailByName(@PathParam String name);
+
+ @POST
+ @Consumes (MediaType.APPLICATION_JSON)
+ @Path("/create")
+ public void createMocktail(Mocktail m);
+
+ @DELETE
+ @Path("/delete/{number}")
+ public void deleteMocktail(@PathParam long number);
+
+ @PUT
+ @Consumes (MediaType.APPLICATION_JSON)
+ @Path("/update/{number}")
+ public void updateMocktail(Mocktail m,@PathParam long number);
+}
\ No newline at end of file
diff --git a/src/main/java/de/hsos/swa/ma/api/al/Cocktail.java b/src/main/java/de/hsos/swa/ma/api/al/Cocktail.java
new file mode 100644
index 0000000..1e8ebec
--- /dev/null
+++ b/src/main/java/de/hsos/swa/ma/api/al/Cocktail.java
@@ -0,0 +1,55 @@
+package de.hsos.swa.ma.api.al;
+
+public class Cocktail {
+ public long idDrink;
+ public String strDrink;
+ //public ArrayList ingredients;
+ public String strInstructionsDE;
+
+ /*public Cocktail() {
+
+ }
+
+ public Cocktail(long id, String name, /*String ingredients, String recipe) {
+ this.idDrink = id;
+ this.strDrink = name;
+ //this.ingredients = ingredients;
+ this.strInstructionsDE = recipe;
+ }
+
+ public long getId(){
+ return this.idDrink;
+ }
+
+ public void setId(long idDrink){
+ this.idDrink = idDrink;
+ }
+
+ public String getName(){
+ return this.strDrink;
+ }
+
+ public void setName(String strDrink){
+ this.strDrink = strDrink;
+ }
+
+ /*public String getIngredients(){
+ return this.ingredients;
+ }
+
+ public void setIngredients(String ingredients){
+ this.ingredients = ingredients;
+ }
+
+ public String getRecipe(){
+ return this.strInstructionsDE;
+ }
+
+ public void setRecipe(String strInstructionsDE){
+ this.strInstructionsDE = strInstructionsDE;
+ }
+
+ public String toString() {
+ return "ID: " + this.idDrink + "\nName: " + this.strDrink + /*"\nZutaten: " + this.ingredients + "\nRezept: " + this.strInstructionsDE;
+ }*/
+}
diff --git a/src/main/java/de/hsos/swa/ma/api/al/CocktailGatewayInterface.java b/src/main/java/de/hsos/swa/ma/api/al/CocktailGatewayInterface.java
new file mode 100644
index 0000000..20aa109
--- /dev/null
+++ b/src/main/java/de/hsos/swa/ma/api/al/CocktailGatewayInterface.java
@@ -0,0 +1,37 @@
+package de.hsos.swa.ma.api.al;
+
+import java.util.ArrayList;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
+
+import org.jboss.resteasy.annotations.jaxrs.PathParam;
+import org.jboss.resteasy.annotations.jaxrs.QueryParam;
+//import javax.ws.rs.Path;
+
+//import javax.enterprise.context.ApplicationScoped;
+
+@Path("/v1/1")
+@RegisterRestClient(configKey="cocktailAPI")
+public interface CocktailGatewayInterface {
+
+ @GET
+ @Path("/random.php")
+ @Produces(MediaType.APPLICATION_JSON)
+ public Drinks getAllCocktails();
+
+ @GET
+ @Path("/search.php")
+ @Produces(MediaType.APPLICATION_JSON)
+ public Drinks getCocktailByName(@QueryParam("s") String name);
+
+ @GET
+ @Path("/filter.php")
+ @Produces(MediaType.APPLICATION_JSON)
+ public Drinks getCocktailByIngredient(@QueryParam("i") String ingredient);
+
+}
diff --git a/src/main/java/de/hsos/swa/ma/api/al/CocktailInterface.java b/src/main/java/de/hsos/swa/ma/api/al/CocktailInterface.java
new file mode 100644
index 0000000..23a1fd3
--- /dev/null
+++ b/src/main/java/de/hsos/swa/ma/api/al/CocktailInterface.java
@@ -0,0 +1,47 @@
+package de.hsos.swa.ma.api.al;
+
+import java.util.ArrayList;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+
+import org.jboss.resteasy.annotations.jaxrs.PathParam;
+
+@Path("/barkeeper/v2/cocktail")
+public interface CocktailInterface {
+
+ @GET
+ @Produces (MediaType.APPLICATION_JSON)
+ @Path("/search")
+ public Drinks getAllCocktails();
+
+ @GET
+ @Produces (MediaType.APPLICATION_JSON)
+ @Path("/search/name/{name}")
+ public Drinks getCocktailByName(@PathParam String name);
+
+ @GET
+ @Produces (MediaType.APPLICATION_JSON)
+ @Path("/search/ingredient/{ingredient}")
+ public Drinks getCocktailByIngredient(@PathParam String ingredient);
+
+ /*@POST
+ @Consumes (MediaType.APPLICATION_JSON)
+ @Path("/create")
+ public void createCocktail(Mocktail m);
+
+ @DELETE
+ @Path("/delete/{number}")
+ public void deleteCocktail(@PathParam long number);
+
+ @PUT
+ @Consumes (MediaType.APPLICATION_JSON)
+ @Path("/update/{number}")
+ public void updateCocktail(Mocktail m,@PathParam long number);*/
+}
\ No newline at end of file
diff --git a/src/main/java/de/hsos/swa/ma/api/al/Drinks.java b/src/main/java/de/hsos/swa/ma/api/al/Drinks.java
new file mode 100644
index 0000000..de7b7d7
--- /dev/null
+++ b/src/main/java/de/hsos/swa/ma/api/al/Drinks.java
@@ -0,0 +1,7 @@
+package de.hsos.swa.ma.api.al;
+
+import java.util.ArrayList;
+
+public class Drinks {
+ public ArrayList drinks;
+}
diff --git a/src/main/java/de/hsos/swa/ma/api/al/ICreate.java b/src/main/java/de/hsos/swa/ma/api/al/ICreate.java
deleted file mode 100644
index 18cda84..0000000
--- a/src/main/java/de/hsos/swa/ma/api/al/ICreate.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package de.hsos.swa.ma.api.al;
-
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.core.MediaType;
-
-//@Path("/create")
-public interface ICreate {
-
- @POST
- @Produces (MediaType.TEXT_PLAIN)
- @Consumes (MediaType.APPLICATION_JSON)
- @Path("/create/single")
- public String createMocktail(Mocktail m);
- //public Mocktail[] showRecipesByName(/*@PathParam */String name);
- //public Mocktail[] showRecipesById(int id);
-
-}
\ No newline at end of file
diff --git a/src/main/java/de/hsos/swa/ma/api/al/IDelete.java b/src/main/java/de/hsos/swa/ma/api/al/IDelete.java
deleted file mode 100644
index 4d30bbf..0000000
--- a/src/main/java/de/hsos/swa/ma/api/al/IDelete.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package de.hsos.swa.ma.api.al;
-
-import javax.ws.rs.DELETE;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.core.MediaType;
-
-/**
- * IDelete
- */
-//@Path("/delete")
-public interface IDelete {
- @DELETE
- @Consumes (MediaType.APPLICATION_JSON)
- @Produces (MediaType.TEXT_PLAIN)
- @Path("/delete/single")
- public String deleteMocktail(Mocktail m);
-}
\ No newline at end of file
diff --git a/src/main/java/de/hsos/swa/ma/api/al/ISearch.java b/src/main/java/de/hsos/swa/ma/api/al/ISearch.java
deleted file mode 100644
index d7bd2cc..0000000
--- a/src/main/java/de/hsos/swa/ma/api/al/ISearch.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package de.hsos.swa.ma.api.al;
-
-import java.util.ArrayList;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-
-public interface ISearch {
-
- @GET
- @Produces (MediaType.APPLICATION_JSON)
- @Path("search/getrecipesall")
- public ArrayList getRecipesAll();
- //public Mocktail[] showRecipesByName(/*@PathParam */String name);
- //public Mocktail[] showRecipesById(int id);
-
-}
\ No newline at end of file
diff --git a/src/main/java/de/hsos/swa/ma/api/al/IUpdate.java b/src/main/java/de/hsos/swa/ma/api/al/IUpdate.java
deleted file mode 100644
index 669f50a..0000000
--- a/src/main/java/de/hsos/swa/ma/api/al/IUpdate.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package de.hsos.swa.ma.api.al;
-
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.core.MediaType;
-
-//@Path("/mocktail/update")
-public interface IUpdate {
-
- @PUT
- @Produces (MediaType.TEXT_PLAIN)
- @Consumes (MediaType.APPLICATION_JSON)
- @Path("/update/single")
- public String updateMocktail(Mocktail m);
-
-}
diff --git a/src/main/java/de/hsos/swa/ma/api/al/Ingredient.java b/src/main/java/de/hsos/swa/ma/api/al/Ingredient.java
new file mode 100644
index 0000000..ac6f0b6
--- /dev/null
+++ b/src/main/java/de/hsos/swa/ma/api/al/Ingredient.java
@@ -0,0 +1,6 @@
+package de.hsos.swa.ma.api.al;
+
+public class Ingredient {
+ public String type;
+ public String measure;
+}
diff --git a/src/main/java/de/hsos/swa/ma/api/al/MocktailInterface.java b/src/main/java/de/hsos/swa/ma/api/al/MocktailInterface.java
new file mode 100644
index 0000000..71f080f
--- /dev/null
+++ b/src/main/java/de/hsos/swa/ma/api/al/MocktailInterface.java
@@ -0,0 +1,47 @@
+package de.hsos.swa.ma.api.al;
+
+import java.util.ArrayList;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+
+import org.jboss.resteasy.annotations.jaxrs.PathParam;
+
+@Path("/barkeeper/v2/mocktail")
+public interface MocktailInterface {
+
+ @GET
+ @Produces (MediaType.APPLICATION_JSON)
+ @Path("/search")
+ public ArrayList getAllMocktails();
+
+ @GET
+ @Produces (MediaType.APPLICATION_JSON)
+ @Path("/search/name/{name}")
+ public ArrayList getMocktailByName(@PathParam String name);
+
+ @GET
+ @Produces (MediaType.APPLICATION_JSON)
+ @Path("/search/ingredient/{ingredient}")
+ public ArrayList getMocktailByIngredient(@PathParam String ingredient);
+
+ @POST
+ @Consumes (MediaType.APPLICATION_JSON)
+ @Path("/create")
+ public void createMocktail(Mocktail m);
+
+ @DELETE
+ @Path("/delete/{number}")
+ public void deleteMocktail(@PathParam long number);
+
+ @PUT
+ @Consumes (MediaType.APPLICATION_JSON)
+ @Path("/update/{number}")
+ public void updateMocktail(Mocktail m,@PathParam long number);
+}
\ No newline at end of file
diff --git a/src/main/java/de/hsos/swa/ma/api/al/ProperBarkeeper.java b/src/main/java/de/hsos/swa/ma/api/al/ProperBarkeeper.java
new file mode 100644
index 0000000..af07668
--- /dev/null
+++ b/src/main/java/de/hsos/swa/ma/api/al/ProperBarkeeper.java
@@ -0,0 +1,188 @@
+package de.hsos.swa.ma.api.al;
+
+import java.util.ArrayList;
+
+import org.jboss.logging.Logger;
+
+import javax.inject.Inject;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+
+import org.eclipse.microprofile.metrics.MetricUnits;
+import org.eclipse.microprofile.metrics.annotation.Counted;
+import org.eclipse.microprofile.metrics.annotation.Timed;
+
+import org.eclipse.microprofile.faulttolerance.Retry;
+import org.eclipse.microprofile.faulttolerance.Timeout;
+import org.eclipse.microprofile.faulttolerance.Fallback;
+
+//import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
+import org.eclipse.microprofile.rest.client.inject.RestClient;
+
+import org.jboss.resteasy.annotations.jaxrs.PathParam;
+
+public class ProperBarkeeper implements CocktailInterface, MocktailInterface{
+
+ private static final Logger logger = Logger.getLogger(Barkeeper.class);
+
+ @Inject
+ StorageTransport st;
+
+ @Inject
+ @RestClient
+ CocktailGatewayInterface cocktailGatewayInterface;
+
+ //Metrics
+ @Counted(name = "performedAllCocktailSearches", description = "How many searches for all cocktails have been performed.")
+ @Timed(name = "searchAllCocktailsTimer", description = "A measure of how long it takes to perform the search.", unit = MetricUnits.MILLISECONDS)
+ //Fault-Tolerance
+ @Retry(maxRetries = 3)
+ @Timeout(250)
+ //@Fallback(fallbackMethod = "getAllMocktails")
+ public Drinks getAllCocktails(){
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->getAllCocktails: started");
+ Drinks drinks = cocktailGatewayInterface.getAllCocktails();
+ logger.trace(System.currentTimeMillis() + ": Barkeeper->getAllCocktails: get all cocktails by REST-CLIENT");
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->getAllCocktails: ended");
+ return drinks;
+ }
+
+ //Metrics
+ @Counted(name = "performedNameCocktailSearches", description = "How many searches for cocktails by name have been performed.")
+ @Timed(name = "searchCocktailsNameTimer", description = "A measure of how long it takes to perform the search.", unit = MetricUnits.MILLISECONDS)
+ //Fault-Tolerance
+ @Retry(maxRetries = 3)
+ @Timeout(250)
+ public Drinks getCocktailByName(String name) {
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->getCocktailByName: started");
+ Drinks drinks = cocktailGatewayInterface.getCocktailByName(name);
+ logger.trace(System.currentTimeMillis() + ": Barkeeper->getCocktailByName: get all cocktails by name REST-CLIENT");
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->getCocktailByName: ended");
+ return drinks;
+ }
+
+ //Metrics
+ @Counted(name = "performedIngredientCocktailSearches", description = "How many searches for cocktails by ingredient have been performed.")
+ @Timed(name = "searchCocktailsIngredientTimer", description = "A measure of how long it takes to perform the search.", unit = MetricUnits.MILLISECONDS)
+ //Fault-Tolerance
+ @Retry(maxRetries = 3)
+ @Timeout(250)
+ public Drinks getCocktailByIngredient(String ingredient){
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->getCocktailByIngredient: started");
+ Drinks drinks = cocktailGatewayInterface.getCocktailByIngredient(ingredient);
+ logger.trace(System.currentTimeMillis() + ": Barkeeper->getCocktailByIngredient: get all cocktails by ingredient REST-CLIENT");
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->getCocktailByIngredient: ended");
+ return drinks;
+ }
+
+ /*public void createCocktail(Mocktail m){
+
+ }
+
+ public void deleteCocktail(@PathParam long number){
+
+ }
+
+ public void updateCocktail(Mocktail m,@PathParam long number){
+
+ }*/
+
+
+ //Metrics
+ @Counted(name = "performedAllMocktailSearches", description = "How many searches for all cocktails have been performed.")
+ @Timed(name = "searchAllMocktailsTimer", description = "A measure of how long it takes to perform the search.", unit = MetricUnits.MILLISECONDS)
+ //Fault-Tolerance
+ @Retry(maxRetries = 3)
+ @Timeout(250)
+ public ArrayList getAllMocktails(){
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->getAllMocktails: started");
+ ArrayList mocks = st.getAllMocktails();
+ logger.trace(System.currentTimeMillis() + ": Barkeeper->getAllMocktails: get all mocktails by REST-CLIENT");
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->getAllMocktails: ended");
+ return mocks;
+ }
+
+ //Metrics
+ @Counted(name = "performedSearchesByName", description = "How many searches by name have been performed.")
+ @Timed(name = "searchMocktailsNameTimer", description = "A measure of how long it takes to perform the search.", unit = MetricUnits.MILLISECONDS)
+ //@Gauge(name = "highestPrimeNumberSoFar", unit = MetricUnits.NONE, description = "Highest prime number so far.")
+ //Fault-Tolerance
+ @Retry(maxRetries = 3)
+ @Timeout(250)
+ @Fallback(fallbackMethod = "fallbackGetMocktailByName")
+ public ArrayList getMocktailByName(String name) {
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->getMocktailByName: started");
+ ArrayList mts = st.getMocktailByName(name);
+ logger.trace(System.currentTimeMillis() + ": Barkeeper->getMocktailByName: get mocktail by name by REST-CLIENT");
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->getMocktailByName: ended");
+ return mts;
+ }
+
+ //Metrics
+ @Counted(name = "performedSearchesByIngredient", description = "How many searches by ingredient have been performed.")
+ @Timed(name = "searchMocktailsIngredientTimer", description = "A measure of how long it takes to perform the search.", unit = MetricUnits.MILLISECONDS)
+ //@Gauge(name = "highestPrimeNumberSoFar", unit = MetricUnits.NONE, description = "Highest prime number so far.")
+ //Fault-Tolerance
+ @Retry(maxRetries = 3)
+ @Timeout(250)
+ //@Fallback(fallbackMethod = "fallbackGetMocktailByName")
+ public ArrayList getMocktailByIngredient(String ingredient) {
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->getMocktailByIngredient: started");
+ ArrayList mts = st.getMocktailByIngredient(ingredient);
+ logger.trace(System.currentTimeMillis() + ": Barkeeper->getMocktailByIngredient: get mocktail by ingredient by REST-CLIENT");
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->getMocktailByIngredient: ended");
+ return mts;
+ }
+
+ public ArrayList fallbackGetMocktailByName(String name) {
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->getMocktailByName: started");
+ ArrayList mts = st.getAllMocktails();
+ logger.trace(System.currentTimeMillis() + ": Barkeeper->getMocktailByName: get mocktail by name by REST-CLIENT");
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->getMocktailByName: ended");
+ return mts;
+ }
+
+ //Metrics
+ @Counted(name = "performedCreates", description = "How many creates have been performed.")
+ @Timed(name = "createTimer", description = "A measure of how long it takes to perform the mocktail creation.", unit = MetricUnits.MILLISECONDS)
+ //Fault-Tolerance
+ @Retry(maxRetries = 3)
+ public void createMocktail(Mocktail m) {
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->createMocktail: started");
+ this.st.addMocktail(m);
+ logger.trace(System.currentTimeMillis() + ": Barkeeper->createMocktail: create mocktail by REST-CLIENT");
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->createMocktail: ended");
+ }
+
+ //Metrics
+ @Counted(name = "performedUpdates", description = "How many updates have been performed.")
+ @Timed(name = "updateTimer", description = "A measure of how long it takes to perform the update of a mocktail.", unit = MetricUnits.MILLISECONDS)
+ //Fault-Tolerance
+ @Retry(maxRetries = 3)
+ public void updateMocktail(Mocktail m, long number) {
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->updateMocktail: started");
+ this.st.updateMocktail(m, number);
+ logger.trace(System.currentTimeMillis() + ": Barkeeper->updateMocktail: update mocktail by REST-CLIENT");
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->updateMocktail: ended");
+ }
+
+ //Metrics
+ @Counted(name = "performedDeletions", description = "How many deletes have been performed.")
+ @Timed(name = "deleteTimer", description = "A measure of how long it takes to delete a mocktail.", unit = MetricUnits.MILLISECONDS)
+ //Fault-Tolerance
+ @Retry(maxRetries = 3)
+ public void deleteMocktail(long id) {
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->deleteMocktail: started");
+ this.st.deleteMocktail(id);
+ logger.trace(System.currentTimeMillis() + ": Barkeeper->deleteMocktail: delete mocktail by REST-CLIENT");
+ logger.debug(System.currentTimeMillis() + ": Barkeeper->deleteMocktail: ended");
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/de/hsos/swa/ma/api/al/StorageTransport.java b/src/main/java/de/hsos/swa/ma/api/al/StorageTransport.java
index e93bb90..25ca89b 100644
--- a/src/main/java/de/hsos/swa/ma/api/al/StorageTransport.java
+++ b/src/main/java/de/hsos/swa/ma/api/al/StorageTransport.java
@@ -2,6 +2,7 @@ package de.hsos.swa.ma.api.al;
import java.util.ArrayList;
+import org.eclipse.microprofile.faulttolerance.CircuitBreaker;
//import javax.ws.rs.Path;
import javax.enterprise.context.ApplicationScoped;
@@ -10,16 +11,9 @@ import javax.enterprise.context.ApplicationScoped;
//@Path("/mocktail/storage")
public class StorageTransport {
- //private Mocktail[] mocktails;
private ArrayList mocktails;
public StorageTransport() {
- /*this.mocktails = new Mocktail[5];
- this.mocktails[0] = new Mocktail("caipi", "keineahnung", "ruehren");
- this.mocktails[1] = new Mocktail("caipi2", "keineahnung", "ruehren");
- this.mocktails[2] = new Mocktail("caipi3", "keineahnung", "ruehren");
- this.mocktails[3] = new Mocktail("caipi4", "keineahnung", "ruehren");
- this.mocktails[4] = new Mocktail("caipi5", "keineahnung", "ruehren");*/
this.mocktails = new ArrayList();
this.mocktails.add(new Mocktail(0, "caipi", "keineahnung", "ruehren"));
this.mocktails.add(new Mocktail(1, "caipi2", "keineahnung", "ruehren"));
@@ -28,9 +22,31 @@ public class StorageTransport {
this.mocktails.add(new Mocktail(4, "caipi5", "keineahnung", "ruehren"));
}
- public ArrayList getRecipesAll() {
+ @CircuitBreaker(requestVolumeThreshold = 4)
+ public ArrayList getMocktailByName(String name) {
+ ArrayList transport = new ArrayList();
+ for(int i = 0; i < this.mocktails.size(); i++){
+ if(this.mocktails.get(i).name.equals(name)){
+ transport.add(this.mocktails.get(i));
+ }
+ }
+ return transport;
+ }
+
+ public ArrayList getAllMocktails() {
return this.mocktails;
}
+
+ public ArrayList getMocktailByIngredient(String ingredient) {
+ ArrayList transport = new ArrayList();
+ for(int i = 0; i < this.mocktails.size(); i++){
+ if(this.mocktails.get(i).ingredients.equals(ingredient)){
+ transport.add(this.mocktails.get(i));
+ }
+ }
+ return transport;
+ }
+
public boolean addMocktail(Mocktail m) {
if(this.mocktails.add(m)){
@@ -40,14 +56,14 @@ public class StorageTransport {
}
}
- public boolean updateMocktail(Mocktail m) {
+ public boolean updateMocktail(Mocktail m, long number) {
int index = -1;
int i = 0;
if(this.mocktails.isEmpty()){
return false;
}
while(i < this.mocktails.size()) {
- if(this.mocktails.get(i).getId() == m.getId()){
+ if(this.mocktails.get(i).getId() == number){
index = i;
}
i++;
@@ -65,5 +81,5 @@ public class StorageTransport {
System.out.println("Test... :D");
return this.mocktails.remove(this.mocktails.get((int)index));
}
-
+
}
\ No newline at end of file
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index e69de29..e15410d 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -0,0 +1,46 @@
+# HTTP-SERVER: PORTS
+#quarkus.http.port=8080
+#%dev.quarkus.http.port=8082
+
+# Logging
+# Root-Logger
+quarkus.log.level=INFO
+quarkus.log.console.level=INFO
+
+#Logging: Categories
+quarkus.log.category."io.quarkus".level = WARN
+quarkus.log.category."de.hsos.swa".level = DEBUG
+quarkus.log.category."de.hsos.swa".level = TRACE
+
+#Logging-Handler: Console
+quarkus.log.console.enable=true
+quarkus.log.console.format=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c{3.}] (%t) %s%e%n
+
+#Mit
+ #%d Datum mit definiertem Format
+ #%c Name der Kategorie
+ #%t Thread-Name
+ #%s Message, falls vorhanden
+ #%e Exception, falls vorhanden
+ #%n Zeilenumbruch
+
+#Logging-Handler: File
+quarkus.log.file.enable=true
+quarkus.log.file.path=quarkus.log
+quarkus.log.file.level=TRACE
+quarkus.log.file.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %s%e%n
+quarkus.log.file.rotation.file-suffix=.yyyy-MM-dd
+quarkus.log.file.rotation.max-backup-index=1
+quarkus.log.file.rotation.max-file-size=2000
+quarkus.log.file.async=true
+
+
+de.hsos.swa.ma.api.al.Barkeeper/getMocktailByName/Retry/maxRetries=6
+de.hsos.swa.ma.api.al.Barkeeper/getMocktailByName/Timeout/300
+
+#cocktail API Resco... Res..... -.- Quelle.
+#cocktailAPI/mp-rest/url=https://www.thecocktaildb.com/api/json
+
+
+de.hsos.swa.ma.api.al.CocktailGatewayInterface/mp-rest/url=https://www.thecocktaildb.com/api/json
+de.hsos.swa.ma.api.al.CocktailGatewayInterface/mp-rest/scope=javax.inject.Singleton
\ No newline at end of file