What is BeanXML?
BeanXML is a type of XML used by Anchor to define experiments, configuration and many aspects of behaviour. It is flexible and extensible, and can easily be used with new types of plugins and other objects, as they are developed and added to Anchor.
Structure of BeanXML
Some rules apply:
- BeanXML is sub-divided into units called AnchorBeans, each described by an XML element.
- It always has the following structure
<bean>element describes the top-level AnchorBean.
- Each AnchorBean has a necessary attribute
config-class='xxxxx'where xxxxx is the fully-qualified name of a Java class. This class accepts particular properties (nested and non-nested).
Types of properties
Two types of properties can be specified in a bean:
- Non-nested property - primitives (integer, double, boolean etc. - and String) can be defined as an XML element’s attribute.
- Nested property - defined as an element inside the definition of the containing element.
It follows that any bean in 2. must also be an AnchorBean. A tree forms of nested-beans who exist as properties of each other.
What properties are available?
Sources of documentation
To understand the available properties in a bean:
- Documentation in the user-guide.
- Any examples in guides or in existing BeanXML.
- The Java source-code for a Bean for the respective
Choice of beans
Two situations are common:
- Only one specific AnchorBean can exist in a particular property.
- A choice exists of possible AnchorBeans in a particular property - so long the bean inherits from a particular base bean.
By inheritance, we refer to a concept from object-oriented programming, where a subclass is as an expanded version of a parent class. The subclass includes all properties from the parent, and adds some more.
Some special beans exist via custom-factories to perform common useful tasks. In these cases, in addition to the usual
config-factory must also be specified in the XML element.
|Factory Name||Registered config-factory||Purpose|
||list||for creating a List of items (itself not a bean!)|
||stringSet||for creating sets of strings (itself not a bean!)|
||include||defines a bean in an external file|
||replaceProperty||defines a bean in an external file|
Lists of beans
<list config-class="java.util.List" config-factory="list"> <item config-class="org.anchoranalysis.bean.shared.regex.RegExSimple" matchString="*_red.tif$"/> <item config-class="org.anchoranalysis.bean.shared.regex.RegExSimple" matchString="*_blue.tif$"/> </list>
<datasets config-class="org.anchoranalysis.bean.StringSet" config-factory="stringSet"> <item>jan30</item> <item>feb05</item> <item>feb16</item> </datasets>
Include (another BeanXML file)
config-class should be identical to the Bean which is being included.
<input filePath="inputManager.xml" config-class="org.anchoranalysis.io.bean.input.InputManager" config-factory="include"/>
Replace (a property with an alternative value)
config-class should be identical to the Bean whose property is being replaced.
<!-- Changes the end attribute (non-nested-property) --> <bean config-class="org.anchoranalysis.bean.shared.SequenceInteger" key="end" replacement="10" config-factory="replaceProperty"> <item config-class="org.anchoranalysis.bean.shared.SequenceInteger" start="1" end="5"/> </bean>
<!-- Replaces the 'calculateLevel' bean nested-property on a thresholder --> <bean config-class="org.anchoranalysis.image.bean.threshold.ThresholderGlobal" key="calculateLevel" config-factory="replaceProperty"> <item config-class="org.anchoranalysis.image.bean.threshold.ThresholderGlobal"> <calculateLevel config-class="org.anchoranalysis.image.bean.threshold.calculatelevel.Otsu" /> </item> <replacement level="20" config-class="org.anchoranalysis.image.bean.threshold.calculatelevel.Constant" /> </bean>
More detailed technical knowledge of BeanXML can be found in the developer documentation.