. */ require_once $CFG->libdir.'/alfresco/Service/Store.php'; require_once $CFG->libdir.'/alfresco/Service/Node.php'; require_once $CFG->libdir.'/alfresco/Service/WebService/WebServiceFactory.php'; class Session extends BaseObject { public $authenticationService; public $repositoryService; public $contentService; private $_repository; private $_ticket; private $_stores; private $_namespaceMap; private $nodeCache; private $idCount = 0; /** * Constructor * * @param userName the user name * @param ticket the currenlty authenticated users ticket */ public function __construct($repository, $ticket) { $this->nodeCache = array(); $this->_repository = $repository; $this->_ticket = $ticket; $this->repositoryService = WebServiceFactory::getRepositoryService($this->_repository->connectionUrl, $this->_ticket); $this->contentService = WebServiceFactory::getContentService($this->_repository->connectionUrl, $this->_ticket); } /** * Creates a new store in the current respository * * @param $address the address of the new store * @param $scheme the scheme of the new store, default value of 'workspace' * @return Store the new store */ public function createStore($address, $scheme="workspace") { // Create the store $result = $this->repositoryService->createStore(array( "scheme" => $scheme, "address" => $address)); $store = new Store($this, $result->createStoreReturn->address, $result->createStoreReturn->scheme); // Add to the cached list if its been populated if (isset($this->_stores) == true) { $this->_stores[] = $store; } // Return the newly created store return $store; } /** * Get the store * * @param $address the address of the store * @param $scheme the scheme of the store. The default it 'workspace' * @return Store the store */ public function getStore($address, $scheme="workspace") { return new Store($this, $address, $scheme); } /** * Get the store from it string representation (eg: workspace://SpacesStore) * * @param $value the stores string representation * @return Store the store */ public function getStoreFromString($value) { list($scheme, $address) = explode("://", $value); return new Store($this, $address, $scheme); } public function getNode($store, $id) { $node = $this->getNodeImpl($store, $id); if ($node == null) { $node = new Node($this, $store, $id); $this->addNode($node); } return $node; } public function getNodeFromString($value) { // TODO throw new Exception("getNode($value) not yet implemented"); } /** * Adds a new node to the session. */ public function addNode($node) { $this->nodeCache[$node->__toString()] = $node; } private function getNodeImpl($store, $id) { $result = null; $nodeRef = $store->scheme . "://" . $store->address . "/" . $id; if (array_key_exists($nodeRef, $this->nodeCache) == true) { $result = $this->nodeCache[$nodeRef]; } return $result; } /** * Commits all unsaved changes to the repository */ public function save($debug=false) { // Build the update statements from the node cache $statements = array(); foreach ($this->nodeCache as $node) { $node->onBeforeSave($statements); } if ($debug == true) { var_dump($statements); echo ("

"); } if (count($statements) > 0) { // Make the web service call $result = $this->repositoryService->update(array("statements" => $statements)); //var_dump($result); // Update the state of the updated nodes foreach ($this->nodeCache as $node) { $node->onAfterSave($this->getIdMap($result)); } } } /** * Clears the current session by emptying the node cache. * * WARNING: all unsaved changes will be lost when clearing the session. */ public function clear() { // Clear the node cache $this->nodeCache = array(); } private function getIdMap($result) { $return = array(); $statements = $result->updateReturn; if (is_array($statements) == true) { foreach ($statements as $statement) { if ($statement->statement == "create") { $id = $statement->sourceId; $uuid = $statement->destination->uuid; $return[$id] = $uuid; } } } else { if ($statements->statement == "create") { $id = $statements->sourceId; $uuid = $statements->destination->uuid; $return[$id] = $uuid; } } return $return; } public function query($store, $query, $language='lucene') { // TODO need to support paged queries $result = $this->repositoryService->query(array( "store" => $store->__toArray(), "query" => array( "language" => $language, "statement" => $query), "includeMetaData" => false)); // TODO for now do nothing with the score and the returned data $resultSet = $result->queryReturn->resultSet; return $this->resultSetToNodes($this, $store, $resultSet); } public function getTicket() { return $this->_ticket; } public function getRepository() { return $this->_repository; } public function getNamespaceMap() { if ($this->_namespaceMap == null) { $this->_namespaceMap = new NamespaceMap(); } return $this->_namespaceMap; } public function getStores() { if (isset ($this->_stores) == false) { $this->_stores = array (); $results = $this->repositoryService->getStores(); foreach ($results->getStoresReturn as $result) { $this->_stores[] = new Store($this, $result->address, $result->scheme); } } return $this->_stores; } /** Want these methods to be package scope some how! **/ public function nextSessionId() { $sessionId = "session".$this->_ticket.$this->idCount; $this->idCount ++; return $sessionId; } } ?>