Delete Lib Folder

git-svn-id: https://svn.apache.org/repos/asf/chemistry/phpclient/trunk@1541225 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/cmis_repository_wrapper.php b/lib/cmis_repository_wrapper.php
deleted file mode 100644
index c2a6d27..0000000
--- a/lib/cmis_repository_wrapper.php
+++ /dev/null
@@ -1,1355 +0,0 @@
-<?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.
-
-define("HTTP_OK", 200);
-define("HTTP_CREATED", 201);
-define("HTTP_ACCEPTED", 202);
-define("HTTP_NONAUTHORITATIVE_INFORMATION", 203);
-define("HTTP_NO_CONTENT", 204);
-define("HTTP_RESET_CONTENT", 205);
-define("HTTP_PARTIAL_CONTENT", 206);
-define("HTTP_MULTIPLE_CHOICES", 300);
-define("HTTP_BAD_REQUEST", 400); // invalidArgument, filterNotValid
-define("HTTP_UNAUTHORIZED", 401);
-define("HTTP_FORBIDDEN", 403); // permissionDenied, streamNotSupported
-define("HTTP_NOT_FOUND", 404); // objectNotFound
-define("HTTP_METHOD_NOT_ALLOWED", 405); // notSupported
-define("HTTP_NOT_ACCEPTABLE", 406);
-define("HTTP_PROXY_AUTHENTICATION_REQUIRED", 407);
-define("xHTTP_REQUEST_TIMEOUT", 408); //Had to change this b/c HTTP_REQUEST_TIMEOUT conflicts with definition in Drupal 7
-define("HTTP_CONFLICT", 409); // constraint, contentAlreadyExists, versioning, updateConflict, nameConstraintViolation
-define("HTTP_UNSUPPORTED_MEDIA_TYPE", 415);
-define("HTTP_UNPROCESSABLE_ENTITY", 422);
-define("HTTP_INTERNAL_SERVER_ERROR", 500); // runtime, storage
-
-class CmisInvalidArgumentException extends Exception {}
-class CmisObjectNotFoundException extends Exception {}
-class CmisPermissionDeniedException extends Exception {}
-class CmisNotSupportedException extends Exception {}
-class CmisConstraintException extends Exception {}
-class CmisRuntimeException extends Exception {}
-
-class CMISRepositoryWrapper
-{
-    // Handles --
-    //   Workspace -- but only endpoints with a single repo
-    //   Entry -- but only for objects
-    //   Feeds -- but only for non-hierarchical feeds
-    // Does not handle --
-    //   -- Hierarchical Feeds
-    //   -- Types
-    //   -- Others?
-    // Only Handles Basic Auth
-    // Very Little Error Checking
-    // Does not work against pre CMIS 1.0 Repos
-    
-    var $url;
-    var $username;
-    var $password;
-    var $authenticated;
-    var $workspace;
-    var $last_request;
-    var $do_not_urlencode;
-    protected $_addlCurlOptions = array();
-    
-    static $namespaces = array (
-        "cmis" => "http://docs.oasis-open.org/ns/cmis/core/200908/",
-        "cmisra" => "http://docs.oasis-open.org/ns/cmis/restatom/200908/",
-        "atom" => "http://www.w3.org/2005/Atom",
-        "app" => "http://www.w3.org/2007/app",
-        
-    );
-
-    function __construct($url, $username = null, $password = null, $options = null, array $addlCurlOptions = array())
-    {
-        if (is_array($options) && $options["config:do_not_urlencode"]) {
-            $this->do_not_urlencode=true;
-        }
-        $this->_addlCurlOptions = $addlCurlOptions; // additional cURL options
-        
-        $this->connect($url, $username, $password, $options);
-    }
-
-    static function getOpUrl($url, $options = null)
-    {
-        if (is_array($options) && (count($options) > 0))
-        {
-            $needs_question = strstr($url, "?") === false;
-            return $url . ($needs_question ? "?" : "&") . http_build_query($options);
-        } else
-        {
-            return $url;
-        }
-    }
-    
-    function convertStatusCode($code, $message)
-    {
-        switch ($code) {
-            case HTTP_BAD_REQUEST:
-                return new CmisInvalidArgumentException($message, $code);
-            case HTTP_NOT_FOUND:
-                return new CmisObjectNotFoundException($message, $code);
-            case HTTP_FORBIDDEN:
-                return new CmisPermissionDeniedException($message, $code);
-            case HTTP_METHOD_NOT_ALLOWED:
-                return new CmisNotSupportedException($message, $code);
-            case HTTP_CONFLICT:
-                return new CmisConstraintException($message, $code);
-            default:
-                return new CmisRuntimeException($message, $code);
-            }
-    }
-
-    function connect($url, $username, $password, $options)
-    {
-        // TODO: Make this work with cookies
-        $this->url = $url;
-        $this->username = $username;
-        $this->password = $password;
-        $this->auth_options = $options;
-        $this->authenticated = false;
-        $retval = $this->doGet($this->url);
-        if ($retval->code == HTTP_OK || $retval->code == HTTP_CREATED)
-        {
-            $this->authenticated = true;
-            $this->workspace = CMISRepositoryWrapper :: extractWorkspace($retval->body);
-        }
-    }
-
-    function doGet($url)
-    {
-        $retval = $this->doRequest($url);
-        if ($retval->code != HTTP_OK)
-        {
-            throw $this->convertStatusCode($retval->code, $retval->body);
-        }
-        return $retval;
-    }
-
-    function doDelete($url)
-    {
-        $retval = $this->doRequest($url, "DELETE");
-        if ($retval->code != HTTP_NO_CONTENT)
-        {
-            throw $this->convertStatusCode($retval->code, $retval->body);
-        }
-        return $retval;
-    }
-
-    function doPost($url, $content, $contentType, $charset = null)
-    {
-        $retval = $this->doRequest($url, "POST", $content, $contentType);
-        if ($retval->code != HTTP_CREATED)
-        {
-            throw $this->convertStatusCode($retval->code, $retval->body);
-        }
-        return $retval;
-    }
-
-    function doPut($url, $content, $contentType, $charset = null)
-    {
-        $retval = $this->doRequest($url, "PUT", $content, $contentType);
-        if (($retval->code < HTTP_OK) || ($retval->code >= HTTP_MULTIPLE_CHOICES))
-        {
-            throw $this->convertStatusCode($retval->code, $retval->body);
-        }
-        return $retval;
-    }
-
-    function doRequest($url, $method = "GET", $content = null, $contentType = null, $charset = null)
-    {
-        // Process the HTTP request
-        // 'til now only the GET request has been tested
-        // Does not URL encode any inputs yet
-        if (is_array($this->auth_options))
-        {
-            $url = CMISRepositoryWrapper :: getOpUrl($url, $this->auth_options);
-        }
-        $session = curl_init($url);
-        curl_setopt($session, CURLOPT_HEADER, false);
-        curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
-        if ($this->username)
-        {
-            curl_setopt($session, CURLOPT_USERPWD, $this->username . ":" . $this->password);
-        }
-        curl_setopt($session, CURLOPT_CUSTOMREQUEST, $method);
-        if ($contentType)
-        {
-            curl_setopt($session, CURLOPT_HTTPHEADER, array (
-                "Content-Type: " . $contentType
-            ));
-        }
-        if ($content)
-        {
-            curl_setopt($session, CURLOPT_POSTFIELDS, $content);
-        }
-        if ($method == "POST")
-        {
-            curl_setopt($session, CURLOPT_POST, true);
-        }
-        
-        // apply addl. cURL options
-        // WARNING: this may override previously set options
-        if (count($this->_addlCurlOptions)) {
-            foreach ($this->_addlCurlOptions as $key => $value) {
-                curl_setopt($session, $key, $value);
-            }
-        }
-        
-        
-        //TODO: Make this storage optional
-        $retval = new stdClass();
-        $retval->url = $url;
-        $retval->method = $method;
-        $retval->content_sent = $content;
-        $retval->content_type_sent = $contentType;
-        $retval->body = curl_exec($session);
-        $retval->code = curl_getinfo($session, CURLINFO_HTTP_CODE);
-        $retval->content_type = curl_getinfo($session, CURLINFO_CONTENT_TYPE);
-        $retval->content_length = curl_getinfo($session, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
-        curl_close($session);
-        $this->last_request = $retval;
-        return $retval;
-    }
-
-    function getLastRequest()
-    {
-        return $this->last_request;
-    }
-
-    function getLastRequestBody()
-    {
-        return $this->last_request->body;
-    }
-
-    function getLastRequestCode()
-    {
-        return $this->last_request->code;
-    }
-
-    function getLastRequestContentType()
-    {
-        return $this->last_request->content_type;
-    }
-
-    function getLastRequestContentLength()
-    {
-        return $this->last_request->content_length;
-    }
-
-    function getLastRequestURL()
-    {
-        return $this->last_request->url;
-    }
-
-    function getLastRequestMethod()
-    {
-        return $this->last_request->method;
-    }
-
-    function getLastRequestContentTypeSent()
-    {
-        return $this->last_request->content_type_sent;
-    }
-
-    function getLastRequestContentSent()
-    {
-        return $this->last_request->content_sent;
-    }
-
-    // Static Utility Functions
-    static function processTemplate($template, $values = array ())
-    {
-        // Fill in the blanks -- 
-        $retval = $template;
-        if (is_array($values))
-        {
-            foreach ($values as $name => $value)
-            {
-                $retval = str_replace("{" . $name . "}", $value, $retval);
-            }
-        }
-        // Fill in any unpoupated variables with ""
-        return preg_replace("/{[a-zA-Z0-9_]+}/", "", $retval);
-
-    }
-
-    static function doXQuery($xmldata, $xquery)
-    {
-        $doc = new DOMDocument();
-        $doc->loadXML($xmldata);
-        return CMISRepositoryWrapper :: doXQueryFromNode($doc, $xquery);
-    }
-
-    static function doXQueryFromNode($xmlnode, $xquery)
-    {
-        // Perform an XQUERY on a NODE
-        // Register the 4 CMIS namespaces
-        //THis may be a hopeless HACK!
-        //TODO: Review
-        if (!($xmlnode instanceof DOMDocument)) {
-            $xdoc=new DOMDocument();
-            $xnode = $xdoc->importNode($xmlnode,true);
-            $xdoc->appendChild($xnode);
-            $xpath = new DomXPath($xdoc);
-        } else {
-        	$xpath = new DomXPath($xmlnode);
-        }
-        foreach (CMISRepositoryWrapper :: $namespaces as $nspre => $nsuri)
-        {
-            $xpath->registerNamespace($nspre, $nsuri);
-        }
-        return $xpath->query($xquery);
-
-    }
-    static function getLinksArray($xmlnode)
-    {
-        // Gets the links of an object or a workspace
-        // Distinguishes between the two "down" links
-        //  -- the children link is put into the associative array with the "down" index
-        //  -- the descendants link is put into the associative array with the "down-tree" index
-        //  These links are distinquished by the mime type attribute, but these are probably the only two links that share the same rel ..
-        //    so this was done as a one off
-        $links = array ();
-        $link_nodes = $xmlnode->getElementsByTagName("link");
-        foreach ($link_nodes as $ln)
-        {
-            if ($ln->attributes->getNamedItem("rel")->nodeValue == "down" && $ln->attributes->getNamedItem("type")->nodeValue == "application/cmistree+xml")
-            {
-                //Descendents and Childredn share same "rel" but different document type
-                $links["down-tree"] = $ln->attributes->getNamedItem("href")->nodeValue;
-            } else
-            {
-                $links[$ln->attributes->getNamedItem("rel")->nodeValue] = $ln->attributes->getNamedItem("href")->nodeValue;
-            }
-        }
-        return $links;
-    }
-	static function extractAllowableActions($xmldata)
-    {
-        $doc = new DOMDocument();
-        $doc->loadXML($xmldata);
-        return CMISRepositoryWrapper :: extractAllowableActionsFromNode($doc);
-    }
-    static function extractAllowableActionsFromNode($xmlnode)
-    {
-        $result = array();
-        $allowableActions = $xmlnode->getElementsByTagName("allowableActions");
-        if ($allowableActions->length > 0) {
-            foreach($allowableActions->item(0)->childNodes as $action)
-            {
-                if (isset($action->localName)) {
-                    $result[$action->localName] = (preg_match("/^true$/i", $action->nodeValue) > 0);
-                }
-            }
-        }
-        return $result;
-    }
-    static function extractObject($xmldata)
-    {
-        $doc = new DOMDocument();
-        $doc->loadXML($xmldata);
-        return CMISRepositoryWrapper :: extractObjectFromNode($doc);
-
-    }
-    static function extractObjectFromNode($xmlnode)
-    {
-        // Extracts the contents of an Object and organizes them into:
-        //  -- Links
-        //  -- Properties
-        //  -- the Object ID
-        // RRM -- NEED TO ADD ALLOWABLEACTIONS
-        $retval = new stdClass();
-        $retval->links = CMISRepositoryWrapper :: getLinksArray($xmlnode);
-        $retval->properties = array ();
-        $prop_nodes = $xmlnode->getElementsByTagName("object")->item(0)->getElementsByTagName("properties")->item(0)->childNodes;
-        foreach ($prop_nodes as $pn)
-        {
-            if ($pn->attributes)
-            {
-                $propDefId = $pn->attributes->getNamedItem("propertyDefinitionId");
-                // TODO: Maybe use ->length=0 to even detect null values
-                if (!is_null($propDefId) && $pn->getElementsByTagName("value") && $pn->getElementsByTagName("value")->item(0))
-                {
-                	if ($pn->getElementsByTagName("value")->length > 1) {
-                		$retval->properties[$propDefId->nodeValue] = array();
-                		for ($idx=0;$idx < $pn->getElementsByTagName("value")->length;$idx++) {
-                			$retval->properties[$propDefId->nodeValue][$idx] = $pn->getElementsByTagName("value")->item($idx)->nodeValue;
-                		}
-                	} else {
-                		$retval->properties[$propDefId->nodeValue] = $pn->getElementsByTagName("value")->item(0)->nodeValue;
-                	}
-                }
-            }
-        }
-        $retval->uuid = $xmlnode->getElementsByTagName("id")->item(0)->nodeValue;
-        $retval->id = $retval->properties["cmis:objectId"];
-        //TODO: RRM FIX THIS
-        $children_node = $xmlnode->getElementsByTagName("children");
-        if (is_object($children_node)) {
-        	    $children_feed_c = $children_node->item(0);
-        }
-        if (is_object($children_feed_c)) {
-			$children_feed_l = $children_feed_c->getElementsByTagName("feed");
-        }
-        if (isset($children_feed_l) && is_object($children_feed_l) && is_object($children_feed_l->item(0))) {
-        	$children_feed = $children_feed_l->item(0);
-			$children_doc = new DOMDocument();
-			$xnode = $children_doc->importNode($children_feed,true); // Avoid Wrong Document Error
-			$children_doc->appendChild($xnode);
-	        $retval->children = CMISRepositoryWrapper :: extractObjectFeedFromNode($children_doc);
-        }
-		$retval->allowableActions = CMISRepositoryWrapper :: extractAllowableActionsFromNode($xmlnode);
-        return $retval;
-    }
-    
-    function handleSpaces($path)
-    {
-        return $this->do_not_urlencode ? $path : rawurlencode($path);
-    }
-
-    static function extractTypeDef($xmldata)
-    {
-        $doc = new DOMDocument();
-        $doc->loadXML($xmldata);
-        return CMISRepositoryWrapper :: extractTypeDefFromNode($doc);
-
-    }
-    static function extractTypeDefFromNode($xmlnode)
-    {
-        // Extracts the contents of an Object and organizes them into:
-        //  -- Links
-        //  -- Properties
-        //  -- the Object ID
-        // RRM -- NEED TO ADD ALLOWABLEACTIONS
-        $retval = new stdClass();
-        $retval->links = CMISRepositoryWrapper :: getLinksArray($xmlnode);
-        $retval->properties = array ();
-        $retval->attributes = array ();
-        $result = CMISRepositoryWrapper :: doXQueryFromNode($xmlnode, "//cmisra:type/*");
-        foreach ($result as $node)
-        {
-            if ((substr($node->nodeName, 0, 13) == "cmis:property") && (substr($node->nodeName, -10) == "Definition"))
-            {
-                $id = $node->getElementsByTagName("id")->item(0)->nodeValue;
-                $cardinality = $node->getElementsByTagName("cardinality")->item(0)->nodeValue;
-                $propertyType = $node->getElementsByTagName("propertyType")->item(0)->nodeValue;
-                // Stop Gap for now
-                $retval->properties[$id] = array (
-                    "cmis:propertyType" => $propertyType,
-                    "cmis:cardinality" => $cardinality,
-                    
-                );
-            } else
-            {
-                $retval->attributes[$node->nodeName] = $node->nodeValue;
-            }
-            $retval->id = $retval->attributes["cmis:id"];
-        }
-        //TODO: RRM FIX THIS
-        $children_node = $xmlnode->getElementsByTagName("children");
-        if (is_object($children_node)) {
-        	    $children_feed_c = $children_node->item(0);
-        }
-        if (is_object($children_feed_c)) {
-			$children_feed_l = $children_feed_c->getElementsByTagName("feed");
-        }
-        if (is_object($children_feed_l) && is_object($children_feed_l->item(0))) {
-        	$children_feed = $children_feed_l->item(0);
-			$children_doc = new DOMDocument();
-			$xnode = $children_doc->importNode($children_feed,true); // Avoid Wrong Document Error
-			$children_doc->appendChild($xnode);
-	        $retval->children = CMISRepositoryWrapper :: extractTypeFeedFromNode($children_doc);
-        }
-
-        /*
-         * 
-        
-        
-        
-        		$prop_nodes = $xmlnode->getElementsByTagName("object")->item(0)->getElementsByTagName("properties")->item(0)->childNodes;
-        		foreach ($prop_nodes as $pn) {
-        			if ($pn->attributes) {
-        				$retval->properties[$pn->attributes->getNamedItem("propertyDefinitionId")->nodeValue] = $pn->getElementsByTagName("value")->item(0)->nodeValue;
-        			}
-        		}
-                $retval->uuid=$xmlnode->getElementsByTagName("id")->item(0)->nodeValue;
-                $retval->id=$retval->properties["cmis:objectId"];
-         */
-        return $retval;
-    }
-
-    static function extractObjectFeed($xmldata)
-    {
-        //Assumes only one workspace for now
-        $doc = new DOMDocument();
-        $doc->loadXML($xmldata);
-        return CMISRepositoryWrapper :: extractObjectFeedFromNode($doc);
-    }
-    static function extractObjectFeedFromNode($xmlnode)
-    {
-        // Process a feed and extract the objects
-        //   Does not handle hierarchy
-        //   Provides two arrays 
-        //   -- one sequential array (a list)
-        //   -- one hash table indexed by objectID
-        //   and a property "numItems" that holds the total number of items available.
-        $retval = new stdClass();
-        // extract total number of items
-        $numItemsNode = CMISRepositoryWrapper::doXQueryFromNode($xmlnode, "/atom:feed/cmisra:numItems");
-        $retval->numItems = $numItemsNode->length ? (int) $numItemsNode->item(0)->nodeValue : -1; // set to negative value if info is not available
-                
-        $retval->objectList = array ();
-        $retval->objectsById = array ();
-        $result = CMISRepositoryWrapper :: doXQueryFromNode($xmlnode, "/atom:feed/atom:entry");
-        foreach ($result as $node)
-        {
-            $obj = CMISRepositoryWrapper :: extractObjectFromNode($node);
-            $retval->objectsById[$obj->id] = $obj;
-            $retval->objectList[] = & $retval->objectsById[$obj->id];
-        }
-        return $retval;
-    }
-
-    static function extractTypeFeed($xmldata)
-    {
-        //Assumes only one workspace for now
-        $doc = new DOMDocument();
-        $doc->loadXML($xmldata);
-        return CMISRepositoryWrapper :: extractTypeFeedFromNode($doc);
-    }
-    static function extractTypeFeedFromNode($xmlnode)
-    {
-        // Process a feed and extract the objects
-        //   Does not handle hierarchy
-        //   Provides two arrays 
-        //   -- one sequential array (a list)
-        //   -- one hash table indexed by objectID
-        $retval = new stdClass();
-        $retval->objectList = array ();
-        $retval->objectsById = array ();
-        $result = CMISRepositoryWrapper :: doXQueryFromNode($xmlnode, "/atom:feed/atom:entry");
-        foreach ($result as $node)
-        {
-            $obj = CMISRepositoryWrapper :: extractTypeDefFromNode($node);
-            $retval->objectsById[$obj->id] = $obj;
-            $retval->objectList[] = & $retval->objectsById[$obj->id];
-        }
-        return $retval;
-    }
-
-    static function extractWorkspace($xmldata)
-    {
-        //Assumes only one workspace for now
-        $doc = new DOMDocument();
-        $doc->loadXML($xmldata);
-        return CMISRepositoryWrapper :: extractWorkspaceFromNode($doc);
-    }
-    static function extractWorkspaceFromNode($xmlnode)
-    {
-        // Assumes only one workspace for now
-        // Load up the workspace object with arrays of
-        //  links
-        //  URI Templates
-        //  Collections
-        //  Capabilities
-        //  General Repository Information
-        $retval = new stdClass();
-        $retval->links = CMISRepositoryWrapper :: getLinksArray($xmlnode);
-        $retval->uritemplates = array ();
-        $retval->collections = array ();
-        $retval->capabilities = array ();
-        $retval->repositoryInfo = array ();
-        $retval->permissions = array();
-        $retval->permissionsMapping = array();
-        $result = CMISRepositoryWrapper :: doXQueryFromNode($xmlnode, "//cmisra:uritemplate");
-        foreach ($result as $node)
-        {
-            $retval->uritemplates[$node->getElementsByTagName("type")->item(0)->nodeValue] = $node->getElementsByTagName("template")->item(0)->nodeValue;
-        }
-        $result = CMISRepositoryWrapper :: doXQueryFromNode($xmlnode, "//app:collection");
-        foreach ($result as $node)
-        {
-            $retval->collections[$node->getElementsByTagName("collectionType")->item(0)->nodeValue] = $node->attributes->getNamedItem("href")->nodeValue;
-        }
-        $result = CMISRepositoryWrapper :: doXQueryFromNode($xmlnode, "//cmis:capabilities/*");
-        foreach ($result as $node)
-        {
-            $retval->capabilities[$node->nodeName] = $node->nodeValue;
-        }
-        $result = CMISRepositoryWrapper :: doXQueryFromNode($xmlnode, "//cmisra:repositoryInfo/*[name()!='cmis:capabilities' and name()!='cmis:aclCapability']");
-        foreach ($result as $node)
-        {
-            $retval->repositoryInfo[$node->nodeName] = $node->nodeValue;
-        }
-        $result = CMISRepositoryWrapper :: doXQueryFromNode($xmlnode, "//cmis:aclCapability/cmis:permissions");
-        foreach ($result as $node)
-        {
-            $retval->permissions[$node->getElementsByTagName("permission")->item(0)->nodeValue] = $node->getElementsByTagName("description")->item(0)->nodeValue;
-        }
-        $result = CMISRepositoryWrapper :: doXQueryFromNode($xmlnode, "//cmis:aclCapability/cmis:mapping");
-        foreach ($result as $node)
-        {
-            $key = $node->getElementsByTagName("key")->item(0)->nodeValue;
-            $values = array();
-            foreach ($node->getElementsByTagName("permission") as $value)
-            {
-                array_push($values, $value->nodeValue);
-            }
-            $retval->permissionsMapping[$key] = $values;
-        }
-        $result = CMISRepositoryWrapper :: doXQueryFromNode($xmlnode, "//cmis:aclCapability/*[name()!='cmis:permissions' and name()!='cmis:mapping']");
-        foreach ($result as $node)
-        {
-            $retval->repositoryInfo[$node->nodeName] = $node->nodeValue;
-        }
-
-        return $retval;
-    }
-}
-
-// Option Contants for Array Indexing
-// -- Generally optional flags that control how much information is returned
-// -- Change log token is an anomoly -- but included in URL as parameter
-define("OPT_MAX_ITEMS", "maxItems");
-define("OPT_SKIP_COUNT", "skipCount");
-define("OPT_FILTER", "filter");
-define("OPT_INCLUDE_PROPERTY_DEFINITIONS", "includePropertyDefinitions");
-define("OPT_INCLUDE_RELATIONSHIPS", "includeRelationships");
-define("OPT_INCLUDE_POLICY_IDS", "includePolicyIds");
-define("OPT_RENDITION_FILTER", "renditionFilter");
-define("OPT_INCLUDE_ACL", "includeACL");
-define("OPT_INCLUDE_ALLOWABLE_ACTIONS", "includeAllowableActions");
-define("OPT_DEPTH", "depth");
-define("OPT_CHANGE_LOG_TOKEN", "changeLogToken");
-
-define("LINK_ALLOWABLE_ACTIONS", "http://docs.oasis-open.org/ns/cmis/link/200908/allowableactions");
-
-define("MIME_ATOM_XML", 'application/atom+xml');
-define("MIME_ATOM_XML_ENTRY", 'application/atom+xml;type=entry');
-define("MIME_ATOM_XML_FEED", 'application/atom+xml;type=feed');
-define("MIME_CMIS_TREE", 'application/cmistree+xml');
-define("MIME_CMIS_QUERY", 'application/cmisquery+xml');
-
-// Many Links have a pattern to them based upon objectId -- but can that be depended upon?
-
-class CMISService extends CMISRepositoryWrapper
-{
-    var $_link_cache;
-    var $_title_cache;
-    var $_objTypeId_cache;
-    var $_type_cache;
-    function __construct($url, $username, $password, $options = null, array $addlCurlOptions = array())
-    {
-        parent :: __construct($url, $username, $password, $options, $addlCurlOptions);
-        $this->_link_cache = array ();
-        $this->_title_cache = array ();
-        $this->_objTypeId_cache = array ();
-        $this->_type_cache = array ();
-    }
-
-    // Utility Methods -- Added Titles
-    // Should refactor to allow for single object	
-    function cacheObjectInfo($obj)
-    {
-        $this->_link_cache[$obj->id] = $obj->links;
-        $this->_title_cache[$obj->id] = $obj->properties["cmis:name"]; // Broad Assumption Here?
-        $this->_objTypeId_cache[$obj->id] = $obj->properties["cmis:objectTypeId"];
-    }
-
-    function cacheFeedInfo($objs)
-    {
-        foreach ($objs->objectList as $obj)
-        {
-            $this->cacheObjectInfo($obj);
-        }
-    }
-
-    function cacheTypeFeedInfo($typs)
-    {
-        foreach ($typs->objectList as $typ)
-        {
-            $this->cacheTypeInfo($typ);
-        }
-    }
-
-    function cacheTypeInfo($tDef)
-    {
-        // TODO: Fix Type Caching with missing properties
-        $this->_type_cache[$tDef->id] = $tDef;
-    }
-
-    function getPropertyType($typeId, $propertyId)
-    {
-        if ($this->_type_cache[$typeId]->properties)
-        {
-            return $this->_type_cache[$typeId]->properties[$propertyId]["cmis:propertyType"];
-        }
-        $obj = $this->getTypeDefinition($typeId);
-        return $obj->properties[$propertyId]["cmis:propertyType"];
-    }
-
-    function getObjectType($objectId)
-    {
-        if ($this->_objTypeId_cache[$objectId])
-        {
-            return $this->_objTypeId_cache[$objectId];
-        }
-        $obj = $this->getObject($objectId);
-        return $obj->properties["cmis:objectTypeId"];
-    }
-
-    function getTitle($objectId)
-    {
-        if ($this->_title_cache[$objectId])
-        {
-            return $this->_title_cache[$objectId];
-        }
-        $obj = $this->getObject($objectId);
-        return $obj->properties["cmis:name"];
-    }
-
-    function getTypeLink($typeId, $linkName)
-    {
-        if ($this->_type_cache[$typeId]->links)
-        {
-            return $this->_type_cache[$typeId]->links[$linkName];
-        }
-        $typ = $this->getTypeDefinition($typeId);
-        return $typ->links[$linkName];
-    }
-
-    function getLink($objectId, $linkName)
-    {
-        if ($this->_link_cache[$objectId][$linkName])
-        {
-            return $this->_link_cache[$objectId][$linkName];
-        }
-        $obj = $this->getObject($objectId);
-        return $obj->links[$linkName];
-    }
-
-    // Repository Services
-    function getRepositories()
-    {
-        throw new Exception("Not Implemented");
-    }
-
-    function getRepositoryInfo()
-    {
-        return $this->workspace;
-    }
-
-    function getTypeDescendants($typeId=null, $depth, $options = array ())
-    {
-    	// TODO: Refactor Type Entries Caching
-        $varmap = $options;
-        if ($typeId) {
-	        $hash_values = $options;
-	        $hash_values['depth'] = $depth;
-	        $myURL = $this->getTypeLink($typeId, "down-tree");
-	        $myURL = CMISRepositoryWrapper :: getOpUrl ($myURL, $hash_values);
-        } else {
-        	$myURL = $this->processTemplate($this->workspace->collections['http://docs.oasis-open.org/ns/cmis/link/200908/typedescendants'], $varmap);       	
-        }
-        $ret = $this->doGet($myURL);
-        $typs = $this->extractTypeFeed($ret->body);
-        $this->cacheTypeFeedInfo($typs);
-        return $typs;
-    }
-
-    function getTypeChildren($typeId=null, $options = array ())
-    {
-    	// TODO: Refactor Type Entries Caching
-        $varmap = $options;
-        if ($typeId) {
-	        $myURL = $this->getTypeLink($typeId, "down");
-	        //TODO: Need GenURLQueryString Utility
-        } else {
-            //TODO: Need right URL
-        	$myURL = $this->processTemplate($this->workspace->collections['types'], $varmap);       	
-        }
-        $ret = $this->doGet($myURL);
-        $typs = $this->extractTypeFeed($ret->body);
-        $this->cacheTypeFeedInfo($typs);
-        return $typs;
-    }
-
-    function getTypeDefinition($typeId, $options = array ())
-    { // Nice to have
-        $varmap = $options;
-        $varmap["id"] = $typeId;
-        $myURL = $this->processTemplate($this->workspace->uritemplates['typebyid'], $varmap);
-        $ret = $this->doGet($myURL);
-        $obj = $this->extractTypeDef($ret->body);
-        $this->cacheTypeInfo($obj);
-        return $obj;
-    }
-
-    function getObjectTypeDefinition($objectId)
-    { // Nice to have
-        $myURL = $this->getLink($objectId, "describedby");
-        $ret = $this->doGet($myURL);
-        $obj = $this->extractTypeDef($ret->body);
-        $this->cacheTypeInfo($obj);
-        return $obj;
-    }
-    //Navigation Services
-    function getFolderTree($folderId, $depth, $options = array ())
-    {
-        $hash_values = $options;
-        $hash_values['depth'] = $depth;
-        $myURL = $this->getLink($folderId, "http://docs.oasis-open.org/ns/cmis/link/200908/foldertree");
-        $myURL = CMISRepositoryWrapper :: getOpUrl ($myURL, $hash_values);
-        $ret = $this->doGet($myURL);
-        $objs = $this->extractObjectFeed($ret->body);
-        $this->cacheFeedInfo($objs);
-        return $objs;
-    }
-
-    function getDescendants($folderId, $depth, $options = array ())
-    { // Nice to have
-        $hash_values = $options;
-        $hash_values['depth'] = $depth;
-        $myURL = $this->getLink($folderId, "down-tree");
-        $myURL = CMISRepositoryWrapper :: getOpUrl ($myURL, $hash_values);
-        $ret = $this->doGet($myURL);
-        $objs = $this->extractObjectFeed($ret->body);
-        $this->cacheFeedInfo($objs);
-        return $objs;
-    }
-
-    function getChildren($folderId, $options = array ())
-    {
-        $myURL = $this->getLink($folderId, "down");
-        //TODO: Need GenURLQueryString Utility
-        $ret = $this->doGet($myURL);
-        $objs = $this->extractObjectFeed($ret->body);
-        $this->cacheFeedInfo($objs);
-        return $objs;
-    }
-
-    function getFolderParent($folderId, $options = array ())
-    { //yes
-        $myURL = $this->getLink($folderId, "up");
-        //TODO: Need GenURLQueryString Utility
-        $ret = $this->doGet($myURL);
-        $obj = $this->extractObjectEntry($ret->body);
-        $this->cacheObjectInfo($obj);
-        return $obj;
-    }
-
-    function getObjectParents($objectId, $options = array ())
-    { // yes
-        $myURL = $this->getLink($objectId, "up");
-        //TODO: Need GenURLQueryString Utility
-        $ret = $this->doGet($myURL);
-        $objs = $this->extractObjectFeed($ret->body);
-        $this->cacheFeedInfo($objs);
-        return $objs;
-    }
-
-    function getCheckedOutDocs($options = array ())
-    {
-        $obj_url = $this->workspace->collections['checkedout'];
-        $ret = $this->doGet($obj_url);
-        $objs = $this->extractObjectFeed($ret->body);
-        $this->cacheFeedInfo($objs);
-        return $objs;
-    }
-
-    //Discovery Services
-
-    static function getQueryTemplate()
-    {
-        ob_start();
-        echo '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' . "\n";
-?>
-<cmis:query xmlns:cmis="http://docs.oasis-open.org/ns/cmis/core/200908/"
-xmlns:cmism="http://docs.oasis-open.org/ns/cmis/messaging/200908/"
-xmlns:atom="http://www.w3.org/2005/Atom"
-xmlns:app="http://www.w3.org/2007/app"
-xmlns:cmisra="http://docs.oasisopen.org/ns/cmis/restatom/200908/">
-<cmis:statement>{q}</cmis:statement>
-<cmis:searchAllVersions>{searchAllVersions}</cmis:searchAllVersions>
-<cmis:includeAllowableActions>{includeAllowableActions}</cmis:includeAllowableActions>
-<cmis:includeRelationships>{includeRelationships}</cmis:includeRelationships>
-<cmis:renditionFilter>{renditionFilter}</cmis:renditionFilter>
-<cmis:maxItems>{maxItems}</cmis:maxItems>
-<cmis:skipCount>{skipCount}</cmis:skipCount>
-</cmis:query>
-<?php
-
-        return ob_get_clean();
-    }
-    function query($statement, $options = array ())
-    {
-        static $query_template;
-        if (!isset ($query_template))
-        {
-            $query_template = CMISService :: getQueryTemplate();
-        }
-        $hash_values = $options;
-        $hash_values['q'] = $statement;
-        $post_value = CMISRepositoryWrapper :: processTemplate($query_template, $hash_values);
-        $ret = $this->doPost($this->workspace->collections['query'], $post_value, MIME_CMIS_QUERY);
-        $objs = $this->extractObjectFeed($ret->body);
-        $this->cacheFeedInfo($objs);
-        return $objs;
-    }
-
-    function getContentChanges()
-    {
-        throw new Exception("Not Implemented");
-    }
-
-    //Object Services
-    static function getEntryTemplate()
-    {
-        ob_start();
-        echo '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' . "\n";
-?>
-<atom:entry xmlns:cmis="http://docs.oasis-open.org/ns/cmis/core/200908/"
-xmlns:cmism="http://docs.oasis-open.org/ns/cmis/messaging/200908/"
-xmlns:atom="http://www.w3.org/2005/Atom"
-xmlns:app="http://www.w3.org/2007/app"
-xmlns:cmisra="http://docs.oasis-open.org/ns/cmis/restatom/200908/">
-<atom:title>{title}</atom:title>
-{SUMMARY}
-{CONTENT}
-<cmisra:object><cmis:properties>{PROPERTIES}</cmis:properties></cmisra:object>
-</atom:entry>
-<?php
-
-        return ob_get_clean();
-    }
-
-    static function getPropertyTemplate()
-    {
-        ob_start();
-?>
-		<cmis:property{propertyType} propertyDefinitionId="{propertyId}">
-			<cmis:value>{properties}</cmis:value>
-		</cmis:property{propertyType}>
-<?php
-
-        return ob_get_clean();
-    }
-
-    function processPropertyTemplates($objectType, $propMap)
-    {
-        static $propTemplate;
-        static $propertyTypeMap;
-        if (!isset ($propTemplate))
-        {
-            $propTemplate = CMISService :: getPropertyTemplate();
-        }
-        if (!isset ($propertyTypeMap))
-        { // Not sure if I need to do this like this
-            $propertyTypeMap = array (
-                "integer" => "Integer",
-                "boolean" => "Boolean",
-                "datetime" => "DateTime",
-                "decimal" => "Decimal",
-                "html" => "Html",
-                "id" => "Id",
-                "string" => "String",
-                "url" => "Url",
-                "xml" => "Xml",
-                
-            );
-        }
-        $propertyContent = "";
-        $hash_values = array ();
-        foreach ($propMap as $propId => $propValue)
-        {
-            $hash_values['propertyType'] = $propertyTypeMap[$this->getPropertyType($objectType, $propId)];
-            $hash_values['propertyId'] = $propId;
-            if (is_array($propValue))
-            {
-                $first_one = true;
-                $hash_values['properties'] = "";
-                foreach ($propValue as $val)
-                {
-                    //This is a bit of a hack
-                    if ($first_one)
-                    {
-                        $first_one = false;
-                    } else
-                    {
-                        $hash_values['properties'] .= "</cmis:value>\n<cmis:value>";
-                    }
-                    $hash_values['properties'] .= $val;
-                }
-            } else
-            {
-                $hash_values['properties'] = $propValue;
-            }
-            //echo "HASH:\n";
-            //print_r(array("template" =>$propTemplate, "Hash" => $hash_values));
-            $propertyContent .= CMISRepositoryWrapper :: processTemplate($propTemplate, $hash_values);
-        }
-        return $propertyContent;
-    }
-
-    static function getContentEntry($content, $content_type = "application/octet-stream")
-    {
-        static $contentTemplate;
-        if (!isset ($contentTemplate))
-        {
-            $contentTemplate = CMISService :: getContentTemplate();
-        }
-        if ($content)
-        {
-            return CMISRepositoryWrapper :: processTemplate($contentTemplate, array (
-                "content" => base64_encode($content
-            ), "content_type" => $content_type));
-        } else
-        {
-            return "";
-        }
-    }
-
-    static function getSummaryTemplate()
-    {
-        ob_start();
-?>
-		<atom:summary>{summary}</atom:summary>
-<?php
-
-        return ob_get_clean();
-    }
-
-    static function getContentTemplate()
-    {
-        ob_start();
-?>
-		<cmisra:content>
-			<cmisra:mediatype>
-				{content_type}
-			</cmisra:mediatype>
-			<cmisra:base64>
-				{content}
-			</cmisra:base64>
-		</cmisra:content>
-<?php
-
-        return ob_get_clean();
-    }
-    static function createAtomEntry($name, $properties)
-    {
-
-    }
-    function getObject($objectId, $options = array ())
-    {
-        $varmap = $options;
-        $varmap["id"] = $objectId;
-        $obj_url = $this->processTemplate($this->workspace->uritemplates['objectbyid'], $varmap);
-        $ret = $this->doGet($obj_url);
-        $obj = $this->extractObject($ret->body);
-        $this->cacheObjectInfo($obj);
-        return $obj;
-    }
-
-    function getObjectByPath($path, $options = array ())
-    {
-        $varmap = $options;
-        $varmap["path"] = $this->handleSpaces($path);
-        $obj_url = $this->processTemplate($this->workspace->uritemplates['objectbypath'], $varmap);
-        $ret = $this->doGet($obj_url);
-        $obj = $this->extractObject($ret->body);
-        $this->cacheObjectInfo($obj);
-        return $obj;
-    }
-
-    function getProperties($objectId, $options = array ())
-    {
-        // May need to set the options array default -- 
-        return $this->getObject($objectId, $options);
-    }
-
-    function getAllowableActions($objectId, $options = array ())
-    {
-        $myURL = $this->getLink($objectId, LINK_ALLOWABLE_ACTIONS);
-        $ret = $this->doGet($myURL);
-        $result = $this->extractAllowableActions($ret->body);
-        return $result;
-    }
-
-    function getRenditions($objectId, $options = array (
-        OPT_RENDITION_FILTER => "*"
-    ))
-    {
-        return getObject($objectId, $options);
-    }
-
-    function getContentStream($objectId, $options = array ())
-    { // Yes
-        $myURL = $this->getLink($objectId, "edit-media");
-        $ret = $this->doGet($myURL);
-        // doRequest stores the last request information in this object
-        return $ret->body;
-    }
-
-    function postObject($folderId, $objectName, $objectType, $properties = array (), $content = null, $content_type = "application/octet-stream", $options = array ())
-    { // Yes
-        $myURL = $this->getLink($folderId, "down");
-        // TODO: Need Proper Query String Handling
-        // Assumes that the 'down' link does not have a querystring in it
-        $myURL = CMISRepositoryWrapper :: getOpUrl($myURL, $options);
-        static $entry_template;
-        if (!isset ($entry_template))
-        {
-            $entry_template = CMISService :: getEntryTemplate();
-        }
-        if (is_array($properties))
-        {
-            $hash_values = $properties;
-        } else
-        {
-            $hash_values = array ();
-        }
-        if (!isset ($hash_values["cmis:objectTypeId"]))
-        {
-            $hash_values["cmis:objectTypeId"] = $objectType;
-        }
-        $properties_xml = $this->processPropertyTemplates($hash_values["cmis:objectTypeId"], $hash_values);
-        if (is_array($options))
-        {
-            $hash_values = $options;
-        } else
-        {
-            $hash_values = array ();
-        }
-        $hash_values["PROPERTIES"] = $properties_xml;
-        $hash_values["SUMMARY"] = CMISService :: getSummaryTemplate();
-        if ($content)
-        {
-            $hash_values["CONTENT"] = CMISService :: getContentEntry($content, $content_type);
-        }
-        if (!isset ($hash_values['title']))
-        {
-            $hash_values['title'] = $objectName;
-        }
-        if (!isset ($hash_values['summary']))
-        {
-            $hash_values['summary'] = $objectName;
-        }
-        $post_value = CMISRepositoryWrapper :: processTemplate($entry_template, $hash_values);
-        $ret = $this->doPost($myURL, $post_value, MIME_ATOM_XML_ENTRY);
-        // print "DO_POST\n";
-        // print_r($ret);
-        $obj = $this->extractObject($ret->body);
-        $this->cacheObjectInfo($obj);
-        return $obj;
-    }
-
-    function createDocument($folderId, $fileName, $properties = array (), $content = null, $content_type = "application/octet-stream", $options = array ())
-    { // Yes
-        return $this->postObject($folderId, $fileName, "cmis:document", $properties, $content, $content_type, $options);
-    }
-
-    function createDocumentFromSource()
-    { //Yes?
-        throw new CmisNotSupportedException("createDocumentFromSource is not supported by the AtomPub binding!");
-    }
-
-    function createFolder($folderId, $folderName, $properties = array (), $options = array ())
-    { // Yes
-        return $this->postObject($folderId, $folderName, "cmis:folder", $properties, null, null, $options);
-    }
-
-    function createRelationship()
-    { // Not in first Release
-        throw new Exception("Not Implemented");
-    }
-
-    function createPolicy()
-    { // Not in first Release
-        throw new Exception("Not Implemented");
-    }
-
-    function updateProperties($objectId, $properties = array (), $options = array ())
-    { // Yes
-        $varmap = $options;
-        $varmap["id"] = $objectId;
-        $objectName = $this->getTitle($objectId);
-        $objectType = $this->getObjectType($objectId);
-        $obj_url = $this->getLink($objectId, "edit");
-        $obj_url = CMISRepositoryWrapper :: getOpUrl($obj_url, $options);
-        static $entry_template;
-        if (!isset ($entry_template))
-        {
-            $entry_template = CMISService :: getEntryTemplate();
-        }
-        if (is_array($properties))
-        {
-            $hash_values = $properties;
-        } else
-        {
-            $hash_values = array ();
-        }
-        $properties_xml = $this->processPropertyTemplates($objectType, $hash_values);
-        if (is_array($options))
-        {
-            $hash_values = $options;
-        } else
-        {
-            $hash_values = array ();
-        }
-        $hash_values["PROPERTIES"] = $properties_xml;
-        $hash_values["SUMMARY"] = CMISService :: getSummaryTemplate();
-        if (!isset ($hash_values['title']))
-        {
-            $hash_values['title'] = $objectName;
-        }
-        if (!isset ($hash_values['summary']))
-        {
-            $hash_values['summary'] = $objectName;
-        }
-        $put_value = CMISRepositoryWrapper :: processTemplate($entry_template, $hash_values);
-	 	// print $put_value; // RRM DEBUG
-        $ret = $this->doPut($obj_url, $put_value, MIME_ATOM_XML_ENTRY);
-        $obj = $this->extractObject($ret->body);
-        $this->cacheObjectInfo($obj);
-        return $obj;
-    }
-
-    function moveObject($objectId, $targetFolderId, $sourceFolderId, $options = array ())
-    { //yes
-        $options['sourceFolderId'] = $sourceFolderId;
-        return $this->postObject($targetFolderId, $this->getTitle($objectId), $this->getObjectType($objectId), array (
-            "cmis:objectId" => $objectId
-        ), null, null, $options);
-    }
-
-    function deleteObject($objectId, $options = array ())
-    { //Yes
-        $varmap = $options;
-        $varmap["id"] = $objectId;
-        $obj_url = $this->getLink($objectId, "edit");
-        $ret = $this->doDelete($obj_url);
-        return;
-    }
-
-    function deleteTree()
-    { // Nice to have
-        throw new Exception("Not Implemented");
-    }
-
-    function setContentStream($objectId, $content, $content_type, $options = array ())
-    { //Yes
-        $myURL = $this->getLink($objectId, "edit-media");
-        $ret = $this->doPut($myURL, $content, $content_type);
-    }
-
-    function deleteContentStream($objectId, $options = array ())
-    { //yes
-        $myURL = $this->getLink($objectId, "edit-media");
-        $ret = $this->doDelete($myURL);
-        return;
-    }
-
-    //Versioning Services
-    function getPropertiesOfLatestVersion($objectId, $major =false, $options = array ())
-    {
-        return $this->getObjectOfLatestVersion($objectId, $major, $options);
-    }
-
-    function getObjectOfLatestVersion($objectId, $major = false, $options = array ())
-    {
-        return $this->getObject($objectId, $options); // Won't be able to handle major/minor distinction
-        // Need to add this -- "current-version"
-        /*
-         * Headers: CMIS-filter, CMIS-returnVersion (enumReturnVersion) 
-         * HTTP Arguments: filter, returnVersion 
-         * Enum returnVersion: This, Latest, Major
-         */
-    }
-
-    function getAllVersions()
-    {
-        throw new Exception("Not Implemented");
-    }
-
-    function checkOut()
-    {
-        throw new Exception("Not Implemented");
-    }
-
-    function checkIn()
-    {
-        throw new Exception("Not Implemented");
-    }
-
-    function cancelCheckOut()
-    {
-        throw new Exception("Not Implemented");
-    }
-
-    function deleteAllVersions()
-    {
-        throw new Exception("Not Implemented");
-    }
-
-    //Relationship Services
-    function getObjectRelationships()
-    {
-        // get stripped down version of object (for the links) and then get the relationships?
-        // Low priority -- can get all information when getting object
-        throw new Exception("Not Implemented");
-    }
-
-    //Multi-Filing Services
-    function addObjectToFolder()
-    { // Probably
-        throw new Exception("Not Implemented");
-    }
-
-    function removeObjectFromFolder()
-    { //Probably
-        throw new Exception("Not Implemented");
-    }
-
-    //Policy Services
-    function getAppliedPolicies()
-    {
-        throw new Exception("Not Implemented");
-    }
-
-    function applyPolicy()
-    {
-        throw new Exception("Not Implemented");
-    }
-
-    function removePolicy()
-    {
-        throw new Exception("Not Implemented");
-    }
-
-    //ACL Services
-    function getACL()
-    {
-        throw new Exception("Not Implemented");
-    }
-
-    function applyACL()
-    {
-        throw new Exception("Not Implemented");
-    }
-}