00001
00002 #include "cafe/FilePattern.hpp"
00003
00004 #include "TSystem.h"
00005 #include "TUUID.h"
00006 #include "TDatime.h"
00007
00008 #include <iomanip>
00009 #include <sstream>
00010
00011 namespace cafe {
00012
00013
00014 FilePattern::FilePattern(const std::string& pattern)
00015 : _pattern(pattern),
00016 _counter(0)
00017 {
00018 }
00019
00020 FilePattern::FilePattern()
00021 : _pattern(""),
00022 _counter(0)
00023 {}
00024
00025 void FilePattern::set(const std::string& pattern)
00026 {
00027 _pattern = pattern;
00028 }
00029
00030 std::string FilePattern::replace(const std::string& input)
00031 {
00032 using namespace std;
00033
00034 std::string new_name = _pattern;
00035 std::string::size_type next = 0;
00036 std::string::size_type pos = 0;
00037 while((pos = new_name.find('%', next)) != std::string::npos) {
00038
00039
00040
00041 std::string input_name = input;
00042
00043 switch(new_name[pos+1]) {
00044 case 'f':
00045 new_name.replace(pos, 2, gSystem->BaseName((char *)input_name.c_str()));
00046 break;
00047 case 'd':
00048 new_name.replace(pos, 2, gSystem->DirName((char *)input_name.c_str()));
00049 break;
00050 case 'r':
00051 {
00052 std::string base = gSystem->BaseName((char *)input_name.c_str());
00053 base.erase(base.rfind('.'));
00054 new_name.replace(pos, 2, base);
00055 }
00056 break;
00057 case 'n':
00058 {
00059 std::ostringstream os;
00060 os << _counter++;
00061 new_name.replace(pos, 2, os.str());
00062 }
00063 break;
00064 case 'D':
00065 {
00066 TDatime date;
00067 std::ostringstream os;
00068 os << setw(2) << setfill('0') << date.GetDay()
00069 << setw(2) << setfill('0') << date.GetMonth()
00070 << setw(4) << setfill('0') << date.GetYear();
00071 new_name.replace(pos, 2, os.str());
00072 }
00073 break;
00074 case 'T':
00075 {
00076 TDatime date;
00077 std::ostringstream os;
00078 os << setw(2) << setfill('0') << date.GetHour()
00079 << setw(2) << setfill('0') << date.GetMinute()
00080 << setw(2) << setfill('0') << date.GetSecond();
00081 new_name.replace(pos, 2, os.str());
00082 }
00083 break;
00084 case 'j':
00085 if(const char *pbs = getenv("PBS_JOBID")) {
00086 new_name.replace(pos, 2, pbs);
00087 break;
00088 }
00089
00090 case 'u':
00091 {
00092 TUUID uuid;
00093 new_name.replace(pos, 2, uuid.AsString());
00094 }
00095 break;
00096 default:
00097 pos++;
00098 break;
00099 }
00100
00101 next = pos;
00102 }
00103
00104 return new_name;
00105
00106 }
00107
00108 }
00109