[ 
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

        

Reply via email to