LSSTApplications  20.0.0
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
std::vector
STL class.
std::string::find
T find(T... args)
std::string::length
T length(T... args)
lsst::pex::policy::UrnPolicyFile::looksLikeUrn
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?
std::vector::back
T back(T... args)
pex
Definition: __init__.py:1
UrnPolicyFile.h
the definition of the UrnPolicyFile class
lsst::pex::policy::UrnPolicyFile::filePathFromUrn
static std::string filePathFromUrn(const std::string &urn, bool strictUrn=false)
Extract the local file path from a URN.
lsst::pex::policy::UrnPolicyFile::reposFromUrn
static std::string reposFromUrn(const std::string &urn, bool strictUrn=false)
Extract the repository name from a URN, or "" if none.
lsst
A base class for image defects.
Definition: imageAlgorithm.dox:1
LSST_EXCEPT
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition: Exception.h:48
std::string::substr
T substr(T... args)
lsst::pex::policy::UrnPolicyFile::URN_PREFIX
static const std::string URN_PREFIX
The prefix that a Policy URN starts with.
Definition: UrnPolicyFile.h:118
lsst::pex::policy::UrnPolicyFile::URN_PREFIX_ABBREV
static const std::string URN_PREFIX_ABBREV
Definition: UrnPolicyFile.h:119
a
table::Key< int > a
Definition: TransmissionCurve.cc:466
std
STL namespace.
transform
table::Key< int > transform
Definition: TransformMap.cc:299
lsst::pex::policy::UrnPolicyFile::productNameFromUrn
static std::string productNameFromUrn(const std::string &urn, bool strictUrn=false)
Extract the product name from a URN.
astshim.fitsChanContinued.length
def length(self)
Definition: fitsChanContinued.py:81
exceptions.h