Java tutorial
// license-header java merge-point /** * This is only generated once! It will never be overwritten. * You can (and have to!) safely modify it by hand. */ package es.caib.seycon.ng.servei; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Vector; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.apache.commons.collections.map.LRUMap; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import es.caib.seycon.ng.comu.Account; import es.caib.seycon.ng.comu.AutoritzacioRol; import es.caib.seycon.ng.comu.RolGrant; import es.caib.seycon.ng.comu.UserAccount; import es.caib.seycon.ng.comu.Usuari; import es.caib.seycon.ng.comu.ValorDomini; import es.caib.seycon.ng.exception.InternalErrorException; import es.caib.seycon.ng.model.AutoritzacioRolEntity; import es.caib.seycon.ng.model.GrupEntity; import es.caib.seycon.ng.model.RolAccountEntity; import es.caib.seycon.ng.utils.AutoritzacioSEU; import es.caib.seycon.ng.utils.Security; import es.caib.seycon.util.TipusDomini; /** * @see es.caib.seycon.ng.servei.AutoritzacioService */ public class AutoritzacioServiceImpl extends es.caib.seycon.ng.servei.AutoritzacioServiceBase { /** * */ private static final String AUTORITZACIO_CACHE = "AutoritzacioCache"; //$NON-NLS-1$ @SuppressWarnings("unchecked") public AutoritzacioServiceImpl() { } // Afegim este valor de domini per a atorgar l'autoritzaci a tots els // possibles valor de domini de l'autoritzaci private final String TIPUS_DOMINI_ESTRELLETA = "TIPUS_DOMINI_ESTRELLETA"; //$NON-NLS-1$ // El guarden de forma esttica private static HashMap xmlAuthorizations = null; // Es carrega en el comenament private Map getAuthorizations() { if (xmlAuthorizations == null) { HashMap xmlAutoritzacions = new HashMap(); InputStream is = null; try { // Obtenim el fitxer d'autoritzacions: Enumeration<URL> urls = AutoritzacioService.class.getClassLoader() .getResources("es/caib/seycon/autoritzacions.xml"); //$NON-NLS-1$ while (urls.hasMoreElements()) { URL url = urls.nextElement(); is = url.openStream(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(is); doc.getDocumentElement().normalize(); // System.out.println("Root element "+ // doc.getDocumentElement().getNodeName()); NodeList elementsAutoritzacio = doc.getElementsByTagName("autoritzacio"); //$NON-NLS-1$ // System.out.println("Information of all autoritzacions"); for (int s = 0; s < elementsAutoritzacio.getLength(); s++) { Node nodeAutoritzacio = elementsAutoritzacio.item(s); if (nodeAutoritzacio.getNodeType() == Node.ELEMENT_NODE) { // Construim l'autoritzaciVO a partir del XML AutoritzacioSEU auto = new AutoritzacioSEU((Element) nodeAutoritzacio); // Si no t codi, l'ignorem if (auto.getCodi() != null) { xmlAutoritzacions.put(auto.getCodi(), auto); } } } is.close(); } // System.out.println("Carregades autoritzacions XML"); xmlAuthorizations = xmlAutoritzacions; } catch (Throwable e) { System.err.println(Messages.getString("AutoritzacioServiceImpl.ErrorObtainingAuthorizations") //$NON-NLS-1$ + e.getMessage()); } finally { try { if (is != null) is.close(); } catch (Throwable th) { } } } return xmlAuthorizations; } protected AutoritzacioRol handleCreate(AutoritzacioRol autoritzacio) throws Exception { AutoritzacioRolEntity auto = getAutoritzacioRolEntityDao().autoritzacioRolToEntity(autoritzacio); getAutoritzacioRolEntityDao().create(auto); return getAutoritzacioRolEntityDao().toAutoritzacioRol(auto); } protected void handleDelete(AutoritzacioRol autoritzacio) throws Exception { // si ya tiene id, la borramos if (autoritzacio.getId() != null) { getAutoritzacioRolEntityDao().remove(autoritzacio.getId()); } } /* * Obtenim els rols que cont l'autoritzaci (llistat des de SEU) * * (non-Javadoc) * * @see * es.caib.seycon.ng.servei.AutoritzacioServiceBase#handleGetRolsAutoritzacio * (java.lang.String) */ protected Collection<AutoritzacioRol> handleGetRolsAutoritzacio(String autoritzacio) throws Exception { if (autoritzacio != null) { List<AutoritzacioRolEntity> autoritzacions = getAutoritzacioRolEntityDao() .findByAutoritzacio(autoritzacio); if (autoritzacions != null && autoritzacions.size() != 0) { return getAutoritzacioRolEntityDao().toAutoritzacioRolList(autoritzacions); } } return new ArrayList(); } private Collection getCodiGrupsFillsGrup(String codiGrup) { LinkedList l_grupsUsuari = new LinkedList(); l_grupsUsuari.add(codiGrup); HashSet grupsFills = new HashSet(); String codiGrupAnalitzat = null; while ((codiGrupAnalitzat = (String) l_grupsUsuari.poll()) != null) { if (!grupsFills.contains(codiGrupAnalitzat)) { // si no l'hem // analitzat ja grupsFills.add(codiGrupAnalitzat); Collection fills = getGrupEntityDao().findSubGrupsByCodi(codiGrupAnalitzat); if (fills != null) for (Iterator git = fills.iterator(); git.hasNext();) { GrupEntity fg = (GrupEntity) git.next(); if (!grupsFills.contains(fg.getCodi())) // si no s ja // analitzat l_grupsUsuari.add(fg.getCodi()); } } } return grupsFills; } private Collection getCodiGrupsParesGrup(String codiGrup) { GrupEntity grupAnalitzar = getGrupEntityDao().findByCodi(codiGrup); Collection totsPares = new HashSet(); GrupEntity pare = grupAnalitzar.getPare(); while (pare != null) { totsPares.add(pare.getCodi()); pare = pare.getPare(); } return totsPares; } private List<AutoritzacioRol> getAutoritzacionsUsuari(Collection autoritzacionsRolVO, String codiUsuari) throws InternalErrorException { List<AutoritzacioRol> autoritzacionsUsuari = new LinkedList<AutoritzacioRol>(); // ROLS de l'usuari actual (heredats -senseDomini i atorgats -ambDomini) HashMap rolsUsuariSenseDomini = new HashMap(); // id_rol => rolEntity // id_rol => llistat de rolsusuariEntity (poden ser N) // Atorgaci directa (RolsUsuarisEntity):amb domini AplicacioService appSvc = getAplicacioService(); PasswordService passSvc = getPasswordService(); AccountService acctSvc = getAccountService(); Account account = acctSvc.findAccount(codiUsuari, passSvc.getDefaultDispatcher()); if (account == null) return new Vector<AutoritzacioRol>(); Collection<RolGrant> grants; if (account instanceof UserAccount) { Usuari usuari = getUsuariService().findUsuariByCodiUsuari(((UserAccount) account).getUser()); grants = appSvc.findEffectiveRolGrantByUser(usuari.getId()); } else grants = appSvc.findEffectiveRolGrantByAccount(account.getId()); HashMap<Long, List<RolGrant>> rols = new HashMap<Long, List<RolGrant>>(); // explorem rols de l'usuari (poden tindre domini) for (RolGrant rg : grants) { Long rolId = rg.getIdRol(); if (!rols.containsKey(rolId)) { LinkedList<RolGrant> grantList = new LinkedList<RolGrant>(); grantList.add(rg); rols.put(rolId, grantList); } else { rols.get(rolId).add(rg); } } // guardem les autoritzacions (per id) if (autoritzacionsRolVO != null && autoritzacionsRolVO.size() != 0) { for (Iterator it = autoritzacionsRolVO.iterator(); it.hasNext();) { // Una fila per cada rol que t atorgat aquesta autoritzaci AutoritzacioRol autoRolVO = (AutoritzacioRol) it.next(); AutoritzacioSEU autoSEU = (AutoritzacioSEU) getAuthorizations().get(autoRolVO.getAutoritzacio()); // pot sser que aquesta auto no existisca en el XML (antigues) // scope dels grups String scope = autoSEU != null ? autoSEU.getScope() : null; // si no t scope: ONE per defecte autoRolVO.setScope(scope != null ? scope : Security.AUTO_SCOPE_ONE); if (autoRolVO.getValorDominiRolUsuari() == null) { // si l'autoritzaci no en t cap vdom creem el // contenidor perqu no es repetixquen autoRolVO.setValorDominiRolUsuari(new HashSet()); } Long idRol = autoRolVO.getRol().getId(); if (rols.containsKey(idRol)) { for (RolGrant rg : rols.get(idRol)) { RolAccountEntity ra = getRolAccountEntityDao().load(rg.getId()); if (rg.getDomainValue() != null) { autoRolVO.getValorDominiRolUsuari() .add(new ValorDomini(rg.getDomainValue(), ra.getRol().getTipusDomini())); if (TipusDomini.GRUPS.equals(ra.getRol().getTipusDomini()) || TipusDomini.GRUPS_USUARI.equals(ra.getRol().getTipusDomini())) { // Obtenim els grups segons el scope de // l'autoritzaci: Collection grupsAutoritzacio = null; if (Security.AUTO_SCOPE_PARES.equals(autoRolVO.getScope())) { // Obtenim el codi dels grups pare grupsAutoritzacio = getCodiGrupsParesGrup(rg.getDomainValue()); } else if (Security.AUTO_SCOPE_FILLS.equals(autoRolVO.getScope())) { // Obtenim el codi dels grups fills grupsAutoritzacio = getCodiGrupsFillsGrup(rg.getDomainValue()); } else if (Security.AUTO_SCOPE_BOTH.equals(autoRolVO.getScope())) { // OBtenim els pares i els fills del // grup Collection pares = getCodiGrupsParesGrup(rg.getDomainValue()); Collection fills = getCodiGrupsFillsGrup(rg.getDomainValue()); grupsAutoritzacio = new HashSet(); grupsAutoritzacio.addAll(pares); grupsAutoritzacio.addAll(fills); } else { // Per defecte (noms el grup) grupsAutoritzacio = new ArrayList(); grupsAutoritzacio.add(rg.getDomainValue()); } // Afegim un valor de domini per cada // grup on corresponga l'autoritzaci for (Iterator git = grupsAutoritzacio.iterator(); git.hasNext();) { String codiGrup = (String) git.next(); autoRolVO.getValorDominiRolUsuari() .add(new ValorDomini(codiGrup, ra.getRol().getTipusDomini())); } } } else { ValorDomini estrelleta = new ValorDomini("*", TIPUS_DOMINI_ESTRELLETA); //$NON-NLS-1$ autoRolVO.getValorDominiRolUsuari().add(estrelleta); } } // L'usuari t el rol (amb o sense domini, l'afegim a la // llista d'autoritzacio-rol) // VO amb els valors de domini i el rol autoritzacionsUsuari.add(autoRolVO); // Analitzem l'HERNCIA de d'altres autoritzacions i les // afegim: // NOTA: l'herncia NO s transitiva (noms primer nivell) // [IMPORTANT] // Noms hem de copiar els valors de domini del mateix tipus // de DOMINI addInheriedAuthorizations(autoritzacionsUsuari, autoRolVO, autoSEU); } } } return autoritzacionsUsuari; } private void addInheriedAuthorizations(List<AutoritzacioRol> autoritzacionsUsuari, AutoritzacioRol autoRolVO, AutoritzacioSEU autoSEU) { if (autoSEU != null && autoSEU.getAutoritzacionsHereta() != null) { // Obtenim les autoritzacions que hereta Collection autosHereta = autoSEU.getAutoritzacionsHereta(); // Mirem si hereta totes (autoritzaci global) // si s aix, afegim TOTES les autoritzacions del xml if (autosHereta.contains("*")) // afegim totes //$NON-NLS-1$ autosHereta = getAuthorizations().keySet(); for (Iterator ait = autosHereta.iterator(); ait.hasNext();) { String codiAutoHereta = (String) ait.next(); // Obtenim les autoritzacions que hereta AutoritzacioSEU autoHereta = (AutoritzacioSEU) getAuthorizations().get(codiAutoHereta); // Pot sser que no existisca aquesta autoritzaci if (autoHereta == null) continue; // Obtenim els tipus de domini de l'autoritzaci que // hereta String tipusDominiHereta = autoHereta.getTipusDomini(); // pot sser nul // clonem l'autoritzaci actual (per mantindre els // dominis) // AutoritzacioRol novaAutoHereta = new // AutoritzacioRol(autoRolVO); AutoritzacioRol novaAutoHereta = new AutoritzacioRol(null/* id */, autoHereta.getCodi(), autoRolVO.getRol(), autoRolVO.getValorDominiRolUsuari() != null ? new ArrayList(autoRolVO.getValorDominiRolUsuari()) : new ArrayList() /* el clonem */, autoHereta.getDescripcio(), tipusDominiHereta, autoHereta.getScope(), autoHereta.getAmbit(), null); // Posem el codi d'autoritzaci corresponent // novaAutoHereta.setAutoritzacio(autoHereta.getCodi()); // I la resta de valors // I revisem els seus valors de domini atorgats (si // sn compatibles) // Si l'autoritzaci t el tipusDomini a null: // SENSE_DOMINI_AUTO (valor domini estrelleta) // NO heretem cap valor de domini d'altres // autoritzacions /* * if (tipusDominiHereta==null) { * novaAutoHereta.setValorDominiRolUsuari(new * ArrayList()); //buida } else //{ */ // llevem les que no ens corresponen if (novaAutoHereta.getValorDominiRolUsuari() != null) { for (Iterator vit = novaAutoHereta.getValorDominiRolUsuari().iterator(); vit.hasNext();) { ValorDomini vdc = (ValorDomini) vit.next(); // TODO: Falta analitzar si l'autoritzaci // que heretem s de tipus grups // i t un scope diferent al de // l'autoritzaci que estem heretant. // Si es estrelleta [AUTORITZACI // SENSE_DOMINI_AUTO] o si // s de domini COMPATIBLE (mateix tipus) el // mantenim // si s null el que hereta, noms heretem // estrelleta ??? // TODO: Comprovar l'herncia a dominis de // rols SENSE_DOMINI // This removes, for example, a application domain value from the role assignment when the authorization needs a group domain value. if (!TIPUS_DOMINI_ESTRELLETA.equals(vdc.getNomDomini()) && (tipusDominiHereta != null && tipusDominiHereta.indexOf(vdc.getNomDomini()) == -1)) { vit.remove(); } } } boolean found = isAuthorizationAlreadyPresent(autoritzacionsUsuari, novaAutoHereta); if (!found) { autoritzacionsUsuari.add(novaAutoHereta); addInheriedAuthorizations(autoritzacionsUsuari, novaAutoHereta, (AutoritzacioSEU) getAuthorizations().get(novaAutoHereta.getAutoritzacio())); } } } } private boolean isAuthorizationAlreadyPresent(List<AutoritzacioRol> autoritzacionsUsuari, AutoritzacioRol novaAutoHereta) { boolean found = false; for (AutoritzacioRol au : autoritzacionsUsuari) { if (au.getAutoritzacio().equals(novaAutoHereta.getAutoritzacio())) { if (au.getValorDominiRolUsuari() == null || au.getValorDominiRolUsuari().isEmpty()) { found = true; break; } boolean hasNewDomainValues = false; for (ValorDomini vdNew : novaAutoHereta.getValorDominiRolUsuari()) { boolean isNewDomainValue = true; for (ValorDomini vdOld : au.getValorDominiRolUsuari()) { if (vdOld.getValor().equals(vdNew.getValor())) { isNewDomainValue = false; break; } } if (isNewDomainValue) { hasNewDomainValues = true; break; } } if (!hasNewDomainValues) { found = true; break; } } } return found; } protected Collection<AutoritzacioRol> handleGetUserAuthorizations(String codiUsuari) throws Exception { AutoritzacioCache autoritzacions = (AutoritzacioCache) getSessionCacheService() .getObject(AUTORITZACIO_CACHE); if (autoritzacions != null && autoritzacions.isValid()) return autoritzacions.getAutoritzacions(); // Obtenim totes les autoritzacions (Entities) // amb els diferents rols que inclou List<AutoritzacioRolEntity> autoritzacionsRol = getAutoritzacioRolEntityDao().loadAll(); // Si no es troba cap autoritzaci: sortim if (autoritzacionsRol == null || autoritzacionsRol.size() == 0) return new ArrayList(); // Pasem a VO List<AutoritzacioRol> auts = getAutoritzacionsUsuari( getAutoritzacioRolEntityDao().toAutoritzacioRolList(autoritzacionsRol), codiUsuari); autoritzacions = new AutoritzacioCache(auts); getSessionCacheService().putObject(AUTORITZACIO_CACHE, autoritzacions); return auts; } protected Collection<AutoritzacioRol> handleGetUserAuthorization(String codiAutoritzacio, String codiUsuari) throws Exception { Collection<AutoritzacioRol> autoritzacions = handleGetUserAuthorizations(codiUsuari); Collection<AutoritzacioRol> effectivAutoritzacions = new LinkedList<AutoritzacioRol>(); for (AutoritzacioRol a : autoritzacions) { if (a.getAutoritzacio().equals(codiAutoritzacio)) effectivAutoritzacions.add(a); } return effectivAutoritzacions; } protected String[] handleGetUserAuthorizationString(String codiAutoritzacio) throws Exception { return handleGetUserAuthorizationString(codiAutoritzacio, getCodiUsuari()); } private String[] autoritzacionsToString(Collection autoritzacioRols) { if (autoritzacioRols != null && autoritzacioRols.size() != 0) { /* * Collection autoVD = new HashSet(); // perqu no es repetixquen * for (Iterator it = autoritzacioRols.iterator(); it.hasNext();) { * AutoritzacioRol autoVO = (AutoritzacioRol) it.next(); * * // Afegim l'autoritzaci GENRICA (sense valor domini): * autoVD.add(autoVO.getAutoritzacio()); * * // Afegim els diferents VALORS DE DOMINI de l'autoritzaci * Collection vdom = autoVO.getValorDominiRolUsuari(); if (vdom != * null && vdom.size() != 0) { for (Iterator vit = vdom.iterator(); * vit.hasNext();) { ValorDomini vd = (ValorDomini) vit.next(); * autoVD.add(autoVO.getAutoritzacio() + "/" + vd.getValor()); } } } * return (String[]) autoVD.toArray(new String[0]); */ // Fem que si t domini ESTRELLETA, englobe els altres // valors de domini // La seva key ser el codi d'autoritzacio // amb HashSet de valor de domini HashMap autoVD = new HashMap(); // aqu posarem les autoritzacions finals: ArrayList autoritzacionsFiltrades = new ArrayList(); for (Iterator it = autoritzacioRols.iterator(); it.hasNext();) { AutoritzacioRol autoVO = (AutoritzacioRol) it.next(); // Key del HashMap String codiAutoritzacio = autoVO.getAutoritzacio(); // key: codi_autoritzacio, values: dominis // obtenim els dominis d'aquesta autoritzaci HashSet dominis = (HashSet) autoVD.get(codiAutoritzacio); // si s nova, li creem el set de dominis if (dominis == null) dominis = new HashSet(); // Afegim l'autoritzaci GENRICA (sense valor domini): dominis.add(autoVO.getAutoritzacio()); // Afegim els diferents VALORS DE DOMINI de l'autoritzaci Collection vdom = autoVO.getValorDominiRolUsuari(); if (vdom != null && vdom.size() != 0) { for (Iterator vit = vdom.iterator(); vit.hasNext();) { ValorDomini vd = (ValorDomini) vit.next(); dominis.add(autoVO.getAutoritzacio() + "/" //$NON-NLS-1$ + vd.getValor()); } } // Guardem els dominis actualitzats de l'autoritzaci: autoVD.put(codiAutoritzacio, dominis); } // Ara hem de netejar els dominis: si tenim ESTRELLETA // ens quedem noms en aquest domini i el genric for (Iterator it = autoVD.keySet().iterator(); it.hasNext();) { String autoActual = (String) it.next(); HashSet dominisAct = (HashSet) autoVD.get(autoActual); if (dominisAct.contains(autoActual + "/*")) {// VALOR DOMINI //$NON-NLS-1$ // ESTRELLETA autoritzacionsFiltrades.add(autoActual); // generic autoritzacionsFiltrades.add(autoActual + "/*"); // valor //$NON-NLS-1$ // ESTRELLETA } else { // Els afegim tots autoritzacionsFiltrades.addAll(dominisAct); } } // Haurem de recrrer return (String[]) autoritzacionsFiltrades.toArray(new String[0]); } else return new String[0]; } protected String[] handleGetUserAuthorizationString(String codiAutoritzacio, String codiUsuari) throws Exception { Collection rolsAutoritzacio = handleGetUserAuthorization(codiAutoritzacio, codiUsuari); return autoritzacionsToString(rolsAutoritzacio); } protected Collection handleGetUserAuthorizations() throws Exception { return handleGetUserAuthorizations(getCodiUsuari()); } protected Collection handleGetUserAuthorization(String codiAutoritzacio) throws Exception { return handleGetUserAuthorization(codiAutoritzacio, getCodiUsuari()); } protected String[] handleGetUserAuthorizationsString() throws Exception { return handleGetUserAuthorizationsString(getCodiUsuari()); } protected String[] handleGetUserAuthorizationsString(String codiUsuari) throws Exception { Collection autosUsu = handleGetUserAuthorizations(codiUsuari); return autoritzacionsToString(autosUsu); } /** * Obtenim el codi de l'usuari actual de l'aplicaci * * @return */ private String getCodiUsuari() { return Security.getCurrentUser(); } protected Collection<AutoritzacioRol> handleGetDescriptionUserAuthorizations() throws Exception { return this.getDescriptionUserAuthorizations(getCodiUsuari()); } protected Collection<AutoritzacioRol> handleGetDescriptionUserAuthorizations(String codiUsuari) throws Exception { Collection autoritzacionsRolUsuari = handleGetUserAuthorizations(codiUsuari); // IMPORTANT: la seva clau es el nom del rol + codiAutoritzacio + // descripci [valor_domini] HashMap<String, AutoritzacioRol> autoritzacionsSenseRepeticions = new HashMap(); // Afegim informaci addicional: if (autoritzacionsRolUsuari != null) { for (Iterator it = autoritzacionsRolUsuari.iterator(); it.hasNext();) { AutoritzacioRol auto = (AutoritzacioRol) it.next(); AutoritzacioSEU autoSEU = (AutoritzacioSEU) getAuthorizations().get(auto.getAutoritzacio()); if (autoSEU != null) { // formategem els valor de domini String valorDominiUsuari = ""; //$NON-NLS-1$ if (auto.getValorDominiRolUsuari() != null && auto.getValorDominiRolUsuari().size() > 0) { HashSet valors = new HashSet(); for (Iterator vit = auto.getValorDominiRolUsuari().iterator(); vit.hasNext();) { ValorDomini vd = (ValorDomini) vit.next(); valors.add(vd.getValor()); } if (valors.size() == 1 && valors.contains("*")) //$NON-NLS-1$ ; else valorDominiUsuari = " " + valors.toString(); //$NON-NLS-1$ } auto.setDescripcio(autoSEU.getDescripcio() //$NON-NLS-1$ + valorDominiUsuari); auto.setTipusDomini(autoSEU.getTipusDomini()); auto.setScope(autoSEU.getScope()); auto.setAmbit(autoSEU.getAmbit()); auto.setHereta(autoSEU.getHereta()); // separat per comes autoritzacionsSenseRepeticions .put(auto.getRol().getNom() + auto.getAutoritzacio() + auto.getDescripcio(), auto); } } // Les ordenem LinkedList autosOrdenades = new LinkedList(autoritzacionsSenseRepeticions.values()); Collections.sort(autosOrdenades, new ComparaAutos()); return autosOrdenades; } return autoritzacionsSenseRepeticions.values(); } private class ComparaAutos implements Comparator { public int compare(Object o1, Object o2) { if (o1 instanceof AutoritzacioRol && o2 instanceof AutoritzacioRol) { AutoritzacioRol a1 = (AutoritzacioRol) o1; AutoritzacioRol a2 = (AutoritzacioRol) o2; if (!a1.getAmbit().equals(a2.getAmbit())) return a1.getAmbit().compareTo(a2.getAmbit()); else if (!a1.getDescripcio().equals(a2.getDescripcio())) return a1.getDescripcio().compareTo(a2.getDescripcio()); } else if (o1 instanceof AutoritzacioSEU && o2 instanceof AutoritzacioSEU) { AutoritzacioSEU a1 = (AutoritzacioSEU) o1; AutoritzacioSEU a2 = (AutoritzacioSEU) o2; if (!a1.getAmbit().equals(a2.getAmbit())) return a1.getAmbit().compareTo(a2.getAmbit()); else if (!a1.getDescripcio().equals(a2.getDescripcio())) return a1.getDescripcio().compareTo(a2.getDescripcio()); } return 0; } } @Override protected Collection<Object> handleGetInformacioAutoritzacio(String autoritzacio) throws Exception { Object obj = getAuthorizations().get(autoritzacio); LinkedList<Object> res = new LinkedList(); if (obj != null && obj instanceof AutoritzacioSEU) { AutoritzacioSEU auto = (AutoritzacioSEU) obj; res.add(auto); return res; } // No l'hem trobada: tornem una buida (no hauria d'ocorrer) res.add(new AutoritzacioSEU(autoritzacio, autoritzacio, "", "", "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ return res; } /* (non-Javadoc) * @see es.caib.seycon.ng.servei.AutoritzacioServiceBase#handleFindAuthorizations(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) */ @Override protected Collection<AutoritzacioSEU> handleFindAuthorizations(String ambit, String descripcio, String codi) throws Exception { descripcio = removeWildcard(descripcio); codi = removeWildcard(codi); if (ambit != null && ambit.trim().compareTo("") == 0) //$NON-NLS-1$ { ambit = null; } if (descripcio != null && descripcio.trim().compareTo("") == 0) //$NON-NLS-1$ { descripcio = null; } if (codi != null && codi.trim().compareTo("") == 0) //$NON-NLS-1$ { codi = null; } Collection<AutoritzacioSEU> allAuthorizations = getAuthorizations().values(); List<AutoritzacioSEU> authorizations = new LinkedList<AutoritzacioSEU>(); if (ambit == null && descripcio == null && codi == null) { authorizations = sort(allAuthorizations); return authorizations; } else { List<AutoritzacioSEU> ambitList = findAmbitAuthorizations(allAuthorizations, ambit); List<AutoritzacioSEU> descripcioList = findDescripcioAuthorizations(allAuthorizations, descripcio); List<AutoritzacioSEU> codiList = findCodiAuthorizations(allAuthorizations, codi); if ((ambitList != null && !ambitList.isEmpty()) || (descripcioList != null && !descripcioList.isEmpty())) authorizations = compareLists(ambitList, descripcioList); if ((authorizations != null && !authorizations.isEmpty()) || (codiList != null && !codiList.isEmpty())) authorizations = compareLists(authorizations, codiList); System.out.println(authorizations); Collections.sort(authorizations, new ComparaAutos()); return authorizations; } } /** * @param allAuthorizations * @return */ private List<AutoritzacioSEU> sort(Collection<AutoritzacioSEU> allAuthorizations) { List<AutoritzacioSEU> list = new LinkedList<AutoritzacioSEU>(); for (AutoritzacioSEU auto : allAuthorizations) { list.add(auto); } Collections.sort(list, new ComparaAutos()); return list; } /** * @param ambit * @return */ private String removeWildcard(String ambit) { if (ambit != null && (ambit.startsWith("%") || ambit.startsWith("*") || ambit.endsWith("%") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ || ambit.endsWith("*"))) //$NON-NLS-1$ { ambit = ambit.replace('%', ' '); ambit = ambit.replace('*', ' '); } if (ambit != null) ambit = ambit.trim(); return ambit; } /** * @param allAuthorizations * @param ambit * @return */ private List<AutoritzacioSEU> findCodiAuthorizations(Collection<AutoritzacioSEU> allAuthorizations, String codi) { List<AutoritzacioSEU> list = new LinkedList<AutoritzacioSEU>(); if (codi != null) { for (AutoritzacioSEU auto : allAuthorizations) { String autoCodi = auto.getCodi(); if (autoCodi != null && autoCodi.contains(codi)) { list.add(auto); } } } return list; } /** * @param allAuthorizations * @param ambit * @return */ private List<AutoritzacioSEU> findDescripcioAuthorizations(Collection<AutoritzacioSEU> allAuthorizations, String descripcio) { List<AutoritzacioSEU> list = new LinkedList<AutoritzacioSEU>(); if (descripcio != null) { for (AutoritzacioSEU auto : allAuthorizations) { String autoDesc = auto.getDescripcio(); if (autoDesc != null && autoDesc.contains(descripcio)) { list.add(auto); } } } return list; } /** * @param allAuthorizations * @param ambit * @return */ private List<AutoritzacioSEU> findAmbitAuthorizations(Collection<AutoritzacioSEU> allAuthorizations, String ambit) { List<AutoritzacioSEU> list = new LinkedList<AutoritzacioSEU>(); if (ambit != null) { for (AutoritzacioSEU auto : allAuthorizations) { String autoAmbit = auto.getAmbit(); if (autoAmbit.equals(ambit)) { list.add(auto); } } } return list; } private List<AutoritzacioSEU> compareLists(List<AutoritzacioSEU> first, List<AutoritzacioSEU> second) { List<AutoritzacioSEU> endList = new LinkedList<AutoritzacioSEU>(); if (first != null && second != null && !first.isEmpty() && !second.isEmpty()) { for (AutoritzacioSEU auto : first) { if (second.contains(auto)) { endList.add(auto); } } return endList; } else if ((first == null || first.isEmpty()) && second != null) return second; else return first; } /* (non-Javadoc) * @see es.caib.seycon.ng.servei.AutoritzacioServiceBase#handleGetScopeList() */ @Override protected List<String> handleGetScopeList() throws Exception { Set<String> set = new HashSet<String>(); Collection<AutoritzacioSEU> allAuthorizations = getAuthorizations().values(); for (AutoritzacioSEU auto : allAuthorizations) { set.add(auto.getAmbit()); } List<String> list = new LinkedList<String>(); for (String ambit : set) { list.add(ambit); } Collections.sort(list); list.add(0, " "); //$NON-NLS-1$ return list; } } class AutoritzacioCache { private Collection<AutoritzacioRol> autoritzacions; Date expirationDate; public AutoritzacioCache(Collection<AutoritzacioRol> autoritzacions) { expirationDate = new Date(System.currentTimeMillis() + 600000); // 10 mins cache this.autoritzacions = autoritzacions; } public boolean isValid() { return expirationDate.after(new Date()); } public Collection<AutoritzacioRol> getAutoritzacions() { return autoritzacions; } public void setAutoritzacions(Collection<AutoritzacioRol> autoritzacions) { this.autoritzacions = autoritzacions; } }