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