...
However it is important to understand when you must implement a implement a Factory Bean.
A Factory Bean is required if the plugin you have implemented takes a constructor which is not a String or an object which Spring can convert into from a String. The IdP String infrastructure has a reasonably wide set of functions to convert from Strings to other types:
...
And assume you want to program configure from an XML segment like this
Code Block | ||
---|---|---|
| ||
<plugin:Parent numerator="22" denominator="7" name="pi"/> |
...
Code Block | ||||
---|---|---|---|---|
| ||||
final String id = StringSupport.trimOrNull(child.getAttributeNS(null, "name")); builder.addPropertyValue("id", id); final String num = StringSupport.trimOrNull(child.getAttributeNS(null, "numerator")); final String denom = StringSupport.trimOrNull(child.getAttributeNS(null, "denominator")); final Rational rational = new Rational(); rational.setDenominator(Integer.decode(denom)); rational.setNumerator(Integer.decode(num)); builder.addPropertyValue("rational", rational); |
This will not work if the deployer wants to use property replacement
Code Block | ||
---|---|---|
| ||
<plugin:Parent numerator="%{idp.numerator}" denominator="7" name="pi"/> |
...
If the object being built inside the parser is a simple bean which can configured with Strings and auto converted types, then it can be created by a secondary builder. In the example above
Code Block | ||
---|---|---|
| ||
final BeanDefinitionBuilder rationalDefn = BeanDefinitionBuilder.genericBeanDefinition(Rational.class); rationalDefn.addPropertyValue("denominator", denom); rationalDefn.addPropertyValue("numerator", num); builder.addPropertyValue("rational", rationalDefn.getBeanDefinition()); |
...
In our example, the FactoryBean might look like this:
Code Block | ||||
---|---|---|---|---|
| ||||
public class ParentFactoryBean extends AbstractComponentAwareFactoryBean<Parent> { private int denominator; private int numerator; public void setDenominator(int what) { denominator = what; } public void setNumerator(int what) { numerator = what; } @Override public Class<?> getObjectType() { return Parent.class; } @Override protected Parent doCreateInstance() throws Exception { final Rational rational = new Rational(); rational.setNumerator(numerator); rational.setDenominator(denominator); Parent parent = new Parent(); parent.setRational(rational); return parent; } } |
...