ATLAS Offline Software
Loading...
Searching...
No Matches
SH::DiskListXRD Class Reference

a DiskList implementation for the XRD protocol More...

#include <DiskListXRD.h>

Inheritance diagram for SH::DiskListXRD:
Collaboration diagram for SH::DiskListXRD:

Public Member Functions

void testInvariant () const
 test the invariant of this object
 DiskListXRD (const std::string &val_server, const std::string &val_dir, bool val_laxParsing=false)
 make the listing for the given directory, but replacing the directory with prefix for the path
bool next ()
 get the next list entry
std::string path () const
 the path for the current entry.
std::string fileName () const
 the filename for the current entry
DiskListopenDir () const
 make a new list object for the sub-directory
std::unique_ptr< DiskListopenDirUnique () const
 make a new list object for the sub-directory
std::string dirname () const
 the base path for the directory listed

Protected Member Functions

virtual bool getNext () override
 get the next list entry
virtual std::string getPath () const override
 the path for the current entry.
virtual DiskListdoOpenDir () const override
 make a new list object for the sub-directory
virtual std::string getDirname () const override
 the base path for the directory listed

Private Types

enum  State { S_BLANK , S_VALID , S_DONE , S_BROKEN }
 the current state More...

Private Attributes

std::string m_server
 the server from which we are reading
std::string m_directory
 the directory we are reading
bool m_laxParser
 whether we employ lax parsing
std::string m_context
 the context (for error reporting)
std::string m_list
 the result of the directory listing
std::string::size_type m_pos = 0
 the current parse position within m_list
std::string m_file
 the last file we read
bool m_isDir = false
 whether this is a directory
bool m_isRead
 whether the directory has been read
State m_state
 the current state

Detailed Description

a DiskList implementation for the XRD protocol

Definition at line 17 of file DiskListXRD.h.

Member Enumeration Documentation

◆ State

enum SH::DiskList::State
privateinherited

the current state

Enumerator
S_BLANK 

just initialized

S_VALID 

holding a valid entry

S_DONE 

finished reading entries

S_BROKEN 

an error occured

Definition at line 173 of file DiskList.h.

174 {
175 S_BLANK,
176 S_VALID,
177 S_DONE,
178 S_BROKEN
179 };
@ S_VALID
holding a valid entry
Definition DiskList.h:176
@ S_DONE
finished reading entries
Definition DiskList.h:177
@ S_BROKEN
an error occured
Definition DiskList.h:178
@ S_BLANK
just initialized
Definition DiskList.h:175

Constructor & Destructor Documentation

◆ DiskListXRD()

SH::DiskListXRD::DiskListXRD ( const std::string & val_server,
const std::string & val_dir,
bool val_laxParsing = false )

make the listing for the given directory, but replacing the directory with prefix for the path

Parameters
val_dirthe directory to list
val_prefixthe prefix with which val_dir will be replaced in the reported paths
val_laxParsingif true, graciously skip over any error messages.
Guarantee
strong
Failures
out of memory II
Rationale
this mechanism is meant to allow scanning file servers using one protocol, but then accessing them using another

Definition at line 31 of file DiskListXRD.cxx.

34 : m_server (val_server), m_directory (val_directory),
35 m_laxParser (val_laxParser), m_isRead (false)
36 {
37 RCU_NEW_INVARIANT (this);
38 }
#define RCU_NEW_INVARIANT(x)
Definition Assert.h:221
std::string m_server
the server from which we are reading
Definition DiskListXRD.h:84
bool m_laxParser
whether we employ lax parsing
Definition DiskListXRD.h:92
std::string m_directory
the directory we are reading
Definition DiskListXRD.h:88
bool m_isRead
whether the directory has been read

Member Function Documentation

◆ dirname()

std::string SH::DiskList::dirname ( ) const
inherited

the base path for the directory listed

Guarantee
strong
Failures
out of memory II

Definition at line 113 of file DiskList.cxx.

115 {
116 RCU_READ_INVARIANT (this);
117 return getDirname ();
118 }
#define RCU_READ_INVARIANT(x)
Definition Assert.h:217
virtual std::string getDirname() const =0
the base path for the directory listed

◆ doOpenDir()

DiskList * SH::DiskListXRD::doOpenDir ( ) const
overrideprotectedvirtual

make a new list object for the sub-directory

Returns
a new list object for the sub-directory, or nullptr if it is not a directory
Precondition
(soft) next() has been called successfully
Guarantee
strong
Failures
out of memory III
Rationale
the virtual part of DiskList::openDir()

Implements SH::DiskList.

Definition at line 112 of file DiskListXRD.cxx.

114 {
115 RCU_READ_INVARIANT (this);
116
117 if (m_file.empty() || !m_isDir)
118 return nullptr;
119
120 return new DiskListXRD (m_server, m_file, m_laxParser);
121 }
DiskListXRD(const std::string &val_server, const std::string &val_dir, bool val_laxParsing=false)
make the listing for the given directory, but replacing the directory with prefix for the path
bool m_isDir
whether this is a directory
std::string m_file
the last file we read

◆ fileName()

std::string SH::DiskList::fileName ( ) const
inherited

the filename for the current entry

Returns
the filename for the current entry
Precondition
(soft) next() has been called successfully
Guarantee
strong
Failures
out of memory III

Definition at line 80 of file DiskList.cxx.

82 {
83 // no invariant used
84 std::string result = path();
85 std::string::size_type split = result.rfind ('/');
86 if (split != std::string::npos)
87 result = result.substr (split + 1);
88 return result;
89 }
std::string path() const
the path for the current entry.
Definition DiskList.cxx:71
std::vector< std::string > split(const std::string &s, const std::string &t=":")
Definition hcg.cxx:179

◆ getDirname()

std::string SH::DiskListXRD::getDirname ( ) const
overrideprotectedvirtual

the base path for the directory listed

Guarantee
strong
Failures
out of memory II
Rationale
the virtual part of DiskList::dirname()

Implements SH::DiskList.

Definition at line 125 of file DiskListXRD.cxx.

127 {
128 RCU_READ_INVARIANT (this);
129 return m_directory;
130 }

◆ getNext()

bool SH::DiskListXRD::getNext ( )
overrideprotectedvirtual

get the next list entry

Returns
whether we found another entry
Guarantee
basic
Failures
i/o errors
Rationale
the virtual part of DiskList::next()

Implements SH::DiskList.

Definition at line 42 of file DiskListXRD.cxx.

44 {
46 using namespace msgScanDir;
47
48 if (!m_isRead)
49 {
50 std::string command = "xrdfs " + RCU::Shell::quote (m_server) + " ls -l " + RCU::Shell::quote (m_directory);
51 ANA_MSG_DEBUG ("trying XRD command: " << command);
52 m_list = RCU::Shell::exec_read (command);
53 ANA_MSG_DEBUG ("XRD command output:\n" << m_list);
54 m_context = "command: " + command + "\n" + m_list;
55 m_isRead = true;
56 m_pos = 0;
57 }
58
59 // rationale: we advance a running index through m_list rather than
60 // repeatedly copying its tail, so that listing N entries costs
61 // O(N) rather than O(N^2). a final line without a trailing
62 // newline is still processed.
63 while (m_pos < m_list.size())
64 {
65 std::string::size_type split1 = m_list.find ('\n', m_pos);
66 std::string line;
67 if (split1 == std::string::npos)
68 {
69 line = m_list.substr (m_pos);
70 m_pos = m_list.size();
71 } else
72 {
73 line = m_list.substr (m_pos, split1 - m_pos);
74 m_pos = split1 + 1;
75 }
76 ANA_MSG_DEBUG ("next XRD list line: " << line);
77
78 std::string::size_type split2 = line.find ('/');
79 if (split2 != std::string::npos &&
80 (line[0] == '-' || line[0] == 'd'))
81 {
82 m_isDir = line[0] == 'd';
83 m_file = line.substr (split2);
84 ANA_MSG_DEBUG ("next XRD file found: " << m_file);
85 ANA_MSG_DEBUG ("XRD file isDir: " << m_isDir);
86 return true;
87 }
88
89 if (!line.empty())
90 {
91 std::string message = "failed to parse line: \"" + line + "\"\n" + m_context;
92
93 ANA_MSG_WARNING (message);
94 if (!m_laxParser)
95 throw std::runtime_error (message);
96 }
97 }
98 return false;
99 }
#define RCU_CHANGE_INVARIANT(x)
Definition Assert.h:219
#define ANA_MSG_DEBUG(xmsg,...)
Macro printing debug messages.
#define ANA_MSG_WARNING(xmsg,...)
Macro printing warning messages.
std::string m_context
the context (for error reporting)
Definition DiskListXRD.h:96
std::string m_list
the result of the directory listing
std::string::size_type m_pos
the current parse position within m_list
std::string exec_read(const std::string &cmd)
effects: execute the given command and return the output returns: the output of the command guarantee...
Definition ShellExec.cxx:35
std::string quote(const std::string &name)
effects: quote the given name to protect it from the shell returns: the quoted name guarantee: strong...
Definition ShellExec.cxx:65

◆ getPath()

std::string SH::DiskListXRD::getPath ( ) const
overrideprotectedvirtual

the path for the current entry.

Returns
the path for the current entry
Precondition
(soft) next() has been called successfully
Guarantee
strong failures: out of memory III
Rationale
the virtual part of DiskList::path()

Implements SH::DiskList.

Definition at line 103 of file DiskListXRD.cxx.

105 {
106 RCU_READ_INVARIANT (this);
107 return "root://" + m_server + "/" + m_file;
108 }

◆ next()

bool SH::DiskList::next ( )
inherited

get the next list entry

Returns
whether we found another entry
Guarantee
basic
Failures
i/o errors

Definition at line 46 of file DiskList.cxx.

48 {
50 switch (m_state)
51 {
52 case S_BLANK:
53 case S_VALID:
55 if (getNext())
57 else
59 return m_state == S_VALID;
60 case S_DONE:
61 throw std::runtime_error ("DiskList::next: already finished processing list");
62 case S_BROKEN:
63 throw std::runtime_error ("DiskList::next: list is in error state");
64 };
65 return false; // compiler dummy
66 }
State m_state
the current state
Definition DiskList.h:181
virtual bool getNext()=0
get the next list entry

◆ openDir()

DiskList * SH::DiskList::openDir ( ) const
inherited

make a new list object for the sub-directory

Returns
a new list object for the sub-directory, or nullptr if it is not a directory
Precondition
(soft) next() has been called successfully
Guarantee
strong
Failures
out of memory III

Definition at line 93 of file DiskList.cxx.

95 {
96 RCU_READ_INVARIANT (this);
97 RCU_REQUIRE2_SOFT (m_state == S_VALID, "getNext() has not been called successfully");
98 return doOpenDir();
99 }
#define RCU_REQUIRE2_SOFT(x, y)
Definition Assert.h:143
virtual DiskList * doOpenDir() const =0
make a new list object for the sub-directory

◆ openDirUnique()

std::unique_ptr< DiskList > SH::DiskList::openDirUnique ( ) const
inherited

make a new list object for the sub-directory

Returns
a new list object for the sub-directory, or nullptr if it is not a directory
Precondition
(soft) next() has been called successfully
Guarantee
strong
Failures
out of memory III

Definition at line 103 of file DiskList.cxx.

105 {
106 RCU_READ_INVARIANT (this);
107 RCU_REQUIRE2_SOFT (m_state == S_VALID, "getNext() has not been called successfully");
108 return std::unique_ptr<DiskList> (doOpenDir());
109 }

◆ path()

std::string SH::DiskList::path ( ) const
inherited

the path for the current entry.

Returns
the path for the current entry
Precondition
(soft) next() has been called successfully
Guarantee
strong failures: out of memory III

Definition at line 70 of file DiskList.cxx.

72 {
73 RCU_READ_INVARIANT (this);
74 RCU_REQUIRE2_SOFT (m_state == S_VALID, "getNext() has not been called successfully");
75 return getPath();
76 }
virtual std::string getPath() const =0
the path for the current entry.

◆ testInvariant()

void SH::DiskListXRD::testInvariant ( ) const

test the invariant of this object

Guarantee
no-fail

Definition at line 24 of file DiskListXRD.cxx.

26 {
27 }

Member Data Documentation

◆ m_context

std::string SH::DiskListXRD::m_context
private

the context (for error reporting)

Definition at line 96 of file DiskListXRD.h.

◆ m_directory

std::string SH::DiskListXRD::m_directory
private

the directory we are reading

Definition at line 88 of file DiskListXRD.h.

◆ m_file

std::string SH::DiskListXRD::m_file
private

the last file we read

Definition at line 108 of file DiskListXRD.h.

◆ m_isDir

bool SH::DiskListXRD::m_isDir = false
private

whether this is a directory

Definition at line 112 of file DiskListXRD.h.

◆ m_isRead

bool SH::DiskListXRD::m_isRead
private

whether the directory has been read

Definition at line 116 of file DiskListXRD.h.

◆ m_laxParser

bool SH::DiskListXRD::m_laxParser
private

whether we employ lax parsing

Definition at line 92 of file DiskListXRD.h.

◆ m_list

std::string SH::DiskListXRD::m_list
private

the result of the directory listing

Definition at line 100 of file DiskListXRD.h.

◆ m_pos

std::string::size_type SH::DiskListXRD::m_pos = 0
private

the current parse position within m_list

Definition at line 104 of file DiskListXRD.h.

◆ m_server

std::string SH::DiskListXRD::m_server
private

the server from which we are reading

Definition at line 84 of file DiskListXRD.h.

◆ m_state

State SH::DiskList::m_state
privateinherited

the current state

Definition at line 181 of file DiskList.h.


The documentation for this class was generated from the following files: