blob: 0b241d6f03afd2f8a61d9deba8cb46d81c8c1ac0 [file] [log] [blame]
Andreas Huber84f89de2016-07-28 15:39:51 -07001#include "FQName.h"
2
3#include <android-base/logging.h>
4#include <regex>
5
6#define RE_COMPONENT "[a-zA-Z_][a-zA-Z_0-9]*"
7#define RE_PATH RE_COMPONENT "([.]" RE_COMPONENT ")*"
8#define RE_VERSION "@[0-9]+[.][0-9]+"
9
10static const std::regex kRE1("(" RE_PATH ")(" RE_VERSION ")?::(" RE_PATH ")");
11static const std::regex kRE2("(" RE_VERSION ")::(" RE_PATH ")");
Andreas Huberda51b8e2016-07-28 16:00:57 -070012static const std::regex kRE3("(" RE_PATH ")(" RE_VERSION ")");
13static const std::regex kRE4(RE_PATH);
Andreas Huber84f89de2016-07-28 15:39:51 -070014
15namespace android {
16
Andreas Huberda51b8e2016-07-28 16:00:57 -070017FQName::FQName()
18 : mValid(false) {
19}
20
Andreas Huber84f89de2016-07-28 15:39:51 -070021FQName::FQName(const std::string &s)
22 : mValid(false) {
23 setTo(s);
24}
25
26bool FQName::isValid() const {
27 return mValid;
28}
29
30bool FQName::setTo(const std::string &s) {
31 mPackage.clear();
32 mVersion.clear();
33 mName.clear();
34
35 mValid = true;
36
37 std::smatch match;
38 if (std::regex_match(s, match, kRE1)) {
39 CHECK_EQ(match.size(), 6u);
40
41 mPackage = match.str(1);
42 mVersion = match.str(3);
43 mName = match.str(4);
44 } else if (std::regex_match(s, match, kRE2)) {
45 CHECK_EQ(match.size(), 4u);
46
47 mVersion = match.str(1);
48 mName = match.str(2);
49 } else if (std::regex_match(s, match, kRE3)) {
Andreas Huberda51b8e2016-07-28 16:00:57 -070050 CHECK_EQ(match.size(), 4u);
51
52 mPackage = match.str(1);
53 mVersion = match.str(3);
54 } else if (std::regex_match(s, match, kRE4)) {
Andreas Huber84f89de2016-07-28 15:39:51 -070055 mName = match.str(0);
56 } else {
57 mValid = false;
58 }
59
60 return isValid();
61}
62
63std::string FQName::package() const {
64 return mPackage;
65}
66
67std::string FQName::version() const {
68 return mVersion;
69}
70
71std::string FQName::name() const {
72 return mName;
73}
74
75void FQName::applyDefaults(
76 const std::string &defaultPackage,
77 const std::string &defaultVersion) {
78 if (mPackage.empty()) {
79 mPackage = defaultPackage;
80 }
81
82 if (mVersion.empty()) {
83 mVersion = defaultVersion;
84 }
85}
86
87std::string FQName::debugString() const {
88 CHECK(mValid);
89
Andreas Huber5345ec22016-07-29 13:33:27 -070090 std::string out;
Andreas Huber84f89de2016-07-28 15:39:51 -070091 out.append(mPackage);
92 out.append(mVersion);
Andreas Huberda51b8e2016-07-28 16:00:57 -070093 if (!mName.empty()) {
94 if (!mPackage.empty() || !mVersion.empty()) {
95 out.append("::");
96 }
97 out.append(mName);
Andreas Huber84f89de2016-07-28 15:39:51 -070098 }
Andreas Huber84f89de2016-07-28 15:39:51 -070099
100 return out;
101}
102
Andreas Huberda51b8e2016-07-28 16:00:57 -0700103void FQName::print() const {
104 if (!mValid) {
105 LOG(INFO) << "INVALID";
106 return;
107 }
108
109 LOG(INFO) << debugString();
110}
111
Andreas Huber84f89de2016-07-28 15:39:51 -0700112} // namespace android
113