ProjectExplorer: Simplify DeployConfigurationFactory interface

Following the RunConfigurationFactory lead this replaces
f = Foo::find(); f->do() by static Foo::do() stanzas.

Also protect DeployConfigurationFactory::canCreate()

Change-Id: I80fa491f836c3b9186f6ce6dccac4d52d4b80fc8
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
hjk
2018-03-12 11:43:59 +01:00
parent 02dacc27eb
commit 805b28b8b7
4 changed files with 19 additions and 67 deletions

View File

@@ -217,33 +217,25 @@ DeployConfiguration *DeployConfigurationFactory::create(Target *parent, Core::Id
return dc;
}
bool DeployConfigurationFactory::canClone(Target *parent, DeployConfiguration *product) const
DeployConfiguration *DeployConfigurationFactory::clone(Target *parent,
const DeployConfiguration *source)
{
if (!canHandle(parent))
return false;
const Core::Id id = product->id();
if (!id.name().startsWith(m_deployConfigBaseId.name()))
return false;
return true;
}
DeployConfiguration *DeployConfigurationFactory::clone(Target *parent, DeployConfiguration *product)
{
QTC_ASSERT(m_creator, return nullptr);
if (!canClone(parent, product))
return nullptr;
DeployConfiguration *dc = m_creator(parent);
QVariantMap data = product->toMap();
dc->fromMap(data);
return dc;
return restore(parent, source->toMap());
}
DeployConfiguration *DeployConfigurationFactory::restore(Target *parent, const QVariantMap &map)
{
if (!canRestore(parent, map))
const Core::Id id = idFromMap(map);
DeployConfigurationFactory *factory = Utils::findOrDefault(g_deployConfigurationFactories,
[parent, id](DeployConfigurationFactory *f) {
if (!f->canHandle(parent))
return false;
return id.name().startsWith(f->m_deployConfigBaseId.name());
});
if (!factory)
return nullptr;
QTC_ASSERT(m_creator, return nullptr);
DeployConfiguration *dc = m_creator(parent);
QTC_ASSERT(factory->m_creator, return nullptr);
DeployConfiguration *dc = factory->m_creator(parent);
QTC_ASSERT(dc, return nullptr);
if (!dc->fromMap(map)) {
delete dc;
@@ -252,22 +244,6 @@ DeployConfiguration *DeployConfigurationFactory::restore(Target *parent, const Q
return dc;
}
bool DeployConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const
{
if (!canHandle(parent))
return false;
const Core::Id id = idFromMap(map);
return id.name().startsWith(m_deployConfigBaseId.name());
}
DeployConfigurationFactory *DeployConfigurationFactory::find(Target *parent, const QVariantMap &map)
{
return Utils::findOrDefault(g_deployConfigurationFactories,
[&parent, &map](DeployConfigurationFactory *factory) {
return factory->canRestore(parent, map);
});
}
QList<DeployConfigurationFactory *> DeployConfigurationFactory::find(Target *parent)
{
return Utils::filtered(g_deployConfigurationFactories,
@@ -276,14 +252,6 @@ QList<DeployConfigurationFactory *> DeployConfigurationFactory::find(Target *par
});
}
DeployConfigurationFactory *DeployConfigurationFactory::find(Target *parent, DeployConfiguration *dc)
{
return Utils::findOrDefault(g_deployConfigurationFactories,
[&parent, &dc](DeployConfigurationFactory *factory) {
return factory->canClone(parent, dc);
});
}
void DeployConfigurationFactory::setSupportedTargetDeviceTypes(const QList<Core::Id> &ids)
{
m_supportedTargetDeviceTypes = ids;

View File

@@ -85,25 +85,19 @@ public:
// used to translate the types to names to display to the user
QString displayNameForId(Core::Id id) const;
virtual bool canHandle(ProjectExplorer::Target *target) const;
bool canCreate(Target *parent, Core::Id id) const;
virtual DeployConfiguration *create(Target *parent, Core::Id id);
// used to recreate the runConfigurations when restoring settings
bool canRestore(Target *parent, const QVariantMap &map) const;
DeployConfiguration *restore(Target *parent, const QVariantMap &map);
bool canClone(Target *parent, DeployConfiguration *product) const;
DeployConfiguration *clone(Target *parent, DeployConfiguration *product);
static DeployConfigurationFactory *find(Target *parent, const QVariantMap &map);
static QList<DeployConfigurationFactory *> find(Target *parent);
static DeployConfigurationFactory *find(Target *parent, DeployConfiguration *dc);
static DeployConfiguration *restore(Target *parent, const QVariantMap &map);
static DeployConfiguration *clone(Target *parent, const DeployConfiguration *dc);
void setSupportedTargetDeviceTypes(const QList<Core::Id> &ids);
void setDefaultDisplayName(const QString &defaultDisplayName);
void setSupportedProjectType(Core::Id id);
protected:
virtual bool canHandle(ProjectExplorer::Target *target) const;
virtual QList<QString> availableBuildTargets(Target *parent) const;
virtual QString displayNameForBuildTarget(const QString &buildTarget) const;

View File

@@ -382,12 +382,7 @@ bool Project::copySteps(Target *sourceTarget, Target *newTarget)
}
foreach (DeployConfiguration *sourceDc, sourceTarget->deployConfigurations()) {
DeployConfigurationFactory *factory = DeployConfigurationFactory::find(newTarget, sourceDc);
if (!factory) {
deployconfigurationError << sourceDc->displayName();
continue;
}
DeployConfiguration *newDc = factory->clone(newTarget, sourceDc);
DeployConfiguration *newDc = DefaultDeployConfigurationFactory::clone(newTarget, sourceDc);
if (!newDc) {
deployconfigurationError << sourceDc->displayName();
continue;

View File

@@ -773,18 +773,13 @@ bool Target::fromMap(const QVariantMap &map)
if (!map.contains(key))
return false;
QVariantMap valueMap = map.value(key).toMap();
DeployConfigurationFactory *factory = DeployConfigurationFactory::find(this, valueMap);
if (!factory) {
DeployConfiguration *dc = DeployConfigurationFactory::restore(this, valueMap);
if (!dc) {
Core::Id id = idFromMap(valueMap);
qWarning("No factory found to restore deployment configuration of id '%s'!",
id.isValid() ? qPrintable(id.toString()) : "UNKNOWN");
continue;
}
DeployConfiguration *dc = factory->restore(this, valueMap);
if (!dc) {
qWarning("Factory '%s' failed to restore deployment configuration!", qPrintable(factory->objectName()));
continue;
}
QTC_CHECK(dc->id().withSuffix(dc->extraId()) == ProjectExplorer::idFromMap(valueMap));
addDeployConfiguration(dc);
if (i == activeConfiguration)