eu.scape_project.planning.policies.OrganisationalPolicies.java Source code

Java tutorial

Introduction

Here is the source code for eu.scape_project.planning.policies.OrganisationalPolicies.java

Source

/*******************************************************************************
 * Copyright 2006 - 2012 Vienna University of Technology,
 * Department of Software Technology and Interactive Systems, IFS
 * 
 * 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 eu.scape_project.planning.policies;

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.io.Serializable;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateful;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;

import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.query.Syntax;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.util.FileManager;

import eu.scape_project.planning.manager.CriteriaManager;
import eu.scape_project.planning.model.RDFPolicy;
import eu.scape_project.planning.model.User;
import eu.scape_project.planning.model.UserGroup;
import eu.scape_project.planning.model.measurement.Measure;
import eu.scape_project.planning.model.policy.ControlPolicy;
import eu.scape_project.planning.model.policy.PreservationCase;

@Stateful
@SessionScoped
public class OrganisationalPolicies implements Serializable {
    private static final long serialVersionUID = 1811189638942547758L;

    @Inject
    private Logger log;

    @Inject
    private EntityManager em;

    @Inject
    private CriteriaManager criteriaManager;

    @Inject
    private User user;

    private String organisation;

    private List<PreservationCase> preservationCases = new ArrayList<PreservationCase>();

    public List<PreservationCase> getPreservationCases() {
        return preservationCases;
    }

    public void setPreservationCases(List<PreservationCase> preservationCases) {
        this.preservationCases = preservationCases;
    }

    public void init() {
        preservationCases.clear();
        RDFPolicy policy = user.getUserGroup().getLatestPolicy();

        if (policy == null) {
            return;
        }

        try {
            resolvePreservationCases(policy.getPolicy());
        } catch (Exception e) {
            log.error("Failed to load policy preservationCases.", e);
        }
    }

    /**
     * Imports a new policy to the users group.
     * 
     * @param input
     *            the policy
     * @throws IOException
     *             if the polify could not be read
     */
    public boolean importPolicy(InputStream input) {
        try {
            String content = IOUtils.toString(input, "UTF-8");
            input.close();

            resolvePreservationCases(content);
            user.getUserGroup().getPolicies().add(new RDFPolicy(content));
            log.info("Imported new policies for user " + user.getUsername());
            return true;
        } catch (Exception e) {
            log.error("Failed to import policies for user " + user.getUsername(), e);
        }
        return false;
    }

    private void resolvePreservationCases(String rdfPolicies) throws Exception {
        preservationCases.clear();
        Model model = ModelFactory.createMemModelMaker().createDefaultModel();
        Reader reader = new StringReader(rdfPolicies);
        model = model.read(reader, null);
        reader.close();

        // String cpModelFile = POLICY_ONTOLOGY_DIR + File.separator +
        // CONTROL_POLICY_FILE;
        Model cpModel = FileManager.get().loadModel("data/vocabulary/control-policy.rdf");
        cpModel.add(FileManager.get().loadModel("data/vocabulary/control-policy_modalities.rdf"));
        cpModel.add(FileManager.get().loadModel("data/vocabulary/control-policy_qualifiers.rdf"));

        model = model.add(cpModel);

        // query organisation from rdf
        String statement = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> "
                + "PREFIX org: <http://www.w3.org/ns/org#> " + "PREFIX owl: <http://www.w3.org/2002/07/owl#> "
                + "SELECT ?organisation WHERE { " + "?org rdf:type owl:NamedIndividual ."
                + "?org org:identifier ?organisation } ";

        Query orgQuery = QueryFactory.create(statement, Syntax.syntaxARQ);
        QueryExecution orgQe = QueryExecutionFactory.create(orgQuery, model);
        ResultSet orgResults = orgQe.execSelect();

        try {
            if ((orgResults != null) && (orgResults.hasNext())) {
                QuerySolution orgQs = orgResults.next();
                this.organisation = orgQs.getLiteral("organisation").toString();
            }
        } finally {
            orgQe.close();
        }

        // query all preservationCases
        statement = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> "
                + "PREFIX skos: <http://www.w3.org/2004/02/skos/core#> "
                + "PREFIX pc: <http://purl.org/DP/preservation-case#> "
                + "SELECT ?preservationcase ?name ?contentset WHERE { "
                + "?preservationcase rdf:type pc:PreservationCase . " + "?preservationcase skos:prefLabel ?name . "
                + "?preservationcase pc:hasContentSet ?contentset } ";

        Query pcQuery = QueryFactory.create(statement, Syntax.syntaxARQ);
        QueryExecution pcQe = QueryExecutionFactory.create(pcQuery, model);
        ResultSet pcResults = pcQe.execSelect();

        try {
            while ((pcResults != null) && (pcResults.hasNext())) {
                QuerySolution pcQs = pcResults.next();
                PreservationCase pc = new PreservationCase();
                pc.setName(pcQs.getLiteral("name").toString());
                pc.setUri(pcQs.getResource("preservationcase").getURI());
                pc.setContentSet(pcQs.getResource("contentset").getURI());
                preservationCases.add(pc);

                // determine user communities
                statement = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> "
                        + "PREFIX skos: <http://www.w3.org/2004/02/skos/core#> "
                        + "PREFIX pc: <http://purl.org/DP/preservation-case#> " + "SELECT ?usercommunity WHERE { "
                        + "<" + pc.getUri() + ">" + " pc:hasUserCommunity ?usercommunity } ";

                Query ucQuery = QueryFactory.create(statement, Syntax.syntaxARQ);

                QueryExecution ucQe = QueryExecutionFactory.create(ucQuery, model);
                ResultSet ucResults = ucQe.execSelect();

                try {
                    String ucs = "";
                    while ((ucResults != null) && ucResults.hasNext()) {
                        QuerySolution ucQs = ucResults.next();

                        ucs += "," + ucQs.getResource("usercommunity").getLocalName();
                    }
                    if (StringUtils.isNotEmpty(ucs)) {
                        pc.setUserCommunities(ucs.substring(1));
                    }
                } finally {
                    ucQe.close();
                }

                // query objectives
                statement = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> "
                        + "PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> "
                        + "PREFIX pc: <http://purl.org/DP/preservation-case#> "
                        + "PREFIX skos: <http://www.w3.org/2004/02/skos/core#> "
                        + "PREFIX cp: <http://purl.org/DP/control-policy#> "
                        + "SELECT ?objective ?objective_label ?objectiveType ?measure ?modality ?value ?qualifier WHERE { "
                        + "<" + pc.getUri() + ">" + " pc:hasObjective ?objective . "
                        + "?objective rdf:type ?objectiveType . " + "?objectiveType rdfs:subClassOf cp:Objective . "
                        + "?objective skos:prefLabel ?objective_label . " + "?objective cp:measure ?measure . "
                        + "?objective cp:value ?value . " + "OPTIONAL {?objective cp:qualifier ?qualifier} . "
                        + "OPTIONAL {?objective cp:modality ?modality} }";

                Query query = QueryFactory.create(statement, Syntax.syntaxARQ);
                QueryExecution qe = QueryExecutionFactory.create(query, model);
                ResultSet results = qe.execSelect();

                try {

                    while ((results != null) && (results.hasNext())) {
                        QuerySolution qs = results.next();
                        ControlPolicy cp = new ControlPolicy();

                        String controlPolicyUri = qs.getResource("objective").getURI();
                        String controlPolicyName = qs.getLiteral("objective_label").toString();
                        String measureUri = qs.getResource("measure").toString();
                        String modality = qs.getResource("modality").getLocalName();
                        String value = qs.getLiteral("value").getString();
                        Resource qualifier = qs.getResource("qualifier");

                        Measure m = criteriaManager.getMeasure(measureUri);

                        cp.setUri(controlPolicyUri);
                        cp.setName(controlPolicyName);
                        cp.setValue(value);
                        cp.setMeasure(m);

                        if (qualifier != null) {
                            cp.setQualifier(ControlPolicy.Qualifier.valueOf(qualifier.getLocalName()));
                        } else {
                            cp.setQualifier(ControlPolicy.Qualifier.EQ);
                        }
                        cp.setModality(ControlPolicy.Modality.valueOf(modality));

                        pc.getControlPolicies().add(cp);
                    }
                } finally {
                    qe.close();
                }
            }
        } finally {
            pcQe.close();
        }
    }

    public PreservationCase getPreservationCase(String preservationCaseUri) {
        if (!StringUtils.isEmpty(preservationCaseUri)) {
            for (PreservationCase s : preservationCases) {
                if (preservationCaseUri.equalsIgnoreCase(s.getUri())) {
                    return s;
                }
            }
        }
        return null;
    }

    /**
     * Clears the policies of the users group.
     */
    public void clearPolicies() {
        user.getUserGroup().getPolicies().clear();
        log.info("Cleared policies of user " + user.getUsername());
        init();
    }

    /**
     * Method responsible for saving the made changes.
     */
    public void save() {
        UserGroup group = user.getUserGroup();

        log.info("size=" + group.getPolicies().size());
        user.setUserGroup(em.merge(group));

        log.info("Policies saved for user " + user.getUsername());
    }

    /**
     * Method responsible for discarding the made changes.
     */
    public void discard() {
        UserGroup oldUserGroup = em.find(UserGroup.class, user.getUserGroup().getId());
        user.setUserGroup(oldUserGroup);

        log.info("Policies discarded for user " + user.getUsername());
    }

    public String getOrganisation() {
        return organisation;
    }
}