PageRenderTime 55ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 1ms

/s3db3.5.10/rdf.php

https://code.google.com/p/s3db/
PHP | 926 lines | 604 code | 218 blank | 104 comment | 105 complexity | de9d87a3843f6b07114eefad5611055f MD5 | raw file
  1. <?php
  2. #rdfproject.php parses a project in s3db into n3.
  3. #reads database info from the session or from key
  4. ini_set('display_errors',0);
  5. if($_REQUEST['su3d'])
  6. ini_set('display_errors',1);
  7. if($_SERVER['HTTP_X_FORWARDED_HOST']!='')
  8. $def = $_SERVER['HTTP_X_FORWARDED_HOST'];
  9. else
  10. $def = $_SERVER['HTTP_HOST'];
  11. if(file_exists('config.inc.php'))
  12. {
  13. include('config.inc.php');
  14. }
  15. else
  16. {
  17. Header('Location: http://'.$def.'/s3db/');
  18. exit;
  19. }
  20. $a = set_time_limit(0);
  21. #ini_set('max_execution_time','30');
  22. ini_set('upload_max_filesize', '128M');
  23. ini_set('post_max_size', '256M');
  24. ini_set('display_errors',0);
  25. ini_set('memory_limit','3000M');
  26. $key = $_GET['key'];
  27. if($key=='') $key = $s3ql['key'];
  28. if($key=='') $key=$argv[1];
  29. $file=$_REQUEST['file'];
  30. if($file=='') $file=$argv[3];
  31. if($id=='') $id = $argv[4];
  32. if($argv!=''){
  33. #whn the script is called via CLI, we need a direc way to accept the inputs. The syntax will be the saem (attr-value pairs)
  34. $inputsOrder = array('key','file','outputOption','uid');
  35. for ($i=1; $i <count($argv) ; $i++) {
  36. list($keyWord, $val) = explode('=',$argv[$i]);
  37. $inputs[$keyWord] = $val;
  38. }
  39. #$inputs['key'] = $argv[1];
  40. #$inputs['file'] = $argv[2];
  41. }
  42. else {
  43. $inputs = $_REQUEST;
  44. }
  45. #$inputs = ($argv!='')?$argv:$_REQUEST;
  46. $key=$inputs['key'];
  47. include_once('core.header.php');
  48. include('dbstruct.php');
  49. $FinalFfilename = ($inputs['file']!='')?$inputs['file']:$GLOBALS['s3db_info']['server']['db']['uploads_folder'].$GLOBALS['s3db_info']['server']['db']['uploads_file'].'/project'.$project_id.'_requested_'.$user_id.'_'.date('m.d.y-His').'.n3';
  50. #echo $FinalFfilename;exit;
  51. #####
  52. #create a file and start writting to it
  53. $fid = fopen($FinalFfilename, 'a+');
  54. #echo '<pre>';print_r($inputs);echo $user_id;exit;
  55. #echo $fid;exit;
  56. if($user_id!='')
  57. {
  58. #$project_id = $_REQUEST['project_id'];
  59. #$url = ($def=='')?$GLOBALS['s3db_info']['deployment']['url']:S3DB_URI_BASE;
  60. $url = S3DB_URI_BASE;
  61. #start building the string, prefix will be the very fisrt thing shouwing up
  62. $n3 .= sprintf('%s', '@prefix dc: <http://purl.org/dc/elements/1.1/> .'.chr(10));
  63. $n3 .= sprintf('%s', '@prefix dcterms: <http://purl.org/dc/terms/> .'.chr(10));
  64. $n3 .= sprintf('%s', '@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .'.chr(10));
  65. $n3 .= sprintf('%s', '@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .'.chr(10));
  66. $n3 .= sprintf('%s', '@prefix owl: <http://www.w3.org/2002/07/owl#> .'.chr(10));
  67. $n3 .= sprintf('%s', '@prefix s3db: <http://www.s3db.org/core#> .'.chr(10));
  68. $n3 .= sprintf('%s', '@prefix s3dbpc: <http://www.s3db.org/permission_codes#> .'.chr(10));
  69. $n3 .= sprintf('%s', '@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .'.chr(10));
  70. $n3 .= sprintf('%s', '@prefix foaf: <http://xmlns.com/foaf/0.1/> .'.chr(10));
  71. $n3 .= sprintf('%s', '@prefix did: <'.$GLOBALS['s3db_info']['deployment']['mothership'].$GLOBALS['Did'].'/> .'.chr(10).chr(10));
  72. $n3 .= sprintf('%s', '@prefix : <'.$url.((substr($url,strlen($url)-1,1)=='/')?'':'/').'> .'.chr(10).chr(10));
  73. $N3coreNames = array('deployment'=>'s3db:s3dbDeployment','project'=>'s3db:s3dbProject', 'collection'=>'s3db:s3dbCollection', 'rule'=>'s3db:s3dbRule', 'item'=>'s3db:s3dbItem', 'statement'=>'s3db:s3dbStatement', 'user'=>'s3db:s3dbUser', 'group'=>'s3db:s3dbGroup');
  74. if(!$inputs['nocore']) {
  75. $core = fread(fopen('core.n3', 'r'), filesize('core.n3'));
  76. $n3 .= sprintf('%s', $core);
  77. #$n3 .= sprintf('%s', 'doc:'.$GLOBALS['Did'].' a s3db:s3dbDeployment .'.chr(10).chr(10));
  78. }
  79. #else {
  80. # $N3coreNames = array('project'=>'rdfs:Class', 'collection'=>'rdfs:Class', 'rule'=>'rdf:Property', 'item'=>'rdf:Resource', 'statement'=>'rdf:Resource', 'user'=>'rdf:Resource', 'group'=>'rdf:Resource');
  81. #}
  82. #parse the core relatioships
  83. #############################################################################
  84. ##define the Classes in the ontology of s3db
  85. $s3Types = array('deployment'=>array('user', 'group', 'project'),
  86. 'group'=>array('user'),
  87. 'project'=>array('collection', 'rule'),
  88. 'collection'=>array('item'),
  89. 'rule'=>array('statement'));
  90. ##############################################################
  91. #the unique identifier for each table
  92. $s3idNames = array('deployment'=>'deployment_id', 'project'=>'project_id', 'collection'=>'resource_id', 'item'=>'resource_id', 'rule'=>'rule_id', 'statement'=>'statement_id', 'user'=>'user_id', 'group'=>'group_id');
  93. #$coreElements = array_keys($s3Elements);
  94. #now is there any id specified?
  95. $specifiedInput = rootIDinfo($s3idNames, $inputs, $argv, $user_id, $key, $db);
  96. extract($specifiedInput);
  97. $specified_id_code = $GLOBALS['s3codesInv'][$specified_id_type];
  98. if(!$specified_id_info['view'])
  99. {echo $GLOBALS['messages']['no_permission_message'].'<message>User does not have access in this '.$specified_id_type.'.</message>';
  100. exit;
  101. }
  102. $specified_id_info = array_filter($specified_id_info);
  103. $ruid_info=uid($letter.$rootID);
  104. #################################
  105. #Determine what should be output
  106. #Build the ROOT ontology
  107. $verbs=array();
  108. switch ($specified_id_code) {
  109. case 'D':
  110. if($ruid_info['Did']==$GLOBALS['Did'])
  111. {$rpre='doc:';$rsuf='';}
  112. else{ $rpre='<';$sruf='>';}
  113. $n3 .= sprintf($rpre.$ruid_info['uid'].$rsuf);
  114. $objectPredicates=array('rdfs:comment'=>(
  115. $specified_id_info[$COREcomment[$specified_id_type]]!='')?'"'.$specified_id_info[$COREcomment[$specified_id_type]].'"':'',
  116. #'a'=> $N3coreNames[$specified_id_type],
  117. 'rdfs:label'=>'"'.$specified_id_info[$CORElabel[$specified_id]].'"',
  118. );
  119. #if(!$inputs['nocore']){
  120. # $objectPredicates['a']=$N3coreNames[$specified_id_type];
  121. #}
  122. break;
  123. case 'P':
  124. if($ruid_info['Did']==$GLOBALS['Did']){$pre=':';$suf='';}
  125. else{ $rpre='<';$rsuf='>';}
  126. $n3 .= sprintf(n3UID($ruid_info['uid']));
  127. $objectPredicates=array('rdfs:comment'=>(
  128. $specified_id_info[$COREcomment[$specified_id_type]]!='')?'"'.$specified_id_info['project_description'].'"':'',
  129. #'a'=> $N3coreNames[$specified_id_type],
  130. 'rdfs:label'=>'"'.$specified_id_info[$CORElabel[$specified_id]].'"',
  131. 'dcterms:creator'=>n3UID('U'.$specified_id_info['created_by']),
  132. 'dcterms:created'=>'"'.$specified_id_info['created_on'].'"'
  133. );
  134. break;
  135. case 'R':
  136. $n3 .= sprintf(n3UID($ruid_info['uid']));
  137. $subject_id = n3UID('C'.$specified_id_info['subject_id']);
  138. $verb_id = ($specified_id_info['verb_id']=="")?":I".random_string(5):n3UID("I".$specified_id_info['verb_id']);
  139. #predicates can't be literals, so create a resource for literal verbs.
  140. #when the verb is not an ID, a random string is generated that will simulate the ID of an instance.
  141. if(!in_array($specified_id_info['verb'], array_keys($verbs)))
  142. {
  143. $addStat .= sprintf($verb_id);
  144. $addStat .= sprintf(' rdfs:label "'.$specified_id_info['verb'].'" ;').chr(10);
  145. if(!$inputs['nocore'])
  146. $addStat .= chr(9).sprintf(' a s3db:s3dbItem ;').chr(10);
  147. ##Find collection of this item and output this information
  148. $item_info = s3info('item', $specified_id_info['verb_id'], $db);
  149. if(is_array($item_info))
  150. $addStat .= chr(9).sprintf(' a '.n3UID("C".$item_info['resource_class_id']).' .').chr(10).chr(10);
  151. else {#find a collection for the verbs
  152. $verbCollection = projectVerbClass(array('project_id'=>$specified_id_info['project_id'], 'db'=>$db,'user_id'=>$user_id));
  153. $addStat .= chr(9).sprintf(' a '.n3UID("C".$verbCollection['resource_id']).' .').chr(10).chr(10);
  154. }
  155. $verbs[$specified_id_info['verb']] =$verb_id;
  156. }
  157. else {
  158. $verb_id = $verbs[$specified_id_info['verb']];
  159. }
  160. $object_id = ($specified_id_info['object_id']=="")?'"'.$specified_id_info['object'].'"':n3UID("C".$specified_id_info['object_id']);
  161. $objectPredicates=array(
  162. 'rdfs:label'=>'"'.$specified_id_info['subject'].' '.$specified_id_info['verb'].' '.$specified_id_info['object'].'"',
  163. #'dc:comment'=>'"'.$specified_id_info['notes'].'"',
  164. 'rdfs:subClassOf'=>n3UID('P'.$specified_id_info['project_id']),
  165. 'rdf:subject'=>$subject_id,
  166. 'rdf:predicate'=>$verb_id,
  167. 'rdf:object'=>$object_id,
  168. 'dcterms:creator'=>n3UID('U'.$specified_id_info['created_by']),
  169. 'dcterms:created'=>'"'.$specified_id_info['created_on'].'"'
  170. );
  171. ##When no core is needed (when the document is not meant to be reloaded, there is no need for
  172. $addStat .= sprintf($subject_id.' '.$verb_id .' '.$object_id.' .').chr(10);
  173. break;
  174. }
  175. if(!$inputs['nocore']){
  176. $objectPredicates['a']=$N3coreNames[$specified_id_type];
  177. }
  178. $objectPredicates=array_filter($objectPredicates);
  179. #echo '<pre>';print_r($objectPredicates);exit;
  180. #echo '<pre>';print_r($s3Types[$specified_id_type]);exit;
  181. foreach ($objectPredicates as $predicate=>$object) {
  182. $n3 .= chr(9).sprintf($predicate.' '.$object.(($predicate==end(array_keys($objectPredicates)))?' .'.chr(10):' ;')).chr(10);
  183. }
  184. #Export user permissions on object
  185. #retrieve permission info on this URI
  186. if(in_array('permissions', array_keys($inputs))){
  187. $s3ql=compact('user_id','db');
  188. $s3ql['from']='users';
  189. $s3ql['where'][$specified_id]=$specified_id_info[$specified_id];
  190. $users = S3QLaction($s3ql);
  191. $me = $user_info;
  192. $me = include_all(array('elements'=>'users', 'element_info'=>$me, 'user_id'=>$user_id, 'db'=>$db));
  193. $me['permissionOnResource'] = $me['permission_level'];
  194. array_push($users, $me);
  195. $permissions=array_map('grab_permission', $users);
  196. $users=grab_id('user', $users);
  197. $specified_id_info['permissions']=array_combine($users, $permissions);
  198. #echo '<pre>';print_r($specified_id_info['permissions']);
  199. if(is_array($specified_id_info['permissions']))
  200. $n3permissions .= chr(10);sprintf($pre.$uid_info['uid'].$suf).chr(10);
  201. foreach ($specified_id_info['permissions'] as $user_code=>$pcode) {
  202. $n3permissions .= sprintf(n3UID($uid='U'.$user_code).' s3dbpc:VCU'.$pcode.' '.n3UID($ruid_info['uid']).' .').chr(10);
  203. }
  204. }
  205. $n3 .= $n3permissions;
  206. #echo $n3;exit;
  207. fwrite($fid, $n3);
  208. #echo $n3permissions;exit;
  209. #echo '<pre>';print_r($s3Types);exit;
  210. #now for the classes. What are rdfs:classes in an s3db ontology?
  211. #EVERTHING THAT HAS A LABEL IS A CLASS. This includes verbs, object and instances
  212. foreach ($s3Types[$specified_id_type] as $a_class) {
  213. #each class has a descriptive statement
  214. $a_class_id = $s3idNames[$a_class];
  215. $a_class_letter = strtoupper(substr($a_class,0,1));
  216. $a_class_type = $GLOBALS['s3codes'][$a_class_letter];
  217. $s3ql=compact('user_id','db');
  218. $s3ql['select']='*';
  219. $s3ql['from']=$GLOBALS['plurals'][$a_class];
  220. $s3ql['where'][$specified_id]=$specified_id_info[$specified_id];
  221. if(ereg('(rule|statement)', $a_class_type))
  222. $s3ql['where']['object']="!=UID";
  223. #echo '<pre>';print_r($s3ql);
  224. #exit;
  225. $subClasses = S3QLaction($s3ql);#find them, output them.
  226. #$verbs=array();
  227. if(is_array($subClasses))
  228. foreach ($subClasses as $subClass_info) {
  229. $subClass_info = array_filter($subClass_info);
  230. #start by saying what sort of s3dbCore id this is.
  231. $n3 = getSubClassStats($a_class_letter.$subClass_info[$a_class_id], $subClass_info, $inData, $user_id, $db, $N3coreNames, $inputs);
  232. #if($a_class_letter=='R'){
  233. #}
  234. fwrite($fid, $n3);
  235. }
  236. }
  237. fclose($fid);
  238. chmod($FinalFfilename, 0777);
  239. ##Prepare to output
  240. $linkname=random_string('10').'.n3';
  241. $filelink = $GLOBALS['URI'].'/extras/'.$linkname;
  242. if(!@copy($FinalFfilename, S3DB_SERVER_ROOT.'/extras/'.$linkname))
  243. {
  244. echo "Could not copy the file. This could be because Apache does not have 'write' permission on the s3db folder or the /extras/.";
  245. exit;
  246. }
  247. if(in_array('output', array_keys($inputs)))
  248. {
  249. #Try reading simile. If the site is not up, give an error message
  250. $simileLink = 'http://simile.mit.edu/babel/translator?reader=n3&writer=rdf-xml&mimetype=text%2Fplain&url='.$filelink;
  251. $simile = @fopen($simileLink,'r');
  252. if(!$simile)
  253. {echo "Could not connect to the rdf conversion service (http://simile.mit.edu/babel), please make sure you are connected to the internet.";
  254. exit;
  255. }
  256. $translation = stream_get_contents($simile);
  257. if(ereg('<html>', $translation))
  258. {
  259. echo "Simile could not convert the file. Please copy the triples on this <a href='".$filelink."'>direct link</a> and submit it to <a href='http://simile.mit.edu/babel'>simile</a> for a conversion in your format of choice.";
  260. exit;
  261. }
  262. switch ($inputs['output']) {
  263. case 'rdf-xml':
  264. ##Convert the n3 to a model; convert that model into rdf
  265. include_once(S3DB_SERVER_ROOT.'/rdfheader.inc.php');
  266. $model = ntriples2php($n3);
  267. $model->saveAs(S3DB_SERVER_ROOT.'/tmp/'.str_replace('.n3', '.rdf', $linkname), 'RDF');
  268. $filelink = str_replace('.n3', '.rdf', $filelink);
  269. $simileLink = 'http://simile.mit.edu/babel/translator?reader=n3&writer=rdf-xml&mimetype=text%2Fplain&url='.$filelink;
  270. break;
  271. case 'json':
  272. $filelink = str_replace('.n3', '.json', $filelink);
  273. $simileLink = 'http://simile.mit.edu/babel/translator?reader=n3&writer=exhibit-json&mimetype=text%2Fplain&url='.$filelink;
  274. break;
  275. default :
  276. $filelink = str_replace('.n3', '.rdf', $filelink);
  277. $simileLink = 'http://simile.mit.edu/babel/translator?reader=n3&writer=rdf-xml&mimetype=text%2Fplain&url='.$filelink;
  278. break;
  279. }
  280. $simile = @fopen($simileLink,'r');
  281. $translation = stream_get_contents($simile);
  282. file_put_contents($translation, $filelink);
  283. }
  284. if(in_array('link', array_keys($inputs))) {
  285. echo "Link for n-triples <a href='".$filelink."'>".$filelink."</a><br />";
  286. $filelink = str_replace('.n3', '.rdf', $filelink);
  287. $simileLink = 'http://simile.mit.edu/babel/translator?reader=n3&writer=rdf-xml&mimetype=text%2Fplain&url='.$filelink;
  288. $simile = @fopen($simileLink,'r');
  289. $translation = stream_get_contents($simile);
  290. if($translation!='' && !ereg('<html>', $translation)) {
  291. @file_put_contents($translation, $filelink);
  292. echo "Link for xml-rdf <a href='".$filelink."'>".$filelink."</a><br />";
  293. }
  294. $filelink = str_replace('.n3', '.json', $filelink);
  295. $simileLink = 'http://simile.mit.edu/babel/translator?reader=n3&writer=exhibit-json&mimetype=text%2Fplain&url='.$filelink;
  296. $simile = @fopen($simileLink,'r');
  297. $translation = stream_get_contents($simile);
  298. if($translation!=''&& !ereg('<html>', $translation)){
  299. file_put_contents($translation, $filelink);
  300. echo "Link for Json <a href='".$filelink."'>".$filelink."</a><br />";
  301. }
  302. #Header('Location:'.$filelink);
  303. #exit;
  304. }
  305. else {
  306. if($inputs['download']!='no'){
  307. header("Content-Type: application/octet-stream");
  308. header("Content-Disposition: attachment; filename=".$linkname);
  309. header("Content-Transfer-Encoding: binary");
  310. }
  311. echo file_get_contents($filelink);
  312. exit;
  313. }
  314. exit;
  315. }
  316. function addCollectionItemStats($user_id,$db, $class_id, $inputs)
  317. {
  318. $s3ql=compact('user_id','db');
  319. $s3ql['from']='items';
  320. $s3ql['where']['collection_id']=$class_id;
  321. $items = S3QLaction($s3ql);
  322. if (is_array($items) && !empty($items)) {
  323. foreach ($items as $key=>$item_info) {
  324. if(!$inputs['nocore'])
  325. $n3 .= sprintf(':I'.$item_info['item_id'].' a s3db:s3dbItem .').chr(10).chr(10);
  326. $objectPredicates=array('rdfs:label'=>'"'.$item_info['notes'].'"',
  327. 'a'=>':C'.$class_id);
  328. $objectPredicates = array_filter($objectPredicates);
  329. if(is_array($objectPredicates) && !empty($objectPredicates))
  330. { #Global "this is a resource" statement
  331. $n3 .= sprintf(':I'.$item_info['item_id']);
  332. foreach ($objectPredicates as $predicate=>$object) {
  333. if($object!='""')
  334. $n3 .= sprintf("%s", ' '.$predicate.' '.$object.(($predicate==end(array_keys($objectPredicates)))?' .'.chr(10).chr(10):' ;'.chr(10).chr(9)));
  335. }
  336. }
  337. }
  338. }
  339. return ($n3);
  340. }
  341. function addRuleStats($user_id,$db, $url,$rule_id, $inputs)
  342. {$COREletter = $GLOBALS['COREletter'];
  343. $s3ql=compact('user_id','db');
  344. $s3ql['from']='statements';
  345. $s3ql['where']['rule_id']=$rule_id;
  346. $stats = S3QLaction($s3ql);
  347. $subject_name = 'item_id';
  348. $predicate_name = 'rule_id';
  349. $object_name = 'item_id';
  350. if(is_array($stats) && !empty($stats))
  351. foreach ($stats as $key=>$stat_info) {
  352. if(!$inputs['nocore'])
  353. $n3 .= sprintf(n3UID('S'.$stat_info['statement_id']).' a s3db:s3dbStatement .').chr(10).chr(10);
  354. if($stat_info['file_name']!='')
  355. {
  356. #find the file. Write it as base64encoded
  357. #echo '<pre>';print_r($stat_info);exit;
  358. $fileLocation = fileLocation($stat_info, $db);
  359. if($fileLocation!='')
  360. {
  361. if(!$inputs['files']){
  362. $content=@fread(@fopen($fileLocation, 'r'), @filesize($fileLocation));
  363. $content=base64_encode($content);
  364. $object='"s3dbFile_'.$stat_info['file_name'].'_'.$content.'"';
  365. }
  366. else {
  367. $object='"s3dbLink_'.$stat_info['file_name'].'_'.S3DB_URI_BASE.'/download.php?key='.$inputs['key'].'&statement_id='.$stat_info['statement_id'].'"';
  368. }
  369. #echo $object;exit;
  370. #echo $subClass_info['file_name'].chr(13).chr(10);
  371. }
  372. #ereg('<a href(.*)download.php(.*)>(.*)</a>', $stat_info['value'], $linkdata);
  373. #$statfilelink='<'.$url.'download.php'.str_replace('"', '', $linkdata[2]).'>';
  374. #$object=$statfilelink;
  375. }
  376. elseif($stat_info['object_id']!='')
  377. {
  378. $object=':'.$COREletter[$object_name].$stat_info['value'];
  379. }
  380. else {
  381. ereg('<a href=(.*)>(.*)</a>', $stat_info['value'], $links);
  382. if(!empty($links))
  383. $object = '"'.str_replace(array('"', '\''),array('', ''), $links[1]).'"';
  384. else
  385. $object='"'.$stat_info['value'].'"';
  386. #$object='"'.htmlentities($stat_info['value']).'"';
  387. }
  388. $objectPredicates=array('rdf:subject'=>n3UID($COREletter[$subject_name].$stat_info[$subject_name]),
  389. 'rdf:predicate'=>n3UID($COREletter[$predicate_name].$stat_info[$predicate_name]),
  390. 'rdf:object'=>$object);
  391. #$objectPredicates['rdfs:label'] ='"'.$stat_info['subject'].' '.$stat_info['instance_notes'].' (I'.$stat_info['instance_id'].') '.$stat_info['verb'].' '.$stat_info['object'].' '.(($stat_info['object_id']!='')?($stat_info['object_notes'].' (I'.$stat_info['value'].')'):(($stat_info['file_name']=='')?str_replace('"', '', $objectPredicates['rdf:object']):$stat_info['file_name'])).'"';
  392. $objectPredicates['rdfs:label'] ='"'.$stat_info['subject'].' '.$stat_info['instance_notes'].' I'.$stat_info['instance_id'].' '.$stat_info['verb'].' '.$stat_info['object'].' '.(($stat_info['object_id']!='')?($stat_info['object_notes'].' I'.$stat_info['value'].''):(($stat_info['file_name']=='')?str_replace('"', '', $objectPredicates['rdf:object']):$stat_info['file_name'])).'"';
  393. $objectPredicates = array_filter($objectPredicates);
  394. if(is_array($objectPredicates) && !empty($objectPredicates) && !$inputs['nocore'])
  395. { #Global "this is a resource" statement
  396. $n3 .= sprintf(':S'.$stat_info['statement_id']);
  397. foreach ($objectPredicates as $predicate=>$object) {
  398. if($object!='""')
  399. $n3 .= sprintf("%s", ' '.$predicate.' '.$object.(($predicate==end(array_keys($objectPredicates)))?' .'.chr(10).chr(10):' ;'.chr(10).chr(9)));
  400. }
  401. }
  402. #unreified statement - the only one neeed where nocore is specified
  403. $n3 .= sprintf("%s", $objectPredicates['rdf:subject']);
  404. $n3 .= chr(9).sprintf("%s", $objectPredicates['rdf:predicate'].' '.(($subClass_info['object_id']!='')?$objectPredicates['rdf:object']:$objectPredicates['rdf:object']).' .').chr(10).chr(10);
  405. }
  406. return ($n3);
  407. }
  408. function addProjectRulesAndCollections($user_id,$db, $url, $project_id, $inData)
  409. {
  410. $s3ql=compact('user_id','db');
  411. $s3ql['select']='*';
  412. $s3ql['from']='collections';
  413. $s3ql['where']['project_id']=$project_id;
  414. $collections = S3QLaction($s3ql);
  415. if(is_array($collections)){
  416. #echo '<pre>';print_r($collections);
  417. foreach ($collections as $key=>$collection_info) {
  418. $n3 .= getSubClassStats('C'.$collection_info['collection_id'], $collection_info, $inData, $user_id, $db, $N3coreNames, $inputs);
  419. #echo $n3;exit;
  420. }
  421. }
  422. $s3ql=compact('user_id','db');
  423. $s3ql['select']='*';
  424. $s3ql['from']='rules';
  425. $s3ql['where']['project_id']=$project_id;
  426. $rules = S3QLaction($s3ql);
  427. if(is_array($rules)){
  428. foreach ($rules as $key=>$rule_info) {
  429. $n3 .= getSubClassStats('R'.$rule_info['rule_id'], $rule_info, $inData, $user_id, $db, $N3coreNames, $inputs);
  430. #echo $n3;exit;
  431. }
  432. }
  433. return ($n3);
  434. }
  435. function addGroupUsers($user_id,$db, $group_id)
  436. {
  437. $s3ql=compact('user_id','db');
  438. $s3ql['select']='*';
  439. $s3ql['from']='users';
  440. $s3ql['where']['group_id']=$group_id;
  441. $users = S3QLaction($s3ql);
  442. $users = grab_id('user', $users);
  443. if(is_array($users))
  444. foreach ($users as $key=>$user_id) {
  445. $n3 .= sprintf(n3UID('U'.$user_id).' rdfs:subClassOf '.n3UID('G'.$group_id).' .').chr(10);
  446. }
  447. return ($n3);
  448. }
  449. function rootIDinfo($s3idNames, $REQUESTdat, $argv, $user_id, $key, $db)
  450. {
  451. if(!in_array('uid', array_keys($REQUESTdat)))
  452. $specified_id = array_intersect($s3idNames, array_keys($REQUESTdat));
  453. else {
  454. $specified_id = $GLOBALS['COREletterInv'][letter($REQUESTdat['uid'])];
  455. }
  456. #echo '<pre>';print_r($REQUESTdat);exit;
  457. if(count($specified_id)!='1')
  458. {
  459. if(is_array($argv))
  460. $inData = array_diff($argv, array($key, 'rdf.php'));
  461. if(is_array($inData)){
  462. foreach ($inData as $key=>$value) {
  463. list($idname[], $id[])=explode('=', $value);
  464. }
  465. $specified_id = array_intersect($s3idNames, $idname);
  466. }
  467. if(count($specified_id)!='1')
  468. {
  469. echo $GLOBALS['messages']['something_missing']."<message>Please specify 1 and only 1 id for the root of the ontology</message>";
  470. exit;
  471. }
  472. else {
  473. $inData = array_combine($idname, $id);
  474. $rootID = $id[0];
  475. $specified_id = $idname[0];
  476. }
  477. }
  478. else {
  479. $inData = $REQUESTdat;
  480. $specified_id=array_combine(array('0'), $specified_id);
  481. $specified_id= $specified_id[0];
  482. $rootID = $REQUESTdat[$specified_id];
  483. if($rootID=='')
  484. {$rootID = ereg_replace('^'.letter($REQUESTdat['uid']), '', $REQUESTdat['uid']);
  485. $specified_id = $GLOBALS['COREletterInv'][letter($REQUESTdat['uid'])];
  486. }
  487. }
  488. $specified_id_type = array_search($specified_id, $s3idNames);
  489. $letter = strtoupper(substr($specified_id,0,1));
  490. $specified_id_info = URIinfo($letter.$rootID, $user_id, $key, $db);
  491. return (compact('letter', 'specified_id', 'specified_id_type', 'specified_id_info', 'inData', 'rootID'));
  492. }
  493. function getSubClassStats($uid, $subClass_info, $inData, $user_id, $db, $N3coreNames, $inputs)
  494. {
  495. global $verbs;
  496. $uid_info = uid($uid);
  497. $letter = substr($uid,0,1);
  498. $a_class_type = $GLOBALS['s3codes'][substr($uid,0,1)];
  499. $a_class_id = $GLOBALS['COREids'][$a_class_type];
  500. $CORElabel = $GLOBALS['CORElabel'];
  501. $N3coreNames = ($N3coreNames!='')?$N3coreNames:$GLOBALS['N3coreNames'];
  502. if(!$inputs['nocore'])
  503. $n3 .= sprintf(n3UID($uid_info['uid']).' a '.$N3coreNames[$a_class_type].' .').chr(10).chr(10);
  504. switch ($a_class_type) {
  505. case 'user':
  506. if ($uid_info['Did']==$GLOBALS['s3db_info']['deployment']['Did']) {
  507. $objectPredicates=array('rdfs:subClassOf' => n3UID($uid_info['Did']),
  508. 'rdfs:label'=>'"'.$subClass_info[$CORElabel[$a_class_id]].'"',
  509. 'foaf:mbox'=>'"'.$subClass_info['account_email'].'"',
  510. 'foaf:name'=>'"'.$subClass_info['account_uname'].'"',
  511. 'foaf:password'=>($user_id==1)?'"'.findPassword(ereg_replace('^'.$letter, '',$uid_info['uid']), $db).'"':'',
  512. 'dcterms:creator'=>n3UID('U'.$subClass_info['created_by']),
  513. 'dcterms:created'=>'"'.$subClass_info['created_on'].'"');
  514. }
  515. else {
  516. $objectPredicates=array('rdfs:subClassOf' => n3UID($GLOBALS['s3db_info']['deployment']['Did']));
  517. }
  518. break;
  519. case 'group':
  520. $objectPredicates=array('rdfs:subClassOf' => ':'.$uid_info['Did'],
  521. 'rdfs:label'=>'"'.$subClass_info[$CORElabel[$a_class_id]].'"',
  522. 'dcterms:creator'=>n3UID('U'.$subClass_info['created_by']),
  523. 'dcterms:created'=>'"'.$subClass_info['created_on'].'"');
  524. $addStat .= addGroupUsers($user_id,$db, $subClass_info[$a_class_id]);
  525. break;
  526. case 'project':
  527. $objectPredicates=array(
  528. 'rdfs:subClassOf' => n3UID($uid_info['Did']),
  529. 'rdfs:label'=>'"'.$subClass_info[$CORElabel[$a_class_id]].'"',
  530. 'dcterms:creator'=>n3UID('U'.$subClass_info['created_by']),
  531. 'dcterms:created'=>'"'.$subClass_info['created_on'].'"'
  532. );
  533. $addStat .= addProjectRulesAndCollections($user_id,$db, $url, $subClass_info[$a_class_id], $inData);
  534. break;
  535. case 'collection':
  536. $objectPredicates=array(
  537. 'rdfs:subClassOf'=>n3UID('P'.$subClass_info['project_id']),
  538. 'rdfs:label'=>'"'.$subClass_info['entity'].'"',
  539. 'rdfs:comment'=>'"'.$subClass_info['notes'].'"',
  540. #'dcterms:creator'=>n3UID('U'.$subClass_info['created_by']),
  541. #'dcterms:created'=>'"'.$subClass_info['created_on'].'"'
  542. );
  543. if(!$inputs['nometa']){
  544. $objectPredicates['dcterms:creator'] = n3UID('U'.$subClass_info['created_by']);
  545. $objectPredicates['dcterms:created'] = '"'.$subClass_info['created_on'].'"';
  546. }
  547. if(in_array('all', array_keys($inputs)))
  548. $addStat .= addCollectionItemStats($user_id,$db, $subClass_info[$a_class_id], $inputs);
  549. #trying to see if the collection declarations are meesing up the query a lot
  550. if($inputs['nocore'])
  551. $n3 .= sprintf(n3UID($uid_info['uid']).' a '.$N3coreNames[$a_class_type].' .').chr(10).chr(10);
  552. break;
  553. case 'rule':
  554. $subject_id = n3UID('C'.$subClass_info['subject_id']);
  555. $verb_id = ($subClass_info['verb_id']=="")?":I".random_string(5):n3UID("I".$subClass_info['verb_id']);
  556. #predicates can't be literals, so create a resource for literal verbs.
  557. #when the verb is not an ID, a random string is generated that will simulate the ID of an instance.
  558. if(!in_array($subClass_info['verb'], array_keys($verbs)))
  559. {
  560. $addStat .= sprintf($verb_id);
  561. $addStat .= sprintf(' rdfs:label "'.$subClass_info['verb'].'" ;').chr(10);
  562. if(!$inputs['nocore'])
  563. $addStat .= chr(9).sprintf(' a s3db:s3dbItem ;').chr(10);
  564. ##Find collection of this item and output this information
  565. $item_info = s3info('item', $subClass_info['verb_id'], $db);
  566. if(is_array($item_info))
  567. $addStat .= chr(9).sprintf(' a '.n3UID("C".$item_info['resource_class_id']).' .').chr(10).chr(10);
  568. else {#find a collection for the verbs
  569. $verbCollection = projectVerbClass(array('project_id'=>$subClass_info['project_id'], 'db'=>$db,'user_id'=>$user_id));
  570. $addStat .= chr(9).sprintf(' a '.n3UID("C".$verbCollection['resource_id']).' .').chr(10).chr(10);
  571. }
  572. $verbs[$subClass_info['verb']] =$verb_id;
  573. }
  574. else {
  575. $verb_id = $verbs[$subClass_info['verb']];
  576. }
  577. $object_id = ($subClass_info['object_id']=="")?'"'.$subClass_info['object'].'"':n3UID("C".$subClass_info['object_id']);
  578. $objectPredicates=array(
  579. 'rdfs:label'=>'"'.$subClass_info['subject'].' '.$subClass_info['verb'].' '.$subClass_info['object'].'"',
  580. #'dc:comment'=>'"'.$subClass_info['notes'].'"',
  581. 'rdfs:subClassOf'=>n3UID('P'.$subClass_info['project_id']),
  582. 'rdf:subject'=>$subject_id,
  583. 'rdf:predicate'=>$verb_id,
  584. 'rdf:object'=>$object_id,
  585. #'dcterms:creator'=>n3UID('U'.$subClass_info['created_by']),
  586. #'dcterms:created'=>'"'.$subClass_info['created_on'].'"'
  587. );
  588. if(!$inputs['nometa']){
  589. $objectPredicates['dcterms:creator'] = n3UID('U'.$subClass_info['created_by']);
  590. $objectPredicates['dcterms:created'] = '"'.$subClass_info['created_on'].'"';
  591. }
  592. ##When no core is needed (when the document is not meant to be reloaded, there is no need for
  593. $addStat .= sprintf($subject_id.' '.$verb_id .' '.$object_id.' .').chr(10);
  594. if(in_array('all', array_keys($inputs)))
  595. $addStat .= addRuleStats($user_id,$db, $url, $subClass_info[$a_class_id], $inputs);
  596. #trying to see if the collection declarations are meesing up the query a lot
  597. if($inputs['nocore'])
  598. $n3 .= sprintf(n3UID($uid_info['uid']).' a '.$N3coreNames[$a_class_type].' .').chr(10).chr(10);
  599. break;
  600. case 'item':
  601. $objectPredicates=array('rdfs:label'=>'"'.$subClass_info['notes'].'"',
  602. 'a'=>n3UID('C'.$subClass_info['class_id']),
  603. #'dcterms:creator'=>':U'.$subClass_info['created_by'],
  604. #'dcterms:created'=>'"'.$subClass_info['created_on'].'"'
  605. );
  606. if(!$inputs['nometa']){
  607. $objectPredicates['dcterms:creator'] = ':U'.$subClass_info['created_by'];
  608. $objectPredicates['dcterms:created'] = '"'.$subClass_info['created_on'].'"';
  609. }
  610. #trying to see if the collection declarations are meesing up the query a lot
  611. if($inputs['nocore'])
  612. $n3 .= sprintf(n3UID($uid_info['uid']).' a '.$N3coreNames[$a_class_type].' .').chr(10).chr(10);
  613. break;
  614. case 'statement':
  615. $subject_name = 'instance_id';
  616. $predicate_name = 'rule_id';
  617. $object_name = 'instance_id';
  618. if($subClass_info['file_name']!='')
  619. {
  620. #find the file. Write it as base64encoded
  621. #echo '<pre>';print_r($subClass_info);
  622. $fileLocation = fileLocation($subClass_info, $db);
  623. if($fileLocation!='')
  624. {
  625. if(!$inputs['files']){
  626. $content=@fread(@fopen($fileLocation, 'r'), @filesize($fileLocation));
  627. $content=base64_encode($content);
  628. $object='"s3dbFile_'.$subClass_info['file_name'].'_'.$content.'"';
  629. }
  630. else {
  631. $object='"s3dbLink_'.$subClass_info['file_name'].'_'.S3DB_URI_BASE.'/download.php?key='.$inputs['key'].'&statement_id='.$subClass_info['statement_id'].'"';
  632. }
  633. #echo $object;exit;
  634. #echo $subClass_info['file_name'].chr(13).chr(10);
  635. }
  636. #echo $object;exit;
  637. #ereg('<a href(.*)download.php(.*)>(.*)</a>', $stat_info['value'], $linkdata);
  638. #$statfilelink='<'.$url.'download.php'.str_replace('"', '', $linkdata[2]).'>';
  639. #$object=$statfilelink;
  640. }
  641. elseif($subClass_info['object_id']!='')
  642. {
  643. $object=n3UID($COREletter[$object_name].$subClass_info['value']);
  644. }
  645. else {
  646. ereg('<a href=(.*)>(.*)</a>', $subClass_info['value'], $links);
  647. if(!empty($links))
  648. $object = '"'.str_replace(array('"', '\''),array('', ''), $links[1]).'"';
  649. else
  650. $object='"'.$subClass_info['value'].'"';
  651. }
  652. $objectPredicates=array(
  653. #'rdf:subject'=>n3UID($COREletter[$subject_name].$subClass_info[$subject_name]),
  654. 'rdf:subject'=>n3UID('I'.$subClass_info[$subject_name]),
  655. 'rdf:predicate'=>n3UID('R'.$subClass_info[$predicate_name]),
  656. #'rdf:object'=>($subClass_info['object_id']!='')?':'.$COREletter[$object_name].$subClass_info['value']:'"'.$subClass_info['value'].'"'
  657. 'rdf:object'=>$object,
  658. 'dcterms:creator'=>n3UID('U'.$subClass_info['created_by']),
  659. 'dcterms:created'=>'"'.$subClass_info['created_on'].'"'
  660. );
  661. #$objectPredicates['rdfs:label'] ='"'.$subClass_info['subject'].' '.$subClass_info['instance_notes'].' (I'.$subClass_info['instance_id'].') '.$subClass_info['verb'].' '.$subClass_info['object'].' '.(($subClass_info['object_id']!='')?($subClass_info['object_notes'].' (I'.$subClass_info['value'].')'):(($subClass_info['file_name']=='')?str_replace('"', '', $objectPredicates['rdf:object']):$subClass_info['file_name'])).'"';
  662. $objectPredicates['rdfs:label'] ='"'.$subClass_info['subject'].' '.$subClass_info['instance_notes'].' I'.$subClass_info['instance_id'].' '.$subClass_info['verb'].' '.$subClass_info['object'].' '.(($subClass_info['object_id']!='')?($subClass_info['object_notes'].' I'.$subClass_info['value'].''):(($subClass_info['file_name']=='')?str_replace('"', '', $objectPredicates['rdf:object']):$subClass_info['file_name'])).'"';
  663. #when no core is requested, return just the reified stat
  664. if($inputs['nocore']) {
  665. $objectPredicates=array();
  666. }
  667. #unreified statement
  668. $addStat .= sprintf("%s", $objectPredicates['rdf:subject']);
  669. $addStat .= chr(9).sprintf("%s", $objectPredicates['rdf:predicate'].' '.(($subClass_info['object_id']!='')?$objectPredicates['rdf:object']:$objectPredicates['rdf:object']).' .').chr(10);
  670. break;
  671. }
  672. #export user permissions in rdf
  673. if(in_array('p', array_keys($inData))){
  674. $s3ql=compact('user_id','db');
  675. $s3ql['from']='users';
  676. $s3ql['where'][$GLOBALS['COREids'][$a_class_type]]=$subClass_info[$GLOBALS['COREids'][$a_class_type]];
  677. $users = S3QLaction($s3ql);
  678. if(is_array($users)){
  679. $permissions=array_map('grab_permission', $users);
  680. $users=grab_id('user', $users);
  681. $specified_id_info['permissions']=array_combine($users, $permissions);
  682. }
  683. if(is_array($specified_id_info['permissions'])){
  684. $n3permissions .= chr(10);
  685. foreach ($specified_id_info['permissions'] as $user_code=>$pcode) {
  686. $n3permissions .= sprintf(n3UID('U'.$user_code).' s3dbpc:VCU'.$pcode.' '.n3UID($uid_info['uid']).' .').chr(10);
  687. }
  688. }
  689. }
  690. $objectPredicates = array_filter($objectPredicates);
  691. if(is_array($objectPredicates) && !empty($objectPredicates))
  692. { #Global "this is a resource" statement
  693. $n3 .= sprintf(n3UID($uid_info['uid']));
  694. foreach ($objectPredicates as $predicate=>$object) {
  695. if($object!='""')
  696. $n3 .= sprintf("%s", ' '.$predicate.' '.$object.(($predicate==end(array_keys($objectPredicates)))?' .'.chr(10).chr(10):' ;'.chr(10).chr(9)));
  697. }
  698. }
  699. if(is_array($user2declare))
  700. foreach ($user2declare as $user=>$toDeclare) {
  701. $uid_info = uid($user);
  702. $addStat .= sprintf(n3UID('U'.$user), 'rdfs:label "'. getUserName($user, $db).'"').chr(10);
  703. }
  704. $n3 .=$addStat.$n3permissions;
  705. #echo $n3;exit;
  706. return ($n3);
  707. }
  708. ?>