package org.hadatac.entity.pojo;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QueryExecutionFactory;
import org.apache.jena.query.QueryFactory;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.query.ResultSetFactory;
import org.apache.jena.query.ResultSetRewindable;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.RDFNode;
import org.apache.jena.rdf.model.Statement;
import org.apache.jena.rdf.model.StmtIterator;
import org.apache.jena.riot.Lang;
import org.apache.jena.riot.RDFDataMgr;
import org.apache.jena.update.UpdateExecutionFactory;
import org.apache.jena.update.UpdateFactory;
import org.apache.jena.update.UpdateProcessor;
import org.apache.jena.update.UpdateRequest;
import org.hadatac.console.controllers.triplestore.UserManagement;
import org.hadatac.console.models.LinkedAccount;
import org.hadatac.console.models.SysUser;
import org.hadatac.utils.Collections;
import org.hadatac.utils.NameSpaces;
public class User implements Comparable<User> {
private String uri;
private String given_name;
private String family_name;
private String name;
private String email;
private String homepage;
private String comment;
private String org_uri;
private String immediateGroupUri;
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
public String getGivenName() {
return given_name;
}
public void setGivenName(String name) {
this.given_name = name;
}
public String getFamilyName() {
return family_name;
}
public void setFamilyName(String name) {
this.family_name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getHomepage() {
return homepage;
}
public void setHomepage(String homepage) {
this.homepage = homepage;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public String getImmediateGroupUri() {
return immediateGroupUri;
}
public void setImmediateGroupUri(String group_uri) {
this.immediateGroupUri = group_uri;
}
public String getOrgUri(){
return org_uri;
}
public void setOrgUri(String uri){
org_uri = uri;
}
public boolean isAdministrator() {
SysUser user = SysUser.findByEmail(getEmail());
if(null != user){
return user.isDataManager();
}
return false;
}
public boolean isValidated() {
SysUser user = SysUser.findByEmail(getEmail());
if(null != user) {
return user.isEmailValidated();
}
return false;
}
public void getGroupNames(List<String> accessLevels) {
if(getImmediateGroupUri() != null) {
User user = UserGroup.find(getImmediateGroupUri());
if(user != null){
System.out.println("Access Level: " + user.getUri());
accessLevels.add(user.getUri());
user.getGroupNames(accessLevels);
}
}
}
public void save() {
String insert = "";
insert += NameSpaces.getInstance().printSparqlNameSpaceList();
insert += "INSERT DATA { ";
insert += "<" + this.getUri() + "> a foaf:Person . \n";
insert += "<" + this.getUri() + "> ";
insert += " foaf:mbox " + "\"" + this.email + "\" . ";
insert += "<" + this.getUri() + "> ";
insert += " hadatac:isMemberOfGroup " + "\"Public\" . ";
insert += "} ";
System.out.println("!!!! INSERT USER QUERY\n" + insert);
UpdateRequest request = UpdateFactory.create(insert);
UpdateProcessor processor = UpdateExecutionFactory.createRemote(request,
Collections.getCollectionsName(Collections.PERMISSIONS_UPDATE));
processor.execute();
}
public static User create() {
User user = new User();
return user;
}
public static File outputAsTurtle() {
String queryString = "CONSTRUCT { ?s ?p ?o } WHERE { ?s ?p ?o } ";
Query query = QueryFactory.create(queryString);
QueryExecution qexec = QueryExecutionFactory.sparqlService(
Collections.getCollectionsName(Collections.PERMISSIONS_SPARQL), query);
Model model = qexec.execConstruct();
File ttl_file = new File(UserManagement.getTurtlePath());
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(ttl_file);
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
}
RDFDataMgr.write(outputStream, model, Lang.TURTLE);
return ttl_file;
}
public static List<String> getUserEmails() {
List<String> emails = new ArrayList<String>();
for (User user : find()) {
emails.add(user.getEmail());
}
return emails;
}
public static List<String> getUserURIs() {
List<String> listUri = new ArrayList<String>();
for (User user : find()) {
listUri.add(user.getUri());
}
return listUri;
}
public static List<User> find() {
List<User> users = new ArrayList<User>();
String queryString =
"PREFIX prov: <http://www.w3.org/ns/prov#> " +
"PREFIX foaf: <http://xmlns.com/foaf/0.1/> " +
"SELECT ?uri WHERE { " +
" ?uri a foaf:Person . " +
"} ";
Query query = QueryFactory.create(queryString);
QueryExecution qexec = QueryExecutionFactory.sparqlService(
Collections.getCollectionsName(Collections.PERMISSIONS_SPARQL), query);
ResultSet results = qexec.execSelect();
ResultSetRewindable resultsrw = ResultSetFactory.copyResults(results);
qexec.close();
while (resultsrw.hasNext()) {
QuerySolution soln = resultsrw.next();
User user = find(soln.getResource("uri").getURI());
if(null != user){
users.add(user);
}
}
java.util.Collections.sort((List<User>) users);
return users;
}
public static User find(String uri) {
User user = null;
boolean bHasEmail = false;
String queryString = "DESCRIBE <" + uri + ">";
Query query = QueryFactory.create(queryString);
Model modelPublic;
Model modelPrivate;
Statement statement;
RDFNode object;
QueryExecution qexecPrivate = QueryExecutionFactory.sparqlService(
Collections.getCollectionsName(Collections.PERMISSIONS_SPARQL), query);
modelPrivate = qexecPrivate.execDescribe();
if (!modelPrivate.isEmpty()) {
user = new User();
}
StmtIterator stmtIteratorPrivate = modelPrivate.listStatements();
while (stmtIteratorPrivate.hasNext()) {
statement = stmtIteratorPrivate.next();
if (!statement.getSubject().getURI().equals(uri)) {
continue;
}
object = statement.getObject();
if (statement.getPredicate().getURI().equals("http://www.w3.org/2000/01/rdf-schema#comment")) {
user.setComment(object.asLiteral().getString());
}
else if (statement.getPredicate().getURI().equals("http://hadatac.org/ont/hadatac#isMemberOfGroup")) {
if(object.toString().equals("Public") || object.toString().equals("")){
user.setImmediateGroupUri("Public");
}
else{
user.setImmediateGroupUri(object.asResource().toString());
}
}
else if (statement.getPredicate().getURI().equals("http://xmlns.com/foaf/0.1/givenName")) {
user.setGivenName(object.asLiteral().getString());
}
else if (statement.getPredicate().getURI().equals("http://xmlns.com/foaf/0.1/familyName")) {
user.setFamilyName(object.asLiteral().getString());
}
else if (statement.getPredicate().getURI().equals("http://xmlns.com/foaf/0.1/name")) {
user.setName(object.asLiteral().getString());
}
else if (statement.getPredicate().getURI().equals("http://xmlns.com/foaf/0.1/mbox")) {
user.setEmail(object.asLiteral().getString());
bHasEmail = true;
}
else if (statement.getPredicate().getURI().equals("http://xmlns.com/foaf/0.1/homepage")) {
String homepage = object.asLiteral().getString();
if(homepage.startsWith("<") && homepage.endsWith(">")){
homepage = homepage.replace("<", "");
homepage = homepage.replace(">", "");
}
user.setHomepage(homepage);
}
}
QueryExecution qexecPublic = QueryExecutionFactory.sparqlService(
Collections.getCollectionsName(Collections.METADATA_SPARQL), query);
modelPublic = qexecPublic.execDescribe();
if (!modelPublic.isEmpty() && user == null) {
user = new User();
}
StmtIterator stmtIteratorPublic = modelPublic.listStatements();
while (stmtIteratorPublic.hasNext()) {
statement = stmtIteratorPublic.next();
object = statement.getObject();
if (statement.getPredicate().getURI().equals("http://xmlns.com/foaf/0.1/name")) {
user.setName(object.asLiteral().getString());
} else if (statement.getPredicate().getURI().equals("http://xmlns.com/foaf/0.1/mbox")) {
user.setEmail(object.asLiteral().getString());
bHasEmail = true;
}
}
if(bHasEmail){
user.setUri(uri);
return user;
}
return null;
}
public static void changeAccessLevel(String uri, String group_uri) {
try {
uri = URLDecoder.decode(uri, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String command = "";
if(group_uri.equals("Public")){
command = "DELETE { <" + uri + "> <http://hadatac.org/ont/hadatac#isMemberOfGroup> \"" + group_uri + "\" . } \n"
+ "INSERT { <" + uri + "> <http://hadatac.org/ont/hadatac#isMemberOfGroup> \"" + group_uri + "\" . } \n "
+ "WHERE { } \n";
}
else{
command = "DELETE { <" + uri + "> <http://hadatac.org/ont/hadatac#isMemberOfGroup> <" + group_uri + "> . } \n"
+ "INSERT { <" + uri + "> <http://hadatac.org/ont/hadatac#isMemberOfGroup> <" + group_uri + "> . } \n "
+ "WHERE { } \n";
}
UpdateRequest req = UpdateFactory.create(command);
UpdateProcessor processor = UpdateExecutionFactory.createRemote(
req, Collections.getCollectionsName(Collections.PERMISSIONS_UPDATE));
processor.execute();
}
public static void deleteUser(String uri, boolean deleteAuth, boolean deleteMember) {
if (deleteMember) {
for(User user : UserGroup.findMembers(uri)){
changeAccessLevel(user.getUri(), User.find(uri).getImmediateGroupUri());
}
}
if (deleteAuth){
User user = User.find(uri);
if(null != user){
SysUser sys_user = SysUser.findByEmail(user.getEmail());
if(null != sys_user){
for (LinkedAccount acc : LinkedAccount.findByIdSolr(sys_user)) {
acc.delete();
}
sys_user.delete();
}
}
}
String queryString = "";
queryString += NameSpaces.getInstance().printSparqlNameSpaceList();
queryString += "DELETE WHERE { <" + uri + "> ?p ?o . } ";
UpdateRequest req = UpdateFactory.create(queryString);
UpdateProcessor processor = UpdateExecutionFactory.createRemote(
req, Collections.getCollectionsName(Collections.PERMISSIONS_UPDATE));
processor.execute();
}
@Override
public int compareTo(User another) {
return this.getUri().compareTo(another.getUri());
}
}