:- module(user_process, [ current_user_process/1, % -ProcessURI user_process_creator/2, % +ProcessURI, ?User user_process_joined/2, % +ProcessURI, ?User set_active_process/1, % +ProcessURI create_user_process/3, % +User, +Properties, -ProcessURI start_user_process/1, % ?ProcessURI join_user_process/2, % +ProcessURI end_user_process/1, % +ProcessURI add_resource_properties/2, % +URI, +Properties:list(p=v) resource_properties/2 % +URI, ?Properties:list(p=v) ]). :- use_module(library(http/http_session)). :- use_module(library(semweb/rdf_db)). :- use_module(library(semweb/rdfs)). :- use_module(user(user_db)). /** Creation of processes in which annotations are made/modified This module deals with the creation of processes for annotation sessions. A process is modelled using the Open Provenance Model (OPM) http://openprovenance.org/. @author Michiel Hildebrand */ :- rdf_meta create_user_process(r, t, r). %% current_user_process(-Process) % % Process is the current annotation session User is involved % in. current_user_process(Process) :- http_session_data(process(Process)), \+ rdf(Process, opmv:wasEndedAt, _). %% user_process_creator(+Process, ?User) % % True if User started Process % user_process_creator(Process, User) :- rdf(Process, opmv:wasControlledBy, User). %% user_process_joined(+Process, ?User) % % True if User joined a Process user_process_joined(Process, User) :- rdf_has(Process, opmv:wasControlledBy, User). %% set_active_process(+Process) % % Store current Process as the active proces in current http % session. set_active_process(Process) :- http_session_retractall(process(_)), http_session_assert(process(Process)). %% create_user_process(+Properties, ?Process) % % True if Process is the current process of User and has % Properties. Creates a new user process if it doesn't exist. create_user_process(_User, Properties, Process) :- current_user_process(Process), \+ rdf(Process, opmv:wasStartedAt, _), resource_properties(Process, Properties), !, set_active_process(Process). create_user_process(User, Properties, Process) :- ( var(Process) -> rdf_bnode(Process) ; true ), set_active_process(Process), http_session_id(Session), rdf_transaction((rdf_assert(Process, rdf:type, opmv:'Process', Process), rdf_assert(Process, opmv:wasControlledBy, User, Process), rdf_assert(Process, pprime:session, Session, Process), add_resource_properties_(Properties, Process) )), debug(user_process, 'Process ~w created by ~w', [Process, User]). %% start_user_process(+Process) % % Start a process by assert the start time. start_user_process(Process) :- rdfs_individual_of(Process, opmv:'Process'), get_time(StartTime0), format_iso_dateTime(StartTime0, StartTime), ( rdf(Process, opmv:wasStartedAt, literal(type(xsd:date, OldTime))) -> debug(user_process, 'Process ~w was already start at ~w', [Process, OldTime]) ; rdf_transaction(rdf_assert(Process, opmv:wasStartedAt, literal(type(xsd:date, StartTime)), Process)), debug(user_process, 'Process ~w started at ~w', [Process, StartTime]) ). %% end_user_process(+Process) % % End a process, by asserting the endTime end_user_process(Process) :- rdfs_individual_of(Process, opmv:'Process'), ( rdf(Process, opmv:wasEndedAt, literal(type(xsd:date, OldTime))) -> debug(user_process, 'Process ~w was already ended at ~w', [Process, OldTime]) ; get_time(EndTime0), format_iso_dateTime(EndTime0, EndTime), rdf_transaction(rdf_assert(Process, opmv:wasEndedAt, literal(type(xsd:date, EndTime)), Process)), debug(user_process, 'Process ~w ended at ~w', [Process, EndTime]) ). %% join_user_process(+Process, +User) % % Add current user agent to a Process. join_user_process(Process, User) :- rdfs_individual_of(Process, opmv:'Process'), set_active_process(Process), rdf_transaction(rdf_assert(Process, opmv:wasPerformedBy, User, Process)), debug(user_process, 'Process ~w joined by ~w', [Process, User]). /******************************* * handy RDF resource stuff * *******************************/ %% add_resource_properties(+URI, +Properties:list(p=v)) % % Assert properties about a URI. add_resource_properties(URI, Ps) :- rdf_transaction(add_resource_properties_(Ps, URI)). add_resource_properties_([], _). add_resource_properties_([P=V|Ps], URI) :- ( rdf(URI, P, V) -> true ; rdf_assert(URI, P, V, URI) ), add_resource_properties_(Ps, URI). %% resource_properties(+Resource, +Properties:list(p=v)) % % True if URI has all Properties. resource_properties(URI, Ps) :- resource_properties_(Ps, URI). resource_properties_([], _). resource_properties_([P=V|Ps], URI) :- rdf_has(URI, P, V), resource_properties_(Ps, URI). /******************************* * misc * *******************************/ %% format_iso_date(+TimeStamp, -ISODate) % % Format timestamp in ISO. format_iso_dateTime(TS, Formatted) :- format_time(atom(Formatted), '%Y-%m-%dT%T', TS). %% current_user_url(-UserURL) % % True if UserURL is URL of user in this session. current_user_url(User) :- http_session_id(SessionID), user_property(User0, session(SessionID)), user_property(User0, url(User)).