The retrieval of a property value is started with a call to PropertyList.get(int propId), which calls PropertyList.get(propId, true, true).
PropertyList.get(int propId, boolean bTryInherit, boolean bTryDefault):
Find the maker for this property as FObj.propertyListTable[propId], variable propertyMaker
propertyMaker.get(int subpropId, PropertyList propertyList, boolean bTryInherit, boolean bTryDefault)
propertyMaker.findProperty(PropertyList propertyList, boolean bTryInherit)
if corresponding and corresponding is forced
evaluate condition: CorrespondingPropertyMaker.isCorrespondingForced (PropertyList propertyList)
return false if this is not a relative property (corresponding.relative)
return true if corresponding property was explicitly specified on this node or on its parent, depending on the type of property (corresponding.useParent)
corresponding.compute(PropertyList propertyList); this subroutine and the subroutines it calls refer to the corresponding property
propertyList.getExplicitOrShorthand(correspondingId); propertyList is that of this node or of the parent, depending on the type of property (corresponding.useParent)
propertyList.getExplicitBaseProp(int correspondingId) (see below)
if (null) propertyList.getShorthand(int correspondingId)
propertyMaker.getShorthand(this) (see below)
if (not null) convert property
else
propertyList.getExplicitBaseProp(int propId) from propertyList as a hash map; note that this requires a conversion from propId to propName via s_htPropNames; example: propertyList = "{master-name=simpleA4}"
if (null) propertyMaker.compute(PropertyList propertyList):
if (corresponding) corresponding.compute(PropertyList propertyList), as above
if (null) propertyMaker.getShorthand(PropertyList propertyList)
if (maker.shorthands) then for each shorthand
propertyList.getExplicit(int shorthand.propId); a shorthand must be ListProperty
if (not null) parse the shorthand property value, parser.getValueForProperty(propId, listprop, propertyMaker, this, propertyList); here propId is the propId of this property, not of the shorthand; a shorthand may contain values for several properties, and this method retrieves the value for the current property; if (not null) return it
Note: the first shorthand property maker in maker.shorthands that returns a good property is used
if (null && bTryInherit) propertyMaker.findProperty(parentPropertyList, true): the whole process is repeated on the parent, and possibly its parents, up to the root node.
if (null && bTryDefault) propertyMaker.make(PropertyList propertyList)
if there is a cached value, defaultProperty, return it
propertyMaker.make(PropertyList propertyList, String value, FObj fo); value is the default value stored in the property maker, fo is the parent FO
if default value is inherit, propertyList.getFromParent(propId)
if (parentPropertyList != null) parentPropertyList.get(propId); the whole process is repeated on the parent, and possibly its parents, up to the root node.
propertyMaker.make(PropertyList propertyList); this seems to create an endless recursion; parentPropertyList == null in the root node.
else check enumerated values propertyMaker.checkEnumValues(value): get the enumerated property from propertyMaker.enums
if (null)
propertyMaker.checkValueKeywords(String value); check if the value is a keyword in propertyMaker.keywords; if so, substitute the value with the value for which the keyword stands
parse the value p = PropertyParser.parse(pvalue, new PropertyInfo(propertyMaker, propertyList, fo))
convert the property propertyMaker.convertProperty(p, propertyList, fo)
if (null) throw org.apache.fop.fo.expr.PropertyException, which immediately is catched and rethrown as FOPException (why?)
catch FOPException; this means that this method may return a null property
catch FOPException; this means that this method may return a null property
The call stack at the findProperty and makecalls is:
[1] org.apache.fop.fo.properties.PropertyMaker.findProperty (PropertyMaker.java:240) [2] org.apache.fop.fo.properties.PropertyMaker.get (PropertyMaker.java:282) [3] org.apache.fop.fo.PropertyList.get (PropertyList.java:252) [4] org.apache.fop.fo.PropertyList.get (PropertyList.java:238) [5] org.apache.fop.fo.FObj.getProperty (FObj.java:163) [6] org.apache.fop.layoutmgr.PageLayoutManager.createPageAreas (PageLayoutManager.java:745)
[1] org.apache.fop.fo.properties.PropertyMaker.make (PropertyMaker.java:387) [2] org.apache.fop.fo.properties.PropertyMaker.make (PropertyMaker.java:369) [3] org.apache.fop.fo.properties.PropertyMaker.get (PropertyMaker.java:285) [4] org.apache.fop.fo.PropertyList.get (PropertyList.java:252) [5] org.apache.fop.fo.PropertyList.get (PropertyList.java:238) [6] org.apache.fop.fo.FObj.getProperty (FObj.java:163) [7] org.apache.fop.layoutmgr.PageLayoutManager.createPageAreas (PageLayoutManager.java:745)
For properties whose maker is compound property maker:
[1] org.apache.fop.fo.properties.PropertyMaker.findProperty (PropertyMaker.java:240) [2] org.apache.fop.fo.properties.PropertyMaker.get (PropertyMaker.java:282) [3] org.apache.fop.fo.properties.CompoundPropertyMaker.get (CompoundPropertyMaker.java:146) [4] org.apache.fop.fo.PropertyList.get (PropertyList.java:252) [5] org.apache.fop.fo.PropertyList.get (PropertyList.java:238) [6] org.apache.fop.fo.flow.Leader.getLength (Leader.java:135) [7] org.apache.fop.layoutmgr.AddLMVisitor.getLeaderAllocIPD (AddLMVisitor.java:305) [8] org.apache.fop.layoutmgr.AddLMVisitor$2.getAllocationIPD (AddLMVisitor.java:290) [9] org.apache.fop.layoutmgr.LeafNodeLayoutManager.getNextBreakPoss (LeafNodeLayoutManager.java:143)