Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

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
languagexml
<plugin:Parent numerator="22" denominator="7" name="pi"/>

...

Code Block
languagejava
titleBroken parsing
	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
languagexml
<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
languagejava
	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
languagejava
titleA Factory Bean
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;
	}
}

 

 

...