今回は、POCOのバリデーションを詳解します。
POCOで用意されているバリデーションはコマンドラインオプションの入力値のバリデーションで、intと正規表現の2種類のバリデーションが提供されています。
オプションは、エラーメッセージに使われているだけなので、HTMLフォームのバリデーションに使うこともできます。ただ、実際のアプリケーションでは、エラーメッセージ体系を独自に決めるでしょうから、POCOの実装を参考にして自作することになると思います。
簡単なバリデーションのサンプルコードは以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
#include "Poco/Util/RegExpValidator.h"
#include "Poco/Util/IntValidator.h"
#include "Poco/Util/Option.h"
#include "Poco/Util/OptionException.h"
#include "Poco/AutoPtr.h"
#include "Poco/Util/Application.h"
#include "Poco/Util/OptionSet.h"
#include "Poco/Util/HelpFormatter.h"
#include "Poco/Util/AbstractConfiguration.h"
#include <iostream>
using Poco::Util::Validator;
using Poco::Util::RegExpValidator;
using Poco::Util::IntValidator;
using Poco::Util::Option;
using Poco::Util::InvalidArgumentException;
using Poco::AutoPtr;
using Poco::Util::Application;
using Poco::Util::OptionSet;
using Poco::Util::HelpFormatter;
using Poco::Util::AbstractConfiguration;
using Poco::Util::OptionCallback;
class ValidatorSample: public Application
/// This sample demonstrates some of the features of the Poco::Util::Validator class.
{
public:
ValidatorSample(): _helpRequested(false)
{
}
protected:
void initialize(Application& self)
{
loadConfiguration(); // load default configuration files, if present
Application::initialize(self);
// add your own initialization code here
}
void uninitialize()
{
// add your own uninitialization code here
Application::uninitialize();
}
void reinitialize(Application& self)
{
Application::reinitialize(self);
// add your own reinitialization code here
}
void defineOptions(OptionSet& options)
{
Application::defineOptions(options);
options.addOption(
Option("help", "h", "display help information on command line arguments")
.required(false)
.repeatable(false)
.callback(OptionCallback<ValidatorSample>(this, &ValidatorSample::handleHelp)));
}
void handleHelp(const std::string& name, const std::string& value)
{
_helpRequested = true;
displayHelp();
stopOptionsProcessing();
}
void handleConfig(const std::string& name, const std::string& value)
{
loadConfiguration(value);
}
void displayHelp()
{
HelpFormatter helpFormatter(options());
helpFormatter.setCommand(commandName());
helpFormatter.setUsage("OPTIONS");
helpFormatter.setHeader("A PropertySample application that demonstrates how to use Poco::Util::PropertyFileConfiguration.");
helpFormatter.format(std::cout);
}
int main(const std::vector<std::string>& args)
{
if (!_helpRequested)
{
// 正規表現でバリデーションします。
Option strField("string field", "s");
AutoPtr<Validator> pRegVal(new RegExpValidator("[0-9]+"));
pRegVal->validate(strField, "0");
pRegVal->validate(strField, "12345");
try
{
pRegVal->validate(strField, "234asdf");
}
catch (InvalidArgumentException& exc)
{
std::cout << exc.message() << std::endl;
}
// 整数(最大値、最小値)でバリデーションします。
Option intField("integer field", "i");
AutoPtr<Validator> pIntVal(new IntValidator(0, 100));
pIntVal->validate(intField, "0");
pIntVal->validate(intField, "100");
pIntVal->validate(intField, "55");
try
{
pIntVal->validate(intField, "-1");
}
catch (InvalidArgumentException& exc)
{
std::cout << exc.message() << std::endl;
}
try
{
pIntVal->validate(intField, "101");
}
catch (InvalidArgumentException& exc)
{
std::cout << exc.message() << std::endl;
}
try
{
pIntVal->validate(intField, "asdf");
}
catch (InvalidArgumentException& exc)
{
std::cout << exc.message() << std::endl;
}
}
return Application::EXIT_OK;
}
private:
bool _helpRequested;
};
POCO_APP_MAIN(ValidatorSample) |