public function __construct(array $params, $mainEntity)
 {
     $this->at = RestUrlParams::parseTimestamp(RestUrlParams::extractValue($params, RestUrlParams::AT));
     if ($this->at == RestUrlParams::ALL_TIMES) {
         $this->at = self::ALL_TIMES;
     }
     $this->published = RestUrlParams::parseBoolean(RestUrlParams::extractValue($params, RestUrlParams::PUBLISHED));
     $this->queryParamsMap = array();
     $this->scopeMap = array();
     if ($mainEntity != NULL) {
         foreach ($params as $paramName => $paramValue) {
             // Parameters can be specified with or without entity-prefix, e.g. 'entity/property=value' or just
             // 'property=value'. Check if an entity-prefix is provided.
             $entityName = NULL;
             $propertyName = NULL;
             $paramNameParts = explode(RestUrlParams::ENTITY_SEPARATOR, $paramName);
             if (count($paramNameParts) == 1) {
                 // It's like 'property=value'.
                 $entityName = $mainEntity->getName();
                 $propertyName = $paramName;
             } else {
                 if (count($paramNameParts) == 2) {
                     // It's like 'entity/property=value'.
                     $entityName = $paramNameParts[0];
                     $propertyName = $paramNameParts[1];
                 } else {
                     throw new Exception("Illegal query parameter '{$paramName}'.");
                 }
             }
             // If it's a scope parameter...
             if (strcasecmp($propertyName, RestUrlParams::SCOPE) == 0) {
                 // ...then parse it.
                 $this->scopeMap[$entityName] = Scope::parseValue($paramValue);
             } else {
                 // ...else add the value to the map at the correct entity-entry.
                 if (!array_key_exists($entityName, $this->queryParamsMap)) {
                     $this->queryParamsMap[$entityName] = array();
                 }
                 // If $paramName is 'id'...
                 if (strcasecmp($propertyName, RestUrlParams::ID) == 0) {
                     // ...then check if this is allowed for the given entity...
                     if (!$mainEntity->isObjectEntity()) {
                         throw new Exception("Cannot fetch entity '" . $mainEntity->getName() . "' by id.");
                     }
                     // ...and apply the correct property name and value.
                     $propertyName = $mainEntity->getObjectIdColumnName();
                     $paramValue = explode(RestUrlParams::ID_SEPARATOR, $paramValue);
                 }
                 $this->queryParamsMap[$entityName][$propertyName] = $paramValue;
             }
         }
     }
 }
 public static function isFetchParam($paramName)
 {
     if (self::$FETCH_PARAM_NAMES == NULL) {
         self::$FETCH_PARAM_NAMES = array(self::AT, self::PUBLISHED, self::SCOPE, self::SKIP_BINARIES, self::ID);
     }
     foreach (self::$FETCH_PARAM_NAMES as $validParamName) {
         if (strcasecmp($paramName, $validParamName) == 0) {
             return TRUE;
         }
     }
     return FALSE;
 }
 /**
  * Fetches a single object of the given entity and id, applying the query parameters to limit the resultset.
  * The fetched data is added as the root element of the given XML document.
  * 
  * @param Entity $entity
  * @param type $id
  * @param array $params
  * @params Scope $scope
  * @params DOMDocument $domDoc
  * @params $skipBinaries
  * @return DOMElement with requested data or NULL if not found
  */
 public function getObjectTree(Entity $entity, $id, array $params, DOMDocument $domDoc)
 {
     $scope = Scope::parseValue(RestUrlParams::extractValue($params, RestUrlParams::SCOPE));
     $skipBinaries = RestUrlParams::parseBoolean(RestUrlParams::extractValue($params, RestUrlParams::SKIP_BINARIES));
     $queryContext = new QueryContext($params, $entity);
     $xmlElementsWithState = array();
     $this->fetchObjects($entity, $id, $queryContext, $scope, $skipBinaries, $domDoc, $domDoc, $xmlElementsWithState);
     $xmlResult = $domDoc->documentElement;
     if ($xmlResult != NULL) {
         $this->setLifecycleTimestamps($xmlElementsWithState);
         $this->setTimestamp($xmlResult, XmlConstants::AT, $queryContext->getParameterAt());
     }
     return $xmlResult;
 }
 private function processQueryParams(Schema $schema, $mainEntity)
 {
     // Get rid of any 'PHPSESSION' and cookie params.
     RestUrlParams::extractValue($this->params, session_name());
     // Create/restore the temporaryIdMap.
     $storedTemporaryIds = NULL;
     if (isset($_SESSION[$this->sessionId])) {
         $storedTemporaryIds = TemporaryIdMap::deserializeTemporaryIds($schema, $_SESSION[$this->sessionId]);
     }
     $this->temporaryIdMap = new TemporaryIdMap($storedTemporaryIds);
     // Validate that prefixed parameters refer to existing entities.
     foreach ($this->params as $paramName => &$paramValue) {
         if (RestUrlParams::isFetchParam($paramName)) {
             continue;
         }
         $paramNameParts = explode(RestUrlParams::ENTITY_SEPARATOR, $paramName);
         $entity = NULL;
         $queryParam = NULL;
         if (count($paramNameParts) == 1) {
             if ($mainEntity == NULL) {
                 //                    error_log("Ignoring unknown query parameter: '$paramName=$paramValue'.");
                 unset($this->params[$paramName]);
                 continue;
             }
             $entity = $mainEntity;
             $queryParam = $paramNameParts[0];
         } else {
             // Check if the specified entity exists.
             $entity = $schema->getObjectEntity($paramNameParts[0], false);
             if ($entity == NULL) {
                 throw new Exception("Unknown entity '{$paramNameParts['0']}' in query parameters.", RestResponse::CLIENT_ERROR);
             }
             $queryParam = $paramNameParts[1];
         }
         // If one or more ID's are specified...
         if (strcasecmp($queryParam, RestUrlParams::ID) == 0) {
             // ...then substitute any temporary ID with its persisted counterpart.
             $persistedIds = array();
             foreach (explode(RestUrlParams::ID_SEPARATOR, $paramValue) as $id) {
                 $persistedIds[] = $this->temporaryIdMap->getPersistedId($entity, $id);
             }
             $paramValue = implode(RestUrlParams::ID_SEPARATOR, $persistedIds);
         }
     }
 }