[ https://issues.apache.org/jira/browse/TRINIDAD-2248?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Blake Sullivan resolved TRINIDAD-2248. -------------------------------------- Resolution: Fixed Fix Version/s: 2.0.2-core Fixed in revision 1304149 > 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 > Assignee: Blake Sullivan > Fix For: 2.0.2-core > > Attachments: trin2248.diff > > Original Estimate: 96h > Remaining Estimate: 96h > > 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