Representan EJB, que se utilizan para validar las operaciones tales como las eliminaciones.
MongoDB no soporta el concepto de integridad referencial, por lo cual recurrimos a Rules para implementar estas validaciones.
Se usaran en los Controller en el método delete.
Como implementarlo:
Buscar todos los @Referenced donde se haga uso de el.
Injectarlo y validar si no tiene registros mediante un count()
Retorna true si es posible eliminarlo, no tiene ninguna colección dependiente.
En este ejemplo:
No se puede eliminar un articulo , si existe en la coleccion Inventario o Facturadetalle u Ordendetalle.
ArticuloRules.java
/*
* 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 com.avbravo.storeejb.rules;
import com.avbravo.avbravoutils.JsfUtil;
import com.avbravo.storeejb.entity.*;
import com.avbravo.storeejb.repository.FacturadetalleRepository;
import com.avbravo.storeejb.repository.InventarioRepository;
import com.avbravo.storeejb.repository.OrdendetalleRepository;
import javax.ejb.Stateless;
import javax.inject.Inject;
import org.bson.Document;
/**
*
* @authoravbravo
*/
@Stateless
public class ArticuloRules {
@Inject
FacturadetalleRepository facturadetalleRepository;
@Inject
InventarioRepository inventarioRepository;
@Inject
OrdendetalleRepository ordendetalleRepository;
// <editor-fold defaultstate="collapsed" desc="isDeleted(Articulo articulo)">
public Boolean isDeleted(Articulo articulo) {
Boolean found = false;
try {
Integer count;
Document doc = new Document("articulo.idarticulo", articulo.getIdarticulo());
count = facturadetalleRepository.count(doc);
if (count > 0) {
return false;
}
count = inventarioRepository.count(doc);
if (count > 0) {
return false;
}
count = ordendetalleRepository.count(doc);
if (count > 0) {
return false;
}
} catch (Exception e) {
JsfUtil.errorMessage("isDeleted() " + e.getLocalizedMessage());
}
return true;
}
// </editor-fold>
}
ArticuloController.java
Inyectar
//Rules
ArticuloRules articuloRules;
Método delete
Validar que se pueda eliminar
if (!articuloRules.isDeleted(articulo)) {
JsfUtil.warningDialog("Delete", rf.getAppMessage("waring.integridadreferencialnopermitida"));
return "";
}
Segmento de código del método delete()
@Override
public String delete(Object item, Boolean deleteonviewpage) {
String path = "";
try {
articulo = (Articulo) item;
if (!articuloRules.isDeleted(articulo)) {
JsfUtil.warningDialog("Delete", rf.getAppMessage("waring.integridadreferencialnopermitida"));
return "";
}
articuloSelected = articulo;
if (articuloRepository.delete("idarticulo", articulo.getIdarticulo())) {
revisionHistoryStoreejbRepository.save(revisionHistoryServices.getRevisionHistory(articulo.getIdarticulo().toString(), loginController.getUsername(), "delete", "articulo", articuloRepository.toDocument(articulo).toString()));
JsfUtil.successMessage(rf.getAppMessage("info.delete"));
if (!deleteonviewpage) {
articuloList.remove(articulo);
articuloFiltered = articuloList;
articuloDataModel = new ArticuloDataModel(articuloList);
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("pagearticulo", page.toString());
} else {
articulo = new Articulo();
articuloSelected = new Articulo();
writable = false;
}
}
} catch (Exception e) {
JsfUtil.errorMessage("delete() " + e.getLocalizedMessage());
}
// path = deleteonviewpage ? "/pages/articulo/list.xhtml" : "";
path = "";
return path;
}// </editor-fold>
Nota:
Una forma rápida para localizar los entitys a incluir en Rules es usando NetBeans IDE y ejecutando una búsqueda en el proyecto:
@Referenced(documment = "Articulo"
Nos muestra los entitys que dependen de el