blob: ee8a070b349c4a0c36bfb27f7bc21abed285455a [file] [log] [blame]
#!/usr/bin/env php
<?php
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file
* Allows CRUD operations on Usergrid Collections.
*
* @author Daniel Johnson <djohnson@apigee.com>
* @author Rod Simpson <rod@apigee.com>
* @since 26-Apr-2013
*/
namespace Apache\Usergrid;
require_once(dirname(__FILE__) . '/Exceptions.php');
class Collection {
/**
* @var \Apache\Usergrid\Client
*/
private $client;
/**
* @var string
*/
private $type;
/**
* @var array
*/
private $qs;
/**
* @var array
*/
private $list;
/**
* @var int
*/
private $iterator;
/**
* @var array
*/
private $previous;
/**
* @var bool|int
*/
private $next;
/**
* @var null|int
*/
private $cursor;
/**
* @var string|string
*/
private $json = '';
/**
* Object constructor.
*
* @param \Apache\Usergrid\Client $client
* @param string $type
* @param array $qs
*/
public function __construct(Client $client, $type, $qs = array()) {
$this->client = $client;
$this->type = $type;
$this->qs = $qs;
$this->list = array();
$this->iterator = -1;
$this->previous = array();
$this->next = FALSE;
$this->cursor = NULL;
$this->fetch();
}
public function get_json() {
return $this->json;
}
public function set_json($json) {
$this->json = $json;
}
/**
* @return string
*/
public function get_type() {
return $this->type;
}
/**
* @param string $type
*/
public function set_type($type) {
$this->type = $type;
}
/**
* @return \Apache\Usergrid\Response
*/
public function fetch() {
if ($this->cursor) {
$this->qs['cursor'] = $this->cursor;
}
elseif (array_key_exists('cursor', $this->qs)) {
unset($this->qs['cursor']);
}
$response = $this->client->get($this->type, $this->qs);
if ($response->get_error()) {
$this->client->write_log('Error getting collection.');
}
else {
$this->set_json($response->get_json());
$response_data = $response->get_data();
$cursor = (isset($response_data['cursor']) ? $response_data['cursor'] : NULL);
$this->save_cursor($cursor);
if (!empty($response_data['entities'])) {
$this->reset_entity_pointer();
$count = count($response_data['entities']);
$this->list = array();
for ($i = 0; $i < $count; $i++) {
$entity_data = $response_data['entities'][$i];
if (array_key_exists('uuid', $entity_data)) {
$entity = new Entity($this->client, $entity_data);
$entity->set('type', $this->type);
$this->list[] = $entity;
}
}
}
}
return $response;
}
/**
* @param array $entity_data
* @return \Apache\Usergrid\Entity
*/
public function add_entity($entity_data) {
$entity = $this->client->create_entity($entity_data);
if ($entity) {
$this->list[] = $entity;
}
return $entity;
}
/**
* @param \Apache\Usergrid\Entity $entity
* @return \Apache\Usergrid\Response
*/
public function destroy_entity(Entity $entity) {
$response = $entity->destroy();
if ($response->get_error()) {
$this->client->write_log('Could not destroy entity.');
}
else {
$response = $this->fetch();
}
return $response;
}
/**
* @param string $uuid
* @return \Apache\Usergrid\Response|bool
* @throws \Apache\Usergrid\UGException
*/
public function get_entity_by_uuid($uuid) {
if (!Client::is_uuid($uuid)) {
if ($this->client->are_exceptions_enabled()) {
throw new UGException("Invalid UUID $uuid");
}
return FALSE;
}
$entity = new Entity($this->client, array('type' => $this->type, 'uuid' => $uuid));
return $entity->fetch();
}
/**
* @return \Apache\Usergrid\Entity|null
*/
public function get_first_entity() {
return (count($this->list) > 0 ? $this->list[0] : NULL);
}
/**
* @return \Apache\Usergrid\Entity|null
*/
public function get_last_entity() {
return (count($this->list) > 0 ? $this->list[count($this->list) - 1] : NULL);
}
/**
* @return bool
*/
public function has_next_entity() {
$next = $this->iterator + 1;
return ($next >= 0 && $next < count($this->list));
}
/**
* @return bool
*/
public function has_prev_entity() {
$prev = $this->iterator - 1;
return ($prev >= 0 && $prev < count($this->list));
}
/**
* @return \Apache\Usergrid\Entity|null
*/
public function get_next_entity() {
if ($this->has_next_entity()) {
$this->iterator++;
return $this->list[$this->iterator];
}
return NULL;
}
/**
* @return \Apache\Usergrid\Entity|null
*/
public function get_prev_entity() {
if ($this->has_prev_entity()) {
$this->iterator--;
return $this->list[$this->iterator];
}
return NULL;
}
public function reset_entity_pointer() {
$this->iterator = -1;
}
public function save_cursor($cursor) {
$this->next = $cursor;
}
public function reset_paging() {
$this->previous = array();
$this->next = FALSE;
$this->cursor = NULL;
}
public function has_next_page() {
return (bool) $this->next;
}
public function has_prev_page() {
return (count($this->previous) > 0);
}
/**
* @return \Apache\Usergrid\Response|bool
*/
public function get_next_page() {
if ($this->has_next_page()) {
array_push($this->previous, $this->cursor);
$this->cursor = $this->next;
$this->list = array();
return $this->fetch();
}
return FALSE;
}
/**
* @return \Apache\Usergrid\Response|bool
*/
public function get_prev_page() {
if ($this->has_prev_page()) {
$this->next = FALSE;
$this->cursor = array_pop($this->previous);
$this->list = array();
return $this->fetch();
}
return FALSE;
}
public function serialize(){
$data = array();
$data->type = $this->type;
$data->qs = $this->qs;
$data->iterator = $this->iterator;
$data->previous = $this->previous;
$data->next = $this->next;
$data->cursor = $this->cursor;
$data->list = array();
$this->reset_entity_pointer();
while ($this->has_next_entity()) {
$entity = $this->get_next_entity();
array_push($data->list, $entity->get_json());
}
return json_encode($data);
}
}