25 #include "internal/berryCommandUtils.h" 33 const uint ParameterizedCommand::HASH_CODE_NOT_COMPUTED = 0;
34 const uint ParameterizedCommand::HASH_FACTOR = 89;
35 const uint ParameterizedCommand::HASH_INITIAL =
qHash(
"berry::ParameterizedCommand");
38 const QList<Parameterization>& params)
39 : command(command), hashCode(HASH_CODE_NOT_COMPUTED)
43 throw Poco::NullPointerException(
44 "A parameterized command cannot have a null command");
47 QList<IParameter::Pointer> parameters;
50 parameters = command->GetParameters();
51 }
catch (
const NotDefinedException* )
55 if (!params.empty() && !parameters.empty())
57 for (
int j = 0; j < parameters.size(); j++)
59 for (
int i = 0; i < params.size(); i++)
61 if (parameters[j] == params[i].GetParameter())
63 this->parameterizations.push_back(params[i]);
73 const bool thisDefined = this->command->IsDefined();
74 const bool otherDefined = command->command->IsDefined();
75 if (!thisDefined || !otherDefined)
77 return CommandUtils::Compare(thisDefined, otherDefined) < 0;
89 catch (
const NotDefinedException* )
91 throw CommandException(
92 "Concurrent modification of a command's defined state");
105 if (!(this->command == command->command))
110 return CommandUtils::Equals(this->parameterizations, command->parameterizations);
121 return command->ExecuteWithChecks(excEvent);
131 return command->GetId();
138 QTextStream nameBuffer(&name);
139 nameBuffer << command->GetName() <<
" (";
140 const unsigned int parameterizationCount = (
unsigned int) parameterizations.size();
141 for (
unsigned int i = 0; i < parameterizationCount; i++)
144 nameBuffer << parameterization.
GetParameter()->GetName() <<
": ";
149 catch (
const ParameterValuesException& )
158 if (i + 1 < parameterizationCount)
171 QHash<QString, QString> parameterMap;
172 for (
int i = 0; i < parameterizations.size(); i++)
175 parameterMap.insert(parameterization.
GetParameter()->GetId(),
183 if (hashCode == HASH_CODE_NOT_COMPUTED)
185 hashCode = HASH_INITIAL * HASH_FACTOR + (command ? command->HashCode() : 0);
186 hashCode = hashCode * HASH_FACTOR;
187 for (
int i = 0; i < parameterizations.size(); i++)
189 hashCode += parameterizations[i].HashCode();
192 if (hashCode == HASH_CODE_NOT_COMPUTED)
202 const QString escapedId(this->Escape(this->
GetId()));
204 if (parameterizations.empty())
210 QTextStream buffer(&str);
213 for (
int i = 0; i < parameterizations.size(); i++)
223 const QString parameterId(parameterization.
GetParameter()->GetId());
224 const QString escapedParameterId(this->Escape(parameterId));
226 buffer << escapedParameterId;
228 const QString parameterValue(parameterization.
GetValue());
229 if (!parameterValue.isEmpty())
231 const QString escapedParameterValue(this->Escape(parameterValue));
233 << escapedParameterValue;
245 QTextStream buffer(&str);
246 buffer <<
"ParameterizedCommand(" << command->ToString() <<
"," 247 << CommandUtils::ToString(parameterizations) <<
")";
251 QList<ParameterizedCommand::Pointer>
254 QList<IParameter::Pointer> parameters(command->GetParameters());
256 typedef QList<QList<Parameterization> > ExpandedParamsType;
257 const ExpandedParamsType expansion(ExpandParameters(0, parameters));
258 QList<ParameterizedCommand::Pointer> combinations;
260 for (ExpandedParamsType::const_iterator expansionItr = expansion.begin();
261 expansionItr != expansion.end(); ++expansionItr)
263 QList<Parameterization> combination(*expansionItr);
265 QList<Parameterization> parameterizations(combination);
268 combinations.push_back(pCmd);
275 const QHash<QString, Object::Pointer>& parameters)
278 if (parameters.empty())
286 QList<Parameterization> parms;
289 for (QHash<QString, Object::Pointer>::const_iterator i = parameters.begin();
290 i != parameters.end(); ++i)
292 QString key(i.key());
305 QString val = i.value()->ToString();
313 QString val(valueConverter->ConvertToString(i.value()));
318 QString val = i.value()->ToString();
329 catch (
const NotDefinedException* )
332 catch (
const ParameterValueConversionException* )
338 QString ParameterizedCommand::Escape(
const QString& rawText)
343 for (QString::const_iterator i = rawText.begin();
344 i != rawText.end(); ++i)
347 QString::value_type c = *i;
360 if (buffer.isEmpty())
367 QList<QList<Parameterization> > ParameterizedCommand::ExpandParameters(
368 unsigned int startIndex,
const QList<IParameter::Pointer>& parameters)
370 typedef QList<QList<Parameterization> > ReturnType;
372 const int nextIndex = startIndex + 1;
373 const bool noMoreParameters = (nextIndex >= parameters.size());
376 ReturnType parameterizations;
378 if (parameter->IsOptional())
380 parameterizations.push_back(QList<Parameterization>());
386 values = parameter->GetValues();
388 catch (
const ParameterValuesException& )
390 if (noMoreParameters)
392 return parameterizations;
396 return ExpandParameters(nextIndex, parameters);
400 for (IParameter::ParameterValues::const_iterator parameterValueItr =
401 parameterValues.begin(); parameterValueItr != parameterValues.end(); ++parameterValueItr)
403 QList<Parameterization> combination;
404 combination.push_back(
406 parameterizations.push_back(combination);
410 if (noMoreParameters)
413 return parameterizations;
417 ReturnType suffixes(ExpandParameters(nextIndex, parameters));
418 if (suffixes.empty())
421 return parameterizations;
424 ReturnType returnValue;
425 for (ReturnType::iterator suffixItr = suffixes.begin(); suffixItr
426 != suffixes.end(); ++suffixItr)
428 for (ReturnType::iterator combinationItr = parameterizations.begin(); combinationItr
429 != parameterizations.end(); ++combinationItr)
431 QList<Parameterization> newCombination(*combinationItr);
432 newCombination.append(*suffixItr);
433 returnValue.push_back(newCombination);
static const char PARAMETER_START_CHAR
SmartPointer< Command > GetCommand() const
Light weight base class for most BlueBerry classes.
static const char ESCAPE_CHAR
Implements transparent reference counting.
static ParameterizedCommand::Pointer GenerateCommand(const SmartPointer< Command > command, const QHash< QString, Object::Pointer > ¶meters)
Object::Pointer ExecuteWithChecks(const Object::ConstPointer &trigger, const Object::Pointer &applicationContext)
virtual QHash< QString, QString > GetParameterValues() const =0
berry::SmartPointer< Self > Pointer
QHash< QString, QString > GetParameterMap() const
SmartPointer< const IParameter > GetParameter() const
static const char PARAMETER_END_CHAR
QString ToString() const override
ParameterizedCommand(const SmartPointer< Command > &command, const QList< Parameterization > ¶meterizations)
static const char PARAMETER_SEPARATOR_CHAR
QString GetValueName() const
static const char ID_VALUE_CHAR
bool operator==(const Object *object) const override
uint HashCode() const override
static QList< ParameterizedCommand::Pointer > GenerateCombinations(const SmartPointer< Command > command)
bool operator<(const Object *object) const override
uint qHash(const berry::Object &o)