Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 743f25a

Browse filesBrowse files
jmikolafabpot
authored andcommitted
[DependencyInjection] Create explicit factoryClass property for Definitions
Previously, the Definition class was used both for type inference and factory construction (if factoryService was absent). This is fine for cases where classes create instances of themselves (e.g. getInstance() or create()), but leads to ambiguity when we have a separate factory class.
1 parent 575b75a commit 743f25a
Copy full SHA for 743f25a

File tree

Expand file treeCollapse file tree

19 files changed

+164
-29
lines changed
Filter options
Expand file treeCollapse file tree

19 files changed

+164
-29
lines changed

‎src/Symfony/Bundle/DoctrineBundle/DependencyInjection/DoctrineExtension.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/DoctrineBundle/DependencyInjection/DoctrineExtension.php
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,7 @@ protected function loadOrmEntityManager(array $entityManager, ContainerBuilder $
408408
new Reference(sprintf('doctrine.orm.%s_configuration', $entityManager['name']))
409409
);
410410
$ormEmDef = new Definition('%doctrine.orm.entity_manager_class%', $ormEmArgs);
411+
$ormEmDef->setFactoryClass('%doctrine.orm.entity_manager_class%');
411412
$ormEmDef->setFactoryMethod('create');
412413
$ormEmDef->addTag('doctrine.orm.entity_manager');
413414
$container->setDefinition($entityManagerService, $ormEmDef);

‎src/Symfony/Bundle/DoctrineBundle/Tests/DependencyInjection/AbstractDoctrineExtensionTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/DoctrineBundle/Tests/DependencyInjection/AbstractDoctrineExtensionTest.php
+6Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ public function testDependencyInjectionConfigurationDefaults()
157157

158158
$definition = $container->getDefinition('doctrine.orm.default_entity_manager');
159159
$this->assertEquals('%doctrine.orm.entity_manager_class%', $definition->getClass());
160+
$this->assertEquals('%doctrine.orm.entity_manager_class%', $definition->getFactoryClass());
160161
$this->assertEquals('create', $definition->getFactoryMethod());
161162
$this->assertArrayHasKey('doctrine.orm.entity_manager', $definition->getTags());
162163

@@ -198,6 +199,7 @@ public function testSingleEntityManagerConfiguration()
198199

199200
$definition = $container->getDefinition('doctrine.orm.default_entity_manager');
200201
$this->assertEquals('%doctrine.orm.entity_manager_class%', $definition->getClass());
202+
$this->assertEquals('%doctrine.orm.entity_manager_class%', $definition->getFactoryClass());
201203
$this->assertEquals('create', $definition->getFactoryMethod());
202204
$this->assertArrayHasKey('doctrine.orm.entity_manager', $definition->getTags());
203205

@@ -239,6 +241,7 @@ public function testLoadSimpleSingleConnection()
239241

240242
$definition = $container->getDefinition('doctrine.orm.default_entity_manager');
241243
$this->assertEquals('%doctrine.orm.entity_manager_class%', $definition->getClass());
244+
$this->assertEquals('%doctrine.orm.entity_manager_class%', $definition->getFactoryClass());
242245
$this->assertEquals('create', $definition->getFactoryMethod());
243246
$this->assertArrayHasKey('doctrine.orm.entity_manager', $definition->getTags());
244247

@@ -279,6 +282,7 @@ public function testLoadSingleConnection()
279282

280283
$definition = $container->getDefinition('doctrine.orm.default_entity_manager');
281284
$this->assertEquals('%doctrine.orm.entity_manager_class%', $definition->getClass());
285+
$this->assertEquals('%doctrine.orm.entity_manager_class%', $definition->getFactoryClass());
282286
$this->assertEquals('create', $definition->getFactoryMethod());
283287
$this->assertArrayHasKey('doctrine.orm.entity_manager', $definition->getTags());
284288

@@ -313,6 +317,7 @@ public function testLoadMultipleConnections()
313317

314318
$definition = $container->getDefinition('doctrine.orm.dm1_entity_manager');
315319
$this->assertEquals('%doctrine.orm.entity_manager_class%', $definition->getClass());
320+
$this->assertEquals('%doctrine.orm.entity_manager_class%', $definition->getFactoryClass());
316321
$this->assertEquals('create', $definition->getFactoryMethod());
317322
$this->assertArrayHasKey('doctrine.orm.entity_manager', $definition->getTags());
318323

@@ -334,6 +339,7 @@ public function testLoadMultipleConnections()
334339

335340
$definition = $container->getDefinition('doctrine.orm.dm2_entity_manager');
336341
$this->assertEquals('%doctrine.orm.entity_manager_class%', $definition->getClass());
342+
$this->assertEquals('%doctrine.orm.entity_manager_class%', $definition->getFactoryClass());
337343
$this->assertEquals('create', $definition->getFactoryMethod());
338344
$this->assertArrayHasKey('doctrine.orm.entity_manager', $definition->getTags());
339345

‎src/Symfony/Bundle/DoctrineMongoDBBundle/DependencyInjection/DoctrineMongoDBExtension.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/DoctrineMongoDBBundle/DependencyInjection/DoctrineMongoDBExtension.php
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ protected function loadDocumentManager(array $documentManager, ContainerBuilder
165165
new Reference($eventManagerId),
166166
);
167167
$odmDmDef = new Definition('%doctrine.odm.mongodb.document_manager_class%', $odmDmArgs);
168+
$odmDmDef->setFactoryClass('%doctrine.odm.mongodb.document_manager_class%');
168169
$odmDmDef->setFactoryMethod('create');
169170
$odmDmDef->addTag('doctrine.odm.mongodb.document_manager');
170171
$container->setDefinition(sprintf('doctrine.odm.mongodb.%s_document_manager', $documentManager['name']), $odmDmDef);

‎src/Symfony/Bundle/DoctrineMongoDBBundle/Tests/DependencyInjection/AbstractMongoDBExtensionTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/DoctrineMongoDBBundle/Tests/DependencyInjection/AbstractMongoDBExtensionTest.php
+6Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public function testDependencyInjectionConfigurationDefaults()
6565

6666
$definition = $container->getDefinition('doctrine.odm.mongodb.default_document_manager');
6767
$this->assertEquals('%doctrine.odm.mongodb.document_manager_class%', $definition->getClass());
68+
$this->assertEquals('%doctrine.odm.mongodb.document_manager_class%', $definition->getFactoryClass());
6869
$this->assertEquals('create', $definition->getFactoryMethod());
6970
$this->assertArrayHasKey('doctrine.odm.mongodb.document_manager', $definition->getTags());
7071

@@ -92,6 +93,7 @@ public function testSingleDocumentManagerConfiguration()
9293

9394
$definition = $container->getDefinition('doctrine.odm.mongodb.default_document_manager');
9495
$this->assertEquals('%doctrine.odm.mongodb.document_manager_class%', $definition->getClass());
96+
$this->assertEquals('%doctrine.odm.mongodb.document_manager_class%', $definition->getFactoryClass());
9597
$this->assertEquals('create', $definition->getFactoryMethod());
9698
$this->assertArrayHasKey('doctrine.odm.mongodb.document_manager', $definition->getTags());
9799

@@ -126,6 +128,7 @@ public function testLoadSimpleSingleConnection()
126128

127129
$definition = $container->getDefinition('doctrine.odm.mongodb.default_document_manager');
128130
$this->assertEquals('%doctrine.odm.mongodb.document_manager_class%', $definition->getClass());
131+
$this->assertEquals('%doctrine.odm.mongodb.document_manager_class%', $definition->getFactoryClass());
129132
$this->assertEquals('create', $definition->getFactoryMethod());
130133
$this->assertArrayHasKey('doctrine.odm.mongodb.document_manager', $definition->getTags());
131134

@@ -154,6 +157,7 @@ public function testLoadSingleConnection()
154157

155158
$definition = $container->getDefinition('doctrine.odm.mongodb.default_document_manager');
156159
$this->assertEquals('%doctrine.odm.mongodb.document_manager_class%', $definition->getClass());
160+
$this->assertEquals('%doctrine.odm.mongodb.document_manager_class%', $definition->getFactoryClass());
157161
$this->assertEquals('create', $definition->getFactoryMethod());
158162
$this->assertArrayHasKey('doctrine.odm.mongodb.document_manager', $definition->getTags());
159163

@@ -184,6 +188,7 @@ public function testLoadMultipleConnections()
184188

185189
$definition = $container->getDefinition('doctrine.odm.mongodb.dm1_document_manager');
186190
$this->assertEquals('%doctrine.odm.mongodb.document_manager_class%', $definition->getClass());
191+
$this->assertEquals('%doctrine.odm.mongodb.document_manager_class%', $definition->getFactoryClass());
187192
$this->assertEquals('create', $definition->getFactoryMethod());
188193
$this->assertArrayHasKey('doctrine.odm.mongodb.document_manager', $definition->getTags());
189194

@@ -199,6 +204,7 @@ public function testLoadMultipleConnections()
199204

200205
$definition = $container->getDefinition('doctrine.odm.mongodb.dm2_document_manager');
201206
$this->assertEquals('%doctrine.odm.mongodb.document_manager_class%', $definition->getClass());
207+
$this->assertEquals('%doctrine.odm.mongodb.document_manager_class%', $definition->getFactoryClass());
202208
$this->assertEquals('create', $definition->getFactoryMethod());
203209
$this->assertArrayHasKey('doctrine.odm.mongodb.document_manager', $definition->getTags());
204210

‎src/Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public function process(ContainerBuilder $container)
4141

4242
// non-synthetic, non-abstract service has class
4343
if (!$definition->isAbstract() && !$definition->isSynthetic() && !$definition->getClass()) {
44-
if ($definition->getFactoryService()) {
44+
if ($definition->getFactoryClass() || $definition->getFactoryService()) {
4545
throw new \RuntimeException(sprintf(
4646
'Please add the class to service "%s" even if it is constructed '
4747
.'by a factory since we might need to add method calls based on '

‎src/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php
+5-1Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,9 @@ protected function resolveDefinition($id, DefinitionDecorator $definition)
4949
$def->setClass($parentDef->getClass());
5050
$def->setArguments($parentDef->getArguments());
5151
$def->setMethodCalls($parentDef->getMethodCalls());
52-
$def->setFactoryService($parentDef->getFactoryService());
52+
$def->setFactoryClass($parentDef->getFactoryClass());
5353
$def->setFactoryMethod($parentDef->getFactoryMethod());
54+
$def->setFactoryService($parentDef->getFactoryService());
5455
$def->setConfigurator($parentDef->getConfigurator());
5556
$def->setFile($parentDef->getFile());
5657
$def->setPublic($parentDef->isPublic());
@@ -60,6 +61,9 @@ protected function resolveDefinition($id, DefinitionDecorator $definition)
6061
if (isset($changes['class'])) {
6162
$def->setClass($definition->getClass());
6263
}
64+
if (isset($changes['factory_class'])) {
65+
$def->setFactoryClass($definition->getFactoryClass());
66+
}
6367
if (isset($changes['factory_method'])) {
6468
$def->setFactoryMethod($definition->getFactoryMethod());
6569
}

‎src/Symfony/Component/DependencyInjection/Compiler/ResolveInterfaceInjectorsPass.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Compiler/ResolveInterfaceInjectorsPass.php
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public function process(ContainerBuilder $container)
3232

3333
$loaded = false;
3434
foreach ($container->getInterfaceInjectors() as $injector) {
35-
if (null !== $definition->getFactoryService()) {
35+
if (null !== $definition->getFactoryClass() || null !== $definition->getFactoryService()) {
3636
continue;
3737
}
3838

‎src/Symfony/Component/DependencyInjection/ContainerBuilder.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/ContainerBuilder.php
+4-2Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -695,10 +695,12 @@ protected function createService(Definition $definition, $id)
695695
$arguments = $this->resolveServices($this->getParameterBag()->resolveValue($definition->getArguments()));
696696

697697
if (null !== $definition->getFactoryMethod()) {
698-
if (null !== $definition->getFactoryService()) {
698+
if (null !== $definition->getFactoryClass()) {
699+
$factory = $this->getParameterBag()->resolveValue($definition->getFactoryClass());
700+
} elseif (null !== $definition->getFactoryService()) {
699701
$factory = $this->get($this->getParameterBag()->resolveValue($definition->getFactoryService()));
700702
} else {
701-
$factory = $this->getParameterBag()->resolveValue($definition->getClass());
703+
throw new \RuntimeException('Cannot create service from factory method without a factory service or factory class.');
702704
}
703705

704706
$service = call_user_func_array(array($factory, $definition->getFactoryMethod()), $arguments);

‎src/Symfony/Component/DependencyInjection/Definition.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Definition.php
+30-4Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class Definition
2020
{
2121
protected $class;
2222
protected $file;
23+
protected $factoryClass;
2324
protected $factoryMethod;
2425
protected $factoryService;
2526
protected $scope;
@@ -49,16 +50,41 @@ public function __construct($class = null, array $arguments = array())
4950
$this->abstract = false;
5051
}
5152

53+
/**
54+
* Sets the name of the class that acts as a factory using the factory method,
55+
* which will be invoked statically.
56+
*
57+
* @param string $factoryClass The factory class name
58+
*
59+
* @return Definition The current instance
60+
*/
61+
public function setFactoryClass($factoryClass)
62+
{
63+
$this->factoryClass = $factoryClass;
64+
65+
return $this;
66+
}
67+
68+
/**
69+
* Gets the factory class.
70+
*
71+
* @return string The factory class name
72+
*/
73+
public function getFactoryClass()
74+
{
75+
return $this->factoryClass;
76+
}
77+
5278
/**
5379
* Sets the factory method able to create an instance of this class.
5480
*
55-
* @param string $method The method name
81+
* @param string $factoryMethod The factory method name
5682
*
5783
* @return Definition The current instance
5884
*/
59-
public function setFactoryMethod($method)
85+
public function setFactoryMethod($factoryMethod)
6086
{
61-
$this->factoryMethod = $method;
87+
$this->factoryMethod = $factoryMethod;
6288

6389
return $this;
6490
}
@@ -74,7 +100,7 @@ public function getFactoryMethod()
74100
}
75101

76102
/**
77-
* Sets the name of the service that acts as a factory using the constructor method.
103+
* Sets the name of the service that acts as a factory using the factory method.
78104
*
79105
* @param string $factoryService The factory service id
80106
*

‎src/Symfony/Component/DependencyInjection/DefinitionDecorator.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/DefinitionDecorator.php
+10-3Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ public function setClass($class)
3737
return parent::setClass($class);
3838
}
3939

40-
public function setFactoryService($service)
40+
public function setFactoryClass($class)
4141
{
42-
$this->changes['factory_service'] = true;
42+
$this->changes['factory_class'] = true;
4343

44-
return parent::setFactoryService($service);
44+
return parent::setFactoryClass($class);
4545
}
4646

4747
public function setFactoryMethod($method)
@@ -51,6 +51,13 @@ public function setFactoryMethod($method)
5151
return parent::setFactoryMethod($method);
5252
}
5353

54+
public function setFactoryService($service)
55+
{
56+
$this->changes['factory_service'] = true;
57+
58+
return parent::setFactoryService($service);
59+
}
60+
5461
public function setConfigurator($callable)
5562
{
5663
$this->changes['configurator'] = true;

‎src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php
+15-7Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -230,10 +230,12 @@ protected function addServiceInlinedDefinitions($id, $definition)
230230
}
231231

232232
if (null !== $sDefinition->getFactoryMethod()) {
233-
if (null !== $sDefinition->getFactoryService()) {
233+
if (null !== $sDefinition->getFactoryClass()) {
234+
$code .= sprintf(" \$%s = call_user_func(array(%s, '%s')%s);\n", $name, $this->dumpValue($sDefinition->getFactoryClass()), $sDefinition->getFactoryMethod(), count($arguments) > 0 ? ', '.implode(', ', $arguments) : '');
235+
} elseif (null !== $sDefinition->getFactoryService()) {
234236
$code .= sprintf(" \$%s = %s->%s(%s);\n", $name, $this->getServiceCall($sDefinition->getFactoryService()), $sDefinition->getFactoryMethod(), implode(', ', $arguments));
235237
} else {
236-
$code .= sprintf(" \$%s = call_user_func(array(%s, '%s')%s);\n", $name, $class, $sDefinition->getFactoryMethod(), count($arguments) > 0 ? ', '.implode(', ', $arguments) : '');
238+
throw new \RuntimeException('Factory service or factory class must be defined in service definition for '.$id);
237239
}
238240
} elseif (false !== strpos($class, '$')) {
239241
$code .= sprintf(" \$class = %s;\n \$%s = new \$class(%s);\n", $class, $name, implode(', ', $arguments));
@@ -294,10 +296,12 @@ protected function addServiceInstance($id, $definition)
294296
}
295297

296298
if (null !== $definition->getFactoryMethod()) {
297-
if (null !== $definition->getFactoryService()) {
299+
if (null !== $definition->getFactoryClass()) {
300+
$code = sprintf(" $return{$instantiation}call_user_func(array(%s, '%s')%s);\n", $this->dumpValue($definition->getFactoryClass()), $definition->getFactoryMethod(), $arguments ? ', '.implode(', ', $arguments) : '');
301+
} elseif (null !== $definition->getFactoryService()) {
298302
$code = sprintf(" $return{$instantiation}%s->%s(%s);\n", $this->getServiceCall($definition->getFactoryService()), $definition->getFactoryMethod(), implode(', ', $arguments));
299303
} else {
300-
$code = sprintf(" $return{$instantiation}call_user_func(array(%s, '%s')%s);\n", $class, $definition->getFactoryMethod(), $arguments ? ', '.implode(', ', $arguments) : '');
304+
throw new \RuntimeException('Factory method requires a factory service or factory class in service definition for '.$id);
301305
}
302306
} elseif (false !== strpos($class, '$')) {
303307
$code = sprintf(" \$class = %s;\n $return{$instantiation}new \$class(%s);\n", $class, implode(', ', $arguments));
@@ -404,8 +408,10 @@ protected function addService($id, $definition)
404408
$return = '';
405409
if ($definition->isSynthetic()) {
406410
$return = sprintf('@throws \RuntimeException always since this service is expected to be injected dynamically');
407-
} else if ($class = $definition->getClass()) {
411+
} elseif ($class = $definition->getClass()) {
408412
$return = sprintf("@return %s A %s instance.", 0 === strpos($class, '%') ? 'Object' : $class, $class);
413+
} elseif ($definition->getFactoryClass()) {
414+
$return = sprintf('@return Object An instance returned by %s::%s().', $definition->getFactoryClass(), $definition->getFactoryMethod());
409415
} elseif ($definition->getFactoryService()) {
410416
$return = sprintf('@return Object An instance returned by %s::%s().', $definition->getFactoryService(), $definition->getFactoryMethod());
411417
}
@@ -821,10 +827,12 @@ protected function dumpValue($value, $interpolate = true)
821827
}
822828

823829
if (null !== $value->getFactoryMethod()) {
824-
if (null !== $value->getFactoryService()) {
830+
if (null !== $value->getFactoryClass()) {
831+
return sprintf("call_user_func(array(%s, '%s')%s)", $this->dumpValue($value->getFactoryClass()), $value->getFactoryMethod(), count($arguments) > 0 ? ', '.implode(', ', $arguments) : '');
832+
} elseif (null !== $value->getFactoryService()) {
825833
return sprintf("%s->%s(%s)", $this->getServiceCall($value->getFactoryService()), $value->getFactoryMethod(), implode(', ', $arguments));
826834
} else {
827-
return sprintf("call_user_func(array(%s, '%s')%s)", $class, $value->getFactoryMethod(), count($arguments) > 0 ? ', '.implode(', ', $arguments) : '');
835+
throw new \RuntimeException('Cannot dump definitions which have factory method without factory service or factory class.');
828836
}
829837
}
830838

‎src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ protected function parseDefinition($id, $service, $file)
143143
$definition = new Definition();
144144
}
145145

146-
foreach (array('class', 'scope', 'public', 'factory-method', 'factory-service', 'synthetic', 'abstract') as $key) {
146+
foreach (array('class', 'scope', 'public', 'factory-class', 'factory-method', 'factory-service', 'synthetic', 'abstract') as $key) {
147147
if (isset($service[$key])) {
148148
$method = 'set'.str_replace('-', '', $key);
149149
$definition->$method((string) $service->getAttributeAsPhp($key));

‎src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php
+4Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,10 @@ protected function parseDefinition($id, $service, $file)
165165
$definition->setAbstract($service['abstract']);
166166
}
167167

168+
if (isset($service['factory_class'])) {
169+
$definition->setFactoryClass($service['factory_class']);
170+
}
171+
168172
if (isset($service['factory_method'])) {
169173
$definition->setFactoryMethod($service['factory_method']);
170174
}

‎src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@
105105
<xsd:attribute name="public" type="boolean" />
106106
<xsd:attribute name="synthetic" type="boolean" />
107107
<xsd:attribute name="abstract" type="boolean" />
108+
<xsd:attribute name="factory-class" type="xsd:string" />
108109
<xsd:attribute name="factory-method" type="xsd:string" />
109110
<xsd:attribute name="factory-service" type="xsd:string" />
110111
<xsd:attribute name="alias" type="xsd:string" />

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.