Commit 3cd4c9d2 authored by Jelte Jansen's avatar Jelte Jansen

ModuleSpec initializer not takes ElementPtr instead of file name,

for creation from file name or ifstream there are the non-member moduleSpecFromFile functions now



git-svn-id: svn://bind10.isc.org/svn/bind10/branches/jelte-configuration@870 e5f2f494-b856-4b98-b285-d166d9295462
parent b5eff6e5
......@@ -48,6 +48,7 @@ using isc::data::ElementPtr;
using isc::data::ModuleSpec;
using isc::data::ParseError;
using isc::data::ModuleSpecError;
using namespace isc::data;
void
ModuleCCSession::read_module_specification(const std::string& filename) {
......@@ -61,7 +62,7 @@ ModuleCCSession::read_module_specification(const std::string& filename) {
}
try {
module_specification_ = ModuleSpec(file, true);
module_specification_ = moduleSpecFromFile(file, true);
} catch (ParseError pe) {
cout << "Error parsing module specification file: " << pe.what() << endl;
exit(1);
......
......@@ -24,7 +24,8 @@
// todo: add more context to thrown ModuleSpecErrors?
using namespace isc::data;
namespace isc {
namespace data {
//
// static functions
......@@ -170,29 +171,12 @@ check_module_specification(const ElementPtr& def)
// Public functions
//
ModuleSpec::ModuleSpec(const std::string& file_name,
ModuleSpec::ModuleSpec(ElementPtr module_spec_element,
const bool check)
throw(ParseError, ModuleSpecError) {
std::ifstream file;
file.open(file_name.c_str());
if (!file) {
std::stringstream errs;
errs << "Error opening " << file_name << ": " << strerror(errno);
throw ModuleSpecError(errs.str());
}
throw(ModuleSpecError)
module_specification = Element::createFromString(file, file_name);
if (check) {
check_module_specification(module_specification);
}
}
ModuleSpec::ModuleSpec(std::istream& in, const bool check)
throw(ParseError, ModuleSpecError) {
module_specification = Element::createFromString(in);
// make sure the whole structure is complete and valid
{
module_specification = module_spec_element;
if (check) {
check_module_specification(module_specification);
}
......@@ -231,6 +215,30 @@ ModuleSpec::validate(const ElementPtr data)
return validate_spec_list(spec, data);
}
ModuleSpec
moduleSpecFromFile(const std::string& file_name, const bool check)
throw(ParseError, ModuleSpecError)
{
std::ifstream file;
file.open(file_name.c_str());
if (!file) {
std::stringstream errs;
errs << "Error opening " << file_name << ": " << strerror(errno);
throw ModuleSpecError(errs.str());
}
ElementPtr module_spec_element = Element::createFromString(file, file_name);
return ModuleSpec(module_spec_element, check);
}
ModuleSpec
moduleSpecFromFile(std::ifstream& in, const bool check)
throw(ParseError, ModuleSpecError) {
ElementPtr module_spec_element = Element::createFromString(in);
return ModuleSpec(module_spec_element, check);
}
//
// private functions
......@@ -332,3 +340,5 @@ ModuleSpec::validate_spec_list(const ElementPtr spec, const ElementPtr data) {
return true;
}
}
}
......@@ -53,29 +53,8 @@ namespace isc { namespace data {
/// Create a \c ModuleSpec instance with the given data as
/// the specification
/// \param e The Element containing the data specification
explicit ModuleSpec(ElementPtr e) : module_specification(e) {};
/// Creates a \c ModuleSpec instance from the contents
/// of the file given by file_name.
/// If check is true, and the module specification is not of
/// the correct form, a ModuleSpecError is thrown. If the file
/// could not be parse, a ParseError is thrown.
/// \param file_name The file to be opened and parsed
/// \param check If true, the module specification in the file
/// is checked to be of the correct form
ModuleSpec(const std::string& file_name, const bool check = true)
throw(ParseError, ModuleSpecError);
/// Creates a \c ModuleSpec instance from the given input
/// stream that contains the contents of a .spec file.
/// If check is true, and the module specification is not of
/// the correct form, a ModuleSpecError is thrown. If the
/// file could not be parsed, a ParseError is thrown.
/// \param in The std::istream containing the .spec file data
/// \param check If true, the module specification is checked
/// to be of the correct form
explicit ModuleSpec(std::istream& in, const bool check = true)
throw(ParseError, ModuleSpecError);
explicit ModuleSpec(ElementPtr e, const bool check = true)
throw(ModuleSpecError);
/// Returns the commands part of the specification as an
/// ElementPtr, returns an empty ElementPtr if there is none
......@@ -112,6 +91,29 @@ namespace isc { namespace data {
ElementPtr module_specification;
};
/// Creates a \c ModuleSpec instance from the contents
/// of the file given by file_name.
/// If check is true, and the module specification is not of
/// the correct form, a ModuleSpecError is thrown. If the file
/// could not be parse, a ParseError is thrown.
/// \param file_name The file to be opened and parsed
/// \param check If true, the module specification in the file
/// is checked to be of the correct form
ModuleSpec
moduleSpecFromFile(const std::string& file_name, const bool check = true)
throw(ParseError, ModuleSpecError);
/// Creates a \c ModuleSpec instance from the given input
/// stream that contains the contents of a .spec file.
/// If check is true, and the module specification is not of
/// the correct form, a ModuleSpecError is thrown. If the
/// file could not be parsed, a ParseError is thrown.
/// \param in The std::istream containing the .spec file data
/// \param check If true, the module specification is checked
/// to be of the correct form
ModuleSpec
moduleSpecFromFile(std::ifstream& in, const bool check = true)
throw(ParseError, ModuleSpecError);
} }
#endif // _DATA_DEF_H
......@@ -34,9 +34,9 @@ data_def_error(const std::string& file,
const std::string& error2 = "",
const std::string& error3 = "")
{
EXPECT_THROW(ModuleSpec(specfile(file)), ModuleSpecError);
EXPECT_THROW(moduleSpecFromFile(specfile(file)), ModuleSpecError);
try {
ModuleSpec dd = ModuleSpec(specfile(file));
ModuleSpec dd = moduleSpecFromFile(specfile(file));
} catch (ModuleSpecError dde) {
std::string ddew = dde.what();
EXPECT_EQ(error1 + error2 + error3, ddew);
......@@ -46,11 +46,11 @@ data_def_error(const std::string& file,
TEST(ModuleSpec, ReadingSpecfiles) {
// Tests whether we can open specfiles and if we get the
// right parse errors
ModuleSpec dd = ModuleSpec(specfile("spec1.spec"));
ModuleSpec dd = moduleSpecFromFile(specfile("spec1.spec"));
EXPECT_EQ(dd.getFullSpec()->get("module_spec")
->get("module_name")
->stringValue(), "Spec1");
dd = ModuleSpec(specfile("spec2.spec"));
dd = moduleSpecFromFile(specfile("spec2.spec"));
EXPECT_EQ(dd.getFullSpec()->get("module_spec")
->get("config_data")->size(), 6);
data_def_error("doesnotexist",
......@@ -60,7 +60,7 @@ TEST(ModuleSpec, ReadingSpecfiles) {
std::ifstream file;
file.open(specfile("spec1.spec").c_str());
dd = ModuleSpec(file);
dd = moduleSpecFromFile(file);
EXPECT_EQ(dd.getFullSpec()->get("module_spec")
->get("module_name")
->stringValue(), "Spec1");
......@@ -132,7 +132,7 @@ data_test(ModuleSpec dd, const std::string& data_file_name)
}
TEST(ModuleSpec, DataValidation) {
ModuleSpec dd = ModuleSpec(specfile("spec22.spec"));
ModuleSpec dd = moduleSpecFromFile(specfile("spec22.spec"));
EXPECT_TRUE(data_test(dd, "data22_1.data"));
EXPECT_FALSE(data_test(dd, "data22_2.data"));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment