Change component templating scheme to generate superclasses of templated
components rather than the templated components themselves
-----------------------------------------------------------------------------------------------------------------------------------
Key: TRINIDAD-2248
URL: https://issues.apache.org/jira/browse/TRINIDAD-2248
Project: MyFaces Trinidad
Issue Type: Improvement
Components: Build
Affects Versions: 2.0.1-core
Reporter: Blake Sullivan
The current component templating scheme works as follows:
For a component with fully qualified name <package name>.<component name>
Look in the parallel java-templates directory tree for the file <package
name>.<component name>Template.java
if it exists, merge the contents of <package name>.<component
name>Template.java with the generated class artifacts to create the actual
component source file <package name>.<component name>.java.
On the surface, this seems fine however it has a major impact on supportability
because
1) The <package name>.<component name>Template.java files often can not be
included in the IDE projects.
2) Debugging of the Template files (which is where all of the interesting code
is) must be done against the flattened file, which is non-obvious and a pain,
while the actual fixes need to be done against the Template files
3) Each Template file fix requires that the generate-components portion of the
build be re-executed to reflatten the component
Developers have tried to work around the first issue in various ways:
1) They make the Template extend the superclass of the component to be
generated, so that the inherited methods are present (this superclass is
ignored when merging)
2) They manually add abstract implementations of any of the artifacts generated
from metadata, using the bizarre /**/ prefix on the lines to indicate to the
merging code that the artifact should be ignored when merging (to avoid
conflicts with the merged functions.
Even with the hacks, which are a pain to use, more complicated usages with
inner classes, still can't be supported.
The proposal is to use real inheritance instead. The old behavior would still
be supported for backwards compatibility. In the new proposal we:
Look in the parallel java-templates directory tree for the file <package
name>.<component name>.java
if it exists, generate a new package private abstract class file with the name
<package name>.Partial<component name>.java containing the generated class
artifacts.
The result is that rather that the generated partial class contains all of the
generated logic and all of the real logic is contained in the component
developer's class, extending the partial class. The developers class is in
every way a real class suitable for inclusion in the source control system.
To convert an old <component name>Template.java file to a new <component
name>.java file, the developer:
1) Renames the source file
2) Changes the old extends and implements to extend just the Partial class
3) Adds the constructors of the form:
/**
* Construct an instance of the <component name>
*/
public <component name>()
{
super();
}
/**
* Construct an instance of the <component name>
*/
protected <component name>(
String rendererType
)
{
super(rendererType);
}
4) Deletes any abstract functions added to make the old scheme kind of work
(these are often preceeded with /**/)
5) If you add your own private property keys, you need to create your own type
and then lock the TYPE yourself. For example:
public static final FacesBean.Type TYPE = new
FacesBean.Type(PartialUIXRegion.TYPE);
private static final PropertyKey _VIEW_ID_INDEX_MAP_KEY =TYPE.registerKey(
"oracle.adf.view.rich.component.fragment.UIXRegion.viewIdToIndexMap",
Map.class, null, 0,
PropertyKey.Mutable.OFTEN);
static
{
TYPE.lock();
}
6) Removes any no longer needed imports
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira