diff --git a/backoffice/src/main/java/uy/edu/fing/tse/jsf/RequestBean.java b/backoffice/src/main/java/uy/edu/fing/tse/jsf/RequestBean.java index 8e0d1185d6746b3faa06c6c2b6d336eceb4c243e..b358919357c2067776dfd9ecfb8b4243aa9339fc 100644 --- a/backoffice/src/main/java/uy/edu/fing/tse/jsf/RequestBean.java +++ b/backoffice/src/main/java/uy/edu/fing/tse/jsf/RequestBean.java @@ -19,7 +19,7 @@ public class RequestBean { private BusinessLocal negocio; @EJB - private uy.edu.fing.tse.practico.business.jms.JMSProducer jms; + private uy.edu.fing.tse.practico.business.mq.JMSProducer jms; @ManagedProperty(value = "#{Session}") private SessionBean session; diff --git a/backoffice/src/main/java/uy/edu/fing/tse/jsp/MyServlet.java b/backoffice/src/main/java/uy/edu/fing/tse/jsp/MyServlet.java index 44d8889fff34de2a89f8addd156d13e573768706..b117d3bf3e5dc98b86fdde7397d258fc0eba455f 100644 --- a/backoffice/src/main/java/uy/edu/fing/tse/jsp/MyServlet.java +++ b/backoffice/src/main/java/uy/edu/fing/tse/jsp/MyServlet.java @@ -20,7 +20,7 @@ public class MyServlet extends HttpServlet { private BusinessLocal negocio; @EJB - private uy.edu.fing.tse.practico.business.jms.JMSProducer jms; + private uy.edu.fing.tse.practico.business.mq.JMSProducer jms; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/Category.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/Category.java index 194727bb30ffd70a063579262d90b65907783406..5930e47cabde12fc83786e05d39010d2e238da7a 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/Category.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/Category.java @@ -1,6 +1,10 @@ package uy.edu.fing.tse.dto; -public final class Category { +import java.io.Serializable; + +public final class Category implements Serializable { + + private static final long serialVersionUID = -317249293474531216L; private Long id; private String name; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/CheckChecker.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/CheckChecker.java index 59d7463588798eb41e75d2f93e0c5137129f7d9f..b9ff4dcc7ea0e225078b81ebc4da26e740ca1fc0 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/CheckChecker.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/CheckChecker.java @@ -1,6 +1,10 @@ package uy.edu.fing.tse.dto; -public final class CheckChecker { +import java.io.Serializable; + +public final class CheckChecker implements Serializable { + + private static final long serialVersionUID = 4798508172561834440L; private Long id; private UserBO checker; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/CheckMechanism.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/CheckMechanism.java index 64c5a3683fff3d2da68bcce0352d0d253114a2d5..4f494037b370c6108215b97f8f02be5ff5b8ba37 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/CheckMechanism.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/CheckMechanism.java @@ -1,8 +1,11 @@ package uy.edu.fing.tse.dto; +import java.io.Serializable; import java.util.Date; -public final class CheckMechanism { +public final class CheckMechanism implements Serializable { + + private static final long serialVersionUID = -5354719133598426738L; private Long id; private Peripherical peripheral; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/Fact.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/Fact.java index 691ec0e2360ff2f834fc029bcd4fd9d8507bc5a7..1fdf5af1bd578fa29f1baca6e68517c7696f0995 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/Fact.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/Fact.java @@ -1,9 +1,12 @@ package uy.edu.fing.tse.dto; +import java.io.Serializable; import java.util.ArrayList; import java.util.List; -public final class Fact { +public final class Fact implements Serializable { + + private static final long serialVersionUID = -6218807350324946355L; private Long id; private String title; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/Mechanism.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/Mechanism.java index 65d5835b4dbddde744df78599aa15dbbde252373..af2924f932af3bb9356eefcc443b5872557c765f 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/Mechanism.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/Mechanism.java @@ -1,6 +1,10 @@ package uy.edu.fing.tse.dto; -public class Mechanism { +import java.io.Serializable; + +public class Mechanism implements Serializable { + + private static final long serialVersionUID = 2443873705205432766L; private Long id; private String name; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/MechanismInternal.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/MechanismInternal.java index 7f2b03854dc5162261418a59ccb4bc8871825fe4..e685e541bf7071fa40e979c1c8831b65fd7e1b7d 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/MechanismInternal.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/MechanismInternal.java @@ -3,4 +3,5 @@ package uy.edu.fing.tse.dto; public final class MechanismInternal extends Mechanism { + private static final long serialVersionUID = -8256891910168590447L; } diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/Peripherical.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/Peripherical.java index 91003e0fdca08ca86ee3f93e7003d79af05548ff..f74e7a3c6b46bfc475289f0b428dd27757899ff0 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/Peripherical.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/Peripherical.java @@ -6,6 +6,8 @@ import java.util.List; public final class Peripherical extends Mechanism { + private static final long serialVersionUID = 3767463748206760371L; + private List<Category> categories = new ArrayList<>(); private String endpoint; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/Role.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/Role.java index 698980b05cde8e240059693fa7fa382602ef546f..ff9c9a75cda83ab9c546c88be5db705077e07502 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/Role.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/Role.java @@ -1,6 +1,10 @@ package uy.edu.fing.tse.dto; -public class Role { +import java.io.Serializable; + +public class Role implements Serializable { + + private static final long serialVersionUID = -1446670708639059343L; private Long id; private String name; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/Score.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/Score.java index 770b8ac5ddbf7daecfbb0721bd629b93f9cb170d..5014f9429ade8be43424ebe6378130ad19e91bcc 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/Score.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/Score.java @@ -1,9 +1,13 @@ package uy.edu.fing.tse.dto; +import java.io.Serializable; + /** * Esta es la que puede ser vergonzosa, verdad a media, verdad, falsa */ -public final class Score { +public final class Score implements Serializable { + + private static final long serialVersionUID = -5278506826296305357L; private Long id; private String value; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/State.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/State.java index 483308de80ce772902fdaeaf7423f86bee79b086..97571a1bfa1621b2919ca4423a088a2eccb3ccee 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/State.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/State.java @@ -1,9 +1,13 @@ package uy.edu.fing.tse.dto; +import java.io.Serializable; + /** * Son los estados para los hechos, Nuevo, aComprobar, enProceso, Verificado, Publicado, Cancelado */ -public final class State { +public final class State implements Serializable { + + private static final long serialVersionUID = 8369408999916591568L; private Long id; private String value; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/StateHistory.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/StateHistory.java index 9d7ed14a00de6886c3a7a0ce4220b3803032579e..91b69784a26688c81068cb1b2f1326ac56167c30 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/StateHistory.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/StateHistory.java @@ -1,8 +1,11 @@ package uy.edu.fing.tse.dto; +import java.io.Serializable; import java.util.Date; -public final class StateHistory { +public final class StateHistory implements Serializable { + + private static final long serialVersionUID = 1032183705367730249L; private Long id; private State state; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/User.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/User.java index 7d1445c0b16cc794aeb4c74d5e7f7fd6e415e457..6078a453a4827fba1e42e83c4cb392dff27736fb 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/User.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/User.java @@ -1,6 +1,10 @@ package uy.edu.fing.tse.dto; -public abstract class User { +import java.io.Serializable; + +public abstract class User implements Serializable { + + private static final long serialVersionUID = -5501550545779779794L; private Long id; private String mail; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/UserBO.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/UserBO.java index f378d472eccec97cd91b091514f1f25bd0d7ddcb..8058ca42aa8cf45f1cb9f15a13003bc6549b1c36 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/UserBO.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/UserBO.java @@ -3,6 +3,8 @@ package uy.edu.fing.tse.dto; public final class UserBO extends User { + private static final long serialVersionUID = -460563178765136315L; + private String salt; private String password; private Role role; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/UserFO.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/UserFO.java index 933fc5e07575125189919b73871b3bcbaf846011..6f822184e86d4f437dba48c72a32941bf0fc6270 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/UserFO.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/UserFO.java @@ -2,4 +2,5 @@ package uy.edu.fing.tse.dto; public final class UserFO extends User { + private static final long serialVersionUID = -7399690108581919726L; } diff --git a/central-ejb/pom.xml b/central-ejb/pom.xml index 9063b50dd547ad82ad75e591d3ef7eade83954ae..91f5fc68016634ed1549499b1e9bf6b65e53ed23 100644 --- a/central-ejb/pom.xml +++ b/central-ejb/pom.xml @@ -83,6 +83,17 @@ <type>pom</type> </dependency> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-databind</artifactId> + <version>2.9.9</version> + </dependency> + + <dependency> + <groupId>com.rabbitmq</groupId> + <artifactId>amqp-client</artifactId> + </dependency> + </dependencies> <build> diff --git a/central-ejb/src/main/java/.keep b/central-ejb/src/main/java/.keep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/Business.java b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/Business.java index 8481131195d564c9ca631dc7f32103b937ab624f..3a650f5f18a79de35aba6d3b1961cff80c19ce14 100644 --- a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/Business.java +++ b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/Business.java @@ -1,28 +1,13 @@ package uy.edu.fing.tse.practico.business; -import uy.edu.fing.tse.dto.NoticiaDTO; -import uy.edu.fing.tse.dto.PublicacionDTO; -import java.util.List; +import uy.edu.fing.tse.dto.CheckMechanism; +import uy.edu.fing.tse.dto.Peripherical; -/** - * La Capa de Negocio deberá proveer funcionalidades para Agregar una Publicación a - * una Noticia, Obtener Noticias, Obtener Publicaciones y Obtener las Publicaciones de - * una Noticia. - */ public interface Business { - void add(NoticiaDTO noticia); + void altaPeriferico(Peripherical p); - void add(PublicacionDTO publicacion, NoticiaDTO noticia); - - NoticiaDTO findNoticia(long idNoticia); - - List<NoticiaDTO> getNoticias(); - - List<PublicacionDTO> getPublicaciones(); - - List<PublicacionDTO> getPublicaciones(final long idNoticia); - - NoticiaDTO addPublicacionANoticia(final PublicacionDTO pub, final long idNoticia); + void altaVerificacionMecanismo(CheckMechanism cm); } + diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/BusinessBean.java b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/BusinessBean.java index fde79c48f597acd31ad99023d51466216c2bc5ab..b3d2c3f43535aec7e695ccae168d4935b81d98d0 100644 --- a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/BusinessBean.java +++ b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/BusinessBean.java @@ -1,19 +1,13 @@ package uy.edu.fing.tse.practico.business; -import uy.edu.fing.tse.dto.NoticiaDTO; -import uy.edu.fing.tse.dto.PublicacionDTO; +import uy.edu.fing.tse.dto.CheckMechanism; +import uy.edu.fing.tse.dto.Peripherical; import uy.edu.fing.tse.practico.db.DataAccessBean; import javax.annotation.PostConstruct; import javax.ejb.*; -import java.util.List; -/** - * Se debe controlar que una noticia no tenga más de diez publicaciones. Esta - * capa deberá implementarse con Stateless Session Beans que provean interfaces - * remotas y locales - */ @Stateless @Local({BusinessLocal.class}) @Remote({BusinessRemote.class}) @@ -29,45 +23,12 @@ public class BusinessBean implements BusinessLocal, BusinessRemote { } @Override - public void add(NoticiaDTO noticia) { - dataAccess.alta(noticia); - } - - @Override - public void add(PublicacionDTO publicacion, NoticiaDTO noticia) { - noticia.getPublicaciones().add(publicacion); - dataAccess.alta(noticia); - } + public void altaPeriferico(Peripherical p) { - @Override - public NoticiaDTO findNoticia(final long idNoticia) { - return dataAccess.find(idNoticia); - } - - @Override - public List<NoticiaDTO> getNoticias() { - return dataAccess.getNoticias(); } @Override - public List<PublicacionDTO> getPublicaciones() { - return dataAccess.getPublicaciones(); - } - - @Override - public List<PublicacionDTO> getPublicaciones(final long idNoticia) { - return dataAccess.find(idNoticia).getPublicaciones(); - } - - @Override - public NoticiaDTO addPublicacionANoticia(final PublicacionDTO pub, final long idNoticia) { - NoticiaDTO noticiaDTO = dataAccess.find(idNoticia); - - if (noticiaDTO.getPublicaciones().size() >= 10) { - throw new RuntimeException("La noticia tiene demasiadas publicaciones ya."); - } + public void altaVerificacionMecanismo(CheckMechanism cm) { - noticiaDTO = dataAccess.addPublicacionToNoticia(pub, idNoticia); - return noticiaDTO; } } diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/common/Propiedades.java b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/common/Propiedades.java new file mode 100644 index 0000000000000000000000000000000000000000..a0b19d5f5d7ad9225a636679e660543c4ab18f63 --- /dev/null +++ b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/common/Propiedades.java @@ -0,0 +1,79 @@ +package uy.edu.fing.tse.practico.business.common; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Path; +import java.util.Map; +import java.util.Properties; + +public enum Propiedades { + + URI("uy.edu.fing.tse.business.rabbit.uri", ""), + HOST("uy.edu.fing.tse.business.rabbit.host", ""), + PORT("uy.edu.fing.tse.business.rabbit.port", "5672"), + VHOST("uy.edu.fing.tse.business.rabbit.vhost", ""), + USERNAME("uy.edu.fing.tse.business.rabbit.username", ""), + PASSWORD("uy.edu.fing.tse.business.rabbit.password", ""); + + private final String key; + private final String defaultValue; + + Propiedades(String key, String defaultValue) { + this.key = key; + this.defaultValue = defaultValue; + } + + public String getKey() { + return key; + } + + public String getDefaultValue() { + return defaultValue; + } + + public String getValue() { + return System.getProperty(key); + } + + public Integer getIntValue() { + return Integer.valueOf(System.getProperty(key)); + } + + public Boolean getBoolValue() { + return Boolean.valueOf(System.getProperty(key)); + } + + static { + //Agrego valores por defecto + for (Propiedades value : Propiedades.values()) { + System.setProperty(value.key, value.defaultValue); + } + //Cargo los valores del archivo + try { + final URL resource = Propiedades.class.getClassLoader().getResource("central.properties"); + final Path of = Path.of(resource.toURI()); + + load(of.toFile()); + } catch (URISyntaxException e) { + throw new RuntimeException("Error leyendo el archivo de propiedades", e); + } + + } + + public static void load(final File propFile) { + try (FileInputStream is = new FileInputStream(propFile)) { + Properties p = new Properties(); + p.load(is); + + for (Map.Entry<Object, Object> entry : p.entrySet()) { + System.setProperty(entry.getKey().toString(), entry.getValue().toString()); + } + + } catch (IOException ex) { + throw new RuntimeException("Error leyendo el archivo de propiedades", ex); + } + } +} diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/jms/AltaNoticiaMDB.java b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/jms/AltaNoticiaMDB.java deleted file mode 100644 index b16d696cb29c7dd476151d23630914e72cce497e..0000000000000000000000000000000000000000 --- a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/jms/AltaNoticiaMDB.java +++ /dev/null @@ -1,38 +0,0 @@ -package uy.edu.fing.tse.practico.business.jms; - -import uy.edu.fing.tse.dto.NoticiaDTO; -import uy.edu.fing.tse.practico.business.BusinessBean; - -import javax.ejb.ActivationConfigProperty; -import javax.ejb.EJB; -import javax.ejb.MessageDriven; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageListener; - -//FIXME comentarlo para el despliegue en OpenShift -@MessageDriven(name = "AltaNoticia", activationConfig = { - @ActivationConfigProperty(propertyName = "destination", propertyValue = "java:/jms/queue/queue_alta_noticia"), - @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), - @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"), - @ActivationConfigProperty(propertyName = "maxSession", propertyValue = "50") -}) -public class AltaNoticiaMDB implements MessageListener { - - @EJB - private BusinessBean negocio; - - @Override - public void onMessage(Message message) { - try { - final String body = message.getBody(String.class); - final String[] split = body.trim().split("\\|"); - - final NoticiaDTO noticia = new NoticiaDTO(null, split[0], split[1]); - negocio.add(noticia); - - } catch (JMSException e) { - e.printStackTrace(); - } - } -} diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/jms/JMSProducer.java b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/jms/JMSProducer.java deleted file mode 100644 index b364f6df82121ee97953bd4487ab855550627846..0000000000000000000000000000000000000000 --- a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/jms/JMSProducer.java +++ /dev/null @@ -1,40 +0,0 @@ -package uy.edu.fing.tse.practico.business.jms; - -import uy.edu.fing.tse.dto.NoticiaDTO; - -import javax.annotation.Resource; -import javax.ejb.Stateless; -import javax.jms.*; - -@Stateless -public class JMSProducer { - - @Resource(lookup = "java:/ConnectionFactory") - private ConnectionFactory connectionFactory; - - @Resource(lookup = "java:/jms/queue/queue_alta_noticia") - private Queue sendQueue; - - public void altaNoticia(final NoticiaDTO noticia) { - try { - sendMsj(noticia.getTitulo() + "|" + noticia.getDescripcion()); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - private void sendMsj(final String messageStr) { - // Create the JMS connection, session, producer, and consumer - try (Connection connection = connectionFactory.createConnection()) { - final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); - final MessageProducer producer = session.createProducer(sendQueue); - - connection.start(); - - final Message message = session.createTextMessage(messageStr); - producer.send(message); - } catch (JMSException _e) { - //ignore - } - } -} diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/MessageConsumer.java b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/MessageConsumer.java new file mode 100644 index 0000000000000000000000000000000000000000..fc6a8fe05fb431574ee880c3e781bf69b9cca1b8 --- /dev/null +++ b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/MessageConsumer.java @@ -0,0 +1,78 @@ +package uy.edu.fing.tse.practico.business.mq; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.rabbitmq.client.AMQP; +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.DefaultConsumer; +import com.rabbitmq.client.Envelope; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import uy.edu.fing.tse.dto.CheckMechanism; +import uy.edu.fing.tse.dto.Peripherical; +import uy.edu.fing.tse.practico.business.BusinessBean; + +import javax.annotation.PostConstruct; +import javax.ejb.EJB; +import javax.ejb.Singleton; +import javax.ejb.Startup; +import java.io.IOException; +import java.util.concurrent.TimeoutException; + +@Singleton +@Startup +public class MessageConsumer { + + private static final Logger LOG = LoggerFactory.getLogger(MessageConsumer.class); + + private Channel channel; + + @EJB + private BusinessBean negocio; + + @PostConstruct + public void init() { + try { + channel = RabbitConfig.channel(); + subscripcion(Queue.SUBCRIBTION, channel); + verificacion(Queue.VERIFICATION, channel); + } catch (IOException | TimeoutException e) { + LOG.error("Error: ", e); + throw new RuntimeException("Error al construir la coneccion con MQ", e); + } + } + + private void subscripcion(final Queue queue, final Channel channel) throws IOException { + LOG.info("Subscribing: " + queue.name); + channel.basicConsume(queue.name, false, queue.name + "Tag", new DefaultConsumer(channel) { + @Override + public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { + String routingKey = envelope.getRoutingKey(); + String contentType = properties.getContentType(); + long deliveryTag = envelope.getDeliveryTag(); + + final Peripherical peripherical = new ObjectMapper().readValue(body, Peripherical.class); + negocio.altaPeriferico(peripherical); + + channel.basicAck(deliveryTag, false); + } + }); + } + + private void verificacion(final Queue queue, final Channel channel) throws IOException { + LOG.info("Subscribing: " + queue.name); + channel.basicConsume(queue.name, false, queue.name + "Tag", new DefaultConsumer(channel) { + @Override + public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { + String routingKey = envelope.getRoutingKey(); + String contentType = properties.getContentType(); + long deliveryTag = envelope.getDeliveryTag(); + + + final CheckMechanism cm = new ObjectMapper().readValue(body, CheckMechanism.class); + negocio.altaVerificacionMecanismo(cm); + + channel.basicAck(deliveryTag, false); + } + }); + } +} diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/MessageProducer.java b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/MessageProducer.java new file mode 100644 index 0000000000000000000000000000000000000000..cc264e1dddb0d67a82b527f731ccea6371b4c6ab --- /dev/null +++ b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/MessageProducer.java @@ -0,0 +1,38 @@ +package uy.edu.fing.tse.practico.business.mq; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.rabbitmq.client.Channel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.PostConstruct; +import javax.ejb.Stateless; +import java.io.IOException; +import java.util.concurrent.TimeoutException; + +@Stateless +public class MessageProducer { + + private static final Logger LOG = LoggerFactory.getLogger(MessageProducer.class); + + private Channel channel; + + @PostConstruct + public void init() { + try { + channel = RabbitConfig.channel(); + } catch (IOException | TimeoutException e) { + LOG.error("Error: ", e); + throw new RuntimeException("Error al construir la coneccion con MQ", e); + } + } + + public void send(final Object message, final Queue queue) throws IOException { + final String body = new ObjectMapper().writeValueAsString(message); + send(body, queue); + } + + public void send(final String message, final Queue queue) throws IOException { + channel.basicPublish("", queue.name, null, message.getBytes()); + } +} diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/Queue.java b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/Queue.java new file mode 100644 index 0000000000000000000000000000000000000000..f5f1daea43e905d88ff05745dab0f2aac45e122d --- /dev/null +++ b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/Queue.java @@ -0,0 +1,21 @@ +package uy.edu.fing.tse.practico.business.mq; + +public enum Queue { + REQUEST("request"), + VERIFICATION("verification"), + SUBCRIBTION("subcription"), + DEFAULT("default"), + COLA("cola"); + + String name; + boolean durable; + boolean exclusive; + boolean autoDelete; + + Queue(String name) { + this.name = name; + durable = false; + exclusive = false; + autoDelete = false; + } +} diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/RabbitConfig.java b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/RabbitConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..f7bc956ffe06035356418d20dd3f8c7bc24edf67 --- /dev/null +++ b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/RabbitConfig.java @@ -0,0 +1,42 @@ +package uy.edu.fing.tse.practico.business.mq; + +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.Connection; +import com.rabbitmq.client.ConnectionFactory; +import uy.edu.fing.tse.practico.business.common.Propiedades; + +import java.io.IOException; +import java.util.concurrent.TimeoutException; + +final class RabbitConfig { + //https://barnacle.rmq.cloudamqp.com/#/queues + private static Channel channel = null; + + private RabbitConfig() { + } + + static Channel channel() throws IOException, TimeoutException { + if (channel == null) { + channel = connection().createChannel(); + for (Queue queue : Queue.values()) { + channel.queueDeclare(queue.name, queue.durable, queue.exclusive, queue.autoDelete, null); + } + } + return channel; + } + + private static Connection connection() throws IOException, TimeoutException { + return connectionFactory().newConnection(); + } + + private static ConnectionFactory connectionFactory() { + ConnectionFactory factory = new ConnectionFactory(); + factory.setHost(Propiedades.HOST.getValue()); + factory.setPort(Propiedades.PORT.getIntValue()); + factory.setPassword(Propiedades.PASSWORD.getValue()); + factory.setUsername(Propiedades.USERNAME.getValue()); + factory.setVirtualHost(Propiedades.VHOST.getValue()); + return factory; + } + +} diff --git a/central-ejb/src/main/resources/central.properties b/central-ejb/src/main/resources/central.properties new file mode 100644 index 0000000000000000000000000000000000000000..33f1c55a66bc58cb265f5d90341d44f3ef282497 --- /dev/null +++ b/central-ejb/src/main/resources/central.properties @@ -0,0 +1,6 @@ +uy.edu.fing.tse.business.rabbit.uri=amqp://hjxhckpo:kGFmsQ9HodjSzRVT016ttW-z7d2tn_IF@barnacle.rmq.cloudamqp.com/hjxhckpo +uy.edu.fing.tse.business.rabbit.host=barnacle.rmq.cloudamqp.com +uy.edu.fing.tse.business.rabbit.port=5672 +uy.edu.fing.tse.business.rabbit.vhost=hjxhckpo +uy.edu.fing.tse.business.rabbit.username=hjxhckpo +uy.edu.fing.tse.business.rabbit.password=kGFmsQ9HodjSzRVT016ttW-z7d2tn_IF \ No newline at end of file diff --git a/pom.xml b/pom.xml index f605bf05e6e86fb7281c0bb0a195385e2ad16f0e..d907081fafca8843e7b5a2d564029f86023ed9f1 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,7 @@ <module>central-db</module> <module>central-ejb</module> <module>central-ear</module> - <module>backoffice</module> + <!-- <module>backoffice</module>--> </modules> <properties> @@ -25,12 +25,13 @@ <version.wildfly>15.0.0.Final</version.wildfly> <!-- other plugin versions --> - <version.compiler.plugin>3.1</version.compiler.plugin> + <version.compiler.plugin>3.8.1</version.compiler.plugin> <version.ear.plugin>3.0.1</version.ear.plugin> <version.ejb.plugin>3.0.1</version.ejb.plugin> - <version.surefire.plugin>2.22.1</version.surefire.plugin> + <version.surefire.plugin>2.22.2</version.surefire.plugin> <version.war.plugin>3.2.2</version.war.plugin> + <org.mapstruct.version>1.3.0.Final</org.mapstruct.version> </properties> <dependencyManagement> @@ -202,10 +203,16 @@ <version>1.2</version> </dependency> + <dependency> + <groupId>com.rabbitmq</groupId> + <artifactId>amqp-client</artifactId> + <version>5.7.0</version> + </dependency> + <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> - <version>1.3.0.Final</version> + <version>${org.mapstruct.version}</version> </dependency> </dependencies> </dependencyManagement> @@ -289,7 +296,10 @@ <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>${version.surefire.plugin}</version> + <configuration> + <skip>false</skip> + <skipTests>false</skipTests> <argLine> --illegal-access=permit </argLine>