/*******************************************************************************
* 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;
}
}