org.glite.security.voms.admin.persistence.dao.VOMSAttributeDAO.java Source code

Java tutorial

Introduction

Here is the source code for org.glite.security.voms.admin.persistence.dao.VOMSAttributeDAO.java

Source

/**
 * Copyright (c) Istituto Nazionale di Fisica Nucleare (INFN). 2006-2016
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.glite.security.voms.admin.persistence.dao;

import java.util.Iterator;
import java.util.List;

import org.glite.security.voms.admin.persistence.HibernateFactory;
import org.glite.security.voms.admin.persistence.error.AlreadyExistsException;
import org.glite.security.voms.admin.persistence.error.NoSuchAttributeException;
import org.glite.security.voms.admin.persistence.model.VOMSUser;
import org.glite.security.voms.admin.persistence.model.attribute.VOMSAttributeDescription;
import org.hibernate.Query;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class VOMSAttributeDAO {

    public static final Logger log = LoggerFactory.getLogger(VOMSAttributeDAO.class);

    protected VOMSAttributeDAO() {

        HibernateFactory.beginTransaction();
    }

    public static VOMSAttributeDAO instance() {

        return new VOMSAttributeDAO();
    }

    public List getAllAttributeDescriptions() {

        String query = "from VOMSAttributeDescription order by name";
        return HibernateFactory.getSession().createQuery(query).list();
    }

    public VOMSAttributeDescription createAttributeDescription(String name, String desc, boolean unique) {

        VOMSAttributeDescription attrDesc = getAttributeDescriptionByName(name);
        if (attrDesc != null)
            throw new AlreadyExistsException("Attribute \"" + name + "\" already defined in database.");

        attrDesc = new VOMSAttributeDescription(name, desc, unique);
        HibernateFactory.getSession().save(attrDesc);
        return attrDesc;
    }

    public VOMSAttributeDescription createAttributeDescription(String name, String desc) {

        return createAttributeDescription(name, desc, false);

    }

    public VOMSAttributeDescription deleteAttributeDescription(String name) {

        VOMSAttributeDescription attrDesc = getAttributeDescriptionByName(name);

        if (attrDesc == null)
            throw new NoSuchAttributeException("Attribute \"" + name + "\" not found in database.");

        String attributeValueEntities[] = new String[] { "VOMSUserAttribute", "VOMSGroupAttribute",
                "VOMSRoleAttribute" };

        // Delete attribute value mappings!
        for (int i = 0; i < attributeValueEntities.length; i++) {
            String query = "delete from " + attributeValueEntities[i] + " where attributeDescription = :desc";
            HibernateFactory.getSession().createQuery(query).setEntity("desc", attrDesc).executeUpdate();

        }

        HibernateFactory.getSession().delete(attrDesc);

        return attrDesc;

    }

    public VOMSAttributeDescription getAttributeDescriptionByName(String name) {

        String query = "from VOMSAttributeDescription where name = :name";

        VOMSAttributeDescription retVal = (VOMSAttributeDescription) HibernateFactory.getSession()
                .createQuery(query).setString("name", name).uniqueResult();

        return retVal;

    }

    public List getUserAttributes() {

        String query = "select a.attributeDescription.name, u, a.value from VOMSUser u join u.attributes a";

        return HibernateFactory.getSession().createQuery(query).list();
    }

    public List getGroupAttributes() {

        String query = "select a.attributeDescription.name, g, a.value from VOMSGroup g join g.attributes a";

        return HibernateFactory.getSession().createQuery(query).list();
    }

    public List getRoleAttributes() {

        String query = "select a.attributeDescription.name, r, a.value from VOMSRole r join r.attributes a";

        return HibernateFactory.getSession().createQuery(query).list();
    }

    public List getUserAttributes(String attributeName) {

        VOMSAttributeDescription desc = getAttributeDescriptionByName(attributeName);

        if (desc == null)
            throw new NoSuchAttributeException("Attribute '" + attributeName + "' not found in database!");

        return getUserAttributes(desc);

    }

    public List getGroupAttributes(String attributeName) {

        VOMSAttributeDescription desc = getAttributeDescriptionByName(attributeName);

        if (desc == null)
            throw new NoSuchAttributeException("Attribute '" + attributeName + "' not found in database!");

        return getGroupAttributes(desc);

    }

    public List getRoleAttributes(String attributeName) {

        VOMSAttributeDescription desc = getAttributeDescriptionByName(attributeName);

        if (desc == null)
            throw new NoSuchAttributeException("Attribute '" + attributeName + "' not found in database!");

        return getRoleAttributes(desc);

    }

    public List getGroupAttributes(VOMSAttributeDescription desc) {

        String query = "select g, a.value from VOMSGroup g join g.attributes a"
                + " where a.attributeDescription = :desc";

        return HibernateFactory.getSession().createQuery(query).setEntity("desc", desc).list();
    }

    public List getRoleAttributes(VOMSAttributeDescription desc) {

        String query = "select r, a.group, a.value from VOMSRole r join r.attributes a"
                + " where a.attributeDescription = :desc";

        return HibernateFactory.getSession().createQuery(query).setEntity("desc", desc).list();
    }

    public List getUserAttributes(VOMSAttributeDescription desc) {

        String query = "select u, a.value from VOMSUser u join u.attributes a"
                + " where a.attributeDescription = :desc";

        return HibernateFactory.getSession().createQuery(query).setEntity("desc", desc).list();
    }

    public SearchResults getAllUserAttributes(int firstResult, int maxResults) {

        SearchResults results = SearchResults.instance();

        String queryString = "select a.attributeDescription.name, u, a.value from VOMSUser u join u.attributes a "
                + "order by a.attributeDescription.name,u.dn";
        Query q = HibernateFactory.getSession().createQuery(queryString);

        q.setFirstResult(firstResult);
        q.setMaxResults(maxResults);

        results.setFirstResult(firstResult);
        results.setResultsPerPage(maxResults);
        results.setCount(countUserAttributes());
        results.setResults(q.list());

        return results;
    }

    public int countUserAttributes() {

        String queryString = "select count(*) from VOMSUser u join u.attributes a";

        Long count = (Long) HibernateFactory.getSession().createQuery(queryString).uniqueResult();

        return count.intValue();

    }

    public int countUserAttributesMatches(String searchString) {

        String queryString = "select count(*) from VOMSUser u join u.attributes a "
                + "where (a.attributeDescription.name like :searchString) or (u.dn like :searchString) or (u.ca.subjectString like :searchString) or "
                + "(a.value like :searchString)";

        String sString = "%" + searchString + "%";
        Query q = HibernateFactory.getSession().createQuery(queryString).setString("searchString", sString);

        Long count = (Long) q.uniqueResult();
        return count.intValue();

    }

    public SearchResults searchUserAttributes(String searchString, int firstResult, int maxResults) {

        if (searchString == null || searchString.equals("") || searchString.length() == 0)
            return getAllUserAttributes(firstResult, maxResults);

        SearchResults results = SearchResults.instance();
        String sString = "%" + searchString + "%";
        String queryString = "select a.attributeDescription.name, u, a.value from VOMSUser u join u.certificates c "
                + " join u.attributes a "
                + "where (a.attributeDescription.name like :searchString) or (c.subjectString like :searchString) or (c.ca.subjectString like :searchString) or "
                + "(a.value like :searchString) order by a.attributeDescription.name,c.subjectString";

        Query q = HibernateFactory.getSession().createQuery(queryString);

        q.setString("searchString", sString);
        q.setFirstResult(firstResult);
        q.setMaxResults(maxResults);

        results.setCount(countUserAttributesMatches(searchString));
        results.setFirstResult(firstResult);
        results.setResultsPerPage(maxResults);
        results.setSearchString(searchString);
        results.setResults(q.list());

        return results;

    }

    public boolean isAttributeValueAlreadyAssigned(VOMSUser u, String attributeName, String attributeValue) {

        return isAttributeValueAlreadyAssigned(u, getAttributeDescriptionByName(attributeName), attributeValue);
    }

    public boolean isAttributeValueAlreadyAssigned(VOMSUser u, VOMSAttributeDescription desc, String attrValue) {

        if (!desc.isUnique())
            return false;

        String queryString = "select a.value from VOMSUser u join u.attributes a where a.attributeDescription = :desc "
                + "and u != :user";

        Query q = HibernateFactory.getSession().createQuery(queryString);

        q.setEntity("desc", desc);
        q.setEntity("user", u);

        // Need to perform the check in memory since oracle has a bug (or I did
        // not understand how to manage clob equality tests).
        Iterator i = q.iterate();
        while (i.hasNext()) {
            String value = (String) i.next();

            // NULL attribute value can be assigned to multiple users, two NULLs
            // aren't equal as attribute values
            if (value == null)
                return false;

            if (value.equals(attrValue))
                return true;
        }

        return false;
    }

    public List<VOMSUser> findUsersWithAttribute(String attributeName) {

        String query = "select u from VOMSUser u join u.attributes a"
                + " where a.attributeDescription.name = :attributeName " + "and a.value is not null";

        Query q = HibernateFactory.getSession().createQuery(query);
        q.setString("attributeName", attributeName);

        return q.list();
    }

    public List<VOMSUser> findUsersWithAttributeValue(String attributeName, String attributeValue) {

        String query = "select u from VOMSUser u join u.attributes a"
                + " where a.attributeDescription.name = :attributeName " + "and a.value = :attributeValue";

        Query q = HibernateFactory.getSession().createQuery(query);
        q.setString("attributeName", attributeName);
        q.setString("attributeValue", attributeValue);

        return q.list();

    }

    public void update(VOMSAttributeDescription desc) {

        HibernateFactory.getSession().update(desc);
    }

}