summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2006-09-19 10:19:04 +0000
committerBenoit Foucher <benoit@zeroc.com>2006-09-19 10:19:04 +0000
commitb2baf486cde6c1765e0e24fdf46b8fcaa8da18f5 (patch)
tree4669d447fafcacab589fa60f01adefa4aef2a85e /cpp
parentAdded test for IceGrid/Query object (diff)
downloadice-b2baf486cde6c1765e0e24fdf46b8fcaa8da18f5.tar.bz2
ice-b2baf486cde6c1765e0e24fdf46b8fcaa8da18f5.tar.xz
ice-b2baf486cde6c1765e0e24fdf46b8fcaa8da18f5.zip
Fixes to prevent definition of duplicate parameters in templates
Diffstat (limited to 'cpp')
-rw-r--r--cpp/src/IceGrid/DescriptorBuilder.cpp6
-rw-r--r--cpp/src/IceGrid/DescriptorHelper.cpp27
-rw-r--r--cpp/test/IceGrid/deployer/AllTests.cpp34
3 files changed, 63 insertions, 4 deletions
diff --git a/cpp/src/IceGrid/DescriptorBuilder.cpp b/cpp/src/IceGrid/DescriptorBuilder.cpp
index 44be7f678ef..c10abbe9acb 100644
--- a/cpp/src/IceGrid/DescriptorBuilder.cpp
+++ b/cpp/src/IceGrid/DescriptorBuilder.cpp
@@ -495,6 +495,12 @@ TemplateDescriptorBuilder::TemplateDescriptorBuilder(ApplicationDescriptorBuilde
void
TemplateDescriptorBuilder::addParameter(const XmlAttributesHelper& attrs)
{
+ if(find(_descriptor.parameters.begin(), _descriptor.parameters.end(), attrs("name")) !=
+ _descriptor.parameters.end())
+ {
+ throw "duplicate parameter `" + attrs("name") + "'";
+ }
+
_descriptor.parameters.push_back(attrs("name"));
if(attrs.contains("default"))
{
diff --git a/cpp/src/IceGrid/DescriptorHelper.cpp b/cpp/src/IceGrid/DescriptorHelper.cpp
index 031d9b15a71..e897cd56d74 100644
--- a/cpp/src/IceGrid/DescriptorHelper.cpp
+++ b/cpp/src/IceGrid/DescriptorHelper.cpp
@@ -302,7 +302,19 @@ Resolver::Resolver(const ApplicationDescriptor& app, const Ice::CommunicatorPtr&
}
if(!t->second.descriptor)
{
- exception("invalid server template: server definition is empty");
+ exception("invalid server template `" + t->first + "': server definition is empty");
+ }
+
+ Ice::StringSeq params = t->second.parameters;
+ sort(params.begin(), params.end());
+ Ice::StringSeq wdups = params;
+ Ice::StringSeq dups;
+ set_difference(wdups.begin(), wdups.end(), params.begin(), unique(params.begin(), params.end()),
+ back_inserter(dups));
+ if(!dups.empty())
+ {
+ dups.erase(unique(dups.begin(), dups.end()), dups.end());
+ exception("invalid server template `" + t->first + "': duplicate parameters " + toString(dups));
}
}
for(t = _application->serviceTemplates.begin(); t != _application->serviceTemplates.end(); ++t)
@@ -313,7 +325,18 @@ Resolver::Resolver(const ApplicationDescriptor& app, const Ice::CommunicatorPtr&
}
if(!t->second.descriptor)
{
- exception("invalid service template: service definition is empty");
+ exception("invalid service template `" + t->first + "': service definition is empty");
+ }
+ Ice::StringSeq params = t->second.parameters;
+ sort(params.begin(), params.end());
+ Ice::StringSeq wdups = params;
+ Ice::StringSeq dups;
+ set_difference(wdups.begin(), wdups.end(), params.begin(), unique(params.begin(), params.end()),
+ back_inserter(dups));
+ if(!dups.empty())
+ {
+ dups.erase(unique(dups.begin(), dups.end()), dups.end());
+ exception("invalid server template `" + t->first + "': duplicate parameters " + toString(dups));
}
}
}
diff --git a/cpp/test/IceGrid/deployer/AllTests.cpp b/cpp/test/IceGrid/deployer/AllTests.cpp
index a33d10487fa..bbefc798469 100644
--- a/cpp/test/IceGrid/deployer/AllTests.cpp
+++ b/cpp/test/IceGrid/deployer/AllTests.cpp
@@ -92,8 +92,7 @@ typedef IceUtil::Handle<SessionKeepAliveThread> SessionKeepAliveThreadPtr;
void
allTests(const Ice::CommunicatorPtr& comm)
{
- RegistryPrx registry = IceGrid::RegistryPrx::checkedCast(
- comm->stringToProxy("IceGrid/Registry"));
+ RegistryPrx registry = IceGrid::RegistryPrx::checkedCast(comm->stringToProxy("IceGrid/Registry"));
test(registry);
AdminSessionPrx session = registry->createAdminSession("foo", "bar");
@@ -349,6 +348,37 @@ allTests(const Ice::CommunicatorPtr& comm)
cout << "ok" << endl;
+ cout << "testing validation... " << flush;
+ TemplateDescriptor templ;
+ templ.parameters.push_back("name");
+ templ.parameters.push_back("nam3");
+ templ.parameters.push_back("nam2");
+ templ.parameters.push_back("nam3");
+ templ.descriptor = new ServerDescriptor();
+ ServerDescriptorPtr server = ServerDescriptorPtr::dynamicCast(templ.descriptor);
+ server->id = "test";
+ server->exe = "${test.dir}/server";
+ ApplicationDescriptor desc;
+ desc.name = "App";
+ desc.serverTemplates["ServerTemplate"] = templ;
+ try
+ {
+ session->startUpdate();
+ admin->addApplication(desc);
+ session->finishUpdate();
+ test(false);
+ }
+ catch(const DeploymentException& ex)
+ {
+ test(ex.reason.find("duplicate parameters") != string::npos);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ cerr << ex << endl;
+ test(false);
+ }
+ cout << "ok" << endl;
+
keepAlive->destroy();
keepAlive->getThreadControl().join();
keepAlive = 0;