edu.cornell.mannlib.vitro.webapp.dao.jena.VClassGroupDaoJena.java Source code

Java tutorial

Introduction

Here is the source code for edu.cornell.mannlib.vitro.webapp.dao.jena.VClassGroupDaoJena.java

Source

/* $This file is distributed under the terms of the license in /doc/license.txt$ */

package edu.cornell.mannlib.vitro.webapp.dao.jena;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.ListIterator;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.hp.hpl.jena.datatypes.xsd.XSDDatatype;
import com.hp.hpl.jena.ontology.Individual;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntModelSpec;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.ResourceFactory;
import com.hp.hpl.jena.shared.Lock;
import com.hp.hpl.jena.util.iterator.ClosableIterator;

import edu.cornell.mannlib.vitro.webapp.beans.IndividualImpl;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup;
import edu.cornell.mannlib.vitro.webapp.dao.InsertException;
import edu.cornell.mannlib.vitro.webapp.dao.VClassDao;
import edu.cornell.mannlib.vitro.webapp.dao.VClassGroupDao;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;

public class VClassGroupDaoJena extends JenaBaseDao implements VClassGroupDao {

    private static final Log log = LogFactory.getLog(VClassGroupDao.class.getName());

    public VClassGroupDaoJena(WebappDaoFactoryJena wadf) {
        super(wadf);
    }

    @Override
    protected OntModel getOntModel() {
        return getOntModelSelector().getApplicationMetadataModel();
    }

    public void deleteVClassGroup(VClassGroup vcg) {
        deleteVClassGroup(vcg, getOntModel());
    }

    public void deleteVClassGroup(VClassGroup vcg, OntModel ontModel) {
        ontModel.enterCriticalSection(Lock.WRITE);
        try {
            Individual groupInd = ontModel.getIndividual(vcg.getURI());
            if (groupInd != null) {
                groupInd.remove();
            }
        } finally {
            ontModel.leaveCriticalSection();
        }
        OntModel tboxModel = getOntModelSelector().getTBoxModel();
        tboxModel.enterCriticalSection(Lock.WRITE);
        try {
            Resource groupRes = ResourceFactory.createResource(vcg.getURI());
            tboxModel.removeAll(groupRes, null, null);
            tboxModel.removeAll(null, null, groupRes);
        } finally {
            tboxModel.leaveCriticalSection();
        }
    }

    public LinkedHashMap<String, VClassGroup> getClassGroupMap() {
        getOntModel().enterCriticalSection(Lock.READ);
        try {
            LinkedHashMap<String, VClassGroup> map = new LinkedHashMap<String, VClassGroup>();
            List<VClassGroup> groups = new ArrayList<VClassGroup>();
            ClosableIterator<Individual> groupIt = getOntModel().listIndividuals(CLASSGROUP);
            try {
                while (groupIt.hasNext()) {
                    Individual groupInd = groupIt.next();
                    VClassGroup group = groupFromGroupIndividual(groupInd);
                    if (group != null) {
                        groups.add(group);
                    }
                }
            } finally {
                groupIt.close();
            }
            Collections.sort(groups);
            Iterator<VClassGroup> groupsIt = groups.iterator();
            while (groupsIt.hasNext()) {
                VClassGroup group = groupsIt.next();
                map.put(group.getPublicName(), group);
            }
            return map;
        } finally {
            getOntModel().leaveCriticalSection();
        }
    }

    public VClassGroup getGroupByURI(String uri) {
        if (uri == null) {
            return null;
        }
        getOntModel().enterCriticalSection(Lock.READ);
        try {
            Individual group = getOntModel().getIndividual(uri);
            return groupFromGroupIndividual(group);
        } catch (IllegalArgumentException ex) {
            return null;
        } finally {
            getOntModel().leaveCriticalSection();
        }
    }

    public List<VClassGroup> getPublicGroupsWithVClasses() {
        return getPublicGroupsWithVClasses(false);
    }

    public List<VClassGroup> getPublicGroupsWithVClasses(boolean displayOrder) {
        return getPublicGroupsWithVClasses(displayOrder, true);
    }

    public List<VClassGroup> getPublicGroupsWithVClasses(boolean displayOrder,
            boolean includeUninstantiatedClasses) {
        return getPublicGroupsWithVClasses(displayOrder, includeUninstantiatedClasses, false);
    }

    public List<VClassGroup> getPublicGroupsWithVClasses(boolean displayOrder, boolean includeUninstantiatedClasses,
            boolean getIndividualCount) {
        VClassDao classDao = getWebappDaoFactory().getVClassDao();
        List<VClassGroup> groups = new ArrayList<VClassGroup>();
        getOntModel().enterCriticalSection(Lock.READ);
        try {
            ClosableIterator<Individual> groupIt = getOntModel().listIndividuals(CLASSGROUP);
            try {
                while (groupIt.hasNext()) {
                    Individual grp = groupIt.next();
                    VClassGroup vgrp = groupFromGroupIndividual(grp);
                    if (vgrp != null) {
                        groups.add(vgrp);
                    }
                }
                java.util.Collections.sort(groups);
            } finally {
                groupIt.close();
            }
        } finally {
            getOntModel().leaveCriticalSection();
        }
        for (VClassGroup vgrp : groups) {
            classDao.addVClassesToGroup(vgrp, includeUninstantiatedClasses, getIndividualCount);
        }
        if (groups.size() > 0) {
            return groups;
        } else {
            /* bdc34: the effect of the following code is that 
             * classgroups will get empty vclasses added to them
             * when includeUninstantiatedClasses == false and all
             * the vclasses are empty.
             * This may not be the desired behavior. 
             */
            classDao.addVClassesToGroups(groups);
            return groups;
        }
    }

    public VClassGroup groupFromGroupIndividual(Individual groupInd) {
        if (groupInd == null) {
            return null;
        }
        VClassGroup group = new VClassGroup();
        group.setPublicName(groupInd.getLabel(null));
        group.setURI(groupInd.getURI());
        group.setNamespace(groupInd.getNameSpace());
        group.setLocalName(groupInd.getLocalName());
        group.setDisplayRank(getPropertyNonNegativeIntValue(groupInd, DISPLAY_RANK));
        return group;
    }

    public int insertNewVClassGroup(VClassGroup vcg) {
        insertNewVClassGroup(vcg, getOntModelSelector().getApplicationMetadataModel());
        return 0;
    }

    public int insertNewVClassGroup(VClassGroup vcg, OntModel ontModel) {

        // VitroClassGroups should really inherit from Individual objects now,
        // but they don't (yet).
        // I'm going to make an Individual so I can avoid duplicating URI code.

        edu.cornell.mannlib.vitro.webapp.beans.Individual groupInd = new IndividualImpl(); // We should make a factory for these
        groupInd.setURI(vcg.getURI());
        groupInd.setNamespace(DEFAULT_NAMESPACE + "vitroClassGroup");
        groupInd.setName(vcg.getPublicName());
        groupInd.setVClassURI(CLASSGROUP.getURI());

        String groupURI = null;

        OntModel unionForURIGeneration = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM,
                ModelFactory.createUnion(getOntModelSelector().getApplicationMetadataModel(),
                        getOntModelSelector().getFullModel()));

        WebappDaoFactory wadfForURIGeneration = null;
        try {
            wadfForURIGeneration = new WebappDaoFactoryJena(unionForURIGeneration);
            groupURI = wadfForURIGeneration.getIndividualDao().insertNewIndividual(groupInd);
        } catch (InsertException ie) {
            throw new RuntimeException(InsertException.class.getName() + "Unable to insert class group " + groupURI,
                    ie);
        } finally {
            wadfForURIGeneration.close();
        }

        if (groupURI != null) {
            ontModel.enterCriticalSection(Lock.WRITE);
            try {
                Individual groupJenaInd = ontModel.getIndividual(groupURI);
                try {
                    groupJenaInd.addProperty(DISPLAY_RANK, Integer.toString(vcg.getDisplayRank()),
                            XSDDatatype.XSDint);
                } catch (Exception e) {
                    log.error("error setting displayRank for " + groupInd.getURI());
                }
            } finally {
                ontModel.leaveCriticalSection();
            }
            return 0;
        } else {
            log.error("Unable to insert class group " + vcg.getPublicName());
            return 1;
        }

    }

    public int removeUnpopulatedGroups(List<VClassGroup> groups) {
        if (groups == null || groups.size() == 0)
            return 0;
        int removedGroupsCount = 0;
        ListIterator<VClassGroup> it = groups.listIterator();
        while (it.hasNext()) {
            VClassGroup group = it.next();
            List<VClass> classes = group.getVitroClassList();
            if (classes == null || classes.size() < 1) {
                removedGroupsCount++;
                it.remove();
            }
        }
        return removedGroupsCount;
    }

    public void sortGroupList(List<VClassGroup> groupList) {
        Collections.sort(groupList, new Comparator<VClassGroup>() {
            public int compare(VClassGroup first, VClassGroup second) {
                if (first != null) {
                    if (second != null) {
                        return (first.getDisplayRank() - second.getDisplayRank());
                    } else {
                        log.error("error--2nd VClassGroup is null in VClassGroupDao.getGroupList().compare()");
                    }
                } else {
                    log.error("error--1st VClassGroup is null in VClassGroupDao.getGroupList().compare()");
                }
                return 0;
            }
        });
    }

    public void updateVClassGroup(VClassGroup vcg) {
        updateVClassGroup(vcg, getOntModelSelector().getApplicationMetadataModel());
    }

    public void updateVClassGroup(VClassGroup vcg, OntModel ontModel) {
        ontModel.enterCriticalSection(Lock.WRITE);
        try {
            Individual groupInd = ontModel.getIndividual(vcg.getURI());
            try {
                groupInd.setLabel(vcg.getPublicName(), getDefaultLanguage());
            } catch (Exception e) {
                log.error("error updating name for " + groupInd.getURI());
            }
            try {
                groupInd.removeAll(DISPLAY_RANK);
                groupInd.addProperty(DISPLAY_RANK, Integer.toString(vcg.getDisplayRank()), XSDDatatype.XSDint);
            } catch (Exception e) {
                log.error("error updating display rank for " + groupInd.getURI());
            }
        } finally {
            ontModel.leaveCriticalSection();
        }
    }

    @Override
    public VClassGroup getGroupByName(String vcgName) {
        if (vcgName == null)
            return null;
        else {
            return getClassGroupMap().get(vcgName);
        }
    }

}