commit 2aa9b58b076c5c6a6e9cbd9b6926be30312ab297 Author: Daniel Neis Araujo Date: Tue May 7 14:48:37 2013 -0300 As downloaded from https://code.google.com/p/oai-pmh-2/ diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt new file mode 100644 index 0000000..79e709e --- /dev/null +++ b/COPYRIGHT.txt @@ -0,0 +1,14 @@ +Copyright (c) 2011 Jianfeng Li + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . diff --git a/ands_rifcs.php b/ands_rifcs.php new file mode 100644 index 0000000..41625bd --- /dev/null +++ b/ands_rifcs.php @@ -0,0 +1,260 @@ +oai_pmh = $ands_response_doc; + $this->working_node = $metadata_node; + $this->create_regObjects(); + } + + /** + * A worker function for easily adding a newly created node to current XML Doc. + * @param $mom_node Type: DOMElement. Node the new child will be attached to. + * @param $name Type: sting. The name of the child node is being added. + * @param $value Type: sting. The text content of the child node is being added. The default is ''. + * @return DOMElement. The added child node + */ + protected function addChild($mom_node,$name, $value='') { + return $this->oai_pmh->addChild($mom_node,$name, $value); + } + + /** Create a registryObjects node to hold individual registryObject's. + * This is only a holder node. + */ + protected function create_regObjects() { + $this->working_node = $this->oai_pmh->addChild($this->working_node,'registryObjects'); + $this->working_node->setAttribute('xmlns',"http://ands.org.au/standards/rif-cs/registryObjects"); + $this->working_node->setAttribute('xmlns:xsi',"http://www.w3.org/2001/XMLSchema-instance"); + $this->working_node->setAttribute('xsi:schemaLocation','http://ands.org.au/standards/rif-cs/registryObjects http://services.ands.org.au/documentation/rifcs/1.2.0/schema/registryObjects.xsd'); + } + + /** Create a single registryObject node. Each set has its own structure but they all have an attribute of group, a key node and an originatingSource node. The newly created node will be used as the working node. + * + * \param $group string, group attribute of the new registryObject node . + * \param $key string, key node, used as an identifier. + * \param $originatingSource string, an url of the data provider. + */ + protected function create_regObject($group, $key, $originatingSource) { + $regObj_node = $this->addChild($this->working_node,'registryObject'); + $regObj_node->setAttribute('group',$group); + $this->addChild($regObj_node,'key',$key); + $this->addChild($regObj_node,'originatingSource',$originatingSource); + $this->working_node = $regObj_node; + } + + /** RIF-CS node is the content node of RIF-CS metadata node which starts from regObjects. + * Each set supportted in RIF-CS has its own content model. The created node will be used as the + * root node of this record for following nodes will be created. + * + * \param $set_name string, the name of set. For ANDS, they are Activity, Party and Collection + * \param $set_type string, the type of set. For example, Activity can have project as a type. + */ + protected function create_rifcs_node($set_name, $set_type) { + $this->working_node = $this->addChild($this->working_node, $set_name); + $this->working_node->setAttribute('type', $set_type); + } + + /** + * Create a top level name node. + * @param $name_type string. Text for the types, can be either primary or abbreviated. Default: primary + * + * @return DOMElement $added_name_node. + * The newly created node, it will be used for further expansion by adding namePart. + */ + protected function create_name_node($name_type = 'primary') { + $c = $this->addChild($this->working_node, 'name'); + $c->setAttribute('type', $name_type); + return $c; + } + + /** + * Create a namePart of a name node. + * @param $name_node + * Type: DOMElement. Node of name_node created previously + * + * @param $value + * Type: string. Text fror this namePart + * + * @param $part_type Type: string, used for group:person record. Types can be: titile, given, family + * + */ + protected function create_namePart($name_node, $value, $part_type = '') { + $c = $this->addChild($name_node, 'namePart', $value); + if (!empty($part_type)) { + $c->setAttribute('type', $part_type); + } + } + + /** Create related object. One RIF-CS can have more than one related object nodes, + * each object is described by one node. + * \param $key + * Type: string. The identifier of the related object. + * \param $relation_type + * Type: string. Type of relationship. + * + */ + protected function create_relatedObject($key,$relation_type) { + $c = $this->addChild($this->working_node, 'relatedObject'); + $this->addChild($c,'key',$key); + $c = $this->addChild($c, 'relation'); + // Mimick ANDS with enpty value to get both tags for relation. Only for better display + // $c = $this->addChild($c, 'relation',' '); + $c->setAttribute('type', $relation_type); + } + + /** Create description node. One RIF-CS can have more than one description nodes. + * Each description node has only one description. + * \param $value Type: string. The content of the description. + * \param $des_type Type: string. Type of the description. Types can be brief, full, acessRights and note. Default is 'brief'. + */ + protected function create_description_node($value, $des_type='brief') { + $c = $this->addChild($this->working_node, 'description', $value); + $c->setAttribute('type', $des_type); + } + + /** Create local or other type of identifier inside of RIF-CS metadata node + * \param $key + * Type string. The indentifier itself. + * \param $i_type + * Type string. Type of identifier. Can be abn, uri, local, etc.. Default is local. + */ + protected function create_identifier_node($key, $i_type='local') { + $c = $this->addChild($this->working_node, 'identifier',$key); + $c->setAttribute('type', $i_type); + } + + /** Location node is a holder node for either address or spatial nodes + * \return DOMElement node, for adding address or spatial nodes. + */ + protected function create_location_node() { + return $this->addChild($this->working_node, 'location'); + } + + /** Address node is a holder node for phiscal or electrical nodes. + * \param $location_node Type: DOMElement. Location node created previously. + * \return DOMElement + */ + protected function create_address_node($location_node) { + return $this->addChild($location_node, 'address'); + } + + /** Electrical address node. Used for email, url, etc + * \param $addr_node Type: DOMElement. Previously created address node. + * \param $e_node Type: string. The content of the adding node. + * \param $e_type Type: string. Default is email. + */ + protected function create_e_node($addr_node, $e_node, $e_type = 'email') { + $c = $this->addChild($addr_node, 'electronic'); + $c->setAttribute('type', $e_type); + $this->addChild($c,'value',$e_node); + } + + /** Physical node is a holder node for phone or fax nodes. + * \param $addr_node Type: DOMelement. Address node created before to which the new phiscial->addressPart will be attached. + * \param $number Type: string. Telephone or fax number as a string. + * \param $fone_fax Type: string. Either telehoneNumber or faxNumber. + */ + protected function create_physcial_fone_fax($addr_node, $number,$fone_fax='telephoneNumber') { + $c = $this->addChild($addr_node, 'physical'); + $c = $this->addChild($c, 'addressPart', $number); + $c->setAttribute('type', $fone_fax); + } + + /** create address node under location node, either streetAddress or postalAddress. + * But they are in text (one block) format. + * \param $addr_node Type: DOMelement. Address node created before to which the new phiscial->addressPart will be attached. + * \param $txt_addr string, full street address in text block format + * \param $phys_type string, default is 'streetAddress', can be 'postalAddress' + */ + protected function create_physcial_addr_txt($addr_node, $txt_addr,$phys_type='streetAddress') { + $c = $this->addChild($addr_node, 'physical'); + $c->setAttribute('type', $phys_type); + $c = $this->addChild($c, 'addressPart', $txt_addr); + $c->setAttribute('type', 'text'); + } + + /** Create spatial node under a location node. + * \param $location_node Type: DOMElement. Location node where spatial node is being added to. + * \param $value Type: string. The value of spatial information. Default is local latitude and longitude. + * \param $sp_type Type: string. Type of spaitial informaion. Default is kmlPolyCoords. + */ + protected function create_spatial_node($location_node, $value = '138.6396,-34.97063', $sp_type = 'kmlPolyCoords') { + $c = $this->addChild($location_node, 'spatial',$value); + $c->setAttribute('type',$sp_type); + } + + /** Create temporal coverage node for collection or activity records. + * \param $values Type: 2-D array. The values of temporal coverage. It can has maximal two elements: one from 'dateFrom' and another for 'dateTo'. + * Either can be ommited according to RIF-CS schema. Each element of $values is an array and has keys: date, type and format. + * ['date'] is a string represents date. It has to be in W3CDTF or UTC format. + * ['type'] has to be either 'dateFrom' or 'dateTo'. + * ['format'] is optional and its default is 'W3CDTF'. UTC format requires date has to be in UTC: dateTtimeZ. + * It throws an exception if the input parameter is not an array. + */ + protected function create_coverage_tempo($values) { + // Non array is not acceptable. + if (!is_array($values)) { throw new Exception('The input of temporal coverage has to be an array of arraies with keys.');} + $c = $this->addChild($this->working_node,'coverage'); + $t = $this->addChild($c,'temporal'); + foreach($values as $value) $this->create_coverage_tempo_date($t, $value); + } + + /** Create temporal coverage node for collection or activity records. + * \param $t Type: DOMElement. The \\\ node to which \ nodes will be attached to. + * \param $value Type: array. The value of temporal coverage. It has maxmimal three elements with keys: type, date and format. + * It throws an exception if the input parameter is not an array. + * \see create_coverage_tempo + */ + private function create_coverage_tempo_date($t, $value) { + if (!is_array($value)) { throw new Exception('The input of temporal coverage has to be an array with keys.');} + $d = $this->addChild($t,'date',$value['date']); + $d->setAttribute('type',$value['type']); + if (isset($value['format'])) $d->setAttribute('dateFormat',$value['format']); + else $d->setAttribute('dateFormat','W3CDTF'); + } + + /** Create a subject node for a researcher, project, project, etc + * \param $value Type: string. A string representing the new namePart. + * \param $subject_type Type: string. A string representing the type of subject. The default value is anzsrc-for. + */ + protected function create_subject_node($value, $subject_type = 'anzsrc-for') { + if (empty($value)) return; + $c = $this->addChild($this->working_node,'subject',$value); + $c->setAttribute('type',$subject_type); + } +} // end of class ANDS_RIFCS + diff --git a/ands_tpa.php b/ands_tpa.php new file mode 100644 index 0000000..e86c031 --- /dev/null +++ b/ands_tpa.php @@ -0,0 +1,349 @@ +create_metadata($cur_record); + * $obj_node = new ANDS_TPA($outputObj, $metadata_node, $db); + * try { + * $obj_node->create_obj_node($record[$SQL['set']], $identifier); + * } catch (Exception $e) { + * echo 'Caught exception: ', $e->getMessage(), " when adding $identifier\n"; + * } + * \endcode + * \see Code in action can be seen in record_rif.php + */ + +class ANDS_TPA extends ANDS_RIFCS { + //! Type: PDO. The database connection of the data source. + //! \see __construct. + private $db; + + /** + * Constructor + * The first two parameters are used by its parent class ANDS_RIFCS. The third is its own private property. + * + * \param $ands_response_doc ANDS_Response_XML. A XML Doc acts as the parent node. + * \param $metadata_node DOMElement. The meta node which all subsequent nodes will be added to. + * \param $db Type: PDO. The database connection of the data source. + */ + function __construct($ands_response_doc, $metadata_node, $db) { + parent::__construct($ands_response_doc, $metadata_node); + $this->db = $db; + } + + + /** + * This is the general entrence of creating actual content. It calls different functions for different type of RIF-CS model. + * When anything goes wrong, e.g. found no record, or $set_name is not recognised, an exception will be thrown. + * And for this implementation, data are stored in a database therefore a PDO is needed. But the source can be any. + * + * \param $set_name Type: string. The name of set is going to be created. Can be one of activity, collection or party. + * \param $key Type: string. The main identifier used in ANDS system. There can be other identifier. + * + * \see create_activity, create_collection, create_party + */ + function create_obj_node($set_name, $key) { + $db = $this->db; + $set_name = strtolower($set_name); + if (in_array($set_name,prepare_set_names())) { + try { + // Get ori_id and which the original table is: + $query = "select ori_table_name, ori_id from oai_headers where oai_identifier = '".$key."'"; + $res = exec_pdo_query($db, $query); + $record = $res->fetch(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + echo "$key returned no record.\n"; + echo $e->getMessage(); + } + + $processor = 'create_'.substr($set_name,6); + $this->create_regObject(REG_OBJ_GROUP, $key, MY_URI); + $this->$processor($record['ori_table_name'],$record['ori_id']); + $this->create_identifier_node($key); + $this->create_identifier_node('table='.$record['ori_table_name'].'+id='.$record['ori_id']); + } else { + throw new Exception('Wrong set name was used: '.$set_name); + } + } + + /** The processor for creating metadata node of Activity. Called from create_obj_node. + * \param $table_name Type: string. The table name will be used to retrieve data from. + * \param $id_project Type: integer. Internal project id associated to this activity-project. + * \see Function create_obj_node. + */ + private function create_activity($table_name, $id_project) { + $db = $this->db; +# // Get ori_id and which the original table is: +# $query = "select ori_table_name, ori_id from oai_headers where oai_identifier = '".$key."'"; +# $res = exec_pdo_query($db, $query); +# $record = $res->fetch(PDO::FETCH_ASSOC); +# // $id_project will e used later, so save it: +# $id_project = $record['ori_id']; + // Get the content using the previously obtained infor: + $query = sprintf("select inter_no,start_date, end_date,pub_descrip from %s where id_project = %s",$table_name,$id_project); + + try { + $res = exec_pdo_query($db,$query); + $record = $res->fetch(PDO::FETCH_ASSOC); + } catch (Exception $e) { + echo $e->getMessage(); + } + + $this->create_rifcs_node('activity','project'); + $c = $this->create_name_node(); + $this->create_namePart($c,'The Plant Accelerator Project '.$record['inter_no']); +// Test codes for rich format. +# // \n works +# $this->create_description_node(sprintf("Line one:%s,\nLine two:%s.\nThird",'a','b')); + $this->create_description_node(str_replace("\r\n","\n",$record['pub_descrip'])); + + $this->create_description_node('The experiment was carried out between '.$record['start_date'].' and '.$record['end_date'],'note'); + $query = sprintf("select idr,stype from list_prj_ids_v2(%d) where stype in ('dataset','person')",$id_project); + // echo $query; + try { + $res = $db->query($query,PDO::FETCH_ASSOC); + if ($res==false) { + throw new Exception($query."\nIt found nothing.\n"); + } + foreach ($res as $record) { + switch ($record['stype']) { + case 'dataset': + $this->create_relatedObject($record['idr'],'hasOutput'); + break; + case 'person': + $this->create_relatedObject($record['idr'],'isManagedBy'); + break; + } + } + // The Plant Accelerator always participates in Activity + $this->create_relatedObject('0874ad60-ab4d-11df-aebd-0002a5d5c51b','hasParticipant'); + } catch (PDOException $e) { + process_pdo_error($query, $e); + }// end of try-catch block + } // end of function create_activity($key, $id_project) + + /** The processor for creating metadata node of Collection. Called from create_obj_node. + * \param $table_name Type: string. The table name will be used to retrieve data from. + * \param $id_collect Type: integer. Internal collection id associated to this collection-dataset. + * \see Function create_obj_node. + */ + private function create_collection($table_name, $id_collect) { + $db = $this->db; + try { + $query = sprintf("select plant,variety,start_date,end_date,img_freq,anzsrc from %s where id_collect = %s",$table_name,$id_collect); + $res = exec_pdo_query($db, $query); + $dataset = $res->fetch(PDO::FETCH_ASSOC); + + $res = exec_pdo_query($db, $query); + $record = $res->fetch(PDO::FETCH_ASSOC); + + $query = 'select id_rep, inter_no, id_project from tpa_project_ids where id_collect = '.$id_collect; + $res = exec_pdo_query($db, $query); + $prj_info = $res->fetch(PDO::FETCH_ASSOC); + + $query = 'select email from tpa_person where id_rep = '.$prj_info['id_rep']; + $res = exec_pdo_query($db, $query); + $email = $res->fetch(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + echo $query.' was failed\n'; + echo $e->getMessage(); + } + + $this->create_rifcs_node('collection','dataset'); + // Get the project inter_no as the name of this dataset + $c = $this->create_name_node(); + $this->create_namePart($c,'Data set of Plant Accelerator Project '.$prj_info['inter_no']); + + // locatin node: contact person + $l_node = $this->create_location_node(); + $a_node = $this->create_address_node($l_node); + $this->create_e_node($a_node, $email['email']); + // location node: TPA's physical address + $l_node = $this->create_location_node(); + $a_node = $this->create_address_node($l_node); + $this->create_physcial_addr_txt($a_node, 'The Plant Accelerator, Hartley Grove, Urrbrae, SA 5064') ; + // Temporal coverage of colletion + $dates = array(array('date'=>$dataset['start_date'],'type'=>'dateFrom'),array('date'=>$dataset['end_date'],'type'=>'dateTo')); + $this->create_coverage_tempo($dates); + // subject + $this->create_subject_node($dataset['aznsrc']); + // relatedOjbects + $query = sprintf("select idr,stype from list_prj_ids_v2(%d) where stype in ('project','person')",$prj_info['id_project']); + try { + $res = $db->query($query,PDO::FETCH_ASSOC); + if ($res==false) { + throw new Exception($query."\nIt found nothing.\n"); + } + foreach ($res as $record) { + switch ($record['stype']) { + case 'project': + $this->create_relatedObject($record['idr'],'isOutputOf'); + break; + case 'person': + $this->create_relatedObject($record['idr'],'isOwnedBy'); + break; + } + } + } catch (PDOException $e) { + process_pdo_error($query, $e); + }// end of try-catch block + + // right of accessing + $this->create_description_node('For information on rights and access to this dataset, please contact the owner.','accessRights'); + + // image data: + $imgs = ''; $ex_conf = ''; + $dic = array('im_type_rgb'=>'RGB','im_type_nir'=>'NIR','im_type_fir'=>'FIR','im_type_nir_roots'=>'NIR Roots','im_type_fluo'=>'Fluorescence'); + $query = 'select im_type_rgb,im_type_nir,im_type_fir,im_type_nir_roots,im_type_fluo, lines, treatments, replicates, total from ands_collection where id_collect = '. $id_collect; + $res = $db->query($query,PDO::FETCH_ASSOC); + if ($res==false) { + throw new Exception($query."\nIt found nothing.\n"); + } + $info = $res->fetch(); + foreach ($info as $item => $v) { + switch ($item) { + case 'im_type_rgb': + case 'im_type_nir': + case 'im_type_fir': + case 'im_type_nir_roots': + case 'im_type_fluo': + if (!empty($v)) { $imgs .= $dic[$item].', '; } + break; + default: + if (!empty($v)) { $ex_conf .= ' '.$item.' = '.$v.', '; } + break; + } + } + if (empty($imgs)) $imgs = "Images data of RGB, FIR, NIR, NIR Roots and Fluorescence cameras., "; + $imgs = substr($imgs,0,-2); + if (!empty($ex_conf)) $imgs = $imgs."\n".substr($ex_conf,0,-2); + $this->create_description_node($imgs); + // imaging frequency + $this->create_description_node('Imaging frequency: '.$dataset['img_freq'],'note'); + } // end of function create_collection($key,$id_collect) + + /** The processor for creating metadata node of Party. Called from create_obj_node. As party-person is different to party-group, there are two sub-functions are called accordingly. + * \param $table_name Type: string. The table name will be used to retrieve data from. + * \param $id_party Type: integer. Internal party id associated to this party. + * \see Function create_obj_node. + */ + private function create_party($table_name, $id_party) { + $db = $this->db; + $query = sprintf("SELECT set_type FROM oai_headers WHERE ori_table_name = '%s' AND ori_id = %s",$table_name,$id_party); + $res = exec_pdo_query($db, $query); + $party_type = $res->fetch(PDO::FETCH_ASSOC); + + if (in_array($party_type['set_type'],array('person','group'))) { + $this->create_rifcs_node('party',$party_type['set_type']); + + if ($party_type['set_type']=='person') { + $this->create_person($table_name, $id_party); + } elseif ($party_type['set_type']=='group') { + $this->create_group($table_name, $id_party); } + } else { + throw new Exception('Unsupported set_type: '.$party_type['set_type']); + } + } // end of function create_part($key,$id_party) + + /** The processor for creating metadata node of Party. Called from create_obj_node. As party-person is different to party-group, there are two sub-functions are called accordingly. + * \param $table_name Type: string. The table name will be used to retrieve data from. + * \param $id_party Type: integer. Internal party id associated to this party-person. + * \see Function create_party. + */ + private function create_person($table_name, $id_party) { + $db = $this->db; + $query = sprintf("SELECT id_org, title, first_name, family_name, tel, fax, email, www, address, post_code, city,state,country,duty FROM %s WHERE id_rep = %s",$table_name, $id_party); + $res = exec_pdo_query($db, $query); + $info = $res->fetch(PDO::FETCH_ASSOC); + $c = $this->create_name_node(); + if (!empty($info['title'])) $this->create_namePart($c,$info['title'],'title'); + $this->create_namePart($c,$info['family_name'],'family'); + $this->create_namePart($c,$info['first_name'],'given'); + + // locatin node: contact person + $l_node = $this->create_location_node(); + $a_node = $this->create_address_node($l_node); + $this->create_e_node($a_node, $info['email']); + if (!empty($info['www'])) $this->create_e_node($a_node, $info['www'],'url'); + $this->create_physcial_fone_fax($a_node, $info['tel'],'telephoneNumber'); + if (!empty($info['fax'])) $this->create_physcial_fone_fax($a_node, $info['fax'],'faxNumber'); + $add_txt = trim($info['address']).', '.$info['city'].' '.$info['state'].' '.$info['post_code'].', '.$info['country']; + // the strlength of ', , ' is 6 + if (strlen($add_txt)>6) $this->create_physcial_addr_txt($a_node,$add_txt); + + // related objects: + // their group: id_customer is a foreign key of tpa_organisation + $query = sprintf("SELECT get_identifier('tpa_organisation',%s)",$info['id_org']); + $res = exec_pdo_query($db, $query); + $info = $res->fetch(PDO::FETCH_NUM); + $this->create_relatedObject($info[0],'isMemberOf'); + + // their activities + $query = "SELECT list_persons_objs($id_party,'project')"; + $res = exec_pdo_query($db, $query); + $info = $res->fetch(PDO::FETCH_NUM); + foreach ($info as $item) { + $this->create_relatedObject($item,'isManagerOf'); + } + // their collections + $query = "SELECT list_persons_objs($id_party,'dataset')"; + $res = exec_pdo_query($db, $query); + $info = $res->fetch(PDO::FETCH_NUM); + foreach ($info as $item) { + $this->create_relatedObject($item,'isOwnerOf'); + } + } + + /** The processor for creating metadata node of Party. Called from create_obj_node. As party-person is different to party-group, there are two sub-functions are called accordingly. + * \param $table_name Type: string. The table name will be used to retrieve data from. + * \param $id_party Type: integer. Internal party id associated to this party-group. + * \see Function create_party. + */ + private function create_group($table_name, $id_party) { + $db = $this->db; + // echo 'table: ',$table_name,' party: ',$id_party,"\n"; + $query = sprintf("SELECT customer_name, abn, post_code, address, city, state, country, tel, fax, email, www, description FROM %s WHERE id_org = %s",$table_name, $id_party); + //echo $query; + $res = exec_pdo_query($db, $query); + $info = $res->fetch(PDO::FETCH_ASSOC); + $c = $this->create_name_node(); + $this->create_namePart($c,$info['customer_name']); + if (!empty($info['abn'])) $this->create_identifier_node($info['abn'],'abn'); + + if (!empty($info['description'])) $this->create_description_node($info['description']); + + $l_node = $this->create_location_node(); + $a_node = $this->create_address_node($l_node); + $this->create_physcial_fone_fax($a_node, $info['tel'],'telephoneNumber'); + $this->create_physcial_fone_fax($a_node, $info['fax'],'faxNumber'); + $add_txt = trim($info['address']).', '.$info['city'].' '.$info['state'].' '.$info['post_code'].', '.$info['country']; + $this->create_physcial_addr_txt($a_node,$add_txt); + + // related objects: + // their members: + $query = "SELECT list_pub_members($id_party)"; + $res = exec_pdo_query($db, $query); + $info = $res->fetch(PDO::FETCH_NUM); + foreach ($info as $item) { + $this->create_relatedObject($item,'hasMember'); + } + } +} // end of class ANDS_TPA + diff --git a/doc/ands__rifcs_8php.html b/doc/ands__rifcs_8php.html new file mode 100644 index 0000000..8ba6b63 --- /dev/null +++ b/doc/ands__rifcs_8php.html @@ -0,0 +1,79 @@ + + + + + +OAI PHP: ands_rifcs.php File Reference + + + + + + + + + +
+

ands_rifcs.php File Reference

+

classes related to generating RIF-CS XML response file for ANDS. +More...

+ + + + +

Classes

class  ANDS_RIFCS
 For creating RIF-CS metadata to meet the requirement of ANDS. More...
+

Detailed Description

+

Generate RIF-CS set records of Activity, Collection, Party.

+
    +
  • They are closely bounded to ANDS requirements, need to know the database for getting information.
  • +
+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/ands__tpa_8php.html b/doc/ands__tpa_8php.html new file mode 100644 index 0000000..1e1f223 --- /dev/null +++ b/doc/ands__tpa_8php.html @@ -0,0 +1,75 @@ + + + + + +OAI PHP: ands_tpa.php File Reference + + + + + + + + + +
+

ands_tpa.php File Reference

+

Classes related to generating RIF-CS XML response file for ANDS from repository. It also serves as an exmaple how class ANDS_RIFCS can be used in a particular case. +More...

+ + + + +

Classes

class  ANDS_TPA
 For creating RIF-CS metadata to meet the requirement of ANDS. More...
+

Detailed Description

+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/annotated.html b/doc/annotated.html new file mode 100644 index 0000000..a6439e8 --- /dev/null +++ b/doc/annotated.html @@ -0,0 +1,74 @@ + + + + + +OAI PHP: Class List + + + + + + + + + +
+

Class List

Here are the classes, structs, unions and interfaces with brief descriptions: + + + + + +
ANDS_Error_XML
ANDS_Response_XML
ANDS_RIFCSFor creating RIF-CS metadata to meet the requirement of ANDS
ANDS_TPAFor creating RIF-CS metadata to meet the requirement of ANDS
ANDS_XML
+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/classANDS__Error__XML-members.html b/doc/classANDS__Error__XML-members.html new file mode 100644 index 0000000..3d76ea4 --- /dev/null +++ b/doc/classANDS__Error__XML-members.html @@ -0,0 +1,73 @@ + + + + + +OAI PHP: Member List + + + + + + + + + +
+

ANDS_Error_XML Member List

This is the complete list of members for ANDS_Error_XML, including all inherited members. + + + + + +
$docANDS_XML
ANDS_XML::__construct($par_array)ANDS_XML
addChild($mom_node, $name, $value='')ANDS_XML
create_request($par_array)ANDS_XML
display()ANDS_XML
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/classANDS__Error__XML.html b/doc/classANDS__Error__XML.html new file mode 100644 index 0000000..49119bc --- /dev/null +++ b/doc/classANDS__Error__XML.html @@ -0,0 +1,87 @@ + + + + + +OAI PHP: ANDS_Error_XML Class Reference + + + + + + + + + +
+

ANDS_Error_XML Class Reference

+Inheritance diagram for ANDS_Error_XML:
+
+
+ + +ANDS_XML + +
+
+ +

List of all members.

+ +
+

Detailed Description

+

Generate an XML response when a request cannot be finished

+

It has only one derived member function

+
The documentation for this class was generated from the following file: +
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/classANDS__Error__XML.png b/doc/classANDS__Error__XML.png new file mode 100644 index 0000000..87a08aa Binary files /dev/null and b/doc/classANDS__Error__XML.png differ diff --git a/doc/classANDS__RIFCS-members.html b/doc/classANDS__RIFCS-members.html new file mode 100644 index 0000000..2901380 --- /dev/null +++ b/doc/classANDS__RIFCS-members.html @@ -0,0 +1,89 @@ + + + + + +OAI PHP: Member List + + + + + + + + + +
+

ANDS_RIFCS Member List

This is the complete list of members for ANDS_RIFCS, including all inherited members. + + + + + + + + + + + + + + + + + + + + + +
$oai_pmhANDS_RIFCS [protected]
$working_nodeANDS_RIFCS [protected]
__construct($ands_response_doc, $metadata_node)ANDS_RIFCS
addChild($mom_node, $name, $value='')ANDS_RIFCS [protected]
create_address_node($location_node)ANDS_RIFCS [protected]
create_coverage_tempo($values)ANDS_RIFCS [protected]
create_coverage_tempo_date($t, $value)ANDS_RIFCS [private]
create_description_node($value, $des_type='brief')ANDS_RIFCS [protected]
create_e_node($addr_node, $e_node, $e_type= 'email')ANDS_RIFCS [protected]
create_identifier_node($key, $i_type='local')ANDS_RIFCS [protected]
create_location_node()ANDS_RIFCS [protected]
create_name_node($name_type= 'primary')ANDS_RIFCS [protected]
create_namePart($name_node, $value, $part_type= '')ANDS_RIFCS [protected]
create_physcial_addr_txt($addr_node, $txt_addr, $phys_type='streetAddress')ANDS_RIFCS [protected]
create_physcial_fone_fax($addr_node, $number, $fone_fax='telephoneNumber')ANDS_RIFCS [protected]
create_regObject($group, $key, $originatingSource)ANDS_RIFCS [protected]
create_regObjects()ANDS_RIFCS [protected]
create_relatedObject($key, $relation_type)ANDS_RIFCS [protected]
create_rifcs_node($set_name, $set_type)ANDS_RIFCS [protected]
create_spatial_node($location_node, $value= '138.6396,-34.97063', $sp_type= 'kmlPolyCoords')ANDS_RIFCS [protected]
create_subject_node($value, $subject_type= 'anzsrc-for')ANDS_RIFCS [protected]
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/classANDS__RIFCS.html b/doc/classANDS__RIFCS.html new file mode 100644 index 0000000..4b9a6f0 --- /dev/null +++ b/doc/classANDS__RIFCS.html @@ -0,0 +1,808 @@ + + + + + +OAI PHP: ANDS_RIFCS Class Reference + + + + + + + + + +
+

ANDS_RIFCS Class Reference

+

For creating RIF-CS metadata to meet the requirement of ANDS. +More...

+
+Inheritance diagram for ANDS_RIFCS:
+
+
+ + +ANDS_TPA + +
+
+ +

List of all members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

 __construct ($ands_response_doc, $metadata_node)

Protected Member Functions

 addChild ($mom_node, $name, $value='')
 create_regObjects ()
 create_regObject ($group, $key, $originatingSource)
 create_rifcs_node ($set_name, $set_type)
 create_name_node ($name_type= 'primary')
 create_namePart ($name_node, $value, $part_type= '')
 create_relatedObject ($key, $relation_type)
 create_description_node ($value, $des_type='brief')
 create_identifier_node ($key, $i_type='local')
 create_location_node ()
 create_address_node ($location_node)
 create_e_node ($addr_node, $e_node, $e_type= 'email')
 create_physcial_fone_fax ($addr_node, $number, $fone_fax='telephoneNumber')
 create_physcial_addr_txt ($addr_node, $txt_addr, $phys_type='streetAddress')
 create_spatial_node ($location_node, $value= '138.6396,-34.97063', $sp_type= 'kmlPolyCoords')
 create_coverage_tempo ($values)
 create_subject_node ($value, $subject_type= 'anzsrc-for')

Protected Attributes

 $oai_pmh
 $working_node

Private Member Functions

 create_coverage_tempo_date ($t, $value)
+

Detailed Description

+

Class ANDS_RIFCS provides all essential functionalities for creating ANDS RIF-CS records. The protected member functions are the backbone functions which can be used for creating any ANDS RIF-CS records.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
ANDS_RIFCS::__construct ( ands_response_doc,
metadata_node 
)
+
+
+

Constructor

+
Parameters:
+ + + +
$ands_response_doc ANDS_Response_XML. A XML Doc acts as the parent node.
$metadata_node DOMElement. The meta node which all subsequent nodes will be added to.
+
+
+ +
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ANDS_RIFCS::addChild ( mom_node,
name,
value = '' 
) [protected]
+
+
+

A worker function for easily adding a newly created node to current XML Doc.

+
Parameters:
+ + + + +
$mom_node Type: DOMElement. Node the new child will be attached to.
$name Type: sting. The name of the child node is being added.
$value Type: sting. The text content of the child node is being added. The default is ''.
+
+
+
Returns:
DOMElement. The added child node
+ +
+
+ +
+
+ + + + + + + + +
ANDS_RIFCS::create_regObjects ( )  [protected]
+
+
+

Create a registryObjects node to hold individual registryObject's. This is only a holder node.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ANDS_RIFCS::create_regObject ( group,
key,
originatingSource 
) [protected]
+
+
+

Create a single registryObject node. Each set has its own structure but they all have an attribute of group, a key node and an originatingSource node. The newly created node will be used as the working node.

+
Parameters:
+ + + + +
$group string, group attribute of the new registryObject node .
$key string, key node, used as an identifier.
$originatingSource string, an url of the data provider.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
ANDS_RIFCS::create_rifcs_node ( set_name,
set_type 
) [protected]
+
+
+

RIF-CS node is the content node of RIF-CS metadata node which starts from regObjects. Each set supportted in RIF-CS has its own content model. The created node will be used as the root node of this record for following nodes will be created.

+
Parameters:
+ + + +
$set_name string, the name of set. For ANDS, they are Activity, Party and Collection
$set_type string, the type of set. For example, Activity can have project as a type.
+
+
+ +
+
+ +
+
+ + + + + + + + + +
ANDS_RIFCS::create_name_node ( name_type = 'primary' )  [protected]
+
+
+

Create a top level name node.

+
Parameters:
+ + +
$name_type string. Text for the types, can be either primary or abbreviated. Default: primary
+
+
+
Returns:
DOMElement $added_name_node. The newly created node, it will be used for further expansion by adding namePart.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ANDS_RIFCS::create_namePart ( name_node,
value,
part_type = '' 
) [protected]
+
+
+

Create a namePart of a name node.

+
Parameters:
+ + + + +
$name_node Type: DOMElement. Node of name_node created previously
$value Type: string. Text fror this namePart
$part_type Type: string, used for group:person record. Types can be: titile, given, family
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
ANDS_RIFCS::create_relatedObject ( key,
relation_type 
) [protected]
+
+
+

Create related object. One RIF-CS can have more than one related object nodes, each object is described by one node.

+
Parameters:
+ + + +
$key Type: string. The identifier of the related object.
$relation_type Type: string. Type of relationship.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
ANDS_RIFCS::create_description_node ( value,
des_type = 'brief' 
) [protected]
+
+
+

Create description node. One RIF-CS can have more than one description nodes. Each description node has only one description.

+
Parameters:
+ + + +
$value Type: string. The content of the description.
$des_type Type: string. Type of the description. Types can be brief, full, acessRights and note. Default is 'brief'.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
ANDS_RIFCS::create_identifier_node ( key,
i_type = 'local' 
) [protected]
+
+
+

Create local or other type of identifier inside of RIF-CS metadata node

+
Parameters:
+ + + +
$key Type string. The indentifier itself.
$i_type Type string. Type of identifier. Can be abn, uri, local, etc.. Default is local.
+
+
+ +
+
+ +
+
+ + + + + + + + +
ANDS_RIFCS::create_location_node ( )  [protected]
+
+
+

Location node is a holder node for either address or spatial nodes

+
Returns:
DOMElement node, for adding address or spatial nodes.
+ +
+
+ +
+
+ + + + + + + + + +
ANDS_RIFCS::create_address_node ( location_node )  [protected]
+
+
+

Address node is a holder node for phiscal or electrical nodes.

+
Parameters:
+ + +
$location_node Type: DOMElement. Location node created previously.
+
+
+
Returns:
DOMElement
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ANDS_RIFCS::create_e_node ( addr_node,
e_node,
e_type = 'email' 
) [protected]
+
+
+

Electrical address node. Used for email, url, etc

+
Parameters:
+ + + + +
$addr_node Type: DOMElement. Previously created address node.
$e_node Type: string. The content of the adding node.
$e_type Type: string. Default is email.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ANDS_RIFCS::create_physcial_fone_fax ( addr_node,
number,
fone_fax = 'telephoneNumber' 
) [protected]
+
+
+

Physical node is a holder node for phone or fax nodes.

+
Parameters:
+ + + + +
$addr_node Type: DOMelement. Address node created before to which the new phiscial->addressPart will be attached.
$number Type: string. Telephone or fax number as a string.
$fone_fax Type: string. Either telehoneNumber or faxNumber.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ANDS_RIFCS::create_physcial_addr_txt ( addr_node,
txt_addr,
phys_type = 'streetAddress' 
) [protected]
+
+
+

create address node under location node, either streetAddress or postalAddress. But they are in text (one block) format.

+
Parameters:
+ + + + +
$addr_node Type: DOMelement. Address node created before to which the new phiscial->addressPart will be attached.
$txt_addr string, full street address in text block format
$phys_type string, default is 'streetAddress', can be 'postalAddress'
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ANDS_RIFCS::create_spatial_node ( location_node,
value = '138.6396,
-34.97063' ,
sp_type = 'kmlPolyCoords' 
) [protected]
+
+
+

Create spatial node under a location node.

+
Parameters:
+ + + + +
$location_node Type: DOMElement. Location node where spatial node is being added to.
$value Type: string. The value of spatial information. Default is local latitude and longitude.
$sp_type Type: string. Type of spaitial informaion. Default is kmlPolyCoords.
+
+
+ +
+
+ +
+
+ + + + + + + + + +
ANDS_RIFCS::create_coverage_tempo ( values )  [protected]
+
+
+

Create temporal coverage node for collection or activity records.

+
Parameters:
+ + +
$values Type: 2-D array. The values of temporal coverage. It can has maximal two elements: one from 'dateFrom' and another for 'dateTo'. Either can be ommited according to RIF-CS schema. Each element of $values is an array and has keys: date, type and format. ['date'] is a string represents date. It has to be in W3CDTF or UTC format. ['type'] has to be either 'dateFrom' or 'dateTo'. ['format'] is optional and its default is 'W3CDTF'. UTC format requires date has to be in UTC: dateTtimeZ. It throws an exception if the input parameter is not an array.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
ANDS_RIFCS::create_coverage_tempo_date ( t,
value 
) [private]
+
+
+

Create temporal coverage node for collection or activity records.

+
Parameters:
+ + + +
$t Type: DOMElement. The <coverage><temporal/></coverage> node to which <date> nodes will be attached to.
$value Type: array. The value of temporal coverage. It has maxmimal three elements with keys: type, date and format. It throws an exception if the input parameter is not an array.
+
+
+
See also:
create_coverage_tempo
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
ANDS_RIFCS::create_subject_node ( value,
subject_type = 'anzsrc-for' 
) [protected]
+
+
+

Create a subject node for a researcher, project, project, etc

+
Parameters:
+ + + +
$value Type: string. A string representing the new namePart.
$subject_type Type: string. A string representing the type of subject. The default value is anzsrc-for.
+
+
+ +
+
+

Member Data Documentation

+ +
+
+ + + + +
ANDS_RIFCS::$oai_pmh [protected]
+
+
+

Type: ANDS_Response_XML. Assigned by constructor.

+
See also:
__construct
+ +
+
+ +
+
+ + + + +
ANDS_RIFCS::$working_node [protected]
+
+
+

Type: DOMElement. Assigned by constructor.

+
See also:
__construct
+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/classANDS__RIFCS.png b/doc/classANDS__RIFCS.png new file mode 100644 index 0000000..d691819 Binary files /dev/null and b/doc/classANDS__RIFCS.png differ diff --git a/doc/classANDS__Response__XML-members.html b/doc/classANDS__Response__XML-members.html new file mode 100644 index 0000000..e8e498a --- /dev/null +++ b/doc/classANDS__Response__XML-members.html @@ -0,0 +1,79 @@ + + + + + +OAI PHP: Member List + + + + + + + + + +
+

ANDS_Response_XML Member List

This is the complete list of members for ANDS_Response_XML, including all inherited members. + + + + + + + + + + + +
$docANDS_XML
$verbANDS_Response_XML [protected]
$verbNodeANDS_Response_XML
add2_verbNode($nodeName, $value=null)ANDS_Response_XML
addChild($mom_node, $name, $value='')ANDS_XML
create_header($identifier, $timestamp, $ands_class, $add_to_node=null)ANDS_Response_XML
create_metadata($mom_record_node)ANDS_Response_XML
create_record()ANDS_Response_XML
create_request($par_array)ANDS_XML
create_resumpToken($token, $expirationdatetime, $num_rows, $cursor=null)ANDS_Response_XML
display()ANDS_XML
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/classANDS__Response__XML.html b/doc/classANDS__Response__XML.html new file mode 100644 index 0000000..a0a4d46 --- /dev/null +++ b/doc/classANDS__Response__XML.html @@ -0,0 +1,307 @@ + + + + + +OAI PHP: ANDS_Response_XML Class Reference + + + + + + + + + +
+

ANDS_Response_XML Class Reference

+Inheritance diagram for ANDS_Response_XML:
+
+
+ + +ANDS_XML + +
+
+ +

List of all members.

+ + + + + + + + + + + +

Public Member Functions

 add2_verbNode ($nodeName, $value=null)
 create_record ()
 create_header ($identifier, $timestamp, $ands_class, $add_to_node=null)
 create_metadata ($mom_record_node)
 create_resumpToken ($token, $expirationdatetime, $num_rows, $cursor=null)

Public Attributes

 $verbNode

Protected Attributes

 $verb
+

Detailed Description

+

Generate an XML response to a request if no error has occured

+

This is the class to further develop to suits a publication need

+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
ANDS_Response_XML::add2_verbNode ( nodeName,
value = null 
)
+
+
+

Add direct child nodes to verb node (OAI-PMH), e.g. response to ListMetadataFormats. Different verbs can have different required child nodes.

+
See also:
create_record, create_header
+
+http://www.openarchives.org/OAI/2.0/openarchivesprotocol.htm.
+
Parameters:
+ + + +
$nodeName Type: string. The name of appending node.
$value Type: string. The content of appending node.
+
+
+ +
+
+ +
+
+ + + + + + + + +
ANDS_Response_XML::create_record ( ) 
+
+
+

Create an empty <record> node. Other nodes will be appended to it later.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ANDS_Response_XML::create_header ( identifier,
timestamp,
ands_class,
add_to_node = null 
)
+
+
+

Headers are enclosed inside of <record> to the query of ListRecords, ListIdentifiers and etc.

+
Parameters:
+ + + + + +
$identifier Type: string. The identifier string for node <identifier>.
$timestamp Type: timestamp. Timestapme in UTC format for node <datastamp>.
$ands_class Type: mix. Can be an array or just a string. Content of <setSpec>.
$add_to_node Type: DOMElement. Default value is null. In normal cases, $add_to_node is the <record> node created previously. When it is null, the newly created header node is attatched to $this->verbNode. Otherwise it will be attatched to the desired node defined in $add_to_node.
+
+
+ +
+
+ +
+
+ + + + + + + + + +
ANDS_Response_XML::create_metadata ( mom_record_node ) 
+
+
+

Create metadata node for holding metadata. This is always added to <record> node.

+
Parameters:
+ + +
$mom_record_node DOMElement. A node acts as the parent node.
+
+
+
Returns:
$meta_node Type: DOMElement. The newly created registryObject node which will be used for further expansion. metadata node itself is maintained by internally by the Class.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ANDS_Response_XML::create_resumpToken ( token,
expirationdatetime,
num_rows,
cursor = null 
)
+
+
+

If there are too many records request could not finished a resumpToken is generated to let harvester know

+
Parameters:
+ + + + + +
$token Type: string. A random number created somewhere?
$expirationdatetime Type: string. A string representing time.
$num_rows Type: integer. Number of records retrieved.
$cursor Type: string. Cursor can be used for database to retrieve next time.
+
+
+ +
+
+

Member Data Documentation

+ +
+
+ + + + +
ANDS_Response_XML::$verbNode
+
+
+

Type: DOMElement. Verb node itself.

+ +
+
+ +
+
+ + + + +
ANDS_Response_XML::$verb [protected]
+
+
+

Type: string. The verb in the request

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/classANDS__Response__XML.png b/doc/classANDS__Response__XML.png new file mode 100644 index 0000000..06aadb9 Binary files /dev/null and b/doc/classANDS__Response__XML.png differ diff --git a/doc/classANDS__TPA-members.html b/doc/classANDS__TPA-members.html new file mode 100644 index 0000000..55e3ba1 --- /dev/null +++ b/doc/classANDS__TPA-members.html @@ -0,0 +1,96 @@ + + + + + +OAI PHP: Member List + + + + + + + + + +
+

ANDS_TPA Member List

This is the complete list of members for ANDS_TPA, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
$dbANDS_TPA [private]
$oai_pmhANDS_RIFCS [protected]
$working_nodeANDS_RIFCS [protected]
__construct($ands_response_doc, $metadata_node, $db)ANDS_TPA
ANDS_RIFCS::__construct($ands_response_doc, $metadata_node)ANDS_RIFCS
addChild($mom_node, $name, $value='')ANDS_RIFCS [protected]
create_activity($table_name, $id_project)ANDS_TPA [private]
create_address_node($location_node)ANDS_RIFCS [protected]
create_collection($table_name, $id_collect)ANDS_TPA [private]
create_coverage_tempo($values)ANDS_RIFCS [protected]
create_description_node($value, $des_type='brief')ANDS_RIFCS [protected]
create_e_node($addr_node, $e_node, $e_type= 'email')ANDS_RIFCS [protected]
create_group($table_name, $id_party)ANDS_TPA [private]
create_identifier_node($key, $i_type='local')ANDS_RIFCS [protected]
create_location_node()ANDS_RIFCS [protected]
create_name_node($name_type= 'primary')ANDS_RIFCS [protected]
create_namePart($name_node, $value, $part_type= '')ANDS_RIFCS [protected]
create_obj_node($set_name, $key)ANDS_TPA
create_party($table_name, $id_party)ANDS_TPA [private]
create_person($table_name, $id_party)ANDS_TPA [private]
create_physcial_addr_txt($addr_node, $txt_addr, $phys_type='streetAddress')ANDS_RIFCS [protected]
create_physcial_fone_fax($addr_node, $number, $fone_fax='telephoneNumber')ANDS_RIFCS [protected]
create_regObject($group, $key, $originatingSource)ANDS_RIFCS [protected]
create_regObjects()ANDS_RIFCS [protected]
create_relatedObject($key, $relation_type)ANDS_RIFCS [protected]
create_rifcs_node($set_name, $set_type)ANDS_RIFCS [protected]
create_spatial_node($location_node, $value= '138.6396,-34.97063', $sp_type= 'kmlPolyCoords')ANDS_RIFCS [protected]
create_subject_node($value, $subject_type= 'anzsrc-for')ANDS_RIFCS [protected]
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/classANDS__TPA.html b/doc/classANDS__TPA.html new file mode 100644 index 0000000..cd9a634 --- /dev/null +++ b/doc/classANDS__TPA.html @@ -0,0 +1,385 @@ + + + + + +OAI PHP: ANDS_TPA Class Reference + + + + + + + + + +
+

ANDS_TPA Class Reference

+

For creating RIF-CS metadata to meet the requirement of ANDS. +More...

+
+Inheritance diagram for ANDS_TPA:
+
+
+ + +ANDS_RIFCS + +
+
+ +

List of all members.

+ + + + + + + + + + + + +

Public Member Functions

 __construct ($ands_response_doc, $metadata_node, $db)
 create_obj_node ($set_name, $key)

Private Member Functions

 create_activity ($table_name, $id_project)
 create_collection ($table_name, $id_collect)
 create_party ($table_name, $id_party)
 create_person ($table_name, $id_party)
 create_group ($table_name, $id_party)

Private Attributes

 $db
+

Detailed Description

+

Class ANDS_RIFCS provides all essential functionalities for creating ANDS RIF-CS records. The protected member functions are the backbone functions which can be used for creating any ANDS RIF-CS records. At the time of design only data source is database and there is only one set of outputs. Therefore there is only one class has been designed. Ideally, there should be a separated class for creating actual records which reflect data source and data models.

+

Example usage: publish records meet ANDS RIF-CS requirements

+
 $metadata_node = $outputObj->create_metadata($cur_record);
+ $obj_node = new ANDS_TPA($outputObj, $metadata_node, $db);
+ try {
+        $obj_node->create_obj_node($record[$SQL['set']], $identifier);
+ } catch (Exception $e) {
+                echo 'Caught exception: ',  $e->getMessage(), " when adding $identifier\n";
+ } 
+
See also:
Code in action can be seen in record_rif.php
+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ANDS_TPA::__construct ( ands_response_doc,
metadata_node,
db 
)
+
+
+

Constructor The first two parameters are used by its parent class ANDS_RIFCS. The third is its own private property.

+
Parameters:
+ + + + +
$ands_response_doc ANDS_Response_XML. A XML Doc acts as the parent node.
$metadata_node DOMElement. The meta node which all subsequent nodes will be added to.
$db Type: PDO. The database connection of the data source.
+
+
+ +
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
ANDS_TPA::create_obj_node ( set_name,
key 
)
+
+
+

This is the general entrence of creating actual content. It calls different functions for different type of RIF-CS model. When anything goes wrong, e.g. found no record, or $set_name is not recognised, an exception will be thrown. And for this implementation, data are stored in a database therefore a PDO is needed. But the source can be any.

+
Parameters:
+ + + +
$set_name Type: string. The name of set is going to be created. Can be one of activity, collection or party.
$key Type: string. The main identifier used in ANDS system. There can be other identifier.
+
+
+
See also:
create_activity, create_collection, create_party
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
ANDS_TPA::create_activity ( table_name,
id_project 
) [private]
+
+
+

The processor for creating metadata node of Activity. Called from create_obj_node.

+
Parameters:
+ + + +
$table_name Type: string. The table name will be used to retrieve data from.
$id_project Type: integer. Internal project id associated to this activity-project.
+
+
+
See also:
Function create_obj_node.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
ANDS_TPA::create_collection ( table_name,
id_collect 
) [private]
+
+
+

The processor for creating metadata node of Collection. Called from create_obj_node.

+
Parameters:
+ + + +
$table_name Type: string. The table name will be used to retrieve data from.
$id_collect Type: integer. Internal collection id associated to this collection-dataset.
+
+
+
See also:
Function create_obj_node.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
ANDS_TPA::create_party ( table_name,
id_party 
) [private]
+
+
+

The processor for creating metadata node of Party. Called from create_obj_node. As party-person is different to party-group, there are two sub-functions are called accordingly.

+
Parameters:
+ + + +
$table_name Type: string. The table name will be used to retrieve data from.
$id_party Type: integer. Internal party id associated to this party.
+
+
+
See also:
Function create_obj_node.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
ANDS_TPA::create_person ( table_name,
id_party 
) [private]
+
+
+

The processor for creating metadata node of Party. Called from create_obj_node. As party-person is different to party-group, there are two sub-functions are called accordingly.

+
Parameters:
+ + + +
$table_name Type: string. The table name will be used to retrieve data from.
$id_party Type: integer. Internal party id associated to this party-person.
+
+
+
See also:
Function create_party.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
ANDS_TPA::create_group ( table_name,
id_party 
) [private]
+
+
+

The processor for creating metadata node of Party. Called from create_obj_node. As party-person is different to party-group, there are two sub-functions are called accordingly.

+
Parameters:
+ + + +
$table_name Type: string. The table name will be used to retrieve data from.
$id_party Type: integer. Internal party id associated to this party-group.
+
+
+
See also:
Function create_party.
+ +
+
+

Member Data Documentation

+ +
+
+ + + + +
ANDS_TPA::$db [private]
+
+
+

Type: PDO. The database connection of the data source.

+
See also:
__construct.
+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/classANDS__TPA.png b/doc/classANDS__TPA.png new file mode 100644 index 0000000..24a9a6c Binary files /dev/null and b/doc/classANDS__TPA.png differ diff --git a/doc/classANDS__XML-members.html b/doc/classANDS__XML-members.html new file mode 100644 index 0000000..7a15601 --- /dev/null +++ b/doc/classANDS__XML-members.html @@ -0,0 +1,73 @@ + + + + + +OAI PHP: Member List + + + + + + + + + +
+

ANDS_XML Member List

This is the complete list of members for ANDS_XML, including all inherited members. + + + + + +
$docANDS_XML
__construct($par_array)ANDS_XML
addChild($mom_node, $name, $value='')ANDS_XML
create_request($par_array)ANDS_XML
display()ANDS_XML
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/classANDS__XML.html b/doc/classANDS__XML.html new file mode 100644 index 0000000..08f8962 --- /dev/null +++ b/doc/classANDS__XML.html @@ -0,0 +1,223 @@ + + + + + +OAI PHP: ANDS_XML Class Reference + + + + + + + + + +
+

ANDS_XML Class Reference

+Inheritance diagram for ANDS_XML:
+
+
+ + +ANDS_Error_XML +ANDS_Response_XML + +
+
+ +

List of all members.

+ + + + + + + + +

Public Member Functions

 __construct ($par_array)
 addChild ($mom_node, $name, $value='')
 create_request ($par_array)
 display ()

Public Attributes

 $doc
+

Detailed Description

+

A wraper of DOMDocument for data provider

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + +
ANDS_XML::__construct ( par_array ) 
+
+
+

Constructs an ANDS_XML object.

+
Parameters:
+ + +
$par_array Type: array. Array of request parameters for creating an ANDS_XML object.
+
+
+
See also:
create_request.
+ +
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ANDS_XML::addChild ( mom_node,
name,
value = '' 
)
+
+
+

Add a child node to a parent node on a XML Doc: a worker function.

+
Parameters:
+ + + + +
$mom_node Type: DOMNode. The target node.
$name Type: string. The name of child nade is being added
$value Type: string. Text for the adding node if it is a text node.
+
+
+
Returns:
DOMElement $added_node The newly created node, can be used for further expansion. If no further expansion is expected, return value can be igored.
+ +
+
+ +
+
+ + + + + + + + + +
ANDS_XML::create_request ( par_array ) 
+
+
+

Create an OAI request node.

+
Parameters:
+ + +
$par_array Type: array The attributes of a request node. They describe the verb of the request and other associated parameters used in the request. Keys of the array define attributes, and values are their content.
+
+
+ +
+
+ +
+
+ + + + + + + + +
ANDS_XML::display ( ) 
+
+
+

Display a doc in a readable, well-formatted way for display or saving

+ +
+
+

Member Data Documentation

+ +
+
+ + + + +
ANDS_XML::$doc
+
+
+

Type: DOMDocument. Handle of current XML Document object

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/classANDS__XML.png b/doc/classANDS__XML.png new file mode 100644 index 0000000..f513229 Binary files /dev/null and b/doc/classANDS__XML.png differ diff --git a/doc/classDB__OP-members.html b/doc/classDB__OP-members.html new file mode 100644 index 0000000..91a7942 --- /dev/null +++ b/doc/classDB__OP-members.html @@ -0,0 +1,80 @@ + + + + + +Data Centre: Member List + + + + + + + + + +
+

DB_OP Member List

This is the complete list of members for DB_OP, including all inherited members. + + + + + + + + + + + + + + +
__construct($params)DB_OP
_connect_string()DB_OP [private]
_error_message()DB_OP [private]
affected_rows()DB_OP
close()DB_OP
db_connect()DB_OP [private]
db_pconnect()DB_OP [private]
display_error($error= '', $swap= '', $native=FALSE)DB_OP
initialize()DB_OP [private]
load_rdriver()DB_OP
query($sql, $return_object=FALSE)DB_OP
reconnect()DB_OP
select($table, $select=array('*'))DB_OP
simple_query($sql)DB_OP
+ + + + +
+ +
+ +
Generated on Fri May 27 09:42:03 2011 for Data Centre by  + +doxygen 1.6.3
+ + diff --git a/doc/classDB__OP.html b/doc/classDB__OP.html new file mode 100644 index 0000000..8baed4f --- /dev/null +++ b/doc/classDB__OP.html @@ -0,0 +1,440 @@ + + + + + +Data Centre: DB_OP Class Reference + + + + + + + + + +
+

DB_OP Class Reference

+

A wrapper class of normally used PostgreSQL operations. +More...

+ +

List of all members.

+ + + + + + + + + + + + + + + + + +

Public Member Functions

 __construct ($params)
 reconnect ()
 affected_rows ()
 select ($table, $select=array('*'))
 simple_query ($sql)
 query ($sql, $return_object=FALSE)
 load_rdriver ()
 close ()
 display_error ($error= '', $swap= '', $native=FALSE)

Private Member Functions

 initialize ()
 _connect_string ()
 db_connect ()
 db_pconnect ()
 _error_message ()
+

Detailed Description

+

This class is used to construct database connection to a PostgreSQL database. It also includes some basic operation to database. This can be a template for future development of connecting to other databases

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + +
DB_OP::__construct ( params ) 
+
+
+

Constructor. Accepts one parameter containing the database connection settings.

+
Parameters:
+ + +
array 
+
+
+ +
+
+

Member Function Documentation

+ +
+
+ + + + + + + + +
DB_OP::initialize ( )  [private]
+
+
+

Initialize Database Settings. Called by the constructor.

+
Parameters:
+ + +
void 
+
+
+
Returns:
boolean. TRUE for successful initialisation. FALSE otherwise.
+ +
+
+ +
+
+ + + + + + + + +
DB_OP::_connect_string ( )  [private]
+
+
+

Construct connection string

+
Returns:
string
+ +
+
+ +
+
+ + + + + + + + +
DB_OP::db_connect ( )  [private]
+
+
+

Non-persistent database connection

+
Returns:
resource
+ +
+
+ +
+
+ + + + + + + + +
DB_OP::db_pconnect ( )  [private]
+
+
+

Persistent database connection

+
Returns:
resource
+ +
+
+ +
+
+ + + + + + + + +
DB_OP::reconnect ( ) 
+
+
+

Reconnect

+

Keep / reestablish the db connection if no queries have been sent for a length of time exceeding the server's idle timeout

+
Returns:
void
+ +
+
+ +
+
+ + + + + + + + +
DB_OP::affected_rows ( ) 
+
+
+

Affected Rows

+
Returns:
integer
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
DB_OP::select ( table,
select = array('*') 
)
+
+
+

Generates the SELECT portion of the query when multiple fileds are needed

+
Parameters:
+ + + +
$table Type: string.
$select Type: array.
+
+
+
Returns:
string
+ +
+
+ +
+
+ + + + + + + + + +
DB_OP::simple_query ( sql ) 
+
+
+

Simple Query This function is used for client script will process result. Or running transaction commands since they do not require all the features of the main query() function.

+
Parameters:
+ + +
string the sql query
+
+
+
Returns:
resource
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
DB_OP::query ( sql,
return_object = FALSE 
)
+
+
+

Execute the query

+

Accepts an SQL string as input and returns a result object upon successful execution of a "read" type query. Returns boolean TRUE upon successful execution of a "write" type query. Returns boolean FALSE upon failure.

+
Parameters:
+ + + +
string An SQL query string
array An array of binding data
+
+
+
Returns:
mixed
+ +
+
+ +
+
+ + + + + + + + +
DB_OP::load_rdriver ( ) 
+
+
+

Load the result drivers

+
Returns:
string the name of the result class
+ +
+
+ +
+
+ + + + + + + + +
DB_OP::close ( ) 
+
+
+

Close database connection

+
Returns:
void
+ +
+
+ +
+
+ + + + + + + + +
DB_OP::_error_message ( )  [private]
+
+
+

The error message string

+
Returns:
string
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
DB_OP::display_error ( error = '',
swap = '',
native = FALSE 
)
+
+
+

Display an error message in some format

+
Parameters:
+ + + + +
string the error message
string any "swap" values
boolean whether to localize the message
+
+
+
Returns:
string sends the application/error_db.php template
+ +
+
+
The documentation for this class was generated from the following file:
    +
  • db_comm.php
  • +
+
+ + + + +
+ +
+ +
Generated on Fri May 27 09:42:03 2011 for Data Centre by  + +doxygen 1.6.3
+ + diff --git a/doc/classDB__Result-members.html b/doc/classDB__Result-members.html new file mode 100644 index 0000000..bcc85d8 --- /dev/null +++ b/doc/classDB__Result-members.html @@ -0,0 +1,81 @@ + + + + + +Data Centre: Member List + + + + + + + + + +
+

DB_Result Member List

This is the complete list of members for DB_Result, including all inherited members. + + + + + + + + + + + + + + + +
_data_seek($n=0)DB_Result
first_row($type= 'object')DB_Result
free_result()DB_Result
last_row($type= 'object')DB_Result
list_fields()DB_Result
next_row($type= 'object')DB_Result
previous_row($type= 'object')DB_Result
reset_result($r_id)DB_Result
result($type= 'object')DB_Result
result_array()DB_Result
result_object()DB_Result
row($n=0, $type= 'object')DB_Result
row_array($n=0)DB_Result
row_object($n=0)DB_Result
set_row($key, $value=NULL)DB_Result
+ + + + +
+ +
+ +
Generated on Fri May 27 09:42:03 2011 for Data Centre by  + +doxygen 1.6.3
+ + diff --git a/doc/classDB__Result.html b/doc/classDB__Result.html new file mode 100644 index 0000000..af1d9f9 --- /dev/null +++ b/doc/classDB__Result.html @@ -0,0 +1,434 @@ + + + + + +Data Centre: DB_Result Class Reference + + + + + + + + + +
+

DB_Result Class Reference

+

List of all members.

+ + + + + + + + + + + + + + + + + +

Public Member Functions

 result ($type= 'object')
 result_object ()
 result_array ()
 row ($n=0, $type= 'object')
 set_row ($key, $value=NULL)
 row_object ($n=0)
 row_array ($n=0)
 first_row ($type= 'object')
 last_row ($type= 'object')
 next_row ($type= 'object')
 previous_row ($type= 'object')
 list_fields ()
 free_result ()
 reset_result ($r_id)
 _data_seek ($n=0)
+

Detailed Description

+

Database Result Class

+

This is a wrapper of normal result operations for PostgreSQL. Two types of results are dealt here: object and array

+

Member Function Documentation

+ +
+
+ + + + + + + + + +
DB_Result::result ( type = 'object' ) 
+
+
+

Query result. Acts as a wrapper function for the following functions.

+

public

+
Parameters:
+ + +
string can be "object" or "array"
+
+
+
Returns:
mixed either a result object or array
+ +
+
+ +
+
+ + + + + + + + +
DB_Result::result_object ( ) 
+
+
+

Query result. "object" version.

+

public

+
Returns:
object
+ +
+
+ +
+
+ + + + + + + + +
DB_Result::result_array ( ) 
+
+
+

Query result. "array" version.

+

public

+
Returns:
array
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
DB_Result::row ( n = 0,
type = 'object' 
)
+
+
+

Query result. Acts as a wrapper function for the following functions.

+

public

+
Parameters:
+ + + +
string 
string can be "object" or "array"
+
+
+
Returns:
mixed either a result object or array
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
DB_Result::set_row ( key,
value = NULL 
)
+
+
+

Assigns an item into a particular column slot

+

public

+
Returns:
object
+ +
+
+ +
+
+ + + + + + + + + +
DB_Result::row_object ( n = 0 ) 
+
+
+

Returns a single result row - object version

+

public

+
Returns:
object
+ +
+
+ +
+
+ + + + + + + + + +
DB_Result::row_array ( n = 0 ) 
+
+
+

Returns a single result row - array version

+

public

+
Returns:
array
+ +
+
+ +
+
+ + + + + + + + + +
DB_Result::first_row ( type = 'object' ) 
+
+
+

Returns the "first" row

+

public

+
Returns:
object
+ +
+
+ +
+
+ + + + + + + + + +
DB_Result::last_row ( type = 'object' ) 
+
+
+

Returns the "last" row

+

public

+
Returns:
object
+ +
+
+ +
+
+ + + + + + + + + +
DB_Result::next_row ( type = 'object' ) 
+
+
+

Returns the "next" row

+

public

+
Returns:
object
+ +
+
+ +
+
+ + + + + + + + + +
DB_Result::previous_row ( type = 'object' ) 
+
+
+

Returns the "previous" row

+

public

+
Returns:
object
+ +
+
+ +
+
+ + + + + + + + +
DB_Result::list_fields ( ) 
+
+
+

Fetch Field Names

+

Generates an array of column names

+

public

+
Returns:
array
+ +
+
+ +
+
+ + + + + + + + +
DB_Result::free_result ( ) 
+
+
+

Free the result

+
Returns:
void
+ +
+
+ +
+
+ + + + + + + + + +
DB_Result::reset_result ( r_id ) 
+
+
+

Reset current DB_Result object

+
Returns:
void
+ +
+
+ +
+
+ + + + + + + + + +
DB_Result::_data_seek ( n = 0 ) 
+
+
+

Data Seek

+

Moves the internal pointer to the desired offset. We call this internally before fetching results to make sure the result set starts at zero

+

private

+
Returns:
array
+ +
+
+
The documentation for this class was generated from the following file:
    +
  • DB_Result.php
  • +
+
+ + + + +
+ +
+ +
Generated on Fri May 27 09:42:03 2011 for Data Centre by  + +doxygen 1.6.3
+ + diff --git a/doc/classProject-members.html b/doc/classProject-members.html new file mode 100644 index 0000000..6be4bab --- /dev/null +++ b/doc/classProject-members.html @@ -0,0 +1,68 @@ + + + + + +Data Centre: Member List + + + + + + + + + +
+

Project Member List

This is the complete list of members for Project, including all inherited members. + +
__construct($db, $dummy)Project
+ + + + +
+ +
+ +
Generated on Fri May 27 09:56:48 2011 for Data Centre by  + +doxygen 1.6.3
+ + diff --git a/doc/classProject.html b/doc/classProject.html new file mode 100644 index 0000000..9d5689e --- /dev/null +++ b/doc/classProject.html @@ -0,0 +1,123 @@ + + + + + +Data Centre: Project Class Reference + + + + + + + + + +
+

Project Class Reference

+Inheritance diagram for Project:
+
+
+ + +TPA_Project + +
+
+ +

List of all members.

+ + + +

Public Member Functions

 __construct ($db, $dummy)
+

Detailed Description

+

Abstract class defines the way to get project related informaion

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
Project::__construct ( db,
dummy 
)
+
+
+

Conctructor

+
Parameters:
+ + + +
$db Type: string. A well defined connection string for PostgreSQL database
$dummy anything Description blabla
+
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + +
+ +
+ +
Generated on Fri May 27 09:56:48 2011 for Data Centre by  + +doxygen 1.6.3
+ + diff --git a/doc/classProject.png b/doc/classProject.png new file mode 100644 index 0000000..4344088 Binary files /dev/null and b/doc/classProject.png differ diff --git a/doc/classTPA__Project-members.html b/doc/classTPA__Project-members.html new file mode 100644 index 0000000..b12e444 --- /dev/null +++ b/doc/classTPA__Project-members.html @@ -0,0 +1,72 @@ + + + + + +Data Centre: Member List + + + + + + + + + +
+

TPA_Project Member List

This is the complete list of members for TPA_Project, including all inherited members. + + + + + +
__construct($db, $dummy)Project
getImgRegimes()TPA_Project
getObjects()TPA_Project
getOutcomes()TPA_Project
getSummary()TPA_Project
+ + + + +
+ +
+ +
Generated on Fri May 27 09:56:48 2011 for Data Centre by  + +doxygen 1.6.3
+ + diff --git a/doc/classTPA__Project.html b/doc/classTPA__Project.html new file mode 100644 index 0000000..a725b6c --- /dev/null +++ b/doc/classTPA__Project.html @@ -0,0 +1,170 @@ + + + + + +Data Centre: TPA_Project Class Reference + + + + + + + + + +
+

TPA_Project Class Reference

+Inheritance diagram for TPA_Project:
+
+
+ + +Project + +
+
+ +

List of all members.

+ + + + + + +

Public Member Functions

 getSummary ()
 getObjects ()
 getImgRegimes ()
 getOutcomes ()
+

Member Function Documentation

+ +
+
+ + + + + + + + +
TPA_Project::getSummary ( ) 
+
+
+

project id is supplied by global variable $_GET["prj_id"]

+
Returns:
Type: mixed
+ +

Reimplemented from Project.

+ +
+
+ +
+
+ + + + + + + + +
TPA_Project::getObjects ( ) 
+
+
+

Retrieve stuided plant of a project

+ +

Reimplemented from Project.

+ +
+
+ +
+
+ + + + + + + + +
TPA_Project::getImgRegimes ( ) 
+
+
+

ImagingRegime

+ +

Reimplemented from Project.

+ +
+
+ +
+
+ + + + + + + + +
TPA_Project::getOutcomes ( ) 
+
+
+

Outcome

+ +

Reimplemented from Project.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + +
+ +
+ +
Generated on Fri May 27 09:56:48 2011 for Data Centre by  + +doxygen 1.6.3
+ + diff --git a/doc/classTPA__Project.png b/doc/classTPA__Project.png new file mode 100644 index 0000000..5a0cd94 Binary files /dev/null and b/doc/classTPA__Project.png differ diff --git a/doc/classes.html b/doc/classes.html new file mode 100644 index 0000000..232e3ab --- /dev/null +++ b/doc/classes.html @@ -0,0 +1,71 @@ + + + + + +OAI PHP: Alphabetical List + + + + + + + + + +
+

Class Index

+ +
  A  
+
ANDS_Response_XML   ANDS_RIFCS   ANDS_TPA   ANDS_XML   
ANDS_Error_XML   
+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git "a/doc/doc\\oai__records__mysql.sql-example.html" "b/doc/doc\\oai__records__mysql.sql-example.html" new file mode 100644 index 0000000..9f2de46 --- /dev/null +++ "b/doc/doc\\oai__records__mysql.sql-example.html" @@ -0,0 +1,101 @@ + + + + + +OAI PHP: doc\oai_records_mysql.sql + + + + + + + + + +
+

doc\oai_records_mysql.sql

in doc folder. If your data is organized differently, you have to adjust the Query functions in that file.

+
    +
  • Check oai site through web browser.
      +
    • SELinux needs special treatment.
    • +
    +
  • +
+

+Structure

+

The system includes files for individual functionality and utility classes and functions to get it work.

+ +
Author:
Jianfeng Li
+
Version:
1.1
+
Date:
2010-2011
+
+ + + + +
+ +
+ +
Generated on Thu Jun 2 09:59:47 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/doc_2oai__records__mysql.sql-example.html b/doc/doc_2oai__records__mysql.sql-example.html new file mode 100644 index 0000000..12ee2b7 --- /dev/null +++ b/doc/doc_2oai__records__mysql.sql-example.html @@ -0,0 +1,101 @@ + + + + + +OAI PHP: doc/oai_records_mysql.sql + + + + + + + + + +
+

doc/oai_records_mysql.sql

in doc folder. If your data is organized differently, you have to adjust the Query functions in that file.

+
    +
  • Check oai site through web browser.
      +
    • SELinux needs special treatment.
    • +
    +
  • +
+

+Structure

+

The system includes files for individual functionality and utility classes and functions to get it work.

+ +
Author:
Jianfeng Li
+
Version:
1.1
+
Date:
2010-2011
+
+ + + + +
+ +
+ +
Generated on Thu Jun 2 10:00:05 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/doxygen.css b/doc/doxygen.css new file mode 100644 index 0000000..d6aaf28 --- /dev/null +++ b/doc/doxygen.css @@ -0,0 +1,545 @@ +/* The standard CSS for doxygen */ + +body, table, div, p, dl { + font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; + font-size: 12px; +} + +/* @group Heading Levels */ + +h1 { + text-align: center; + font-size: 150%; +} + +h2 { + font-size: 120%; +} + +h3 { + font-size: 100%; +} + +dt { + font-weight: bold; +} + +div.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; +} + +p.startli, p.startdd, p.starttd { + margin-top: 2px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + padding: 2px; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #153788; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #1b77c5; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #6666cc; + color: #ffffff; + border: 1px double #9295C2; +} + +.contents a.qindexHL:visited { + color: #ffffff; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code { + color: #3030f0; +} + +a.codeRef { + color: #3030f0; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +.fragment { + font-family: monospace, fixed; + font-size: 105%; +} + +pre.fragment { + border: 1px solid #CCCCCC; + background-color: #f5f5f5; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; +} + +div.ah { + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + margin-bottom: 6px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background: white; + color: black; + margin-right: 20px; + margin-left: 20px; +} + +td.indexkey { + background-color: #e8eef2; + font-weight: bold; + border: 1px solid #CCCCCC; + margin: 2px 0px 2px 0; + padding: 2px 10px; +} + +td.indexvalue { + background-color: #e8eef2; + border: 1px solid #CCCCCC; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #f0f0f0; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +/* @end */ + +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #84b0c7; +} + +th.dirtab { + background: #e8eef2; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #666; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #FAFAFA; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memItemLeft, .memItemRight, .memTemplParams { + border-top: 1px solid #ccc; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memTemplParams { + color: #606060; + white-space: nowrap; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtemplate { + font-size: 80%; + color: #606060; + font-weight: normal; + margin-left: 3px; +} + +.memnav { + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.memitem { + padding: 0; + margin-bottom: 10px; +} + +.memname { + white-space: nowrap; + font-weight: bold; + margin-left: 6px; +} + +.memproto { + border-top: 1px solid #84b0c7; + border-left: 1px solid #84b0c7; + border-right: 1px solid #84b0c7; + padding: 0; + background-color: #d5e1e8; + font-weight: bold; + /* firefox specific markup */ + background-image: -moz-linear-gradient(rgba(228, 233, 245, 1.0) 0%, rgba(193, 205, 232, 1.0) 100%); + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 8px; + -moz-border-radius-topleft: 8px; + /* webkit specific markup */ + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(228, 233, 245, 1.0)), to(rgba(193, 205, 232, 1.0))); + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 8px; + -webkit-border-top-left-radius: 8px; + +} + +.memdoc { + border-bottom: 1px solid #84b0c7; + border-left: 1px solid #84b0c7; + border-right: 1px solid #84b0c7; + padding: 2px 5px; + background-color: #eef3f5; + border-top-width: 0; + /* firefox specific markup */ + -moz-border-radius-bottomleft: 8px; + -moz-border-radius-bottomright: 8px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 8px; + -webkit-border-bottom-right-radius: 8px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} + +/* @end */ + +/* @group Directory (tree) */ + +/* for the tree view */ + +.ftvtree { + font-family: sans-serif; + margin: 0.5em; +} + +/* these are for tree view when used as main index */ + +.directory { + font-size: 9pt; + font-weight: bold; +} + +.directory h3 { + margin: 0px; + margin-top: 1em; + font-size: 11pt; +} + +/* +The following two styles can be used to replace the root node title +with an image of your choice. Simply uncomment the next two styles, +specify the name of your image and be sure to set 'height' to the +proper pixel height of your image. +*/ + +/* +.directory h3.swap { + height: 61px; + background-repeat: no-repeat; + background-image: url("yourimage.gif"); +} +.directory h3.swap span { + display: none; +} +*/ + +.directory > h3 { + margin-top: 0; +} + +.directory p { + margin: 0px; + white-space: nowrap; +} + +.directory div { + display: none; + margin: 0px; +} + +.directory img { + vertical-align: -30%; +} + +/* these are for tree view when not used as main index */ + +.directory-alt { + font-size: 100%; + font-weight: bold; +} + +.directory-alt h3 { + margin: 0px; + margin-top: 1em; + font-size: 11pt; +} + +.directory-alt > h3 { + margin-top: 0; +} + +.directory-alt p { + margin: 0px; + white-space: nowrap; +} + +.directory-alt div { + display: none; + margin: 0px; +} + +.directory-alt img { + vertical-align: -30%; +} + +/* @end */ + +address { + font-style: normal; + color: #333; +} + +table.doxtable { + border-collapse:collapse; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #153788; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #254798; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; +} + diff --git a/doc/doxygen.png b/doc/doxygen.png new file mode 100644 index 0000000..f0a274b Binary files /dev/null and b/doc/doxygen.png differ diff --git a/doc/examples.html b/doc/examples.html new file mode 100644 index 0000000..6938b3c --- /dev/null +++ b/doc/examples.html @@ -0,0 +1,64 @@ + + + + + +OAI PHP: Examples + + + + + + + + + +
+

Examples

Here is a list of all examples: +
+ + + + +
+ +
+ +
Generated on Thu Jun 2 10:02:12 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/files.html b/doc/files.html new file mode 100644 index 0000000..a5f6aa5 --- /dev/null +++ b/doc/files.html @@ -0,0 +1,82 @@ + + + + + +OAI PHP: File Index + + + + + + + + + +
+

File List

Here is a list of all documented files with brief descriptions: + + + + + + + + + + + + + + +
ands_rifcs.phpClasses related to generating RIF-CS XML response file for ANDS
ands_tpa.phpClasses related to generating RIF-CS XML response file for ANDS from repository. It also serves as an exmaple how class ANDS_RIFCS can be used in a particular case
getrecord.phpResponse to Verb GetRecord
identify.phpResponse to Verb Identify
index.phpDefault starting point of OAI Data Provider for a human to check
listmetadataformats.phpResponse to Verb ListMetadataFormats
listrecords.phpResponse to Verb ListRecords
listsets.phpResponse to Verb ListSets
oai2.phpOAI Data Provider command processor
oaidp-config.phpConfiguration file of current data provider
oaidp-util.phpUtilities for the OAI Data Provider
record_dc.phpDefinition of Dublin Core handler
record_rif.phpDefinition of RIF-CS handler
xml_creater.phpFunctions and class related to generating XML response file
+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/functions.html b/doc/functions.html new file mode 100644 index 0000000..6a8e618 --- /dev/null +++ b/doc/functions.html @@ -0,0 +1,220 @@ + + + + + +OAI PHP: Class Members + + + + + + + + + +
+Here is a list of all documented class members with links to the class documentation for each member: + +

- $ -

+ + +

- _ -

+ + +

- a -

+ + +

- c -

+ + +

- d -

+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/functions_func.html b/doc/functions_func.html new file mode 100644 index 0000000..fbea310 --- /dev/null +++ b/doc/functions_func.html @@ -0,0 +1,197 @@ + + + + + +OAI PHP: Class Members - Functions + + + + + + + + + +
+  + +

- _ -

+ + +

- a -

+ + +

- c -

+ + +

- d -

+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/functions_vars.html b/doc/functions_vars.html new file mode 100644 index 0000000..bbd05f8 --- /dev/null +++ b/doc/functions_vars.html @@ -0,0 +1,94 @@ + + + + + +OAI PHP: Class Members - Variables + + + + + + + + + +
+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/getrecord_8php.html b/doc/getrecord_8php.html new file mode 100644 index 0000000..8e82cfc --- /dev/null +++ b/doc/getrecord_8php.html @@ -0,0 +1,74 @@ + + + + + +OAI PHP: getrecord.php File Reference + + + + + + + + + +
+

getrecord.php File Reference

+

Response to Verb GetRecord. +More...

+ +
+

Detailed Description

+

Retrieve a record based its identifier.

+

Local variables $metadataPrefix and $identifier need to be provided through global array variable $args by their indexes 'metadataPrefix' and 'identifier'. The reset of information will be extracted from database based those two parameters.

+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/globals.html b/doc/globals.html new file mode 100644 index 0000000..5370e38 --- /dev/null +++ b/doc/globals.html @@ -0,0 +1,255 @@ + + + + + +OAI PHP: Class Members + + + + + + + + + +
+Here is a list of all documented file members with links to the documentation: + +

- $ -

+ + +

- a -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- i -

+ + +

- m -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/globals_enum.html b/doc/globals_enum.html new file mode 100644 index 0000000..0a8af4c --- /dev/null +++ b/doc/globals_enum.html @@ -0,0 +1,94 @@ + + + + + +OAI PHP: Class Members + + + + + + + + + +
+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/globals_func.html b/doc/globals_func.html new file mode 100644 index 0000000..becf275 --- /dev/null +++ b/doc/globals_func.html @@ -0,0 +1,148 @@ + + + + + +OAI PHP: Class Members + + + + + + + + + +
+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/globals_vars.html b/doc/globals_vars.html new file mode 100644 index 0000000..640d71f --- /dev/null +++ b/doc/globals_vars.html @@ -0,0 +1,88 @@ + + + + + +OAI PHP: Class Members + + + + + + + + + +
+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/hierarchy.html b/doc/hierarchy.html new file mode 100644 index 0000000..1111192 --- /dev/null +++ b/doc/hierarchy.html @@ -0,0 +1,78 @@ + + + + + +OAI PHP: Hierarchical Index + + + + + + + + + +
+

Class Hierarchy

This inheritance list is sorted roughly, but not completely, alphabetically: +
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/identify_8php.html b/doc/identify_8php.html new file mode 100644 index 0000000..36354b8 --- /dev/null +++ b/doc/identify_8php.html @@ -0,0 +1,74 @@ + + + + + +OAI PHP: identify.php File Reference + + + + + + + + + +
+

identify.php File Reference

+

Response to Verb Identify. +More...

+ +
+

Detailed Description

+

Tell the world what the data provider is. Usually it is static once the provider has been set up.

+
See also:
http://www.openarchives.org/OAI/2.0/guidelines-oai-identifier.htm for details
+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/index.html b/doc/index.html new file mode 100644 index 0000000..c827bfc --- /dev/null +++ b/doc/index.html @@ -0,0 +1,117 @@ + + + + + +OAI PHP: Main Page + + + + + + + + + +
+

+Introduction

+

This is an implementation for an OAI-PMH 2.0 Data Provider (sometimes, repository is used exchangeablly) written in PHP.

+

This implementation completely complies to OAI-PMH 2.0, including the support of on-the-fly output compression which may significantly reduce the amount of data being transfered.

+

This package has been inspired by PHP OAI Data Provider developed by Heinrich Stamerjohanns at University of Oldenburg. Some of the functions and algorithms used in this code were transplanted from his implementation at http://physnet.uni-oldenburg.de/oai/.

+

Database support is supported through PDO (PHP Data Objects included in the PHP distribution), so almost any popular SQL-database can be used without any change in the code. Only thing need to do is to configure database connection and define a suitable data structure.

+

The repository can be quite easily configured by just editing oaidp-config.php, most possible values and options are explained.

+

+Requirements

+
    +
  • A running web server + PHP version 5.0 or above.
  • +
  • A databse can be connected by PDO.
  • +
+

+Installation

+
    +
  • Copy the the files in source package to a location under your document root of your web server. The directory structure should be preserved.
  • +
  • Change to that directory (e.g. cd /var/www/html/oai).
  • +
  • Allow your webserver to write to the token directory. The default token directory is /tmp which does not need any attention.
  • +
  • Edit oaidp-config.php. Almost all possible options are explained. It is assumed that basic elements of a record are stored in one simple table. You can find sql examples of table definition in doc folder. If your data is organized differently, you have to adjust the Query functions to reflect it and even develop your own code.
  • +
  • Check your oai site through a web browser. e.g. :
     http://localhost/oai/ 
    +
  • +
  • SELinux needs special treatments for database connection and other permission.
  • +
+

+Structure

+

The system includes files for individual functionality and utility classes and functions to get it work.

+
    +
  • Controller +
  • +
  • Individual functionalities:
      +
    • identify.php: identifies the data provider. Responses to Identify.
    • +
    • listmetadataformats.php: lists supported metadata formats, e.g. dc or rif-cs. Responses to ListMetadataFormats.
    • +
    • listsets.php: lists supported sets, e.g. Activity, Collection or Party. Responses to ListSets.
    • +
    • listrecords.php: lists a group of records without details. Responses to ListRecords. It also serves to ListIdentifiers which only returns identifiers.
    • +
    • getrecord.php: gets an individual record. Responses to GetRecord.
    • +
    +
  • +
  • Utility classes +
  • +
  • Utility functions
      +
    • oaidp-util.php
    • +
    • Support to different metadataformats in your own systems. Two examples provided with the package are: record_dc.php and record_rif.php. They are helpers and need information from the real records. They need to be devloped for your particular system.
    • +
    +
  • +
  • Configurations +
  • +
+
Author:
Jianfeng Li
+
Version:
1.1
+
Date:
2010-2011
+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/index_8php.html b/doc/index_8php.html new file mode 100644 index 0000000..1611732 --- /dev/null +++ b/doc/index_8php.html @@ -0,0 +1,73 @@ + + + + + +OAI PHP: index.php File Reference + + + + + + + + + +
+

index.php File Reference

+

Default starting point of OAI Data Provider for a human to check. +More...

+ +
+

Detailed Description

+

OAI Data Provider is not designed for human to retrieve data but it is possible to use this page to test and check the functionality of current implementation. This page provides a summary of the OAI-PMH and the implementation.

+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/installdox b/doc/installdox new file mode 100755 index 0000000..9b89fe0 --- /dev/null +++ b/doc/installdox @@ -0,0 +1,117 @@ +#!/usr/bin/perl + +%subst = ( ); +$quiet = 0; + +if (open(F,"search.cfg")) +{ + $_= ; s/[ \t\n]*$//g ; $subst{"_doc"} = $_; + $_= ; s/[ \t\n]*$//g ; $subst{"_cgi"} = $_; +} + +while ( @ARGV ) { + $_ = shift @ARGV; + if ( s/^-// ) { + if ( /^l(.*)/ ) { + $v = ($1 eq "") ? shift @ARGV : $1; + ($v =~ /\/$/) || ($v .= "/"); + $_ = $v; + if ( /(.+)\@(.+)/ ) { + if ( exists $subst{$1} ) { + $subst{$1} = $2; + } else { + print STDERR "Unknown tag file $1 given with option -l\n"; + &usage(); + } + } else { + print STDERR "Argument $_ is invalid for option -l\n"; + &usage(); + } + } + elsif ( /^q/ ) { + $quiet = 1; + } + elsif ( /^\?|^h/ ) { + &usage(); + } + else { + print STDERR "Illegal option -$_\n"; + &usage(); + } + } + else { + push (@files, $_ ); + } +} + +foreach $sub (keys %subst) +{ + if ( $subst{$sub} eq "" ) + { + print STDERR "No substitute given for tag file `$sub'\n"; + &usage(); + } + elsif ( ! $quiet && $sub ne "_doc" && $sub ne "_cgi" ) + { + print "Substituting $subst{$sub} for each occurence of tag file $sub\n"; + } +} + +if ( ! @files ) { + if (opendir(D,".")) { + foreach $file ( readdir(D) ) { + $match = ".html"; + next if ( $file =~ /^\.\.?$/ ); + ($file =~ /$match/) && (push @files, $file); + ($file =~ "tree.js") && (push @files, $file); + } + closedir(D); + } +} + +if ( ! @files ) { + print STDERR "Warning: No input files given and none found!\n"; +} + +foreach $f (@files) +{ + if ( ! $quiet ) { + print "Editing: $f...\n"; + } + $oldf = $f; + $f .= ".bak"; + unless (rename $oldf,$f) { + print STDERR "Error: cannot rename file $oldf\n"; + exit 1; + } + if (open(F,"<$f")) { + unless (open(G,">$oldf")) { + print STDERR "Error: opening file $oldf for writing\n"; + exit 1; + } + if ($oldf ne "tree.js") { + while () { + s/doxygen\=\"([^ \"\:\t\>\<]*)\:([^ \"\t\>\<]*)\" (href|src)=\"\2/doxygen\=\"$1:$subst{$1}\" \3=\"$subst{$1}/g; + print G "$_"; + } + } + else { + while () { + s/\"([^ \"\:\t\>\<]*)\:([^ \"\t\>\<]*)\", \"\2/\"$1:$subst{$1}\" ,\"$subst{$1}/g; + print G "$_"; + } + } + } + else { + print STDERR "Warning file $f does not exist\n"; + } + unlink $f; +} + +sub usage { + print STDERR "Usage: installdox [options] [html-file [html-file ...]]\n"; + print STDERR "Options:\n"; + print STDERR " -l tagfile\@linkName tag file + URL or directory \n"; + print STDERR " -q Quiet mode\n\n"; + exit 1; +} diff --git a/doc/listmetadataformats_8php.html b/doc/listmetadataformats_8php.html new file mode 100644 index 0000000..f175d3e --- /dev/null +++ b/doc/listmetadataformats_8php.html @@ -0,0 +1,119 @@ + + + + + +OAI PHP: listmetadataformats.php File Reference + + + + + + + + + +
+

listmetadataformats.php File Reference

+

Response to Verb ListMetadataFormats. +More...

+ + + +

Functions

 addMetedataFormat (&$outputObj, $key, $val)
+

Detailed Description

+

The information of supported metadata formats is saved in database and retrieved by calling function idFormatQuery.

+
See also:
idFormatQuery
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
addMetedataFormat (&$  outputObj,
key,
val 
)
+
+
+

Add a metadata format node to an ANDS_Response_XML

+
Parameters:
+ + + + +
&$outputObj type: ANDS_Response_XML. The ANDS_Response_XML object for output.
$key type string. The name of new node.
$val type: array. Values accessable through keywords 'schema' and 'metadataNamespace'.
+
+
+ +
+
+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/listrecords_8php.html b/doc/listrecords_8php.html new file mode 100644 index 0000000..c7ce4bc --- /dev/null +++ b/doc/listrecords_8php.html @@ -0,0 +1,77 @@ + + + + + +OAI PHP: listrecords.php File Reference + + + + + + + + + +
+

listrecords.php File Reference

+

Response to Verb ListRecords. +More...

+ +
+

Detailed Description

+

Lists records according to conditions. If there are too many, a resumptionToken is generated.

+
    +
  • If a request comes with a resumptionToken and is still valid, read it and send back records.
  • +
  • Otherwise, set up a query with conditions such as: 'metadataPrefix', 'from', 'until', 'set'. Only 'metadataPrefix' is compulsory. All conditions are accessible through global array variable $args by keywords.
  • +
+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/listsets_8php.html b/doc/listsets_8php.html new file mode 100644 index 0000000..9ae81af --- /dev/null +++ b/doc/listsets_8php.html @@ -0,0 +1,73 @@ + + + + + +OAI PHP: listsets.php File Reference + + + + + + + + + +
+

listsets.php File Reference

+

Response to Verb ListSets. +More...

+ +
+

Detailed Description

+

Lists what sets are available to records in the system.

+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/oai2_8php.html b/doc/oai2_8php.html new file mode 100644 index 0000000..3b432f7 --- /dev/null +++ b/doc/oai2_8php.html @@ -0,0 +1,130 @@ + + + + + +OAI PHP: oai2.php File Reference + + + + + + + + + +
+

oai2.php File Reference

+

OAI Data Provider command processor. +More...

+ + + + +

Variables

 $errors = array()
 $attribs = array ('from', 'identifier', 'metadataPrefix', 'set', 'resumptionToken', 'until')
+

Detailed Description

+

OAI Data Provider is not designed for human to retrieve data.

+

This is an implementation of OAI Data Provider version 2.0.

+
See also:
http://www.openarchives.org/OAI/2.0/openarchivesprotocol.htm
+

It needs other files:

+ +

It also initiates:

+
    +
  • PDO datbase connection object $db.
  • +
  • ANDS_XML XML document handler $outputObj.
  • +
+
Todo:
Remember: to define your own classess for generating metadata records. In common cases, you have to implement your own code to act fully and correctly. For generic usage, you can try the ANDS_Response_XML defined in xml_creater.php.
+

Variable Documentation

+ +
+
+ + + + +
$errors = array()
+
+
+

An array for collecting erros which can be reported later. It will be checked before a new action is taken.

+ +
+
+ +
+
+ + + + +
$attribs = array ('from', 'identifier', 'metadataPrefix', 'set', 'resumptionToken', 'until')
+
+
+

Supported attributes associate to verbs.

+ +
+
+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/oai__records__mysql.sql-example.html b/doc/oai__records__mysql.sql-example.html new file mode 100644 index 0000000..20d16ae --- /dev/null +++ b/doc/oai__records__mysql.sql-example.html @@ -0,0 +1,101 @@ + + + + + +OAI PHP: oai_records_mysql.sql + + + + + + + + + +
+

oai_records_mysql.sql

in doc folder. If your data is organized differently, you have to adjust the Query functions in that file.

+
    +
  • Check oai site through web browser.
      +
    • SELinux needs special treatment.
    • +
    +
  • +
+

+Structure

+

The system includes files for individual functionality and utility classes and functions to get it work.

+ +
Author:
Jianfeng Li
+
Version:
1.1
+
Date:
2010-2011
+
+ + + + +
+ +
+ +
Generated on Thu Jun 2 10:02:12 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/oai_records_mysql.sql b/doc/oai_records_mysql.sql new file mode 100644 index 0000000..c0ac2d6 --- /dev/null +++ b/doc/oai_records_mysql.sql @@ -0,0 +1,33 @@ +# +# Table structure for table 'oai_records' +# +# This is different to the structure for PostgreSQL to show many structures can be choosen. +# +# +CREATE TABLE oai_records ( + serial int(11) DEFAULT '0' NOT NULL auto_increment, + provider varchar(255), + url varchar(255), + enterdate datetime, + oai_identifier varchar(255), + oai_set varchar(255), + datestamp datetime, + deleted enum('false', 'true') NOT NULL, + dc_title varchar(255), + dc_creator text, + dc_subject varchar(255), + dc_description text, + dc_contributor varchar(255), + dc_publisher varchar(255), + dc_date date, + dc_type varchar(255), + dc_format varchar(255), + dc_identifier varchar(255), + dc_source varchar(255), + dc_language varchar(255), + dc_relation varchar(255), + dc_coverage varchar(255), + dc_rights varchar(255), + PRIMARY KEY (serial) +); + diff --git a/doc/oai_records_pgsql.sql b/doc/oai_records_pgsql.sql new file mode 100644 index 0000000..a86ff89 --- /dev/null +++ b/doc/oai_records_pgsql.sql @@ -0,0 +1,17 @@ +-- +-- Table structure for table 'oai_records' +-- +-- This is different to the structure for MySQL to show many structures can be choosen. +-- + +CREATE TABLE oai_records ( + serial serial, + provider varchar(255), + url varchar(255), + enterdate timestamp, + oai_identifier varchar(255), + oai_set varchar(255), + datestamp timestamp, + deleted boolean default false, + PRIMARY KEY (serial) +); diff --git a/doc/oaidp-config_8php.html b/doc/oaidp-config_8php.html new file mode 100644 index 0000000..128ee4b --- /dev/null +++ b/doc/oaidp-config_8php.html @@ -0,0 +1,237 @@ + + + + + +OAI PHP: oaidp-config.php File Reference + + + + + + + + + +
+

oaidp-config.php File Reference

+

Configuration file of current data provider. +More...

+ + + + + + + + + + + +

Constants

enum  SHOW_QUERY_ERROR
enum  CONTENT_TYPE
enum  MAXRECORDS
enum  MAXIDS
enum  TOKEN_VALID
enum  TOKEN_PREFIX

Variables

 $identifyResponse = array()
 $compression = null
+

Detailed Description

+

This is the configuration file for the PHP OAI Data Provider. Please read through the WHOLE file, there are several things, that need to be adjusted.

+

The response may may be compressed for better performace:

+
    +
  • Compression : a compression encoding supported by the repository. The recommended values are those defined for the Content-Encoding header in Section 14.11 of RFC 2616 describing HTTP 1.1. A compression element should not be included for the identity encoding, which is implied.
  • +
+

Some other used variables:

+
    +
  • $adminEmail: the e-mail addresses of administrators of the repository.
  • +
+ +
    +
  • $SETS: An array with key words . List of supported SETs.
  • +
+
    +
  • $METADATAFORMATS: List of supported metadata formats. It is a two-dimensional array with keys. Each supported format is one element of this array at the first dimension. The key is the name of a metadata format. The exact number of items within each format associated array depends on the nature of a metadata format. Most definitions are done here but handlers themselves are defined in separated files because only the names of PHP script are listed here.
      +
    • metadataPrefix
    • +
    • schema
    • +
    • metadataNamespace
    • +
    • myhandler
    • +
    • other optional items: record_prefix, record_namespace and etc.
    • +
    +
  • +
+
    +
  • $SQL: Settings for database and queries from database
  • +
+
    +
  • $DSN: DSN for connecting your database. Reference PDO for details.
  • +
+

The rest of settings will not normally need to be adjusted. Read source code for details.

+

Constant Documentation

+ +
+
+ + + + +
enum SHOW_QUERY_ERROR
+
+
+

Whether to show error message for dubug. For installation, testing and debuging set SHOW_QUERY_ERROR to TRUE If set to TRUE, application will die and display query and database error message as soon as there is a problem. Do not set this to TRUE on a production site, since it will show error messages to everybody. If set FALSE, will create XML-output, no matter what happens.

+ +
+
+ +
+
+ + + + +
enum CONTENT_TYPE
+
+
+

The content-type the WWW-server delivers back. For debug-puposes, "text/plain" is easier to view. On a production site you should use "text/xml".

+ +
+
+ +
+
+ + + + +
enum MAXRECORDS
+
+
+

Maximum mumber of the records to deliver (verb is ListRecords) If there are more records to deliver a ResumptionToken will be generated.

+ +
+
+ +
+
+ + + + +
enum MAXIDS
+
+
+

Maximum mumber of identifiers to deliver (verb is ListIdentifiers) If there are more identifiers to deliver a ResumptionToken will be generated.

+ +
+
+ +
+
+ + + + +
enum TOKEN_VALID
+
+
+

After 24 hours resumptionTokens become invalid. Unit is second.

+ +
+
+ +
+
+ + + + +
enum TOKEN_PREFIX
+
+
+

Where token is saved and path is included

+ +
+
+

Variable Documentation

+ +
+
+ + + + +
$identifyResponse = array()
+
+
+

Identifier settings. It needs to have proper values to reflect the settings of the data provider.

+
    +
  • $identifyResponse['repositoryName'] : compulsory. A human readable name for the repository;
  • +
  • $identifyResponse['baseURL'] : compulsory. The base URL of the repository;
  • +
  • $identifyResponse['protocolVersion'] : compulsory. The version of the OAI-PMH supported by the repository;
  • +
  • $identifyResponse['earliestDatestamp'] : compulsory. A UTCdatetime that is the guaranteed lower limit of all datestamps recording changes, modifications, or deletions in the repository. A repository must not use datestamps lower than the one specified by the content of the earliestDatestamp element. earliestDatestamp must be expressed at the finest granularity supported by the repository.
  • +
  • $identifyResponse['deletedRecord'] : the manner in which the repository supports the notion of deleted records. Legitimate values are no ; transient ; persistent with meanings defined in the section on deletion.
  • +
  • $identifyResponse['granularity'] : the finest harvesting granularity supported by the repository. The legitimate values are YYYY-MM-DD and YYYY-MM-DDThh:mm:ssZ with meanings as defined in ISO8601.
  • +
+ +
+
+ +
+
+ + + + +
$compression = null
+
+
+

Compression methods supported. Optional (multiple). Default: null.

+

Currently only gzip is supported (you need output buffering turned on, and php compiled with libgz). The client MUST send "Accept-Encoding: gzip" to actually receive

+ +
+
+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/oaidp-util_8php.html b/doc/oaidp-util_8php.html new file mode 100644 index 0000000..282ff90 --- /dev/null +++ b/doc/oaidp-util_8php.html @@ -0,0 +1,656 @@ + + + + + +OAI PHP: oaidp-util.php File Reference + + + + + + + + + +
+

oaidp-util.php File Reference

+

Utilities for the OAI Data Provider. +More...

+ + + + + + + + + + + + + + + + + + + + + + + + +

Functions

 debug_var_dump ($var_name, $var)
 debug_print_r ($var_name, $var)
 debug_message ($msg)
 checkArgs ($args, $checkList)
 is_valid_uri ($url)
 is_valid_attrb ($attrb)
 formatDatestamp ($datestamp)
 checkDateFormat ($date)
 prepare_set_names ()
 oai_exit ()
 get_token ()
 createResumToken ($cursor, $extquery, $metadataPrefix)
 readResumToken ($resumptionToken)
 selectallQuery ($metadPrefix="rif", $id= '')
 idFormatQuery ($id)
 idQuery ($metadPrefix="rif", $id= '')
 untilQuery ($until)
 fromQuery ($from)
 setQuery ($set)
 rowCount ($metadataPrefix, $extQuery, $db)
 process_pdo_error ($query, $e)
 exec_pdo_query ($db, $query)
+

Detailed Description

+

A collection of functions used.

+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
debug_var_dump ( var_name,
var 
)
+
+
+

Dump information of a varible for debugging, only works when SHOW_QUERY_ERROR is true.

+
Parameters:
+ + + +
$var_name Type: string Name of variable is being debugded
$var Type: mix Any type of varibles used in PHP
+
+
+
See also:
SHOW_QUERY_ERROR in oaidp-config.php
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
debug_print_r ( var_name,
var 
)
+
+
+

Prints human-readable information about a variable for debugging, only works when SHOW_QUERY_ERROR is true.

+
Parameters:
+ + + +
$var_name Type: string Name of variable is being debugded
$var Type: mix Any type of varibles used in PHP
+
+
+
See also:
SHOW_QUERY_ERROR in oaidp-config.php
+ +
+
+ +
+
+ + + + + + + + + +
debug_message ( msg ) 
+
+
+

Prints a message for debugging, only works when SHOW_QUERY_ERROR is true. PHP function print_r can be used to construct message with return parameter sets to true.

+
Parameters:
+ + +
$msg Type: string Message needs to be shown
+
+
+
See also:
SHOW_QUERY_ERROR in oaidp-config.php
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
checkArgs ( args,
checkList 
)
+
+
+

Check if provided correct arguments for a request.

+

Only number of parameters is checked. metadataPrefix has to be checked before it is used. set has to be checked before it is used. resumptionToken has to be checked before it is used. from and until can easily checked here because no extra information is needed.

+ +
+
+ +
+
+ + + + + + + + + +
is_valid_uri ( url ) 
+
+
+

Validates an identifier. The pattern is: '/^[-a-z\.0-9]+$/i' which means it accepts -, letters and numbers. Used only by function oai_error code idDoesNotExist.

+
Parameters:
+ + +
$url Type: string
+
+
+ +
+
+ +
+
+ + + + + + + + + +
is_valid_attrb ( attrb ) 
+
+
+

Validates attributes come with the query. It accepts letters, numbers, ':', '_', '.' and -. Here there are few more match patterns than is_valid_uri(): ':_'.

+
Parameters:
+ + +
$attrb Type: string
+
+
+ +
+
+ +
+
+ + + + + + + + + +
formatDatestamp ( datestamp ) 
+
+
+

All datestamps used in this system are GMT even return value from database has no TZ information

+ +
+
+ +
+
+ + + + + + + + + +
checkDateFormat ( date ) 
+
+
+

The database uses datastamp without time-zone information. It needs to clean all time-zone informaion from time string and reformat it

+ +
+
+ +
+
+ + + + + + + + +
prepare_set_names ( ) 
+
+
+

Retrieve all defined 'setSpec' from configuraiton of $SETS. It is used by ANDS_TPA::create_obj_node();

+ +
+
+ +
+
+ + + + + + + + +
oai_exit ( ) 
+
+
+

Finish a request when there is an error: send back errors.

+ +
+
+ +
+
+ + + + + + + + +
get_token ( ) 
+
+
+

Generate a string based on the current Unix timestamp in microseconds for creating resumToken file name.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
createResumToken ( cursor,
extquery,
metadataPrefix 
)
+
+
+

Create a token file. It has three parts which is separated by '#': cursor, extension of query, metadataPrefix. Called by listrecords.php.

+ +
+
+ +
+
+ + + + + + + + + +
readResumToken ( resumptionToken ) 
+
+
+

Read a saved ResumToken

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
selectallQuery ( metadPrefix = "rif",
id = '' 
)
+
+
+

this function should generate a query which will return all records the useless condition id_column = id_column is just there to ease further extensions to the query, please leave it as it is.

+ +
+
+ +
+
+ + + + + + + + + +
idFormatQuery ( id ) 
+
+
+

this function will return metadataFormat of a record

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
idQuery ( metadPrefix = "rif",
id = '' 
)
+
+
+

this function will return identifier and datestamp for all records not very useful

+ +
+
+ +
+
+ + + + + + + + + +
untilQuery ( until ) 
+
+
+

filter for until, appends to the end of SQL query

+ +
+
+ +
+
+ + + + + + + + + +
fromQuery ( from ) 
+
+
+

filter for from , appends to the end of SQL query

+ +
+
+ +
+
+ + + + + + + + + +
setQuery ( set ) 
+
+
+

filter for sets, appends to the end of SQL query

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
rowCount ( metadataPrefix,
extQuery,
db 
)
+
+
+

for accurately to assess how many records satisfy conditions for all DBs

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
process_pdo_error ( query,
e 
)
+
+
+

A worker function for processing an error when a query was executed

+
Parameters:
+ + + +
$query string, original query
$e PDOException, the PDOException object
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
exec_pdo_query ( db,
query 
)
+
+
+

When query return no result, throw an Exception of Not found.

+
Parameters:
+ + + +
$db PDO
$query string
+
+
+
Returns:
$res PDOStatement
+ +
+
+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/pages.html b/doc/pages.html new file mode 100644 index 0000000..2745581 --- /dev/null +++ b/doc/pages.html @@ -0,0 +1,64 @@ + + + + + +OAI PHP: Page Index + + + + + + + + + +
+

Related Pages

Here is a list of all related documentation pages: +
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/prj__info_8php.html b/doc/prj__info_8php.html new file mode 100644 index 0000000..8f2d1c3 --- /dev/null +++ b/doc/prj__info_8php.html @@ -0,0 +1,173 @@ + + + + + +Data Centre: prj_info.php File Reference + + + + + + + + + +
+

prj_info.php File Reference

+

Display project information. +More...

+ + + + + +

Functions

 format_bytes ($bytes)
 disp_ul_sec ($result, $lbls)
 disp_dl_group ($lbls, $row)
+

Detailed Description

+

Project information includes 1. General project informaion 2. List of plants: studied objects 3. Imaging regime 4. Outcomes 5. Image data download options 6. Copyright statement 6.1. Contact person 6.2 Organisations involved

+

Function Documentation

+ +
+
+ + + + + + + + + +
format_bytes ( bytes ) 
+
+
+

Format files size to a in bytes, KB, MB, GB and TB

+
Parameters:
+ + +
$bytes Type: integer. Value of size will be formatted.
+
+
+
Returns:
string. Round to a format of xxx.xx unit.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
disp_ul_sec ( result,
lbls 
)
+
+
+

Organise a query result in an unordered list

+
Parameters:
+ + + +
$result Type: resource. The query result to be displayed.
$lbls Type: array. The string array of labels.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
disp_dl_group ( lbls,
row 
)
+
+
+

Organise a lable and content pair in <dt> <dd> pair.

+
Parameters:
+ + + +
$lbls Type: array. The string array of labels.
$row Type: array. The string array of content.
+
+
+ +
+
+
+ + + + +
+ +
+ +
Generated on Fri May 27 09:42:03 2011 for Data Centre by  + +doxygen 1.6.3
+ + diff --git a/doc/project_8php.html b/doc/project_8php.html new file mode 100644 index 0000000..f99696e --- /dev/null +++ b/doc/project_8php.html @@ -0,0 +1,88 @@ + + + + + +Data Centre: project.php File Reference + + + + + + + + + +
+

project.php File Reference

+

Extract project information. +More...

+ + + + +

Classes

class  Project
class  TPA_Project
+

Detailed Description

+

Project information includes 1. General project informaion 2. List of plants: studied objects 3. Imaging regime 4. Outcomes 5. Image data download options 6. Copyright statement 6.1. Contact person 6.2 Organisations involved

+
See also:
project_viewer.php
+

Example usage:

+
 $db = new DB_OP($pars8P);
+        $prj = new TPA_Project($db);
+        try {
+        var_dump($prj->getSummary());
+        var_dump($prj->getObjects());
+        var_dump($prj->getImgRegimes());
+        var_dump($prj->getOutcomes());
+        var_dump($prj->getContacts());
+        var_dump($prj->getOrganisations());
+        } catch (Execption $e) {
+                echo $e->getMessage(),"\n";
+        }
+
+ + + + +
+ +
+ +
Generated on Fri May 27 09:56:48 2011 for Data Centre by  + +doxygen 1.6.3
+ + diff --git a/doc/project__viewer_8php.html b/doc/project__viewer_8php.html new file mode 100644 index 0000000..f846fe5 --- /dev/null +++ b/doc/project__viewer_8php.html @@ -0,0 +1,184 @@ + + + + + +Data Centre: project_viewer.php File Reference + + + + + + + + + +
+

project_viewer.php File Reference

+

Display project information. +More...

+ + + + + +

Functions

 format_bytes ($bytes)
 disp_ul_sec ($result, $lbls)
 disp_dl_group ($lbls, $row)
+

Detailed Description

+

Project information includes 1. General project informaion 2. List of plants: studied objects 3. Imaging regime 4. Outcomes 5. Image data download options 6. Copyright statement 6.1. Contact person 6.2 Organisations involved

+

Function Documentation

+ +
+
+ + + + + + + + + +
format_bytes ( bytes ) 
+
+
+

Format files size to a in bytes, KB, MB, GB and TB

+
Parameters:
+ + +
$bytes Type: integer. Value of size will be formatted.
+
+
+
Returns:
string. Round to a format of xxx.xx unit.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
disp_ul_sec ( result,
lbls 
)
+
+
+

Display results in an unordered list setction Within each list, there is a description list

+
    +
  • +
    +
    +
    +
    +
    +
    +
  • +
  • +
    +
    +
    +
    +
    +
    +
  • +
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
disp_dl_group ( lbls,
row 
)
+
+
+

Organise a lable and content pair in <dt> <dd> pair.

+
Parameters:
+ + + +
$lbls Type: array. The string array of labels.
$row Type: array. The string array of content.
+
+
+ +
+
+
+ + + + +
+ +
+ +
Generated on Fri May 27 09:42:03 2011 for Data Centre by  + +doxygen 1.6.3
+ + diff --git a/doc/record__dc_8php.html b/doc/record__dc_8php.html new file mode 100644 index 0000000..e448636 --- /dev/null +++ b/doc/record__dc_8php.html @@ -0,0 +1,74 @@ + + + + + +OAI PHP: record_dc.php File Reference + + + + + + + + + +
+

record_dc.php File Reference

+

Definition of Dublin Core handler. +More...

+ +
+

Detailed Description

+

It is not working as it does not provide any content to the metadata node. It only included to demonstrate how a new metadata can be supported. For a working example, please see record_rif.php.

+
See also:
oaidp-config.php
+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/record__rif_8php.html b/doc/record__rif_8php.html new file mode 100644 index 0000000..8bb282b --- /dev/null +++ b/doc/record__rif_8php.html @@ -0,0 +1,79 @@ + + + + + +OAI PHP: record_rif.php File Reference + + + + + + + + + +
+

record_rif.php File Reference

+

Definition of RIF-CS handler. +More...

+ +
+

Detailed Description

+

It is a plug-in helper function which will be called from where a metadata in rif format is being generated. The name of function defined here cannot be changed. This can also be used as an example for your own metadata strucutre:

+
    +
  • create a metetadata node
  • +
  • append contents of the record to the metedata node
  • +
+

In this example, every time when a new record is being generated, a new instance of ANDS_TPA is created. As XML output document and the database connection are the same, it is possible to design otherwise.

+
See also:
oaidp-config.php
+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/response__error_8php.html b/doc/response__error_8php.html new file mode 100644 index 0000000..af8c688 --- /dev/null +++ b/doc/response__error_8php.html @@ -0,0 +1,121 @@ + + + + + +OAI PHP: response_error.php File Reference + + + + + + + + + +
+

response_error.php File Reference

+ + +

Classes

class  ANDS_XML
+

Function Documentation

+ +
+
+ + + + + + + + + +
create_request ( doc ) 
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
create_header ( identifier,
timestamp,
ands_class 
)
+
+
+ +
+
+
+ + + + +
+ +
+ +
Generated on Tue Apr 19 13:58:31 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/search/all_24.html b/doc/search/all_24.html new file mode 100644 index 0000000..fc6a5ad --- /dev/null +++ b/doc/search/all_24.html @@ -0,0 +1,80 @@ + + + + + + + +
+
Loading...
+
+
+ $attribs + oai2.php +
+
+
+
+ $compression + oaidp-config.php +
+
+
+
+ $db + ANDS_TPA +
+
+
+
+ $doc + ANDS_XML +
+
+
+
+ $errors + oai2.php +
+
+
+
+ $identifyResponse + oaidp-config.php +
+
+
+
+ $oai_pmh + ANDS_RIFCS +
+
+
+
+ $verb + ANDS_Response_XML +
+
+
+
+ $verbNode + ANDS_Response_XML +
+
+
+
+ $working_node + ANDS_RIFCS +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/all_5f.html b/doc/search/all_5f.html new file mode 100644 index 0000000..0dc43b2 --- /dev/null +++ b/doc/search/all_5f.html @@ -0,0 +1,30 @@ + + + + + + + +
+
Loading...
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/all_61.html b/doc/search/all_61.html new file mode 100644 index 0000000..2e94d6b --- /dev/null +++ b/doc/search/all_61.html @@ -0,0 +1,76 @@ + + + + + + + +
+
Loading...
+
+
+ add2_verbNode + ANDS_Response_XML +
+
+ +
+
+ addMetedataFormat + listmetadataformats.php +
+
+ + +
+ +
+ +
+
+ ANDS_TPA +
+
+
+ +
+
+
+ ANDS_XML +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/all_63.html b/doc/search/all_63.html new file mode 100644 index 0000000..cbd0bf6 --- /dev/null +++ b/doc/search/all_63.html @@ -0,0 +1,212 @@ + + + + + + + +
+
Loading...
+
+
+ checkArgs + oaidp-util.php +
+
+
+
+ checkDateFormat + oaidp-util.php +
+
+
+
+ CONTENT_TYPE + oaidp-config.php +
+
+
+
+ create_activity + ANDS_TPA +
+
+
+
+ create_address_node + ANDS_RIFCS +
+
+
+
+ create_collection + ANDS_TPA +
+
+
+
+ create_coverage_tempo + ANDS_RIFCS +
+
+
+
+ create_coverage_tempo_date + ANDS_RIFCS +
+
+
+
+ create_description_node + ANDS_RIFCS +
+
+
+
+ create_e_node + ANDS_RIFCS +
+
+
+
+ create_group + ANDS_TPA +
+
+
+
+ create_header + ANDS_Response_XML +
+
+
+
+ create_identifier_node + ANDS_RIFCS +
+
+
+
+ create_location_node + ANDS_RIFCS +
+
+
+
+ create_metadata + ANDS_Response_XML +
+
+
+
+ create_name_node + ANDS_RIFCS +
+
+
+
+ create_namePart + ANDS_RIFCS +
+
+
+
+ create_obj_node + ANDS_TPA +
+
+
+
+ create_party + ANDS_TPA +
+
+
+
+ create_person + ANDS_TPA +
+
+
+
+ create_physcial_addr_txt + ANDS_RIFCS +
+
+
+
+ create_physcial_fone_fax + ANDS_RIFCS +
+
+
+
+ create_record + ANDS_Response_XML +
+
+
+
+ create_regObject + ANDS_RIFCS +
+
+
+
+ create_regObjects + ANDS_RIFCS +
+
+
+
+ create_relatedObject + ANDS_RIFCS +
+
+
+
+ create_request + ANDS_XML +
+
+
+
+ create_resumpToken + ANDS_Response_XML +
+
+
+
+ create_rifcs_node + ANDS_RIFCS +
+
+
+
+ create_spatial_node + ANDS_RIFCS +
+
+
+
+ create_subject_node + ANDS_RIFCS +
+
+
+
+ createResumToken + oaidp-util.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/all_64.html b/doc/search/all_64.html new file mode 100644 index 0000000..b4c5397 --- /dev/null +++ b/doc/search/all_64.html @@ -0,0 +1,44 @@ + + + + + + + +
+
Loading...
+
+
+ debug_message + oaidp-util.php +
+
+
+
+ debug_print_r + oaidp-util.php +
+
+
+
+ debug_var_dump + oaidp-util.php +
+
+
+
+ display + ANDS_XML +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/all_65.html b/doc/search/all_65.html new file mode 100644 index 0000000..5f06e12 --- /dev/null +++ b/doc/search/all_65.html @@ -0,0 +1,26 @@ + + + + + + + +
+
Loading...
+
+
+ exec_pdo_query + oaidp-util.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/all_66.html b/doc/search/all_66.html new file mode 100644 index 0000000..8932716 --- /dev/null +++ b/doc/search/all_66.html @@ -0,0 +1,32 @@ + + + + + + + +
+
Loading...
+
+
+ formatDatestamp + oaidp-util.php +
+
+
+
+ fromQuery + oaidp-util.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/all_67.html b/doc/search/all_67.html new file mode 100644 index 0000000..506ebd2 --- /dev/null +++ b/doc/search/all_67.html @@ -0,0 +1,31 @@ + + + + + + + +
+
Loading...
+
+
+ get_token + oaidp-util.php +
+
+
+ +
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/all_69.html b/doc/search/all_69.html new file mode 100644 index 0000000..510e21c --- /dev/null +++ b/doc/search/all_69.html @@ -0,0 +1,54 @@ + + + + + + + +
+
Loading...
+
+ +
+
+
+ idFormatQuery + oaidp-util.php +
+
+
+
+ idQuery + oaidp-util.php +
+
+
+
+ index.php +
+
+
+
+ is_valid_attrb + oaidp-util.php +
+
+
+
+ is_valid_uri + oaidp-util.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/all_6c.html b/doc/search/all_6c.html new file mode 100644 index 0000000..e0e3a98 --- /dev/null +++ b/doc/search/all_6c.html @@ -0,0 +1,35 @@ + + + + + + + +
+
Loading...
+ + +
+ +
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/all_6d.html b/doc/search/all_6d.html new file mode 100644 index 0000000..c7e1ba3 --- /dev/null +++ b/doc/search/all_6d.html @@ -0,0 +1,32 @@ + + + + + + + +
+
Loading...
+
+
+ MAXIDS + oaidp-config.php +
+
+
+
+ MAXRECORDS + oaidp-config.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/all_6e.html b/doc/search/all_6e.html new file mode 100644 index 0000000..fb35180 --- /dev/null +++ b/doc/search/all_6e.html @@ -0,0 +1,26 @@ + + + + + + + +
+
Loading...
+
+
+ next_row + DB_Result +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/all_6f.html b/doc/search/all_6f.html new file mode 100644 index 0000000..0873ad0 --- /dev/null +++ b/doc/search/all_6f.html @@ -0,0 +1,47 @@ + + + + + + + +
+
Loading...
+
+
+ oai2.php +
+
+
+
+ oai_error + xml_creater.php +
+
+
+
+ oai_exit + oaidp-util.php +
+
+ + +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/all_70.html b/doc/search/all_70.html new file mode 100644 index 0000000..859db78 --- /dev/null +++ b/doc/search/all_70.html @@ -0,0 +1,32 @@ + + + + + + + +
+
Loading...
+
+
+ prepare_set_names + oaidp-util.php +
+
+
+
+ process_pdo_error + oaidp-util.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/all_71.html b/doc/search/all_71.html new file mode 100644 index 0000000..ed5c9a8 --- /dev/null +++ b/doc/search/all_71.html @@ -0,0 +1,26 @@ + + + + + + + +
+
Loading...
+
+
+ query + DB_OP +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/all_72.html b/doc/search/all_72.html new file mode 100644 index 0000000..b1d8fb7 --- /dev/null +++ b/doc/search/all_72.html @@ -0,0 +1,42 @@ + + + + + + + +
+
Loading...
+
+
+ readResumToken + oaidp-util.php +
+
+
+ +
+ +
+
+ rowCount + oaidp-util.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/all_73.html b/doc/search/all_73.html new file mode 100644 index 0000000..05304fa --- /dev/null +++ b/doc/search/all_73.html @@ -0,0 +1,38 @@ + + + + + + + +
+
Loading...
+
+
+ selectallQuery + oaidp-util.php +
+
+
+
+ setQuery + oaidp-util.php +
+
+
+
+ SHOW_QUERY_ERROR + oaidp-config.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/all_74.html b/doc/search/all_74.html new file mode 100644 index 0000000..9fd8b19 --- /dev/null +++ b/doc/search/all_74.html @@ -0,0 +1,32 @@ + + + + + + + +
+
Loading...
+
+
+ TOKEN_PREFIX + oaidp-config.php +
+
+
+
+ TOKEN_VALID + oaidp-config.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/all_75.html b/doc/search/all_75.html new file mode 100644 index 0000000..ceb3c72 --- /dev/null +++ b/doc/search/all_75.html @@ -0,0 +1,26 @@ + + + + + + + +
+
Loading...
+
+
+ untilQuery + oaidp-util.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/all_78.html b/doc/search/all_78.html new file mode 100644 index 0000000..a5f9c2e --- /dev/null +++ b/doc/search/all_78.html @@ -0,0 +1,25 @@ + + + + + + + +
+
Loading...
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/classes_61.html b/doc/search/classes_61.html new file mode 100644 index 0000000..8f094ad --- /dev/null +++ b/doc/search/classes_61.html @@ -0,0 +1,45 @@ + + + + + + + +
+
Loading...
+ + +
+ +
+
+
+ ANDS_TPA +
+
+
+
+ ANDS_XML +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/classes_64.html b/doc/search/classes_64.html new file mode 100644 index 0000000..f58fbfb --- /dev/null +++ b/doc/search/classes_64.html @@ -0,0 +1,30 @@ + + + + + + + +
+
Loading...
+
+
+ DB_OP +
+
+
+
+ DB_Result +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/classes_70.html b/doc/search/classes_70.html new file mode 100644 index 0000000..6391a60 --- /dev/null +++ b/doc/search/classes_70.html @@ -0,0 +1,25 @@ + + + + + + + +
+
Loading...
+
+
+ Project +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/classes_74.html b/doc/search/classes_74.html new file mode 100644 index 0000000..5196b92 --- /dev/null +++ b/doc/search/classes_74.html @@ -0,0 +1,25 @@ + + + + + + + +
+
Loading...
+
+ +
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/close.png b/doc/search/close.png new file mode 100644 index 0000000..9342d3d Binary files /dev/null and b/doc/search/close.png differ diff --git a/doc/search/enums_63.html b/doc/search/enums_63.html new file mode 100644 index 0000000..5b8b25e --- /dev/null +++ b/doc/search/enums_63.html @@ -0,0 +1,26 @@ + + + + + + + +
+
Loading...
+
+
+ CONTENT_TYPE + oaidp-config.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/enums_6d.html b/doc/search/enums_6d.html new file mode 100644 index 0000000..c7e1ba3 --- /dev/null +++ b/doc/search/enums_6d.html @@ -0,0 +1,32 @@ + + + + + + + +
+
Loading...
+
+
+ MAXIDS + oaidp-config.php +
+
+
+
+ MAXRECORDS + oaidp-config.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/enums_73.html b/doc/search/enums_73.html new file mode 100644 index 0000000..1328c8c --- /dev/null +++ b/doc/search/enums_73.html @@ -0,0 +1,26 @@ + + + + + + + +
+
Loading...
+
+
+ SHOW_QUERY_ERROR + oaidp-config.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/enums_74.html b/doc/search/enums_74.html new file mode 100644 index 0000000..9fd8b19 --- /dev/null +++ b/doc/search/enums_74.html @@ -0,0 +1,32 @@ + + + + + + + +
+
Loading...
+
+
+ TOKEN_PREFIX + oaidp-config.php +
+
+
+
+ TOKEN_VALID + oaidp-config.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/enums_78.html b/doc/search/enums_78.html new file mode 100644 index 0000000..dcdf7fe --- /dev/null +++ b/doc/search/enums_78.html @@ -0,0 +1,26 @@ + + + + + + + +
+
Loading...
+
+
+ XMLSCHEMA + oaidp-config.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/files_61.html b/doc/search/files_61.html new file mode 100644 index 0000000..36b78e4 --- /dev/null +++ b/doc/search/files_61.html @@ -0,0 +1,30 @@ + + + + + + + +
+
Loading...
+ +
+ +
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/files_67.html b/doc/search/files_67.html new file mode 100644 index 0000000..45d3f59 --- /dev/null +++ b/doc/search/files_67.html @@ -0,0 +1,25 @@ + + + + + + + +
+
Loading...
+
+ +
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/files_69.html b/doc/search/files_69.html new file mode 100644 index 0000000..d789c73 --- /dev/null +++ b/doc/search/files_69.html @@ -0,0 +1,30 @@ + + + + + + + +
+
Loading...
+
+ +
+
+
+ index.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/files_6c.html b/doc/search/files_6c.html new file mode 100644 index 0000000..e0e3a98 --- /dev/null +++ b/doc/search/files_6c.html @@ -0,0 +1,35 @@ + + + + + + + +
+
Loading...
+ + +
+ +
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/files_6f.html b/doc/search/files_6f.html new file mode 100644 index 0000000..a6090e5 --- /dev/null +++ b/doc/search/files_6f.html @@ -0,0 +1,35 @@ + + + + + + + +
+
Loading...
+
+
+ oai2.php +
+
+ + +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/files_70.html b/doc/search/files_70.html new file mode 100644 index 0000000..77a118f --- /dev/null +++ b/doc/search/files_70.html @@ -0,0 +1,25 @@ + + + + + + + +
+
Loading...
+
+ +
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/files_72.html b/doc/search/files_72.html new file mode 100644 index 0000000..cebc22c --- /dev/null +++ b/doc/search/files_72.html @@ -0,0 +1,30 @@ + + + + + + + +
+
Loading...
+
+ +
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/files_78.html b/doc/search/files_78.html new file mode 100644 index 0000000..a5f9c2e --- /dev/null +++ b/doc/search/files_78.html @@ -0,0 +1,25 @@ + + + + + + + +
+
Loading...
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/functions_5f.html b/doc/search/functions_5f.html new file mode 100644 index 0000000..0dc43b2 --- /dev/null +++ b/doc/search/functions_5f.html @@ -0,0 +1,30 @@ + + + + + + + +
+
Loading...
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/functions_61.html b/doc/search/functions_61.html new file mode 100644 index 0000000..919d5c8 --- /dev/null +++ b/doc/search/functions_61.html @@ -0,0 +1,41 @@ + + + + + + + +
+
Loading...
+
+
+ add2_verbNode + ANDS_Response_XML +
+
+ +
+
+ addMetedataFormat + listmetadataformats.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/functions_63.html b/doc/search/functions_63.html new file mode 100644 index 0000000..e8cf0c5 --- /dev/null +++ b/doc/search/functions_63.html @@ -0,0 +1,206 @@ + + + + + + + +
+
Loading...
+
+
+ checkArgs + oaidp-util.php +
+
+
+
+ checkDateFormat + oaidp-util.php +
+
+
+
+ create_activity + ANDS_TPA +
+
+
+
+ create_address_node + ANDS_RIFCS +
+
+
+
+ create_collection + ANDS_TPA +
+
+
+
+ create_coverage_tempo + ANDS_RIFCS +
+
+
+
+ create_coverage_tempo_date + ANDS_RIFCS +
+
+
+
+ create_description_node + ANDS_RIFCS +
+
+
+
+ create_e_node + ANDS_RIFCS +
+
+
+
+ create_group + ANDS_TPA +
+
+
+
+ create_header + ANDS_Response_XML +
+
+
+
+ create_identifier_node + ANDS_RIFCS +
+
+
+
+ create_location_node + ANDS_RIFCS +
+
+
+
+ create_metadata + ANDS_Response_XML +
+
+
+
+ create_name_node + ANDS_RIFCS +
+
+
+
+ create_namePart + ANDS_RIFCS +
+
+
+
+ create_obj_node + ANDS_TPA +
+
+
+
+ create_party + ANDS_TPA +
+
+
+
+ create_person + ANDS_TPA +
+
+
+
+ create_physcial_addr_txt + ANDS_RIFCS +
+
+
+
+ create_physcial_fone_fax + ANDS_RIFCS +
+
+
+
+ create_record + ANDS_Response_XML +
+
+
+
+ create_regObject + ANDS_RIFCS +
+
+
+
+ create_regObjects + ANDS_RIFCS +
+
+
+
+ create_relatedObject + ANDS_RIFCS +
+
+
+
+ create_request + ANDS_XML +
+
+
+
+ create_resumpToken + ANDS_Response_XML +
+
+
+
+ create_rifcs_node + ANDS_RIFCS +
+
+
+
+ create_spatial_node + ANDS_RIFCS +
+
+
+
+ create_subject_node + ANDS_RIFCS +
+
+
+
+ createResumToken + oaidp-util.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/functions_64.html b/doc/search/functions_64.html new file mode 100644 index 0000000..b4c5397 --- /dev/null +++ b/doc/search/functions_64.html @@ -0,0 +1,44 @@ + + + + + + + +
+
Loading...
+
+
+ debug_message + oaidp-util.php +
+
+
+
+ debug_print_r + oaidp-util.php +
+
+
+
+ debug_var_dump + oaidp-util.php +
+
+
+
+ display + ANDS_XML +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/functions_65.html b/doc/search/functions_65.html new file mode 100644 index 0000000..5f06e12 --- /dev/null +++ b/doc/search/functions_65.html @@ -0,0 +1,26 @@ + + + + + + + +
+
Loading...
+
+
+ exec_pdo_query + oaidp-util.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/functions_66.html b/doc/search/functions_66.html new file mode 100644 index 0000000..8932716 --- /dev/null +++ b/doc/search/functions_66.html @@ -0,0 +1,32 @@ + + + + + + + +
+
Loading...
+
+
+ formatDatestamp + oaidp-util.php +
+
+
+
+ fromQuery + oaidp-util.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/functions_67.html b/doc/search/functions_67.html new file mode 100644 index 0000000..6e8af7b --- /dev/null +++ b/doc/search/functions_67.html @@ -0,0 +1,26 @@ + + + + + + + +
+
Loading...
+
+
+ get_token + oaidp-util.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/functions_69.html b/doc/search/functions_69.html new file mode 100644 index 0000000..274da8b --- /dev/null +++ b/doc/search/functions_69.html @@ -0,0 +1,44 @@ + + + + + + + +
+
Loading...
+
+
+ idFormatQuery + oaidp-util.php +
+
+
+
+ idQuery + oaidp-util.php +
+
+
+
+ is_valid_attrb + oaidp-util.php +
+
+
+
+ is_valid_uri + oaidp-util.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/functions_6c.html b/doc/search/functions_6c.html new file mode 100644 index 0000000..e5a2dfa --- /dev/null +++ b/doc/search/functions_6c.html @@ -0,0 +1,38 @@ + + + + + + + +
+
Loading...
+
+
+ last_row + DB_Result +
+
+
+
+ list_fields + DB_Result +
+
+
+
+ load_rdriver + DB_OP +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/functions_6d.html b/doc/search/functions_6d.html new file mode 100644 index 0000000..f20805f --- /dev/null +++ b/doc/search/functions_6d.html @@ -0,0 +1,26 @@ + + + + + + + +
+
Loading...
+
+
+ metadataHeader + oaidp-util.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/functions_6e.html b/doc/search/functions_6e.html new file mode 100644 index 0000000..fb35180 --- /dev/null +++ b/doc/search/functions_6e.html @@ -0,0 +1,26 @@ + + + + + + + +
+
Loading...
+
+
+ next_row + DB_Result +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/functions_6f.html b/doc/search/functions_6f.html new file mode 100644 index 0000000..80c6ebc --- /dev/null +++ b/doc/search/functions_6f.html @@ -0,0 +1,32 @@ + + + + + + + +
+
Loading...
+
+
+ oai_error + xml_creater.php +
+
+
+
+ oai_exit + oaidp-util.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/functions_70.html b/doc/search/functions_70.html new file mode 100644 index 0000000..859db78 --- /dev/null +++ b/doc/search/functions_70.html @@ -0,0 +1,32 @@ + + + + + + + +
+
Loading...
+
+
+ prepare_set_names + oaidp-util.php +
+
+
+
+ process_pdo_error + oaidp-util.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/functions_71.html b/doc/search/functions_71.html new file mode 100644 index 0000000..ed5c9a8 --- /dev/null +++ b/doc/search/functions_71.html @@ -0,0 +1,26 @@ + + + + + + + +
+
Loading...
+
+
+ query + DB_OP +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/functions_72.html b/doc/search/functions_72.html new file mode 100644 index 0000000..f816a6c --- /dev/null +++ b/doc/search/functions_72.html @@ -0,0 +1,32 @@ + + + + + + + +
+
Loading...
+
+
+ readResumToken + oaidp-util.php +
+
+
+
+ rowCount + oaidp-util.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/functions_73.html b/doc/search/functions_73.html new file mode 100644 index 0000000..5a7a6ea --- /dev/null +++ b/doc/search/functions_73.html @@ -0,0 +1,32 @@ + + + + + + + +
+
Loading...
+
+
+ selectallQuery + oaidp-util.php +
+
+
+
+ setQuery + oaidp-util.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/functions_75.html b/doc/search/functions_75.html new file mode 100644 index 0000000..ceb3c72 --- /dev/null +++ b/doc/search/functions_75.html @@ -0,0 +1,26 @@ + + + + + + + +
+
Loading...
+
+
+ untilQuery + oaidp-util.php +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/search/nomatches.html b/doc/search/nomatches.html new file mode 100644 index 0000000..b1ded27 --- /dev/null +++ b/doc/search/nomatches.html @@ -0,0 +1,12 @@ + + + + + + + +
+
No Matches
+
+ + diff --git a/doc/search/search.css b/doc/search/search.css new file mode 100644 index 0000000..63b7f96 --- /dev/null +++ b/doc/search/search.css @@ -0,0 +1,200 @@ +/*---------------- Search Box */ +#FSearchBox { + float: left; +} +#MSearchBox { + padding: 0px; + margin: 0px; + border: none; + border: 1px solid #84B0C7; + white-space: nowrap; + -moz-border-radius: 8px; + -webkit-border-top-left-radius: 8px; + -webkit-border-top-right-radius: 8px; + -webkit-border-bottom-left-radius: 8px; + -webkit-border-bottom-right-radius: 8px; +} +#MSearchField { + font: 9pt Arial, Verdana, sans-serif; + color: #999999; + background-color: #FFFFFF; + font-style: normal; + cursor: text; + padding: 1px 1px; + margin: 0px 6px 0px 0px; + border: none; + outline: none; + vertical-align: middle; +} +.MSearchBoxActive #MSearchField { + color: #000000; +} +#MSearchSelect { + float : none; + display : inline; + background : none; + font: 9pt Verdana, sans-serif; + border: none; + margin: 0px 0px 0px 6px; + vertical-align: middle; + padding: 0px 0px; +} + +#MSearchClose { + float : none; + display : none; + background : none; + border: none; + margin: 0px 4px 0px 0px; + padding: 0px 0px; + outline: none; +} + +#MSearchCloseImg { + vertical-align: middle; +} + +.MSearchBoxLeft { + display: block; + text-align: left; + float: left; + margin-left: 6px; +} +.MSearchBoxRight { + display: block; + float: right; + text-align: right; + margin-right: 6px; +} +.MSearchBoxSpacer { + font-size: 0px; + clear: both; +} +.MSearchBoxRow { + font-size: 0px; + clear: both; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #A0A0A0; + background-color: #FAFAFA; + z-index: 1; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + } +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} +a.SelectItem:hover { + color: #FFFFFF; + background-color: #2A50E4; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + width: 60ex; + height: 15em; + } +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000000; + background-color: #EEF3F5; + } + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} +.SRPage .SRChildren { + display: none; +} +.SRSymbol { + font-weight: bold; color: #153788; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #153788; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; +} + +.SRResult { + display: none; +} + diff --git a/doc/search/search.js b/doc/search/search.js new file mode 100644 index 0000000..9a75ec2 --- /dev/null +++ b/doc/search/search.js @@ -0,0 +1,736 @@ +// Search script generated by doxygen +// Copyright (C) 2009 by Dimitri van Heesch. + +// The code in this file is loosly based on main.js, part of Natural Docs, +// which is Copyright (C) 2003-2008 Greg Valure +// Natural Docs is licensed under the GPL. + +var indexSectionsWithContent = +{ + 0: "0000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000010101111101001101101111001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 1: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 2: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000101001001001000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 3: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010101111101000001101101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 4: "0000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 5: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000100000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +}; + +var indexSectionNames = +{ + 0: "all", + 1: "classes", + 2: "files", + 3: "functions", + 4: "variables", + 5: "enums" +}; + +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var hexCode; + if (code<16) + { + hexCode="0"+code.toString(16); + } + else + { + hexCode=code.toString(16); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + if (indexSectionsWithContent[this.searchIndex].charAt(code) == '1') + { + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches.html'; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location.href = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName == 'DIV' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName == 'DIV' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} diff --git a/doc/search/search.png b/doc/search/search.png new file mode 100644 index 0000000..9dd2396 Binary files /dev/null and b/doc/search/search.png differ diff --git a/doc/search/variables_24.html b/doc/search/variables_24.html new file mode 100644 index 0000000..fc6a5ad --- /dev/null +++ b/doc/search/variables_24.html @@ -0,0 +1,80 @@ + + + + + + + +
+
Loading...
+
+
+ $attribs + oai2.php +
+
+
+
+ $compression + oaidp-config.php +
+
+
+
+ $db + ANDS_TPA +
+
+
+
+ $doc + ANDS_XML +
+
+
+
+ $errors + oai2.php +
+
+
+
+ $identifyResponse + oaidp-config.php +
+
+
+
+ $oai_pmh + ANDS_RIFCS +
+
+
+
+ $verb + ANDS_Response_XML +
+
+
+
+ $verbNode + ANDS_Response_XML +
+
+
+
+ $working_node + ANDS_RIFCS +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/tab_b.gif b/doc/tab_b.gif new file mode 100644 index 0000000..0d62348 Binary files /dev/null and b/doc/tab_b.gif differ diff --git a/doc/tab_l.gif b/doc/tab_l.gif new file mode 100644 index 0000000..9b1e633 Binary files /dev/null and b/doc/tab_l.gif differ diff --git a/doc/tab_r.gif b/doc/tab_r.gif new file mode 100644 index 0000000..ce9dd9f Binary files /dev/null and b/doc/tab_r.gif differ diff --git a/doc/tabs.css b/doc/tabs.css new file mode 100644 index 0000000..a444163 --- /dev/null +++ b/doc/tabs.css @@ -0,0 +1,105 @@ +/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */ + +DIV.tabs +{ + float : left; + width : 100%; + background : url("tab_b.gif") repeat-x bottom; + margin-bottom : 4px; +} + +DIV.tabs UL +{ + margin : 0px; + padding-left : 10px; + list-style : none; +} + +DIV.tabs LI, DIV.tabs FORM +{ + display : inline; + margin : 0px; + padding : 0px; +} + +DIV.tabs FORM +{ + float : right; +} + +DIV.tabs A +{ + float : left; + background : url("tab_r.gif") no-repeat right top; + border-bottom : 1px solid #84B0C7; + font-size : 80%; + font-weight : bold; + text-decoration : none; +} + +DIV.tabs A:hover +{ + background-position: 100% -150px; +} + +DIV.tabs A:link, DIV.tabs A:visited, +DIV.tabs A:active, DIV.tabs A:hover +{ + color: #1A419D; +} + +DIV.tabs SPAN +{ + float : left; + display : block; + background : url("tab_l.gif") no-repeat left top; + padding : 5px 9px; + white-space : nowrap; +} + +DIV.tabs #MSearchBox +{ + float : right; + display : inline; + font-size : 1em; +} + +DIV.tabs TD +{ + font-size : 80%; + font-weight : bold; + text-decoration : none; +} + + + +/* Commented Backslash Hack hides rule from IE5-Mac \*/ +DIV.tabs SPAN {float : none;} +/* End IE5-Mac hack */ + +DIV.tabs A:hover SPAN +{ + background-position: 0% -150px; +} + +DIV.tabs LI.current A +{ + background-position: 100% -150px; + border-width : 0px; +} + +DIV.tabs LI.current SPAN +{ + background-position: 0% -150px; + padding-bottom : 6px; +} + +DIV.navpath +{ + background : none; + border : none; + border-bottom : 1px solid #84B0C7; + text-align : center; + margin : 2px; + padding : 2px; +} diff --git a/doc/todo.html b/doc/todo.html new file mode 100644 index 0000000..666dcdc --- /dev/null +++ b/doc/todo.html @@ -0,0 +1,67 @@ + + + + + +OAI PHP: Todo List + + + + + + + + + +
+ + +

Todo List

+
+
File oai2.php
+
Remember: to define your own classess for generating metadata records. In common cases, you have to implement your own code to act fully and correctly. For generic usage, you can try the ANDS_Response_XML defined in xml_creater.php.
+
+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/doc/xml__creater_8php.html b/doc/xml__creater_8php.html new file mode 100644 index 0000000..2dc1f15 --- /dev/null +++ b/doc/xml__creater_8php.html @@ -0,0 +1,130 @@ + + + + + +OAI PHP: xml_creater.php File Reference + + + + + + + + + +
+

xml_creater.php File Reference

+

functions and class related to generating XML response file. +More...

+ + + + + + + +

Classes

class  ANDS_XML
class  ANDS_Error_XML
class  ANDS_Response_XML

Functions

 oai_error ($code, $argument= '', $value= '')
+

Detailed Description

+

Example usage:

+
 $par_array = array("verb"=>"ListRecords","resumptionToken"=>"9CD1DA87F59C3E960871F4F3C9D093887C17D174");    
+ // Example 1: Error response
+ $error_array[] = oai_error("badVerb","Rubish");
+ $error_array[] = oai_error("sameVerb");
+ $e = new ANDS_Error_XML($par_array,$error_array);
+ $e->display();
+
+
+ // Example 2: Normal response without error codes
+ $par_array = array("verb"=>"ListRecords","resumptionToken"=>"9CD1DA87F59C3E960871F4F3C9D093887C17D174");
+ $test = new ANDS_Response_XML($par_array);
+ $record_node = $test->create_record();
+ $test->create_header("function: identifier string",gmdate("Y-m-d\TH:i:s\Z"),"collection",$record_node);
+ $test->create_metadata($record_node);
+ $test->display();
+
See also:
http://www.openarchives.org/OAI/openarchivesprotocol.html#ErrorConditions
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
oai_error ( code,
argument = '',
value = '' 
)
+
+
+

utility funciton to mapping error codes to readable messages

+ +
+
+
+ + + + +
+ +
+ +
Generated on Thu Jun 16 12:49:22 2011 for OAI PHP by  + +doxygen 1.6.3
+ + diff --git a/getrecord.php b/getrecord.php new file mode 100644 index 0000000..2c8cc2b --- /dev/null +++ b/getrecord.php @@ -0,0 +1,80 @@ +$metadataPrefix and $identifier need to be provided through global array variable $args + * by their indexes 'metadataPrefix' and 'identifier'. + * The reset of information will be extracted from database based those two parameters. + */ + +debug_message("\nI am debuging". __FILE__) ; + +$metadataPrefix = $args['metadataPrefix']; +// myhandler is a php file which will be included to generate metadata node. +// $inc_record = $METADATAFORMATS[$metadataPrefix]['myhandler']; + +if (is_array($METADATAFORMATS[$metadataPrefix]) + && isset($METADATAFORMATS[$metadataPrefix]['myhandler'])) { + $inc_record = $METADATAFORMATS[$metadataPrefix]['myhandler']; +} else { + $errors[] = oai_error('cannotDisseminateFormat', 'metadataPrefix', $metadataPrefix); +} + +$identifier = $args['identifier']; +$query = selectallQuery($metadataPrefix, $identifier); + +debug_message("Query: $query") ; + +$res = $db->query($query); + +if ($res===false) { + if (SHOW_QUERY_ERROR) { + echo __FILE__.','.__LINE__."
"; + echo "Query: $query
\n"; + die($db->errorInfo()); + } else { + $errors[] = oai_error('idDoesNotExist', '', $identifier); + } +} elseif (!$res->rowCount()) { // based on PHP manual, it might only work for some DBs + $errors[] = oai_error('idDoesNotExist', '', $identifier); +} + + +if (!empty($errors)) { + oai_exit(); +} + +$record = $res->fetch(PDO::FETCH_ASSOC); +if ($record===false) { + if (SHOW_QUERY_ERROR) { + echo __FILE__.','.__LINE__."
"; + echo "Query: $query
\n"; + } + $errors[] = oai_error('idDoesNotExist', '', $identifier); +} + +$identifier = $record[$SQL['identifier']];; + +$datestamp = formatDatestamp($record[$SQL['datestamp']]); + +if (isset($record[$SQL['deleted']]) && ($record[$SQL['deleted']] == 'true') && + ($deletedRecord == 'transient' || $deletedRecord == 'persistent')) { + $status_deleted = TRUE; +} else { + $status_deleted = FALSE; +} + +$outputObj = new ANDS_Response_XML($args); +$cur_record = $outputObj->create_record(); +$cur_header = $outputObj->create_header($identifier, $datestamp,$record[$SQL['set']],$cur_record); +// return the metadata record itself +if (!$status_deleted) { + include($inc_record); // where the metadata node is generated. + create_metadata($outputObj, $cur_record, $identifier, $record[$SQL['set']], $db); +} else { + $cur_header->setAttribute("status","deleted"); +} +?> diff --git a/identify.php b/identify.php new file mode 100644 index 0000000..1811bff --- /dev/null +++ b/identify.php @@ -0,0 +1,139 @@ + $val) { + $outputObj->add2_verbNode($key, $val); +} + +foreach($adminEmail as $val) { + $outputObj->add2_verbNode("adminEmail", $val); +} + +if(isset($compression)) { + foreach($compression as $val) { + $outputObj->add2_verbNode("compression", $val); + } +} + +// A description MAY be included. +// Use this if you choose to comply with a specific format of unique identifiers +// for items. +// See http://www.openarchives.org/OAI/2.0/guidelines-oai-identifier.htm +// for details + +// As they will not be changed, using string for simplicity. +$output = ''; +if ($show_identifier && $repositoryIdentifier && $delimiter && $sampleIdentifier) { + $output .= +' + + oai + '.$repositoryIdentifier.' + '.$delimiter.' + '.$sampleIdentifier.' + + '."\n"; +} + +// A description MAY be included. +// This example from arXiv.org is used by the e-prints community, please adjust +// see http://www.openarchives.org/OAI/2.0/guidelines-eprints.htm for details + +// To include, change 'false' to 'true'. +if (false) { + $output .= +' + + + Author self-archived e-prints + + + + + + '."\n"; +} + +// If you want to point harvesters to other repositories, you can list their +// base URLs. Usage of friends container is RECOMMENDED. +// see http://www.openarchives.org/OAI/2.0/guidelines-friends.htm +// for details + +// To include, change 'false' to 'true'. +if (false) { + $output .= +' + + http://naca.larc.nasa.gov/oai2.0/ + http://techreports.larc.nasa.gov/ltrs/oai2.0/ + http://physnet.uni-oldenburg.de/oai/oai2.php + http://cogprints.soton.ac.uk/perl/oai + http://ub.uni-duisburg.de:8080/cgi-oai/oai.pl + http://rocky.dlib.vt.edu/~jcdlpix/cgi-bin/OAI1.1/jcdlpix.pl + + '."\n"; +} + +// If you want to provide branding information, adjust accordingly. +// Usage of friends container is OPTIONAL. +// see http://www.openarchives.org/OAI/2.0/guidelines-branding.htm +// for details + +// To include, change 'false' to 'true'. +if (false) { + $output .= +' + + + http://my.site/icon.png + http://my.site/homepage.html + MySite(tm) + 88 + 31 + + http://some.where/DCrender.xsl + http://another.place/MARCrender.css + + '."\n"; +} + +if(strlen($output)>10) { + $des = $outputObj->doc->createDocumentFragment(); + $des->appendXML($output); + $outputObj->verbNode->appendChild($des); +} +?> diff --git a/index.php b/index.php new file mode 100644 index 0000000..862f00a --- /dev/null +++ b/index.php @@ -0,0 +1,141 @@ +Query functions + * to reflect it and even develop your own code. + *- Check your oai site through a web browser. e.g. : \code http://localhost/oai/ \endcode + *- SELinux needs special treatments for database connection and other permission. + * + * \section struct_sec Structure +The system includes files for individual functionality and utility classes and functions to get it work. +- Controller + - oai2.php +- Individual functionalities: + - identify.php: identifies the data provider. Responses to Identify. + - listmetadataformats.php: lists supported metadata formats, e.g. dc or rif-cs. Responses to ListMetadataFormats. + - listsets.php: lists supported sets, e.g. Activity, Collection or Party. Responses to ListSets. + - listrecords.php: lists a group of records without details. Responses to ListRecords. It also serves to ListIdentifiers which only returns identifiers. + - getrecord.php: gets an individual record. Responses to GetRecord. +- Utility classes + - xml_creater.php which includes classess ANDS_XML, ANDS_Error_XML, ANDS_Response_XML +- Utility functions + - oaidp-util.php + - Support to different metadataformats in your own systems. Two examples provided with the package are: record_dc.php and record_rif.php. They are helpers and need information from the real records. They need to be devloped for your particular system. +- Configurations + - oaidp-config.php + + * + * \author Jianfeng Li + * \version 1.1 + * \date 2010-2011 + */ + +/** + * \file + * \brief + * Default starting point of OAI Data Provider for a human to check. + * + * OAI Data Provider is not designed for human to retrieve data but it is possible to use this page to test and check the functionality of current implementation. + * This page provides a summary of the OAI-PMH and the implementation. + * +*/ + +$MY_URI = 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['SCRIPT_NAME']; +$pos = strrpos($MY_URI, '/'); +$MY_URI = substr($MY_URI, 0, $pos). '/oai2.php'; + +?> + + +php-oai2 Data Provider + + + +

php-oai2 Data Provider

+

This is an implementation of an OAI-PMH 2.0 Data Provider, written in PHP and has been tested with version 5.3.

+ +

This implementation completely complies to OAI-PMH 2.0, including the support of on-the-fly output compression which may significantly +reduce the amount of data being transfered.

+ +

This package has been inspired by PHP OAI Data Provider developed by Heinrich Stamerjohanns at University of Oldenburg. + Some of the functions and algorithms used in this code were transplanted from his implementation.

+ +

Database is supported through PDO, so almost any popular SQL-database which has PDO driver can be used without any change in the code.

+ +

It uses DOM extension,an extension included in every PHP installation since version 5, for generating XML files. With PHP 5 or above no extra extension is needed.

+ +

The repository can be quite easily configured by just editing oai2/oaidp-config.php, most possible values and options are explained. +For requirements and instructions to install and configure, please reference the documentation.

+ +

Once you have setup your Data Provider, you can the easiliy check the generated answers (it will be XML) of your Data Provider +by clicking on the test links below.

+ +

For simple visual tests set $SHOW_QUERY_ERROR to TRUE and $CONTENT_TYPE to text/plain, so you can easily read the generated XML responses in your browser.

+ +

Remember, GetRecord needs identifier to work. +So please change it use your own or you should see a response with error message.

+ +

+

+
Example Tables +
OAI Records (mysql)
+
OAI Records (pgsql)
+ +
Query and check your Data-Provider
+
Identify
+
ListMetadataFormats
+
ListSets
+
ListIdentifiers
+
ListRecords
+
GetRecord
+ +
+

+ +

+For other tests on your own provider or other providers, please use the Repository Explorer. +

+

+Jianfeng Li
+The Plant Accelerator
+University of Adelaide +

+ + + + + diff --git a/listmetadataformats.php b/listmetadataformats.php new file mode 100644 index 0000000..7c1bf3c --- /dev/null +++ b/listmetadataformats.php @@ -0,0 +1,67 @@ +idFormatQuery. + * \sa idFormatQuery + */ + +/** + * Add a metadata format node to an ANDS_Response_XML + * \param &$outputObj + * type: ANDS_Response_XML. The ANDS_Response_XML object for output. + * \param $key + * type string. The name of new node. + * \param $val + * type: array. Values accessable through keywords 'schema' and 'metadataNamespace'. + * + */ +function addMetedataFormat(&$outputObj,$key,$val) { + $cmf = $outputObj->add2_verbNode("metadataFormat"); + $outputObj->addChild($cmf,'metadataPrefix',$key); + $outputObj->addChild($cmf,'schema',$val['schema']); + $outputObj->addChild($cmf,'metadataNamespace',$val['metadataNamespace']); +} + +if (isset($args['identifier'])) { + $identifier = $args['identifier']; + $query = idFormatQuery($identifier); + $res = $db->query($query); + if ($res==false) { + if (SHOW_QUERY_ERROR) { + echo __FILE__.','.__LINE__."
"; + echo "Query: $query
\n"; + die($db->errorInfo()); + } else { + $errors[] = oai_error('idDoesNotExist','', $identifier); + } + } else { + $record = $res->fetch(); + if($record===false) { + $errors[] = oai_error('idDoesNotExist', '', $identifier); + } else { + $mf = explode(",",$record[$SQL['metadataPrefix']]); + } + } +} + +//break and clean up on error +if (!empty($errors)) oai_exit(); + +$outputObj = new ANDS_Response_XML($args); +if (isset($mf)) { + foreach($mf as $key) { + $val = $METADATAFORMATS[$key]; + addMetedataFormat($outputObj,$key, $val); + } +} elseif (is_array($METADATAFORMATS)) { + foreach($METADATAFORMATS as $key=>$val) { + addMetedataFormat($outputObj,$key, $val); + } +} +else { // a very unlikely event + $errors[] = oai_error('noMetadataFormats'); + oai_exit(); +} +?> diff --git a/listrecords.php b/listrecords.php new file mode 100644 index 0000000..01c8e25 --- /dev/null +++ b/listrecords.php @@ -0,0 +1,182 @@ +$args by keywords. + */ + +debug_message("\nI am debuging". __FILE__) ; + +// Resume previous session? +if (isset($args['resumptionToken'])) { + if (!file_exists(TOKEN_PREFIX.$args['resumptionToken'])) { + $errors[] = oai_error('badResumptionToken', '', $args['resumptionToken']); + } else { + $readings = readResumToken(TOKEN_PREFIX.$args['resumptionToken']); + if ($readings == false) { + $errors[] = oai_error('badResumptionToken', '', $args['resumptionToken']); + } else { + debug_var_dump('readings',$readings); + list($deliveredrecords, $extquery, $metadataPrefix) = $readings; + } + } +} else { // no, we start a new session + $deliveredrecords = 0; + $extquery = ''; + + $metadataPrefix = $args['metadataPrefix']; + + if (isset($args['from'])) { + $from = checkDateFormat($args['from']); + $extquery .= fromQuery($from); + } + + if (isset($args['until'])) { + $until = checkDateFormat($args['until']); + $extquery .= untilQuery($until); + } + + if (isset($args['set'])) { + if (is_array($SETS)) { + $extquery .= setQuery($args['set']); + } else { + $errors[] = oai_error('noSetHierarchy'); + } + } +} + +if (!empty($errors)) { + oai_exit(); +} + +// Load the handler +if (is_array($METADATAFORMATS[$metadataPrefix]) + && isset($METADATAFORMATS[$metadataPrefix]['myhandler'])) { + $inc_record = $METADATAFORMATS[$metadataPrefix]['myhandler']; + include($inc_record); +} else { + $errors[] = oai_error('cannotDisseminateFormat', 'metadataPrefix', $metadataPrefix); +} + +if (!empty($errors)) { + oai_exit(); +} + +if (empty($errors)) { + $query = selectallQuery($metadataPrefix) . $extquery; + debug_message("Query: $query") ; + + $res = $db->prepare($query, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)); + $r = $res->execute(); + if ($r===false) { + if (SHOW_QUERY_ERROR) { + echo __FILE__.','.__LINE__."
"; + echo "Query: $query
\n"; + print_r($db->errorInfo()); + exit(); + } else { + $errors[] = oai_error('noRecordsMatch'); + } + } else { + $r = $res->setFetchMode(PDO::FETCH_ASSOC); + if ($r===false) { + exit("FetchMode is not supported"); + } + $num_rows = rowCount($metadataPrefix, $extquery, $db); + if ($num_rows==0) { + echo "Cannot find records: $query\n"; + $errors[] = oai_error('noRecordsMatch'); + } + } +} + +if (!empty($errors)) { + oai_exit(); +} + +// Will we need a new ResumptionToken? +if($args['verb']=='ListRecords') { + $maxItems = MAXRECORDS; +} elseif($args['verb']=='ListIdentifiers') { + $maxItems = MAXIDS; +} else { + exit("Check ".__FILE__." ".__LINE__.", there is something wrong."); +} +$maxrec = min($num_rows - $deliveredrecords, $maxItems); + +if ($num_rows - $deliveredrecords > $maxItems) { + $cursor = (int)$deliveredrecords + $maxItems; + $restoken = createResumToken($cursor, $extquery, $metadataPrefix); + $expirationdatetime = gmstrftime('%Y-%m-%dT%TZ', time()+TOKEN_VALID); +} +// Last delivery, return empty ResumptionToken +elseif (isset($args['resumptionToken'])) { + $restoken = $args['resumptionToken']; // just used as an indicator + unset($expirationdatetime); +} + + +if (isset($args['resumptionToken'])) { + debug_message("Try to resume because a resumptionToken supplied.") ; + $record = $res->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_ABS, $deliveredrecords); +} +// Record counter +$countrec = 0; + +// Publish a batch to $maxrec number of records +$outputObj = new ANDS_Response_XML($args); +while ($countrec++ < $maxrec) { + $record = $res->fetch(PDO::FETCH_ASSOC); + if ($record===false) { + if (SHOW_QUERY_ERROR) { + echo __FILE__.",". __LINE__."
"; + print_r($db->errorInfo()); + exit(); + } + } + + $identifier = $oaiprefix.$record[$SQL['identifier']]; + $datestamp = formatDatestamp($record[$SQL['datestamp']]); + $setspec = $record[$SQL['set']]; + + // debug_var_dump('record', $record); + if (isset($record[$SQL['deleted']]) && ($record[$SQL['deleted']] === true) && + ($deletedRecord == 'transient' || $deletedRecord == 'persistent')) { + $status_deleted = TRUE; + } else { + $status_deleted = FALSE; + } + + //debug_var_dump('status_deleted', $status_deleted); + if($args['verb']=='ListRecords') { + $cur_record = $outputObj->create_record(); + $cur_header = $outputObj->create_header($identifier, $datestamp,$setspec,$cur_record); + // return the metadata record itself + if (!$status_deleted) { + debug_var_dump('inc_record',$inc_record); + create_metadata($outputObj, $cur_record, $identifier, $setspec, $db); + } + } else { // for ListIdentifiers, only identifiers will be returned. + $cur_header = $outputObj->create_header($identifier, $datestamp,$setspec); + } + if ($status_deleted) { + $cur_header->setAttribute("status","deleted"); + } +} + +// ResumptionToken +if (isset($restoken)) { + if(isset($expirationdatetime)) { + $outputObj->create_resumpToken($restoken,$expirationdatetime,$num_rows,$cursor); + } else { + $outputObj->create_resumpToken('',null,$num_rows,$deliveredrecords); + } +} + +// end ListRecords +if (SHOW_QUERY_ERROR) {echo "Debug listrecord.php reached to the end.\n\n";} +?> diff --git a/listsets.php b/listsets.php new file mode 100644 index 0000000..8c47918 --- /dev/null +++ b/listsets.php @@ -0,0 +1,30 @@ +add2_verbNode("set"); + foreach($set as $key => $val) { + if($key=='setDescription') { + $desNode = $outputObj->addChild($setNode,$key); + $des = $outputObj->doc->createDocumentFragment(); + $des->appendXML($val); + $desNode->appendChild($des); + } else { + $outputObj->addChild($setNode,$key,$val); + } + } + } +} else { + $errors[] = oai_error('noSetHierarchy'); + oai_exit(); +} + +?> diff --git a/oai2.php b/oai2.php new file mode 100644 index 0000000..e426fb2 --- /dev/null +++ b/oai2.php @@ -0,0 +1,173 @@ +Remember: to define your own classess for generating metadata records. + * In common cases, you have to implement your own code to act fully and correctly. + * For generic usage, you can try the ANDS_Response_XML defined in xml_creater.php. + */ + +// Report all errors except E_NOTICE +// This is the default value set in php.ini +// If anything else, try them. +// error_reporting (E_ALL ^ E_NOTICE); + +/** + * An array for collecting erros which can be reported later. It will be checked before a new action is taken. + */ +$errors = array(); + +/** + * Supported attributes associate to verbs. + */ +$attribs = array ('from', 'identifier', 'metadataPrefix', 'set', 'resumptionToken', 'until'); + +if (in_array($_SERVER['REQUEST_METHOD'],array('GET','POST'))) { + $args = $_REQUEST; +} else { + $errors[] = oai_error('badRequestMethod', $_SERVER['REQUEST_METHOD']); +} + +require_once('oaidp-util.php'); +// Always using htmlentities() function to encodes the HTML entities submitted by others. +// No one can be trusted. +foreach ($args as $key => $val) { + $checking = htmlspecialchars(stripslashes($val)); + if (!is_valid_attrb($checking)) { + $errors[] = oai_error('badArgument', $checking); + } else {$args[$key] = $checking; } +} +if (!empty($errors)) { oai_exit(); } + +foreach($attribs as $val) { + unset($$val); +} + +require_once('oaidp-config.php'); + +// Create a PDO object +try { + $db = new PDO($DSN); +} catch (PDOException $e) { + exit('Connection failed: ' . $e->getMessage()); +} + +// For generic usage or just trying: +// require_once('xml_creater.php'); +// In common cases, you have to implement your own code to act fully and correctly. +require_once('ands_tpa.php'); + +// Default, there is no compression supported +$compress = FALSE; +if (isset($compression) && is_array($compression)) { + if (in_array('gzip', $compression) && ini_get('output_buffering')) { + $compress = TRUE; + } +} + +if (SHOW_QUERY_ERROR) { + echo "Args:\n"; print_r($args); +} + +if (isset($args['verb'])) { + switch ($args['verb']) { + + case 'Identify': + // we never use compression in Identify + $compress = FALSE; + if(count($args)>1) { + foreach($args as $key => $val) { + if(strcmp($key,"verb")!=0) { + $errors[] = oai_error('badArgument', $key, $val); + } + } + } + if (empty($errors)) include 'identify.php'; + break; + + case 'ListMetadataFormats': + $checkList = array("ops"=>array("identifier")); + checkArgs($args, $checkList); + if (empty($errors)) include 'listmetadataformats.php'; + break; + + case 'ListSets': + if(isset($args['resumptionToken']) && count($args) > 2) { + $errors[] = oai_error('exclusiveArgument'); + } + $checkList = array("ops"=>array("resumptionToken")); + checkArgs($args, $checkList); + if (empty($errors)) include 'listsets.php'; + break; + + case 'GetRecord': + $checkList = array("required"=>array("metadataPrefix","identifier")); + checkArgs($args, $checkList); + if (empty($errors)) include 'getrecord.php'; + break; + + case 'ListIdentifiers': + case 'ListRecords': + if(isset($args['resumptionToken'])) { + if (count($args) > 2) { + $errors[] = oai_error('exclusiveArgument'); + } + $checkList = array("ops"=>array("resumptionToken")); + } else { + $checkList = array("required"=>array("metadataPrefix"),"ops"=>array("from","until","set")); + } + checkArgs($args, $checkList); + if (empty($errors)) include 'listrecords.php'; + break; + + default: + // we never use compression with errors + $compress = FALSE; + $errors[] = oai_error('badVerb', $args['verb']); + } /*switch */ +} else { + $errors[] = oai_error('noVerb'); +} + +if (!empty($errors)) { oai_exit(); } + +if ($compress) { + ob_start('ob_gzhandler'); +} + +header(CONTENT_TYPE); + +if(isset($outputObj)) { + $outputObj->display(); +} else { + exit("There is a bug in codes"); +} + + if ($compress) { + ob_end_flush(); + } + +?> diff --git a/oaidp-config.php b/oaidp-config.php new file mode 100644 index 0000000..b036f34 --- /dev/null +++ b/oaidp-config.php @@ -0,0 +1,298 @@ +$adminEmail: the e-mail addresses of administrators of the repository. + * + * - $repositoryIdentifier : For a data provider there is only one. For repositories to comply with the oai + * format it has to be unique identifiers for items records. Basically using domainname will be fine. + * See: http://www.openarchives.org/OAI/2.0/guidelines-oai-identifier.htm. + * + * - $SETS: An array with key words . List of supported SETs. + * + * - $METADATAFORMATS: List of supported metadata formats. It is a two-dimensional array with keys. + * Each supported format is one element of this array at the first dimension. + * The key is the name of a metadata format. + * The exact number of items within each format associated array depends on the nature of a metadata format. + * Most definitions are done here but handlers themselves are defined in separated files because only the names of PHP script are listed here. + * - metadataPrefix + * - schema + * - metadataNamespace + * - myhandler + * - other optional items: record_prefix, record_namespace and etc. + * + * - $SQL: Settings for database and queries from database + * + * - $DSN: DSN for connecting your database. Reference PDO for details. + * + * The rest of settings will not normally need to be adjusted. Read source code for details. +*/ + +/** + * Whether to show error message for dubug. + * For installation, testing and debuging set SHOW_QUERY_ERROR to TRUE + * If set to TRUE, application will die and display query and database error message + * as soon as there is a problem. Do not set this to TRUE on a production site, + * since it will show error messages to everybody. + * If set FALSE, will create XML-output, no matter what happens. + */ +// If everything is running ok, you should use this +define('SHOW_QUERY_ERROR',FALSE); + +/** + * \property CONTENT_TYPE + * The content-type the WWW-server delivers back. For debug-puposes, "text/plain" + * is easier to view. On a production site you should use "text/xml". + */ +#define('CONTENT_TYPE','Content-Type: text/plain'); +// If everything is running ok, you should use this +define('CONTENT_TYPE', 'Content-Type: text/xml'); + +/** + * Identifier settings. It needs to have proper values to reflect the settings of the data provider. + * + * - $identifyResponse['repositoryName'] : compulsory. A human readable name for the repository; + * - $identifyResponse['baseURL'] : compulsory. The base URL of the repository; + * - $identifyResponse['protocolVersion'] : compulsory. The version of the OAI-PMH supported by the repository; + * - $identifyResponse['earliestDatestamp'] : compulsory. A UTCdatetime that is the guaranteed lower limit of all datestamps recording changes, modifications, or deletions in the repository. A repository must not use datestamps lower than the one specified by the content of the earliestDatestamp element. earliestDatestamp must be expressed at the finest granularity supported by the repository. + * - $identifyResponse['deletedRecord'] : the manner in which the repository supports the notion of deleted records. Legitimate values are no ; transient ; persistent with meanings defined in the section on deletion. + * - $identifyResponse['granularity'] : the finest harvesting granularity supported by the repository. The legitimate values are YYYY-MM-DD and YYYY-MM-DDThh:mm:ssZ with meanings as defined in ISO8601. + * + */ +$identifyResponse = array(); + +// MUST (only one) +// please adjust +$identifyResponse["repositoryName"] = 'Your organisation'; + +// For ANDS to harvest of RIF-CS, originatingSource is plantaccelerator.org.au +// $dataSource = "plantaccelerator.org.au"; +define('DATASOURCE','domain.of.your.organisation'); + +// do not change +define('MY_URI','http://'.$_SERVER['SERVER_NAME'].$_SERVER['SCRIPT_NAME']); +// You can use a static URI as well. +// $baseURL = "http://my.server.org/oai/oai2.php"; +$identifyResponse["baseURL"] = MY_URI; + +// do not change +$identifyResponse["protocolVersion"] = '2.0'; + +// MUST (only one) +// the earliest datestamp in your repository, +// please adjust +// Only date is needed even later it will be formatted according to the granularity. +$identifyResponse["earliestDatestamp"] = '2011-01-01'; + +// How your repository handles deletions +// no: The repository does not maintain status about deletions. +// It MUST NOT reveal a deleted status. +// persistent: The repository persistently keeps track about deletions +// with no time limit. It MUST consistently reveal the status +// of a deleted record over time. +// transient: The repository does not guarantee that a list of deletions is +// maintained. It MAY reveal a deleted status for records. +// +// If your database keeps track of deleted records change accordingly. +// Currently if $record['deleted'] is set to 'true', $status_deleted is set. +// Some lines in listidentifiers.php, listrecords.php, getrecords.php +// must be changed to fit the condition for your database. +$identifyResponse["deletedRecord"] = 'no'; +$deletedRecord = $identifyResponse["deletedRecord"]; // a shorthand for checking the configuration of Deleted Records + +// MAY (only one) +//granularity is days +//$granularity = 'YYYY-MM-DD'; +// granularity is seconds +$identifyResponse["granularity"] = 'YYYY-MM-DDThh:mm:ssZ'; + +// this is appended if your granularity is seconds. +// do not change +if (strcmp($identifyResponse["granularity"],'YYYY-MM-DDThh:mm:ssZ')==0) { + $identifyResponse["earliestDatestamp"] = $identifyResponse["earliestDatestamp"].'T00:00:00Z'; +} + +// MUST (multiple) +// please adjust +$adminEmail = array('some.one@contact.com'); + +/** Compression methods supported. Optional (multiple). Default: null. +* +* Currently only gzip is supported (you need output buffering turned on, +* and php compiled with libgz). +* The client MUST send "Accept-Encoding: gzip" to actually receive +*/ +// $compression = array('gzip'); +$compression = null; + +// MUST (only one) +// You may choose any name, but for repositories to comply with the oai +// format it has to be unique identifiers for items records. +// see: http://www.openarchives.org/OAI/2.0/guidelines-oai-identifier.htm +// Basically use domainname +// please adjust +$repositoryIdentifier = 'url.organisation.'; + +// For RIF-CS, especially with ANDS, each registryObject much has a group for the ownership of data. +// For detail please see ANDS guide on its web site. Each data provider should have only one REG_OBJ_GROUP +// for this purpose. +define('REG_OBJ_GROUP','Something agreed on'); + +// If Identifier needs to show NODE description. It is defined in identify.php +// You may include details about your community and friends (other +// data-providers). +// Please check identify.php for other possible containers +// in the Identify response +$show_identifier = false; +// MUST (only one) +// should not be changed. Only useful when NODE description is included in the response to Identifier +$delimiter = ':'; + + +/** Maximum mumber of the records to deliver + * (verb is ListRecords) + * If there are more records to deliver + * a ResumptionToken will be generated. + */ +define('MAXRECORDS',10); + +/** Maximum mumber of identifiers to deliver + * (verb is ListIdentifiers) + * If there are more identifiers to deliver + * a ResumptionToken will be generated. + */ +define('MAXIDS',40); + +/** After 24 hours resumptionTokens become invalid. Unit is second. */ +define('TOKEN_VALID',24*3600); +$expirationdatetime = gmstrftime('%Y-%m-%dT%TZ', time()+TOKEN_VALID); +/** Where token is saved and path is included */ +define('TOKEN_PREFIX','/tmp/ANDS_DBPD-'); + +// define all supported sets in your repository +$SETS = array ( + array('setSpec'=>'class:activity', 'setName'=>'Activities'), + array('setSpec'=>'class:collection', 'setName'=>'Collections'), + array('setSpec'=>'class:party', 'setName'=>'Parties')/*, + array('setSpec'=>'phdthesis', 'setName'=>'PHD Thesis', 'setDescription'=>' + This set contains metadata describing electronic music recordings made during the 1950ies + ') //, + // array('setSpec'=>'math', 'setName'=>'Mathematics') , + // array('setSpec'=>'phys', 'setName'=>'Physics') + */); + +// define all supported metadata formats, has to be an array +// +// myhandler is the name of the file that handles the request for the +// specific metadata format. +// [record_prefix] describes an optional prefix for the metadata +// [record_namespace] describe the namespace for this prefix + +$METADATAFORMATS = array ( + 'rif' => array('metadataPrefix'=>'rif', + 'schema'=>'http://services.ands.org.au/sandbox/orca/schemata/registryObjects.xsd', + 'metadataNamespace'=>'http://ands.org.au/standards/rif-cs/registryObjects/', + 'myhandler'=>'record_rif.php' + ), + 'oai_dc' => array('metadataPrefix'=>'oai_dc', + 'schema'=>'http://www.openarchives.org/OAI/2.0/oai_dc.xsd', + 'metadataNamespace'=>'http://www.openarchives.org/OAI/2.0/oai_dc/', + 'myhandler'=>'record_dc.php', + 'record_prefix'=>'dc', + 'record_namespace' => 'http://purl.org/dc/elements/1.1/' + ) + ); + +if (!is_array($METADATAFORMATS)) { exit("Configuration of METADATAFORMAT has been wrongly set. Correct your ".__FILE__);} + +// The shorthand of xml schema namespace, no need to change this +define('XMLSCHEMA', 'http://www.w3.org/2001/XMLSchema-instance'); + +// +// DATABASE SETUP +// + +// change according to your local DB setup. +$DB_HOST = '127.0.0.1'; +$DB_USER = 'your-name'; +$DB_PASSWD = 'your-pwd'; +$DB_NAME = 'your-db'; + +// Data Source Name: This is the universal connection string +// if you use something other than mysql edit accordingly. +// Example for MySQL +// $DSN = "mysql://$DB_USER:$DB_PASSWD@$DB_HOST/$DB_NAME"; +// Example for Oracle +// $DSN = "oci8://$DB_USER:$DB_PASSWD@$DB_NAME"; + +$DSN = "pgsql:host=$DB_HOST;port=5432;dbname=$DB_NAME;user=$DB_USER;password=$DB_PASSWD"; + +// the charset you store your metadata in your database +// currently only utf-8 and iso8859-1 are supported +$charset = "iso8859-1"; + +// if entities such as < > ' " in your metadata has already been escaped +// then set this to true (e.g. you store < as < in your DB) +$xmlescaped = false; + +// We store multiple entries for one element in a single row +// in the database. SQL['split'] lists the delimiter for these entries. +// If you do not do this, do not define $SQL['split'] +// $SQL['split'] = ';'; + +// the name of the table where your store your metadata's header +$SQL['table'] = 'oai_headers'; + +// the name of the column where you store the unique identifiers +// pointing to your item. +// this is your internal identifier for the item +$SQL['identifier'] = 'oai_identifier'; + +$SQL['metadataPrefix'] = 'oai_metadataprefix'; + +// If you want to expand the internal identifier in some way +// use this (but not for OAI stuff, see next line) +$idPrefix = ''; + +// this is your external (OAI) identifier for the item +// this will be expanded to +// oai:$repositoryIdentifier:$idPrefix$SQL['identifier'] +// should not be changed +// +// Commented out 24/11/10 14:19:09 +// $oaiprefix = "oai".$delimiter.$repositoryIdentifier.$delimiter.$idPrefix; +$oaiprefix = ""; + +// adjust anIdentifier with sample contents an identifier +// $sampleIdentifier = $oaiprefix.'anIdentifier'; + +// the name of the column where you store your datestamps +$SQL['datestamp'] = 'datestamp'; + +// the name of the column where you store information whether +// a record has been deleted. Leave it as it is if you do not use +// this feature. +$SQL['deleted'] = 'deleted'; + +// to be able to quickly retrieve the sets to which one item belongs, +// the setnames are stored for each item +// the name of the column where you store sets +$SQL['set'] = 'oai_set'; +?> diff --git a/oaidp-util.php b/oaidp-util.php new file mode 100644 index 0000000..e99e5c5 --- /dev/null +++ b/oaidp-util.php @@ -0,0 +1,332 @@ +return parameter sets to true. + * \param $msg Type: string Message needs to be shown + * \see SHOW_QUERY_ERROR in oaidp-config.php + */ +function debug_message($msg) { + if (!SHOW_QUERY_ERROR) return; + echo $msg,"\n"; +} + +/** Check if provided correct arguments for a request. + * + * Only number of parameters is checked. + * metadataPrefix has to be checked before it is used. + * set has to be checked before it is used. + * resumptionToken has to be checked before it is used. + * from and until can easily checked here because no extra information + * is needed. + */ +function checkArgs($args, $checkList) { +// global $errors, $TOKEN_VALID, $METADATAFORMATS; + global $errors, $METADATAFORMATS; +// $verb = $args['verb']; + unset($args["verb"]); + + debug_print_r('checkList',$checkList); + debug_print_r('args',$args); + + // "verb" has been checked before, no further check is needed + if(isset($checkList['required'])) { + for($i = 0; $i < count($checkList["required"]); $i++) { + debug_message("Checking: par$i: ". $checkList['required'][$i] . " in "); + debug_var_dump("isset(\$args[\$checkList['required'][\$i]])",isset($args[$checkList['required'][$i]])); + // echo "key exists". array_key_exists($checkList["required"][$i],$args)."\n"; + if(isset($args[$checkList['required'][$i]])==false) { + // echo "caught\n"; + $errors[] = oai_error('missingArgument', $checkList["required"][$i]); + } else { + // if metadataPrefix is set, it is in required section + if(isset($args['metadataPrefix'])) { + $metadataPrefix = $args['metadataPrefix']; + // Check if the format is supported, it has enough infor (an array), last if a handle has been defined. + if (!array_key_exists ($metadataPrefix, $METADATAFORMATS) || !(is_array($METADATAFORMATS[$metadataPrefix]) + || !isset($METADATAFORMATS[$metadataPrefix]['myhandler']))) { + $errors[] = oai_error('cannotDisseminateFormat', 'metadataPrefix', $metadataPrefix); + } + } + unset($args[$checkList["required"][$i]]); + } + } + } + debug_message('Before return'); + debug_print_r('errors',$errors); + if (!empty($errors)) return; + + // check to see if there is unwanted + foreach($args as $key => $val) { + debug_message("checkArgs: $key"); + if(!in_array($key, $checkList["ops"])) { + debug_message("Wrong\n".print_r($checkList['ops'],true)); + $errors[] = oai_error('badArgument', $key, $val); + } + switch ($key) { + case 'from': + case 'until': + if(!checkDateFormat($val)) { + $errors[] = oai_error('badGranularity', $key, $val); + } + break; + + case 'resumptionToken': + // only check for expairation + if((int)$val+TOKEN_VALID < time()) + $errors[] = oai_error('badResumptionToken'); + break; + } + } +} + +/** Validates an identifier. The pattern is: '/^[-a-z\.0-9]+$/i' which means + * it accepts -, letters and numbers. + * Used only by function oai_error code idDoesNotExist. + * \param $url Type: string + */ +function is_valid_uri($url) +{ + return((bool)preg_match('/^[-a-z\.0-9]+$/i', $url)); +} + +/** Validates attributes come with the query. + * It accepts letters, numbers, ':', '_', '.' and -. + * Here there are few more match patterns than is_valid_uri(): ':_'. + * \param $attrb Type: string + */ + function is_valid_attrb($attrb) { + return preg_match("/^[_a-zA-Z0-9\-\:\.]+$/",$attrb); + } + +/** All datestamps used in this system are GMT even + * return value from database has no TZ information + */ +function formatDatestamp($datestamp) +{ + return date("Y-m-d\TH:i:s\Z",strtotime($datestamp)); +} + +/** The database uses datastamp without time-zone information. + * It needs to clean all time-zone informaion from time string and reformat it + */ +function checkDateFormat($date) { + $date = str_replace(array("T","Z")," ",$date); + $time_val = strtotime($date); + if (SHOW_QUERY_ERROR) { echo "timeval: $time_val\n"; } + if(!$time_val) return false; + if(strstr($date,":")) { + return date("Y-m-d H:i:s",$time_val); + } else { + return date("Y-m-d",$time_val); + } +} + +/** Retrieve all defined 'setSpec' from configuraiton of $SETS. + * It is used by ANDS_TPA::create_obj_node(); +*/ +function prepare_set_names() { + global $SETS; + $n = count($SETS); + $a = array_fill(0,$n,''); + for ($i = 0; $i <$n; $i++) { + $a[$i] = $SETS[$i]['setSpec']; + } + return $a; +} + +/** Finish a request when there is an error: send back errors. */ +function oai_exit() +{ +// global $CONTENT_TYPE; + header(CONTENT_TYPE); + global $args,$errors,$compress; + $e = new ANDS_Error_XML($args,$errors); + if ($compress) { + ob_start('ob_gzhandler'); + } + + $e->display(); + + if ($compress) { + ob_end_flush(); + } + + exit(); +} + +// ResumToken section +/** Generate a string based on the current Unix timestamp in microseconds for creating resumToken file name. */ +function get_token() +{ + list($usec, $sec) = explode(" ", microtime()); + return ((int)($usec*1000) + (int)($sec*1000)); +} + +/** Create a token file. + * It has three parts which is separated by '#': cursor, extension of query, metadataPrefix. + * Called by listrecords.php. + */ +function createResumToken($cursor, $extquery, $metadataPrefix) { + $token = get_token(); + $fp = fopen (TOKEN_PREFIX.$token, 'w'); + if($fp==false) { + exit("Cannot write. Writer permission needs to be changed."); + } + fputs($fp, "$cursor#"); + fputs($fp, "$extquery#"); + fputs($fp, "$metadataPrefix#"); + fclose($fp); + return $token; +} + +/** Read a saved ResumToken */ +function readResumToken($resumptionToken) { + $rtVal = false; + $fp = fopen($resumptionToken, 'r'); + if ($fp!=false) { + $filetext = fgets($fp, 255); + $textparts = explode('#', $filetext); + fclose($fp); + unlink ($resumptionToken); + $rtVal = array((int)$textparts[0], $textparts[1], $textparts[2]); + } + return $rtVal; +} + +// Here are a couple of queries which might need to be adjusted to +// your needs. Normally, if you have correctly named the columns above, +// this does not need to be done. + +/** this function should generate a query which will return + * all records + * the useless condition id_column = id_column is just there to ease + * further extensions to the query, please leave it as it is. + */ +function selectallQuery ($metadPrefix = "rif", $id = '') +{ + global $SQL; + $query = "SELECT * FROM ".$SQL['table'] . " WHERE ".$SQL['metadataPrefix']." LIKE '%$metadPrefix%'"; + if ($id != '') { + $query .= " AND ".$SQL['identifier']." ='$id'"; + } + return $query; +} + +/** this function will return metadataFormat of a record */ +function idFormatQuery($id) +{ + global $SQL; + return 'select '.$SQL['metadataPrefix'].' FROM '.$SQL['table']. " WHERE ".$SQL['identifier']." = '".$id."'"; +} + +/** this function will return identifier and datestamp for all records + * not very useful + */ +function idQuery ($metadPrefix = "rif", $id = '') +{ + global $SQL; + + if ($SQL['set'] != '') { + $query = 'select '.$SQL['identifier'].','.$SQL['datestamp'].','.$SQL['set'].' FROM '.$SQL['table']. " WHERE ".$SQL['metadataPrefix']." LIKE '%$metadPrefix%'"; + } else { + $query = 'select '.$SQL['identifier'].','.$SQL['datestamp'].' FROM '.$SQL['table']. " WHERE ".$SQL['metadataPrefix']." LIKE '%$metadPrefix%'"; + } + + if ($id != '') { + $query .= " AND ".$SQL['identifier']." = '$id'"; + } + + return $query; +} + +/** filter for until, appends to the end of SQL query */ +function untilQuery($until) +{ + global $SQL; + + return ' AND '.$SQL['datestamp']." <= '$until'"; +} + +/** filter for from , appends to the end of SQL query */ +function fromQuery($from) +{ + global $SQL; + + return ' AND '.$SQL['datestamp']." >= '$from'"; +} + +/** filter for sets, appends to the end of SQL query */ +function setQuery($set) +{ + global $SQL; + // strip off "class:" which is not saved in database + if(strstr($set,"class:")) $set = substr($set,6); + return ' AND '.$SQL['set']." LIKE '%$set%'"; +} + +/** for accurately to assess how many records satisfy conditions for all DBs */ +function rowCount($metadataPrefix, $extQuery, $db) { + global $SQL; + $n = 0; + $sql = "SELECT COUNT(*) FROM ".$SQL['table'] . " WHERE ".$SQL['metadataPrefix']." LIKE '%$metadataPrefix%'" . $extQuery; + if ($res = $db->query($sql)) { + $n = $res->fetchColumn(); + } + return $n; +} + +/** A worker function for processing an error when a query was executed + * \param $query string, original query + * \param $e PDOException, the PDOException object +*/ +function process_pdo_error($query, $e) { + echo $query.' was failed\n'; + echo $e->getMessage(); +} + +/** When query return no result, throw an Exception of Not found. + * \param $db PDO + * \param $query string + * \return $res PDOStatement + */ +function exec_pdo_query($db, $query) +{ + $res = $db->query($query); + if ($res===false) { + throw new Exception($query.":\nIt found nothing.\n"); + } else return $res; +} +?> diff --git a/record_dc.php b/record_dc.php new file mode 100644 index 0000000..57be707 --- /dev/null +++ b/record_dc.php @@ -0,0 +1,14 @@ +create_metadata($cur_record); +} diff --git a/record_rif.php b/record_rif.php new file mode 100644 index 0000000..c7be32e --- /dev/null +++ b/record_rif.php @@ -0,0 +1,34 @@ +create_metadata($cur_record); + $obj_node = new ANDS_TPA($outputObj, $metadata_node, $db); + try { + $obj_node->create_obj_node($setspec, $identifier); + } catch (Exception $e) { + echo 'Caught exception: ', $e->getMessage(), " when adding $identifier\n"; + } +} + diff --git a/xml_creater.php b/xml_creater.php new file mode 100644 index 0000000..dd402d4 --- /dev/null +++ b/xml_creater.php @@ -0,0 +1,328 @@ +"ListRecords","resumptionToken"=>"9CD1DA87F59C3E960871F4F3C9D093887C17D174"); + * // Example 1: Error response + * $error_array[] = oai_error("badVerb","Rubish"); + * $error_array[] = oai_error("sameVerb"); + * $e = new ANDS_Error_XML($par_array,$error_array); + * $e->display(); + * + + * // Example 2: Normal response without error codes + * $par_array = array("verb"=>"ListRecords","resumptionToken"=>"9CD1DA87F59C3E960871F4F3C9D093887C17D174"); + * $test = new ANDS_Response_XML($par_array); + * $record_node = $test->create_record(); + * $test->create_header("function: identifier string",gmdate("Y-m-d\TH:i:s\Z"),"collection",$record_node); + * $test->create_metadata($record_node); + * $test->display(); + * \endcode + * + * \see http://www.openarchives.org/OAI/openarchivesprotocol.html#ErrorConditions + */ + +/* +http://www.openarchives.org/OAI/openarchivesprotocol.html#ErrorConditions + +badArgument: + The request includes illegal arguments, is missing required arguments, includes a repeated argument, or values for arguments have an illegal syntax. Applied to all verbs. + +badResumptionToken: + The value of the resumptionToken argument is invalid or expired. Applied to: ListIdentifiers, ListRecords, ListSets + +badVerb: + Value of the verb argument is not a legal OAI-PMH verb, the verb argument is missing, or the verb argument is repeated. N/A + +cannotDisseminateFormat: + The metadata format identified by the value given for the metadataPrefix argument is not supported by the item or by the repository. Applied to GetRecord, ListIdentifiers, ListRecords + +idDoesNotExist: + The value of the identifier argument is unknown or illegal in this repository. Applied to GetRecord, ListMetadataFormats + +noRecordsMatch: + The combination of the values of the from, until, set and metadataPrefix arguments results in an empty list. Applied to ListIdentifiers, ListRecords + +noMetadataFormats: + There are no metadata formats available for the specified item. Applied to ListMetadataFormats. + +noSetHierarchy: + The repository does not support sets. Applied to ListSets, ListIdentifiers, ListRecords + +*/ + +/** utility funciton to mapping error codes to readable messages */ +function oai_error($code, $argument = '', $value = '') +{ + switch ($code) { + case 'badArgument' : + $text = "The argument '$argument' (value='$value') included in the request is not valid."; + break; + + case 'badGranularity' : + $text = "The value '$value' of the argument '$argument' is not valid."; + $code = 'badArgument'; + break; + + case 'badResumptionToken' : + $text = "The resumptionToken '$value' does not exist or has already expired."; + break; + + case 'badRequestMethod' : + $text = "The request method '$argument' is unknown."; + $code = 'badVerb'; + break; + + case 'badVerb' : + $text = "The verb '$argument' provided in the request is illegal."; + break; + + case 'cannotDisseminateFormat' : + $text = "The metadata format '$value' given by $argument is not supported by this repository."; + break; + + case 'exclusiveArgument' : + $text = 'The usage of resumptionToken as an argument allows no other arguments.'; + $code = 'badArgument'; + break; + + case 'idDoesNotExist' : + $text = "The value '$value' of the identifier does not exist in this repository."; + if (!is_valid_uri($value)) { + $code = 'badArgument'; + $text .= ' Invalidated URI has been detected.'; + } + break; + + case 'missingArgument' : + $text = "The required argument '$argument' is missing in the request."; + $code = 'badArgument'; + break; + + case 'noRecordsMatch' : + $text = 'The combination of the given values results in an empty list.'; + break; + + case 'noMetadataFormats' : + $text = 'There are no metadata formats available for the specified item.'; + break; + + case 'noVerb' : + $text = 'The request does not provide any verb.'; + $code = 'badVerb'; + break; + + case 'noSetHierarchy' : + $text = 'This repository does not support sets.'; + break; + + case 'sameArgument' : + $text = 'Do not use the same argument more than once.'; + $code = 'badArgument'; + break; + + case 'sameVerb' : + $text = 'Do not use verb more than once.'; + $code = 'badVerb'; + break; + + case 'notImp' : + $text = 'Not yet implemented.'; + $code = 'debug'; + break; + + default: + $text = "Unknown error: code: '$code', argument: '$argument', value: '$value'"; + $code = 'badArgument'; + } + return $code."|".$text; +} + +/** + * A wraper of DOMDocument for data provider + */ +class ANDS_XML { + + public $doc; /**< Type: DOMDocument. Handle of current XML Document object */ + + /** + * Constructs an ANDS_XML object. + * + * @param $par_array Type: array. + * Array of request parameters for creating an ANDS_XML object. + * \see create_request. + */ + function __construct($par_array) { + $this->doc = new DOMDocument("1.0","UTF-8"); + // oai_node equals to $this->doc->documentElement; + $oai_node = $this->doc->createElement("OAI-PMH"); + $oai_node->setAttribute("xmlns","http://www.openarchives.org/OAI/2.0/"); + $oai_node->setAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance"); + $oai_node->setAttribute("xsi:schemaLocation","http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd"); + $this->addChild($oai_node,"responseDate",gmdate("Y-m-d\TH:i:s\Z")); + $this->doc->appendChild($oai_node); + $this->create_request($par_array); + } + + /** + * Add a child node to a parent node on a XML Doc: a worker function. + * + * @param $mom_node + * Type: DOMNode. The target node. + * + * @param $name + * Type: string. The name of child nade is being added + * + * @param $value + * Type: string. Text for the adding node if it is a text node. + * + * @return DOMElement $added_node + * The newly created node, can be used for further expansion. + * If no further expansion is expected, return value can be igored. + */ + + function addChild($mom_node,$name, $value='') { + $added_node = $this->doc->createElement($name,$value); + $added_node = $mom_node->appendChild($added_node); + return $added_node; + } + + + /** + * Create an OAI request node. + * + * @param $par_array Type: array + * The attributes of a request node. They describe the verb of the request and other associated parameters used in the request. + * Keys of the array define attributes, and values are their content. + */ + + function create_request($par_array) { + $request = $this->addChild($this->doc->documentElement,"request",MY_URI); + foreach($par_array as $key => $value) { + $request->setAttribute($key,$value); + } + } + + /** + * Display a doc in a readable, well-formatted way for display or saving + */ + function display() { + $pr = new DOMDocument(); + $pr->preserveWhiteSpace = false; + $pr->formatOutput = true; + $pr->loadXML($this->doc->saveXML()); + echo $pr->saveXML(); + } +} + +/** + * Generate an XML response when a request cannot be finished + * + * It has only one derived member function + */ +class ANDS_Error_XML extends ANDS_XML { + function __construct($par_array, $error_array) { + parent::__construct($par_array); + + $oai_node = $this->doc->documentElement; + foreach($error_array as $e) { + list($code, $value) = explode("|", $e); + $node = $this->addChild($oai_node,"error",$value); + $node->setAttribute("code",$code); + } + } +} + +/** + * Generate an XML response to a request if no error has occured + * + * This is the class to further develop to suits a publication need + */ +class ANDS_Response_XML extends ANDS_XML { + public $verbNode; /**< Type: DOMElement. Verb node itself. */ + protected $verb; /**< Type: string. The verb in the request */ + + function __construct($par_array) { + parent::__construct($par_array); + $this->verb = $par_array["verb"]; + $this->verbNode = $this->addChild($this->doc->documentElement,$this->verb); + } + +/** Add direct child nodes to verb node (OAI-PMH), e.g. response to ListMetadataFormats. + * Different verbs can have different required child nodes. + * \see create_record, create_header + * \see http://www.openarchives.org/OAI/2.0/openarchivesprotocol.htm. + * + * \param $nodeName Type: string. The name of appending node. + * \param $value Type: string. The content of appending node. + */ + function add2_verbNode($nodeName, $value=null) { + return $this->addChild($this->verbNode,$nodeName,$value); + } + + /** + * Create an empty \ node. Other nodes will be appended to it later. + */ + function create_record() { + return $this->add2_verbNode("record"); + } + + /** Headers are enclosed inside of \ to the query of ListRecords, ListIdentifiers and etc. + * + * \param $identifier Type: string. The identifier string for node \. + * \param $timestamp Type: timestamp. Timestapme in UTC format for node \. + * \param $ands_class Type: mix. Can be an array or just a string. Content of \. + * \param $add_to_node Type: DOMElement. Default value is null. + * In normal cases, $add_to_node is the \ node created previously. When it is null, the newly created header node is attatched to $this->verbNode. + * Otherwise it will be attatched to the desired node defined in $add_to_node. + */ + function create_header($identifier,$timestamp,$ands_class, $add_to_node=null) { + if(is_null($add_to_node)) { + $header_node = $this->add2_verbNode("header"); + } else { + $header_node = $this->addChild($add_to_node,"header"); + } + $this->addChild($header_node,"identifier",$identifier); + $this->addChild($header_node,"datestamp",$timestamp); + if (is_array($ands_class)) { + foreach ($ands_class as $setspec) { + $this->addChild($header_node,"setSpec",$setspec); + } + } else { $this->addChild($header_node,"setSpec",$ands_class); } + return $header_node; + } + + /** Create metadata node for holding metadata. This is always added to \ node. + * + * \param $mom_record_node DOMElement. A node acts as the parent node. + * + * @return $meta_node Type: DOMElement. + * The newly created registryObject node which will be used for further expansion. + * metadata node itself is maintained by internally by the Class. + */ + function create_metadata($mom_record_node) { + $meta_node = $this->addChild($mom_record_node,"metadata"); + return $meta_node; + } + + /** If there are too many records request could not finished a resumpToken is generated to let harvester know + * + * \param $token Type: string. A random number created somewhere? + * \param $expirationdatetime Type: string. A string representing time. + * \param $num_rows Type: integer. Number of records retrieved. + * \param $cursor Type: string. Cursor can be used for database to retrieve next time. + */ + function create_resumpToken($token, $expirationdatetime, $num_rows, $cursor=null) { + $resump_node = $this->addChild($this->verbNode,"resumptionToken",$token); + if(isset($expirationdatetime)) { + $resump_node->setAttribute("expirationDate",$expirationdatetime); + } + $resump_node->setAttribute("completeListSize",$num_rows); + $resump_node->setAttribute("cursor",$cursor); + } +} +