LSSTApplications  18.0.0+106,18.0.0+50,19.0.0,19.0.0+1,19.0.0+10,19.0.0+11,19.0.0+13,19.0.0+17,19.0.0+2,19.0.0-1-g20d9b18+6,19.0.0-1-g425ff20,19.0.0-1-g5549ca4,19.0.0-1-g580fafe+6,19.0.0-1-g6fe20d0+1,19.0.0-1-g7011481+9,19.0.0-1-g8c57eb9+6,19.0.0-1-gb5175dc+11,19.0.0-1-gdc0e4a7+9,19.0.0-1-ge272bc4+6,19.0.0-1-ge3aa853,19.0.0-10-g448f008b,19.0.0-12-g6990b2c,19.0.0-2-g0d9f9cd+11,19.0.0-2-g3d9e4fb2+11,19.0.0-2-g5037de4,19.0.0-2-gb96a1c4+3,19.0.0-2-gd955cfd+15,19.0.0-3-g2d13df8,19.0.0-3-g6f3c7dc,19.0.0-4-g725f80e+11,19.0.0-4-ga671dab3b+1,19.0.0-4-gad373c5+3,19.0.0-5-ga2acb9c+2,19.0.0-5-gfe96e6c+2,w.2020.01
LSSTDataManagementBasePackage
UrnPolicyFile.cc
Go to the documentation of this file.
1 /*
2  * LSST Data Management System
3  * Copyright 2008, 2009, 2010 LSST Corporation.
4  *
5  * This product includes software developed by the
6  * LSST Project (http://www.lsst.org/).
7  *
8  * This program is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the LSST License Statement and
19  * the GNU General Public License along with this program. If not,
20  * see <http://www.lsstcorp.org/LegalNotices/>.
21  */
22 
23 /*
24  * UrnPolicyFile
25  */
27 #include "lsst/pex/exceptions.h"
28 
29 #include <string>
30 #include <vector>
31 
32 namespace lsst {
33 namespace pex {
34 namespace policy {
35 
36 //@cond
37 
38 using namespace std;
39 
40 const string UrnPolicyFile::URN_PREFIX("urn:eupspkg:");
41 const string UrnPolicyFile::URN_PREFIX_ABBREV("@");
42 
51 string stripPrefixes(string urn, bool strict) {
52  // strip @'s
53  int numAts = 0;
54  while (urn.length() > 0 && urn.find(UrnPolicyFile::URN_PREFIX_ABBREV) == 0) {
56  ++numAts;
57  }
58 
59  // strip urn:eupspkg:
60  string lowered(urn);
61  transform(lowered.begin(), lowered.end(), lowered.begin(), ::tolower);
62  bool hasPrefix = (lowered.find(UrnPolicyFile::URN_PREFIX) == 0);
63  if (hasPrefix) urn = urn.substr(UrnPolicyFile::URN_PREFIX.length());
64 
65  // validate, if requested
66  if (strict && (numAts > 1 || !hasPrefix))
67  throw LSST_EXCEPT(BadNameError, ("URN must start with \"urn:eupspkg:\" or \"@urn:eupspkg:\""));
68 
69  return urn;
70 }
71 
82 void splitAndValidate(const string& urn, vector<string>& a, bool strict) {
83  // strip prefixes
84  string stripped = stripPrefixes(urn, strict);
85 
86  // split
87  while (true) {
88  size_t i = stripped.find(":");
89  if (i == string::npos) {
90  if (stripped.length() > 0) a.push_back(stripped);
91  break;
92  } else {
93  a.push_back(stripped.substr(0, i));
94  stripped = stripped.substr(i + 1);
95  }
96  }
97 
98  // validate
99  // - min size is 2 -- product:file
100  // - max size is 3 -- product:repos:file
101  if (a.size() < 2 || a.size() > 3)
102  throw LSST_EXCEPT(BadNameError, "Wrong number of terms in policy file urn \"" + urn + "\". " +
103  "The expected form is " +
104  "@urn:eupspkg:<product>:[<repository>:]<file> or " +
105  "@@<product>:[<repository>:]<file>. " +
106  "Is there a typo in the urn?");
107 }
108 
115 string UrnPolicyFile::productNameFromUrn(const string& urn, bool strictUrn) {
116  vector<string> split;
117  splitAndValidate(urn, split, strictUrn);
118  return split[0];
119 }
120 
127 string UrnPolicyFile::filePathFromUrn(const string& urn, bool strictUrn) {
128  vector<string> split;
129  splitAndValidate(urn, split, strictUrn);
130  return split.back();
131 }
132 
139 string UrnPolicyFile::reposFromUrn(const string& urn, bool strictUrn) {
140  vector<string> split;
141  splitAndValidate(urn, split, strictUrn);
142  if (split.size() == 3)
143  return split[1];
144  else
145  return "";
146 }
147 
155 bool UrnPolicyFile::looksLikeUrn(const string& s, bool strict) {
156  if (strict) {
157  string lc(s);
158  transform(lc.begin(), lc.end(), lc.begin(), ::tolower);
159  while (lc[0] == '@') lc = lc.substr(1);
160  if (lc.find(UrnPolicyFile::URN_PREFIX) != 0) return false;
161  }
162  const string& stripped = stripPrefixes(s, strict);
163  return s.length() != stripped.length() && s.find(":") != s.npos;
164 }
165 
166 //@endcond
167 
168 } // namespace policy
169 } // namespace pex
170 } // namespace lsst
static const std::string URN_PREFIX_ABBREV
The prefix that a Policy URN starts with.
static const std::string URN_PREFIX
The prefix that a Policy URN starts with.
table::Key< int > a
STL namespace.
static std::string productNameFromUrn(const std::string &urn, bool strictUrn=false)
Extract the product name from a URN.
static bool looksLikeUrn(const std::string &s, bool strict=false)
Does s look like a URN? That is, does it start with URN_PREFIX or URN_PREFIX_ABBREV?
T push_back(T... args)
A base class for image defects.
static std::string reposFromUrn(const std::string &urn, bool strictUrn=false)
Extract the repository name from a URN, or "" if none.
T find(T... args)
T length(T... args)
Definition: __init__.py:1
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition: Exception.h:48
STL class.
static std::string filePathFromUrn(const std::string &urn, bool strictUrn=false)
Extract the local file path from a URN.
T back(T... args)
T substr(T... args)
table::Key< int > transform
the definition of the UrnPolicyFile class