Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"java.configuration.updateBuildConfiguration": "interactive"
}
6 changes: 6 additions & 0 deletions ANALISIS_CONCURRENCIA.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
La primera condición de carrera es que dos hilos intenten modificar de alguna manera la lista (ya sea adicionando o accediendo a algún elemento) al mismo tiempo
Esto lo solucionamos modificando el HashMap en InMemoryBlueprintPersistence por un ConcurrentHashMap, el cual limita las modificaciones múltiples.

La segunda condición de carrera, es que se acceda a algún plano, y este se intente modificar o acceder al mismo tiempo que otro está trabajando con dicho plano.
Por lo cual, en cada uno de los métodos de los servicios (InMemoryBlueprintPersistence), vamos a bloquear el acceso múltiple por medio de syncronized, pero de planos específicos, con el fin
de no limitar la eficiencia de la aplicación
Binary file added API REST BLUEPRINTS.pdf
Binary file not shown.
1 change: 1 addition & 0 deletions BlueprintsRestApi.drawio
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<mxfile host="app.diagrams.net" modified="2023-03-08T04:08:58.343Z" agent="5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.63" etag="eLuPN4JATHl-x-oUqqq1" version="20.8.22" type="device"><diagram name="Página-1" id="dQp0YWTbmTnYMwl97sMQ">7Vrdc9o4EP9b7oGZ5sE3WMZAHgPk2tz0bjJNZ9o8ClsGHbbkyOLr/vpb2ZIt2xBICgk3LckM0u56Je3+9kNOOt442XwUOJ3/xUMSd1A33HS8SQchF7k9+FKUbUHxh4OCMBM01EIV4YH+SzSxq6lLGpKsJig5jyVN68SAM0YCWaNhIfi6LhbxuL5qimekRXgIcNymfqOhnBfUIRpU9E+EzuZmZbd/XXASbIT1SbI5DvnaInm3HW8sOJfFKNmMSayMZ+xSPPfHHm65MUGYPOaBp490mvR5/86Letd/Ltbpwv/b0VpWOF7qA3dQPwZ9o6mA0UyNDCVLMVPnkFttnP7TUm1+FPCYi453A0wxm36AbYxhaL6uchVgeSadCCc03hain0i8IpIG2OJnuf8V10XpxmYUiyoO4yLBscVbYUExfMd0huVSKLQ8KxfgdJ/IWrtSMQdwgpwTEymJcOD4AWWz9pNcpHPMtEpU0CTZSAfDjlhBDsBJRFg8ysLcb4rZNUfNOVKAsgj0m5UYKbhrGuZwtpZZcxHWN1bqgrNMFxTUKZ2ZFHxBnHWB4JrcFAeLmeBLFjoNPyLfLVxoD66snYYk4AJLypkj5zRYMJLp7VFGJTX2acpavnxWztpOTS6KOZZN44Q0S2O8NeIxBQbq/kaTlAuJmcaxBqxB9ghQnwrK5Jfbh68393cG6RBEBdjrAWCHBKpFAprLBHY3cYEXCp5+xWJGVFQqCOXGJaGerYhQoI9vCnBMJE9LhYpHNnvj2y2zBqRbwhMixRZEzAOeTjRbk4r0fF3lrV5f0+ZWziqJWOfKWam7Sicw0BnlBdkF7cguDcNBVkzVMOHhUtFG/0C0bU2qHRpCmWN7xxprf7rbb8GWvdAOcxmaIDHgdFWvE7tMqNe75wC0ajHHlBDtrkFdAY+iDBDU9EC56dc7xWs7ZYw6N6Mxh1hhyn4wHe0Evaa0wid7IGJFA5JVOqpImp4gaE4QHl6/ER6DdnjkRavp7+tzRUfvPNHxCsvtx8lPHivu8HgfpYKvoFcNv5CnJRUkvFMVP8KBcpuFdJP/P+Mpie95RlWtA96US8kT1WYtiAzmO8NAcIm1uHN9orjo+fW48Lq74mK/a08eFu71YZsTFt6o5h5mugWwLExC6OC1LBT/OZ9xhuPbitqwKtlQ+V2Nf/f17NFogvFkY4lNtmbC4KjfjZiaPFYa1LR6LJ/VnrsngoKtVD9oxaja9vM+BBPwpQjI4eQuTSp9HthtUPxgoHq9Bpi8BkqKA+in7MtKQ5HfPaCoOGFL0akC32DOAmFZ7cB9Gc0kYeCJJjBVDwse1Z3/pGz71e3CYNLOAqYLTGgY5tDUzfxnEin3eRXliw69nJS38+OiPzYRkCcHPM2XUKhKlW1ya/kj+FXXMYVPf6J6eX/kVnP4VeJCjjkD1ZjmqCM4k2uSyROlGbfhUNROM8NdaaZ/pjSDdpTfF/dBOy7DU7iSwW3RurzAvfOD49j0q+dvI5mFsEvuqHy/5tKyktiVw33Ljgr5l91SFZj7yXsqs9Lb13erule1/kB9t0r6Y62i76nvoOSM5d30owfr+z6k/SBoeoN6FkeDV9b3piLPfeP6frmNvTs8UX5GjZKL3ruz99pvm8uaZ94g/Oqojn7fN2y49707Ku+IFxrvn9jPm6DRee5VJ8u7zbdg6I3zrndEh3ZajLzPRf1wgT4PUJp/BGj59/9SoL3+RRXoiMaxqQ4d5EW++tFVyKIXn1Y9AU4//5wm8/uXVtfbHX1Z1/O/qv0q6Ud2bBdW0c3bvDev6Obl6wVU9CIRnT5R9/b4+qWJ+mDGf3Wihmn13ymFePU/Pt7tfw==</diagram></mxfile>
19 changes: 19 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,25 @@
</properties>

<dependencies>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1</version>
</dependency>

<!-- API, java.xml.bind module -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.2</version>
</dependency>

<!-- Runtime, com.sun.xml.bind module -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,99 @@

import java.util.LinkedHashSet;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.security.auth.message.callback.PrivateKeyCallback.Request;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import edu.eci.arsw.blueprints.controllers.dao.BlueprintBody;
import edu.eci.arsw.blueprints.model.Blueprint;
import edu.eci.arsw.blueprints.model.Point;
import edu.eci.arsw.blueprints.persistence.BlueprintNotFoundException;
import edu.eci.arsw.blueprints.persistence.BlueprintPersistenceException;
import edu.eci.arsw.blueprints.services.BlueprintsServices;

/**
*
* @author hcadavid
*/
@RestController
@RequestMapping(value = "/blueprints")
public class BlueprintAPIController {

@Autowired
BlueprintsServices services;

@RequestMapping(method = RequestMethod.GET)
public ResponseEntity<?> get() {
try {
//obtener datos que se enviarán a través del API
return new ResponseEntity<>(services.getAllBlueprints(),HttpStatus.ACCEPTED);
} catch (BlueprintNotFoundException ex) {
Logger.getLogger(BlueprintAPIController.class.getName()).log(Level.SEVERE, null, ex);
return new ResponseEntity<>("No se ha encontrado",HttpStatus.NOT_FOUND);
}
}

@RequestMapping(method = RequestMethod.GET, value = "/{author}")
public ResponseEntity<?> getByAuthor(@PathVariable String author) {
try {
//obtener datos que se enviarán a través del API
return new ResponseEntity<>(services.getBlueprintsByAuthor(author),HttpStatus.ACCEPTED);
} catch (BlueprintNotFoundException ex) {
Logger.getLogger(BlueprintAPIController.class.getName()).log(Level.SEVERE, null, ex);
return new ResponseEntity<>("Error 404 Blueprint not found",HttpStatus.NOT_FOUND);
}
}



@RequestMapping(method = RequestMethod.GET, value = "/{author}/{bpname}")
public ResponseEntity<?> getByAuthorAndName(@PathVariable String author, @PathVariable String bpname) {
try {
//obtener datos que se enviarán a través del API
return new ResponseEntity<>(services.getBlueprint(author, bpname),HttpStatus.ACCEPTED);
} catch (BlueprintNotFoundException ex) {
Logger.getLogger(BlueprintAPIController.class.getName()).log(Level.SEVERE, null, ex);
return new ResponseEntity<>("Error 404 Blueprint not found",HttpStatus.NOT_FOUND);
}
}

@RequestMapping(method = RequestMethod.POST, value = "/create")
public ResponseEntity<?> create(@RequestBody BlueprintBody body) {
try {
Point[] pts = new Point[]{new Point(body.getX1(),body.getY1()),new Point(body.getX2(), body.getY2())};
Blueprint bp = new Blueprint(body.getAuthor(), body.getName(), pts);
services.addNewBlueprint(bp);

return new ResponseEntity<>(HttpStatus.CREATED);
} catch (BlueprintPersistenceException ex) {
Logger.getLogger(BlueprintAPIController.class.getName()).log(Level.SEVERE, null, ex);
return new ResponseEntity<>("Could not create blueprint",HttpStatus.BAD_REQUEST);
}
}

@RequestMapping(method = RequestMethod.PUT, value = "/{author}/{bpname}")
public ResponseEntity<?> update(@RequestBody BlueprintBody body, @PathVariable String author, @PathVariable String bpname) {
try {
services.updateBlueprint(author, bpname, body);
return new ResponseEntity<>(HttpStatus.CREATED);
} catch (Exception ex) {
Logger.getLogger(BlueprintAPIController.class.getName()).log(Level.SEVERE, null, ex);
return new ResponseEntity<>("Could not update blueprint",HttpStatus.BAD_REQUEST);
}
}



}

Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package edu.eci.arsw.blueprints.controllers.dao;

public class BlueprintBody {
String author, name;
Integer x1, y1, x2, y2;

public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getX1() {
return x1;
}
public void setX1(Integer x1) {
this.x1 = x1;
}
public Integer getY1() {
return y1;
}
public void setY1(Integer y1) {
this.y1 = y1;
}
public Integer getX2() {
return x2;
}
public void setX2(Integer x2) {
this.x2 = x2;
}
public Integer getY2() {
return y2;
}
public void setY2(Integer y2) {
this.y2 = y2;
}



}
7 changes: 7 additions & 0 deletions src/main/java/edu/eci/arsw/blueprints/filters/Filter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package edu.eci.arsw.blueprints.filters;

import edu.eci.arsw.blueprints.model.Blueprint;

public interface Filter {
public void filter(Blueprint bp);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package edu.eci.arsw.blueprints.filters;

import java.util.*;

import org.springframework.stereotype.Service;

import edu.eci.arsw.blueprints.model.*;
import org.springframework.stereotype.Component;

@Component("RedundanceFilter")
public class RedundanceFilter implements Filter{

@Override
public void filter(Blueprint bp) {
List<Point> pts0 = bp.getPoints();
ArrayList<Point> ps1 = new ArrayList();
for(int i=0;i<pts0.size()-1;i++){
if(pts0.get(i).getX()!=pts0.get(i+1).getX() &pts0.get(i).getY()!=pts0.get(i+1).getY() ){
ps1.add(pts0.get(i));
}
}
ps1.add(pts0.get(pts0.size()-1));
bp.setPoints(ps1);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package edu.eci.arsw.blueprints.filters;

import java.util.*;

import edu.eci.arsw.blueprints.model.*;
import org.springframework.stereotype.Component;

@Component("SubmuestreoFilter")
public class SubmuestreoFilter implements Filter{

@Override
public void filter(Blueprint bp) {
List<Point> pts0 = bp.getPoints();
int i=0;
ArrayList<Point> ps1 = new ArrayList();
for(Point p:pts0){
if(i%2!=0){
ps1.add(p);
}
i++;
}
bp.setPoints(ps1);
}
}
100 changes: 100 additions & 0 deletions src/main/java/edu/eci/arsw/blueprints/model/Blueprint.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@

package edu.eci.arsw.blueprints.model;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;


public class Blueprint {

private String author=null;

private List<Point> points=null;

private String name=null;

public Blueprint(String author,String name,Point[] pnts){
this.author=author;
this.name=name;
points=Arrays.asList(pnts);
}

public Blueprint(String author, String name){
this.name=name;
points=new ArrayList<>();
}

public Blueprint() {
}

public String getName() {
return name;
}

public String getAuthor() {
return author;
}

public List<Point> getPoints() {
return points;
}

public void setPoints(List<Point> points) {
this.points = points;
}

public void addPoint(Point p){
this.points.add(p);
}

@Override
public String toString() {
return "Blueprint{" + "author=" + author + ", name=" + name + '}';
}

@Override
public int hashCode() {
int hash = 7;
return hash;
}

@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Blueprint other = (Blueprint) obj;
if (!Objects.equals(this.author, other.author)) {
return false;
}
if (!Objects.equals(this.name, other.name)) {
return false;
}
if (this.points.size()!=other.points.size()){
return false;
}
for (int i=0;i<this.points.size();i++){
if (this.points.get(i)!=other.points.get(i)){
return false;
}
}

return true;
}

public void updatePoint(List<Point> update) {
this.points = update;

}



}
43 changes: 43 additions & 0 deletions src/main/java/edu/eci/arsw/blueprints/model/Point.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package edu.eci.arsw.blueprints.model;

/**
*
* @author hcadavid
*/
public class Point {

private int x;
private int y;

public Point(int x, int y) {
this.x = x;
this.y = y;
}

public Point() {
}

public int getX() {
return x;
}

public void setX(int x) {
this.x = x;
}

public int getY() {
return y;
}

public void setY(int y) {
this.y = y;
}



}
Loading