public static function getRevision($uri, $poid, $roid, $userId = -1)
 {
     $server = BIMsie::getServerByUri($uri, $userId);
     if ($server === false) {
         return false;
     } else {
         $userId = $userId == -1 ? get_current_user_id() : $userId;
         $bimsieCache = BIMsie::getCacheByUri($uri, $userId);
         if ($bimsieCache === false || !isset($bimsieCache['projects'][$poid])) {
             $project = BIMsie::getProject($uri, $poid, $userId);
             if ($project) {
                 $bimsieCache = BIMsie::getCacheByUri($uri, $userId);
                 if (isset($server['token']) && isset($server['tokenValid']) && $server['tokenValid'] > time()) {
                     $revisions = BIMsie::request($server['uri'], $server['token'], 'Bimsie1ServiceInterface', 'getAllRevisionsOfProject', array('poid' => $poid));
                     $error = BIMsie::getErrorMessage($revisions);
                     if ($error === false && isset($revisions) && isset($revisions->response) && isset($revisions->response->result)) {
                         $revisions = $revisions->response->result;
                         $bimsieCache['projects'][$poid]->revisions = array();
                         foreach ($revisions as $revision) {
                             $revision->dateString = date('d-m-Y H:i', $revision->date * 0.001);
                             $revision->name = $revision->dateString . ' - ' . $revision->comment;
                             $bimsieCache['projects'][$poid]->revisions[$revision->oid] = $revision;
                         }
                         BIMsie::updateCache($bimsieCache, $userId);
                         if (isset($bimsieCache['projects'][$poid]->revisions[$roid])) {
                             return $bimsieCache['projects'][$poid]->revisions[$roid];
                         } else {
                             return false;
                         }
                     } else {
                         return false;
                     }
                 } else {
                     return false;
                 }
             } else {
                 return false;
             }
         } elseif (isset($bimsieCache['projects']) && isset($bimsieCache['projects'][$poid]) && isset($bimsieCache['projects'][$poid]->revisions) && isset($bimsieCache['projects'][$poid]->revisions[$roid])) {
             return $bimsieCache['projects'][$poid]->revisions[$roid];
         } else {
             if (!isset($bimsieCache['projects'][$poid]->revisions) || !isset($bimsieCache['projects'][$poid]->revisions[$roid])) {
                 if (isset($server['token']) && isset($server['tokenValid']) && $server['tokenValid'] > time()) {
                     $revisions = BIMsie::request($server['uri'], $server['token'], 'Bimsie1ServiceInterface', 'getAllRevisionsOfProject', array('poid' => $poid));
                     $error = BIMsie::getErrorMessage($revisions);
                     if ($error === false && isset($revisions) && isset($revisions->response) && isset($revisions->response->result)) {
                         $revisions = $revisions->response->result;
                         $bimsieCache['projects'][$poid]->revisions = array();
                         foreach ($revisions as $revision) {
                             $revision->dateString = date('d-m-Y H:i', $revision->date * 0.001);
                             $revision->name = $revision->dateString . ' - ' . $revision->comment;
                             $bimsieCache['projects'][$poid]->revisions[$revision->oid] = $revision;
                         }
                         BIMsie::updateCache($bimsieCache, $userId);
                         if (isset($bimsieCache['projects'][$poid]->revisions[$roid])) {
                             return $bimsieCache['projects'][$poid]->revisions[$roid];
                         } else {
                             return false;
                         }
                     } else {
                         return false;
                     }
                 } else {
                     return false;
                 }
             } else {
                 return false;
             }
         }
     }
 }