Author: ruschein
Date: 2011-09-26 09:01:39 -0700 (Mon, 26 Sep 2011)
New Revision: 26963
Modified:
csplugins/trunk/ucsd/ruschein/GSFS/progs/ParseDirectory.cc
csplugins/trunk/ucsd/ruschein/GSFS/progs/directory_listing.txt
Log:
First successful directory listing.
Modified: csplugins/trunk/ucsd/ruschein/GSFS/progs/ParseDirectory.cc
===================================================================
--- csplugins/trunk/ucsd/ruschein/GSFS/progs/ParseDirectory.cc 2011-09-24
18:33:24 UTC (rev 26962)
+++ csplugins/trunk/ucsd/ruschein/GSFS/progs/ParseDirectory.cc 2011-09-26
16:01:39 UTC (rev 26963)
@@ -1,3 +1,4 @@
+#include <fstream>
#include <iostream>
#include <vector>
#include <cstdlib>
@@ -2,2 +3,4 @@
#include <FileUtil.h>
+#include <StringUtil.h>
+#include <TimeUtil.h>
#include "JSONScanner.h"
@@ -12,49 +15,359 @@
class DirEntry {
+ std::string name_;
+ std::string url_;
+ std::string owner_;
+ bool is_directory_;
+ bool owner_has_read_premission_;
+ bool owner_has_write_permission_;
+ time_t last_modified_;
+ uint64_t size_;
+public:
+ DirEntry(const std::string &name, const std::string &url, const
std::string &owner, const bool is_directory,
+ const bool owner_has_read_premission, const bool
owner_has_write_permission, const time_t last_modified,
+ const uint64_t size)
+ : name_(name), url_(url), owner_(owner),
is_directory_(is_directory),
+ owner_has_read_premission_(owner_has_read_premission),
owner_has_write_permission_(owner_has_write_permission),
+ last_modified_(last_modified), size_(size) { }
+ std::string toString() const;
};
-static bool SkipBraceBlock(JSONScanner * const scanner) {
+std::string DirEntry::toString() const {
+ return name_ + "(" + url_ + "), " + std::string(is_directory_ ?
"directory, " : "ordinary file, ")
+ + "owner=" + owner_ + ", " +
std::string(owner_has_read_premission_ ? "r" : "-")
+ + std::string(owner_has_write_permission_ ? "w" : "-") + ",
size=" + StringUtil::ToString(size_);
+}
+
+
+static bool SkipBlock(JSONScanner * const scanner, const
JSONScanner::TokenType open_token,
+ const JSONScanner::TokenType close_token)
+{
JSONScanner::TokenType token = scanner->getToken();
- if (token != JSONScanner::OPEN_BRACE)
+ if (token != open_token)
return false;
- unsigned open_brace_count(1);
- while (open_brace_count != 0) {
+ unsigned open_token_count(1);
+ while (open_token_count != 0) {
token = scanner->getToken();
if (token == JSONScanner::END_OF_INPUT)
return false;
- else if (token == JSONScanner::OPEN_BRACE)
- ++open_brace_count;
- else if (token == JSONScanner::CLOSE_BRACE)
- --open_brace_count;
+ else if (token == open_token)
+ ++open_token_count;
+ else if (token == close_token)
+ --open_token_count;
}
return true;
}
-static bool SkipBracketBlock(JSONScanner * const scanner) {
- JSONScanner::TokenType token = scanner->getToken();
- if (token != JSONScanner::OPEN_BRACKET)
+static inline bool SkipBraceBlock(JSONScanner * const scanner) {
+ return SkipBlock(scanner, JSONScanner::OPEN_BRACE,
JSONScanner::CLOSE_BRACE);
+}
+
+
+static inline bool SkipBracketBlock(JSONScanner * const scanner) {
+ return SkipBlock(scanner, JSONScanner::OPEN_BRACKET,
JSONScanner::CLOSE_BRACKET);
+}
+
+
+static bool SkipUntil(JSONScanner * const scanner, const
JSONScanner::TokenType look_for) {
+ for (;;) {
+ const JSONScanner::TokenType token = scanner->getToken();
+ if (token == look_for)
+ return true;
+ else if (token == JSONScanner::END_OF_INPUT)
+ return false;
+ }
+}
+
+
+bool ParseEffectiveACL(const std::string &owner, JSONScanner * const scanner,
+ bool * const owner_has_read_premission, bool * const
owner_has_write_premission)
+{
+ if (not SkipUntil(scanner, JSONScanner::OPEN_BRACKET))
return false;
- unsigned open_bracket_count(1);
- while (open_bracket_count != 0) {
+ *owner_has_read_premission = false;
+ *owner_has_write_premission = false;
+
+ JSONScanner::TokenType token;
+ token = scanner->getToken();
+
+ for (;;) {
+ if (token == JSONScanner::CLOSE_BRACKET)
+ break;
+ else if (token != JSONScanner::OPEN_BRACE)
+ return false;
+
+ // parse "sid":
token = scanner->getToken();
- if (token == JSONScanner::END_OF_INPUT)
+ if (token != JSONScanner::STRING_CONSTANT)
return false;
- else if (token == JSONScanner::OPEN_BRACKET)
- ++open_bracket_count;
- else if (token == JSONScanner::CLOSE_BRACKET)
- --open_bracket_count;
+ if (scanner->getLastString() != "sid")
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::COLON)
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::OPEN_BRACE)
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::STRING_CONSTANT)
+ return false;
+ if (scanner->getLastString() != "id")
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::COLON)
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::STRING_CONSTANT)
+ return false;
+ const std::string id = scanner->getLastString();
+ if (not SkipUntil(scanner, JSONScanner::CLOSE_BRACE))
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::COMMA)
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::STRING_CONSTANT)
+ return false;
+ if (scanner->getLastString() != "permission")
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::COLON)
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::STRING_CONSTANT)
+ return false;
+ if (id == owner) {
+ const std::string permission = scanner->getLastString();
+ if (permission == "W")
+ *owner_has_read_premission = true;
+ else if (permission == "R")
+ *owner_has_write_premission = true;
+ }
+ token = scanner->getToken();
+ if (token != JSONScanner::CLOSE_BRACE)
+ return false;
+
+ token = scanner->getToken();
+ if (token == JSONScanner::COMMA)
+ token = scanner->getToken();
}
+ token = scanner->getToken();
+ if (token != JSONScanner::CLOSE_BRACE)
+ return false;
+
return true;
}
+bool ProcessFileList(JSONScanner * const scanner, std::vector<DirEntry> *
const entries) {
+ JSONScanner::TokenType token;
+ token = scanner->getToken();
+ if (token == JSONScanner::CLOSE_BRACKET)
+ return true;
+
+ for (;;) {
+ if (token != JSONScanner::OPEN_BRACE)
+ return false;
+
+ // "name"
+ token = scanner->getToken();
+ if (token != JSONScanner::STRING_CONSTANT)
+ return false;
+ if (scanner->getLastString() != "name")
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::COLON)
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::STRING_CONSTANT)
+ return false;
+ const std::string name = scanner->getLastString();
+ token = scanner->getToken();
+ if (token != JSONScanner::COMMA)
+ return false;
+
+ // "url"
+ token = scanner->getToken();
+ if (token != JSONScanner::STRING_CONSTANT)
+ return false;
+ if (scanner->getLastString() != "url")
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::COLON)
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::STRING_CONSTANT)
+ return false;
+ const std::string url = scanner->getLastString();
+ token = scanner->getToken();
+ if (token != JSONScanner::COMMA)
+ return false;
+
+ // "path"
+ token = scanner->getToken();
+ if (token != JSONScanner::STRING_CONSTANT)
+ return false;
+ if (scanner->getLastString() != "path")
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::COLON)
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::STRING_CONSTANT)
+ return false;
+ const std::string path = scanner->getLastString();
+ token = scanner->getToken();
+ if (token != JSONScanner::COMMA)
+ return false;
+
+ // "owner"
+ token = scanner->getToken();
+ if (token != JSONScanner::STRING_CONSTANT)
+ return false;
+ if (scanner->getLastString() != "owner")
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::COLON)
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::OPEN_BRACE)
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::STRING_CONSTANT)
+ return false;
+ if (scanner->getLastString() != "id")
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::COLON)
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::STRING_CONSTANT)
+ return false;
+ const std::string owner = scanner->getLastString();
+ if (not SkipUntil(scanner, JSONScanner::CLOSE_BRACE))
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::COMMA)
+ return false;
+
+ // "size"
+ token = scanner->getToken();
+ if (token != JSONScanner::STRING_CONSTANT)
+ return false;
+ if (scanner->getLastString() != "size")
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::COLON)
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::INTEGER_CONSTANT)
+ return false;
+ const int64_t size = scanner->getLastInteger();
+ token = scanner->getToken();
+ if (token != JSONScanner::COMMA)
+ return false;
+
+ // "lastModified"
+ time_t last_modified = 0;
+ token = scanner->getToken();
+ if (token != JSONScanner::STRING_CONSTANT)
+ return false;
+ if (scanner->getLastString() != "lastModified")
+ goto isDirectory;
+ token = scanner->getToken();
+ if (token != JSONScanner::COLON)
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::STRING_CONSTANT)
+ return false;
+ last_modified =
TimeUtil::Iso8601StringToTimeT(scanner->getLastString(), TimeUtil::UTC);
+ token = scanner->getToken();
+ if (token != JSONScanner::COMMA)
+ return false;
+
+ // "isDirectory"
+ token = scanner->getToken();
+ if (token != JSONScanner::STRING_CONSTANT)
+ return false;
+isDirectory:
+ if (scanner->getLastString() != "isDirectory")
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::COLON)
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::BOOLEAN_CONSTANT)
+ return false;
+ const bool is_directory = scanner->getLastBoolean();
+ token = scanner->getToken();
+ if (token != JSONScanner::COMMA)
+ return false;
+
+ if (!is_directory) {
+ // "dataFormat"
+ token = scanner->getToken();
+ if (token != JSONScanner::STRING_CONSTANT)
+ return false;
+ if (scanner->getLastString() != "dataFormat")
+ goto availableDataFormats;
+ token = scanner->getToken();
+ if (token != JSONScanner::COLON)
+ return false;
+ SkipBraceBlock(scanner);
+ token = scanner->getToken();
+ if (token != JSONScanner::COMMA)
+ return false;
+
+ // "availableDataFormats"
+ token = scanner->getToken();
+ if (token != JSONScanner::STRING_CONSTANT)
+ return false;
+availableDataFormats:
+ if (scanner->getLastString() != "availableDataFormats")
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::COLON)
+ return false;
+ SkipBracketBlock(scanner);
+ token = scanner->getToken();
+ if (token != JSONScanner::COMMA)
+ return false;
+ }
+
+ // "effectiveAcl"
+ token = scanner->getToken();
+ if (token != JSONScanner::STRING_CONSTANT)
+ return false;
+ if (scanner->getLastString() != "effectiveAcl")
+ return false;
+ token = scanner->getToken();
+ if (token != JSONScanner::COLON)
+ return false;
+ bool owner_has_read_premission, owner_has_write_premission;
+ if (not ParseEffectiveACL(owner, scanner,
&owner_has_read_premission, &owner_has_write_premission))
+ return false;
+
+ token = scanner->getToken();
+ if (token != JSONScanner::CLOSE_BRACE)
+ return false;
+
+ entries->push_back(DirEntry(name, url, owner, is_directory,
owner_has_read_premission,
+ owner_has_write_premission,
last_modified, size));
+
+ token = scanner->getToken();
+ if (token == JSONScanner::COMMA)
+ token = scanner->getToken();
+ }
+}
+
+
bool ParseListing(const std::string &listing, std::vector<DirEntry> * const
entries) {
entries->clear();
@@ -71,7 +384,7 @@
if (scanner.getLastString() != "directory")
return false;
- if (!SkipBraceBlock(&scanner))
+ if (not SkipBraceBlock(&scanner))
return false;
if (scanner.getToken() != JSONScanner::COMMA)
@@ -83,9 +396,12 @@
if (scanner.getToken() != JSONScanner::COLON)
return false;
- if (!SkipBracketBlock(&scanner))
+ if (scanner.getToken() != JSONScanner::OPEN_BRACKET)
return false;
+ if (not ProcessFileList(&scanner, entries))
+ return false;
+
// top-level closing brace
if (scanner.getToken() != JSONScanner::CLOSE_BRACE)
return false;
@@ -105,5 +421,8 @@
}
std::vector<DirEntry> dir_entries;
- std::cout << "ParseListing() returned " <<
ParseListing(json_directory_listing, &dir_entries) << '\n';
+ ParseListing(json_directory_listing, &dir_entries);
+ for (std::vector<DirEntry>::const_iterator entry(dir_entries.begin());
+ entry != dir_entries.end(); ++entry)
+ std::cout << entry->toString() << '\n';
}
Modified: csplugins/trunk/ucsd/ruschein/GSFS/progs/directory_listing.txt
===================================================================
--- csplugins/trunk/ucsd/ruschein/GSFS/progs/directory_listing.txt
2011-09-24 18:33:24 UTC (rev 26962)
+++ csplugins/trunk/ucsd/ruschein/GSFS/progs/directory_listing.txt
2011-09-26 16:01:39 UTC (rev 26963)
@@ -32,17 +32,17 @@
{"id":"test",
"name":"test",
"type":"User"},
- "size":225,
- "lastModified":"2011-08-23T16:36:57Z",
- "isDirectory":false,
-
"dataFormat":{"name":"gct","version":"0.0.0","url":"http:\/\/www.genomespace.org\/datamanager\/dataformat\/gct\/0.0.0","fileExtension":"gct"},
- "availableDataFormats":
+ "size":225,
+ "lastModified":"2011-08-23T16:36:57Z",
+ "isDirectory":false,
+
"dataFormat":{"name":"gct","version":"0.0.0","url":"http:\/\/www.genomespace.org\/datamanager\/dataformat\/gct\/0.0.0","fileExtension":"gct"},
+ "availableDataFormats":
[
{"name":"genomicatab","version":"0.0.0","url":"http:\/\/www.genomespace.org\/datamanager\/dataformat\/genomicatab\/0.0.0","fileExtension":"tab"},
{"name":"gxp","version":"0.0.0","url":"http:\/\/www.genomespace.org\/datamanager\/dataformat\/gxp\/0.0.0","fileExtension":"gxp"},
{"name":"gct","version":"0.0.0","url":"http:\/\/www.genomespace.org\/datamanager\/dataformat\/gct\/0.0.0","fileExtension":"gct"}
],
- "effectiveAcl":
+ "effectiveAcl":
{"objectId":"\/users\/test\/FileProcessorTestData_twoRecords.gct",
"objectType":"DataManagerFileObject",
"accessControlEntries":
@@ -135,4 +135,17 @@
"owner":{"id":"test","name":"test","type":"User"},
"size":0,
"isDirectory":true,
-
"effectiveAcl":{"objectId":"\/users\/test\/atm-test","objectType":"DataManagerFileObject","accessControlEntries":[{"sid":{"id":"test","name":"test","type":"User"},"permission":"R"},{"sid":{"id":"test","name":"test","type":"User"},"permission":"W"}]}}]}
+ "effectiveAcl":
+ {"objectId":"\/users\/test\/atm-test",
+ "objectType":"DataManagerFileObject",
+ "accessControlEntries":
+ [
+
{"sid":{"id":"test","name":"test","type":"User"},
+ "permission":"R"},
+
{"sid":{"id":"test","name":"test","type":"User"},
+ "permission":"W"}
+ ]
+ }
+ }
+ ]
+ }
--
You received this message because you are subscribed to the Google Groups
"cytoscape-cvs" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/cytoscape-cvs?hl=en.