BeanUtilities.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2024 Link.it srl (https://link.it).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3, as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openspcoop2.core.registry.driver;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.openspcoop2.core.id.IDAccordo;
import org.openspcoop2.core.id.IDAccordoCooperazione;
import org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.AccordoCooperazione;
import org.openspcoop2.core.registry.IdSoggetto;
import org.openspcoop2.core.registry.AccordoServizioParteComune;
import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
import org.openspcoop2.core.registry.Documento;
import org.openspcoop2.core.registry.PortaDominio;
import org.openspcoop2.core.registry.RegistroServizi;
import org.openspcoop2.core.registry.Soggetto;
import org.openspcoop2.core.registry.constants.RuoliDocumento;
import org.openspcoop2.core.registry.constants.TipiDocumentoCoordinamento;
import org.openspcoop2.core.registry.constants.TipiDocumentoLivelloServizio;
import org.openspcoop2.core.registry.constants.TipiDocumentoSemiformale;
import org.openspcoop2.core.registry.constants.TipiDocumentoSicurezza;
/**
* Utility sui bean del package
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public abstract class BeanUtilities implements IDriverRegistroServiziGet {
private static final String DRIVER_REGISTRO_SERVIZI_DB = "org.openspcoop2.core.registry.driver.db.DriverRegistroServiziDB";
/**
* Controlla che il bean presente nel registro, sia uguale al bean passato come parametro
*
* @param idAccordo
* @param accordoCooperazione
* @return true se il bean presente nel registro, sia uguale al bean passato come parametro
*/
@Override
public boolean verificaAccordoCooperazione(IDAccordoCooperazione idAccordo,AccordoCooperazione accordoCooperazione)throws DriverRegistroServiziException {
return verificaAccordoCooperazione(idAccordo,accordoCooperazione,true);
}
@Override
public boolean verificaAccordoCooperazione(IDAccordoCooperazione idAccordo,AccordoCooperazione accordoCooperazione,boolean checkID)throws DriverRegistroServiziException{
AccordoCooperazione beanRegistro = null;
try{
if(this.getClass().getName().equals(BeanUtilities.DRIVER_REGISTRO_SERVIZI_DB)){
Method m = this.getClass().getMethod("getAccordoCooperazione", IDAccordoCooperazione.class,boolean.class);
beanRegistro = (AccordoCooperazione) m.invoke(this, idAccordo, true);
}
else
beanRegistro = this.getAccordoCooperazione(idAccordo);
}catch(DriverRegistroServiziNotFound dNotFound){}
catch(Exception e){
throw new DriverRegistroServiziException(e.getMessage(),e);
}
if(beanRegistro==null){
if(accordoCooperazione==null)
return true;
else
return false;
}else{
if(accordoCooperazione==null)
return false;
else
return beanRegistro.equals(accordoCooperazione,checkID);
}
}
/**
* Controlla che il bean presente nel registro, sia uguale al bean passato come parametro
*
* @param idAccordo
* @param accordoServizioParteComune
* @return true se il bean presente nel registro, sia uguale al bean passato come parametro
*/
@Override
public boolean verificaAccordoServizioParteComune(IDAccordo idAccordo,AccordoServizioParteComune accordoServizioParteComune)throws DriverRegistroServiziException {
return verificaAccordoServizioParteComune(idAccordo,accordoServizioParteComune,true);
}
@Override
public boolean verificaAccordoServizioParteComune(IDAccordo idAccordo,AccordoServizioParteComune accordoServizioParteComune,boolean checkID)throws DriverRegistroServiziException{
AccordoServizioParteComune beanRegistro = null;
try{
if(this.getClass().getName().equals(BeanUtilities.DRIVER_REGISTRO_SERVIZI_DB)){
Method m = this.getClass().getMethod("getAccordoServizioParteComune", IDAccordo.class,boolean.class);
beanRegistro = (AccordoServizioParteComune) m.invoke(this, idAccordo, true);
}
else
beanRegistro = this.getAccordoServizioParteComune(idAccordo);
}catch(DriverRegistroServiziNotFound dNotFound){}
catch(Exception e){
throw new DriverRegistroServiziException(e.getMessage(),e);
}
if(beanRegistro==null){
if(accordoServizioParteComune==null)
return true;
else
return false;
}else{
if(accordoServizioParteComune==null)
return false;
else
return beanRegistro.equals(accordoServizioParteComune,checkID);
}
}
/**
* Controlla che il bean presente nel registro, sia uguale al bean passato come parametro
*
* @param nomePdd
* @param pdd
* @return true se il bean presente nel registro, sia uguale al bean passato come parametro
*/
@Override
public boolean verificaPortaDominio(String nomePdd,PortaDominio pdd)throws DriverRegistroServiziException{
return this.verificaPortaDominio(nomePdd, pdd,true);
}
@Override
public boolean verificaPortaDominio(String nomePdd,PortaDominio pdd,boolean checkID)throws DriverRegistroServiziException{
PortaDominio beanRegistro = null;
try{
beanRegistro = this.getPortaDominio(nomePdd);
}catch(DriverRegistroServiziNotFound dNotFound){}
if(beanRegistro==null){
if(pdd==null)
return true;
else
return false;
}else{
if(pdd==null)
return false;
else
return beanRegistro.equals(pdd,checkID);
}
}
/**
* Controlla che il bean presente nel registro, sia uguale al bean passato come parametro
*
* @param idSoggetto
* @param soggetto
* @return true se il bean presente nel registro, sia uguale al bean passato come parametro
* @throws DriverRegistroServiziException
*/
@Override
public boolean verificaSoggetto(IDSoggetto idSoggetto,Soggetto soggetto)throws DriverRegistroServiziException {
return verificaSoggetto(idSoggetto, soggetto,true);
}
@Override
public boolean verificaSoggetto(IDSoggetto idSoggetto,Soggetto soggetto,boolean checkID)throws DriverRegistroServiziException{
Soggetto beanRegistro = null;
try{
beanRegistro = this.getSoggetto(idSoggetto);
}catch(DriverRegistroServiziNotFound dNotFound){}
if(beanRegistro==null){
if(soggetto==null)
return true;
else
return false;
}else{
if(soggetto==null)
return false;
else
return beanRegistro.equals(soggetto,checkID);
}
}
/**
* Controlla che il bean presente nel registro, sia uguale al bean passato come parametro
*
* @param idServizio
* @param accordoServizioParteSpecifica
* @return true se il bean presente nel registro, sia uguale al bean passato come parametro
* @throws DriverRegistroServiziException
*/
@Override
public boolean verificaAccordoServizioParteSpecifica(IDServizio idServizio,AccordoServizioParteSpecifica accordoServizioParteSpecifica)throws DriverRegistroServiziException {
return verificaAccordoServizioParteSpecifica(idServizio,accordoServizioParteSpecifica,true);
}
@Override
public boolean verificaAccordoServizioParteSpecifica(IDServizio idServizio,AccordoServizioParteSpecifica accordoServizioParteSpecifica,boolean checkID)throws DriverRegistroServiziException{
AccordoServizioParteSpecifica beanRegistro = null;
try{
if(this.getClass().getName().equals(BeanUtilities.DRIVER_REGISTRO_SERVIZI_DB)){
Method m = this.getClass().getMethod("getAccordoServizioParteSpecifica", IDServizio.class,boolean.class);
beanRegistro = (AccordoServizioParteSpecifica) m.invoke(this, idServizio, true);
}
else
beanRegistro = this.getAccordoServizioParteSpecifica(idServizio);
}catch(DriverRegistroServiziNotFound dNotFound){}
catch(Exception e){
throw new DriverRegistroServiziException(e.getMessage(),e);
}
if(beanRegistro==null){
if(accordoServizioParteSpecifica==null)
return true;
else
return false;
}else{
if(accordoServizioParteSpecifica==null)
return false;
else
return beanRegistro.equals(accordoServizioParteSpecifica,checkID);
}
}
/**
* Controlla che il bean presente nel registro, sia uguale al bean passato come parametro
*
* @param idSoggetto Identificatore del Soggetto di tipo {@link org.openspcoop2.core.id.IDSoggetto}.
* @param idAccordoServizioParteComune ID dell'accordo che deve implementare il servizio correlato
* @param accordoServizioParteSpecifica
* @return true se il bean presente nel registro, sia uguale al bean passato come parametro
* @throws DriverRegistroServiziException
*/
@Override
public boolean verificaAccordoServizioParteSpecifica_ServizioCorrelato(IDSoggetto idSoggetto, IDAccordo idAccordoServizioParteComune,AccordoServizioParteSpecifica accordoServizioParteSpecifica)throws DriverRegistroServiziException {
return verificaAccordoServizioParteSpecifica_ServizioCorrelato(idSoggetto,idAccordoServizioParteComune,accordoServizioParteSpecifica,true);
}
@Override
public boolean verificaAccordoServizioParteSpecifica_ServizioCorrelato(IDSoggetto idSoggetto, IDAccordo idAccordoServizioParteComune,AccordoServizioParteSpecifica accordoServizioParteSpecifica,boolean checkID)throws DriverRegistroServiziException{
AccordoServizioParteSpecifica beanRegistro = null;
try{
if(this.getClass().getName().equals(BeanUtilities.DRIVER_REGISTRO_SERVIZI_DB)){
Method m = this.getClass().getMethod("getAccordoServizioParteSpecifica_ServizioCorrelato", IDSoggetto.class,IDAccordo.class,boolean.class);
beanRegistro = (AccordoServizioParteSpecifica) m.invoke(this, idSoggetto, idAccordoServizioParteComune, true);
}
else
beanRegistro = this.getAccordoServizioParteSpecifica_ServizioCorrelato(idSoggetto,idAccordoServizioParteComune);
}catch(DriverRegistroServiziNotFound dNotFound){}
catch(Exception e){
throw new DriverRegistroServiziException(e.getMessage(),e);
}
if(beanRegistro==null){
if(accordoServizioParteSpecifica==null)
return true;
else
return false;
}else{
if(accordoServizioParteSpecifica==null)
return false;
else
return beanRegistro.equals(accordoServizioParteSpecifica,checkID);
}
}
public static IDSoggetto getSoggettoReferenteID(IdSoggetto ass){
if(ass!=null && ass.getTipo()!=null && ass.getNome()!=null){
return new IDSoggetto(ass.getTipo(),ass.getNome());
}else{
return null;
}
}
public static IDSoggetto getSoggettoErogatore(AccordoServizioParteSpecifica asps){
if(asps!=null && asps.getTipoSoggettoErogatore()!=null && asps.getNomeSoggettoErogatore()!=null){
return new IDSoggetto(asps.getTipoSoggettoErogatore(),asps.getNomeSoggettoErogatore());
}else{
return null;
}
}
public static void validateTipoRuolo(String tipo,String ruolo)throws DriverRegistroServiziException{
if(RuoliDocumento.allegato.toString().equals(ruolo)){
// qualsiasi tipo e' accettato
return;
}else if(RuoliDocumento.specificaSemiformale.toString().equals(ruolo)){
if(TipiDocumentoSemiformale.HTML.toString().equals(tipo)==false &&
TipiDocumentoSemiformale.LINGUAGGIO_NATURALE.toString().equals(tipo)==false &&
TipiDocumentoSemiformale.UML.toString().equals(tipo)==false &&
TipiDocumentoSemiformale.XML.toString().equals(tipo)==false &&
TipiDocumentoSemiformale.XSD.toString().equals(tipo)==false &&
TipiDocumentoSemiformale.JSON.toString().equals(tipo)==false &&
TipiDocumentoSemiformale.YAML.toString().equals(tipo)==false){
throw new DriverRegistroServiziException("Tipo["+tipo+"] non accettato per il Ruolo["+ruolo+"], valori ammessi sono: "+
TipiDocumentoSemiformale.HTML.toString()+","
+TipiDocumentoSemiformale.LINGUAGGIO_NATURALE.toString()+","
+TipiDocumentoSemiformale.UML.toString()+","
+TipiDocumentoSemiformale.XML.toString()+","
+TipiDocumentoSemiformale.XSD.toString()+","
+TipiDocumentoSemiformale.JSON.toString()+","
+TipiDocumentoSemiformale.YAML.toString());
}
}else if(RuoliDocumento.specificaLivelloServizio.toString().equals(ruolo)){
if(TipiDocumentoLivelloServizio.WSAGREEMENT.toString().equals(tipo)==false &&
TipiDocumentoLivelloServizio.WSLA.toString().equals(tipo)==false){
throw new DriverRegistroServiziException("Tipo["+tipo+"] non accettato per il Ruolo["+ruolo+"], valori ammessi sono: "+
TipiDocumentoLivelloServizio.WSAGREEMENT.toString()+","
+TipiDocumentoLivelloServizio.WSLA.toString());
}
}else if(RuoliDocumento.specificaSicurezza.toString().equals(ruolo)){
if(TipiDocumentoSicurezza.LINGUAGGIO_NATURALE.toString().equals(tipo)==false &&
TipiDocumentoSicurezza.WSPOLICY.toString().equals(tipo)==false &&
TipiDocumentoSicurezza.XACML_POLICY.toString().equals(tipo)==false){
throw new DriverRegistroServiziException("Tipo["+tipo+"] non accettato per il Ruolo["+ruolo+"], valori ammessi sono: "+
TipiDocumentoSicurezza.LINGUAGGIO_NATURALE.toString()+","
+TipiDocumentoSicurezza.WSPOLICY.toString()+","
+TipiDocumentoSicurezza.XACML_POLICY.toString());
}
}else if(RuoliDocumento.specificaCoordinamento.toString().equals(ruolo)){
if(TipiDocumentoCoordinamento.BPEL.toString().equals(tipo)==false &&
TipiDocumentoCoordinamento.WSCDL.toString().equals(tipo)==false){
throw new DriverRegistroServiziException("Tipo["+tipo+"] non accettato per il Ruolo["+ruolo+"], valori ammessi sono: "+
TipiDocumentoCoordinamento.BPEL.toString()+","
+TipiDocumentoCoordinamento.WSCDL.toString());
}
}else{
throw new DriverRegistroServiziException("Ruolo non conosciuto");
}
}
/**
* Dato un bean {@link AccordoServizioParteComune}, {@link AccordoCooperazione}, {@link AccordoServizioParteSpecifica} ritorna la lista
* di tutti i {@link Documento} contenuti nel bean, recuperandoli dagli array interni al bean.
* @param <T> -{@link AccordoServizioParteComune}, {@link AccordoCooperazione}, {@link AccordoServizioParteSpecifica}
* @param o -Il bean del quale si vogliono tutti i documenti
* @return La lista dei documenti. La lista non e' mai null.
*/
public static <T> ArrayList<Documento> getAllDocumenti(T o){
ArrayList<Documento> lista = new ArrayList<Documento>();
if(o instanceof AccordoServizioParteComune){
AccordoServizioParteComune b = (AccordoServizioParteComune)o;
if(b.sizeAllegatoList()>0){
for (Documento documento : b.getAllegatoList()) {
lista.add(documento);
}
}
if(b.sizeSpecificaSemiformaleList()>0){
for (Documento documento : b.getSpecificaSemiformaleList()) {
lista.add(documento);
}
}
}else if (o instanceof AccordoCooperazione){
AccordoCooperazione b = (AccordoCooperazione)o;
if(b.sizeAllegatoList()>0){
for (Documento documento : b.getAllegatoList()) {
lista.add(documento);
}
}
if(b.sizeSpecificaSemiformaleList()>0){
for (Documento documento : b.getSpecificaSemiformaleList()) {
lista.add(documento);
}
}
}else if(o instanceof AccordoServizioParteSpecifica){
AccordoServizioParteSpecifica b = (AccordoServizioParteSpecifica)o;
if(b.sizeAllegatoList()>0){
for (Documento documento : b.getAllegatoList()) {
lista.add(documento);
}
}
if(b.sizeSpecificaSemiformaleList()>0){
for (Documento documento : b.getSpecificaSemiformaleList()) {
lista.add(documento);
}
}
if(b.sizeSpecificaLivelloServizioList()>0){
for (Documento documento : b.getSpecificaLivelloServizioList()) {
lista.add(documento);
}
}
if(b.sizeSpecificaSicurezzaList()>0){
for (Documento documento : b.getSpecificaSicurezzaList()) {
lista.add(documento);
}
}
}
//lista vuota
return lista;
}
public RegistroServizi getImmagineCompletaRegistroServizi() throws DriverRegistroServiziException{
RegistroServizi registroServizi = new RegistroServizi();
// Porte di Dominio
List<String> idPdd = null;
try{
idPdd = this.getAllIdPorteDominio(new FiltroRicerca());
}catch(DriverRegistroServiziNotFound dNotFound){}
if(idPdd!=null){
for(int i=0; i<idPdd.size(); i++){
try{
registroServizi.addPortaDominio(this.getPortaDominio(idPdd.get(i)));
}catch(DriverRegistroServiziNotFound dNotfound){
throw new DriverRegistroServiziException("Porta di Dominio ["+idPdd.get(i)+"] trovato tramite getAllId ma poi non recuperabile: "+dNotfound.getMessage(),dNotfound);
}
}
}
// Accordi di Cooperazione
List<IDAccordoCooperazione> idAccordiCooperazione = null;
try{
idAccordiCooperazione = this.getAllIdAccordiCooperazione(new FiltroRicercaAccordi());
}catch(DriverRegistroServiziNotFound dNotFound){}
if(idAccordiCooperazione!=null){
for(int i=0; i<idAccordiCooperazione.size(); i++){
try{
registroServizi.addAccordoCooperazione(this.getAccordoCooperazione(idAccordiCooperazione.get(i)));
}catch(DriverRegistroServiziNotFound dNotfound){
throw new DriverRegistroServiziException("Accordo di cooperazione ["+idAccordiCooperazione.get(i)+"] trovato tramite getAllId ma poi non recuperabile: "+dNotfound.getMessage(),dNotfound);
}
}
}
// Accordi di Servizio
List<IDAccordo> idAccordiServizio = null;
try{
idAccordiServizio = this.getAllIdAccordiServizioParteComune(new FiltroRicercaAccordi());
}catch(DriverRegistroServiziNotFound dNotFound){}
if(idAccordiServizio!=null){
for(int i=0; i<idAccordiServizio.size(); i++){
try{
registroServizi.addAccordoServizioParteComune(this.getAccordoServizioParteComune(idAccordiServizio.get(i)));
}catch(DriverRegistroServiziNotFound dNotfound){
throw new DriverRegistroServiziException("Accordo di servizio parte comune ["+idAccordiServizio.get(i)+"] trovato tramite getAllId ma poi non recuperabile: "+dNotfound.getMessage(),dNotfound);
}
}
}
// Soggetti
List<IDSoggetto> idSoggetti = null;
try{
idSoggetti = this.getAllIdSoggetti(new FiltroRicercaSoggetti());
}catch(DriverRegistroServiziNotFound dNotFound){}
if(idSoggetti!=null){
for(int i=0; i<idSoggetti.size(); i++){
try{
Soggetto soggetto = this.getSoggetto(idSoggetti.get(i));
// I servizi possono contenere solo meta-informazioni (es. Driver DB)
while(soggetto.sizeAccordoServizioParteSpecificaList()>0){
soggetto.removeAccordoServizioParteSpecifica(0);
}
FiltroRicercaServizi filtro = new FiltroRicercaServizi();
filtro.setTipoSoggettoErogatore(soggetto.getTipo());
filtro.setNomeSoggettoErogatore(soggetto.getNome());
// Recupero servizi con informazioni complete
List<IDServizio> idServizi = null;
try{
idServizi = this.getAllIdServizi(filtro);
}catch(DriverRegistroServiziNotFound dNotFound){}
if(idServizi!=null){
for(int j=0; j<idServizi.size(); j++){
try{
AccordoServizioParteSpecifica s = this.getAccordoServizioParteSpecifica(idServizi.get(j));
soggetto.addAccordoServizioParteSpecifica(s);
}catch(DriverRegistroServiziNotFound dNotfound){
throw new DriverRegistroServiziException("Accordo Servizio Parte Specifica ["+idServizi.get(j)+"] trovato tramite getAllId ma poi non recuperabile: "+dNotfound.getMessage(),dNotfound);
}
}
}
registroServizi.addSoggetto(soggetto);
}catch(DriverRegistroServiziNotFound dNotfound){
throw new DriverRegistroServiziException("Soggetto ["+idSoggetti.get(i)+"] trovato tramite getAllId ma poi non recuperabile: "+dNotfound.getMessage(),dNotfound);
}
}
}
return registroServizi;
}
}