As I recall, one of tap's stated goals is to become a framework
without a need for developers to extend any base class (i.e. BasePage,
BaseComponent).  If that *is* a goal, it seems like this is not just
wanted, but needed.

-Mike

Then there's the whole composition vs. inheritance issue...
(http://www.artima.com/designtechniques/compoinh.html)

On 4/10/06, Martijn Hinten <[EMAIL PROTECTED]> wrote:
> I asked this same question about half a year ago. Most answers refer to
> either annotations or using a smart subclassing of a given base class.
> But what if you are still using Java 1.4 and hence not able to use
> annotations and are neither willing to implement a subclassing solution,
> because imho the way to do this should be via the .page files so all
> common ASOs, properties etcetera are nicely grouped together.
>
> So Tap-team, I stand with Mike. Please think about his suggestions.
> Please. (I am using the 'subclassing'-method now, but although it works,
> are not all that happy with it).
>
> I'll vote for the Jira if you want. ;-)
>
> Regards,
> Martijn
>
> Mike Snare wrote:
>
> >I must say that this notion of inserting common ASOs and services into
> >all pages has come up several times on this list in just the last
> >month I've been subscribing.
> >
> >@Tap Team:
> >How difficult would it be to add the ability to either:
> >  A)  declare services/aso's as 'global' (or some better label), such
> >that every page gets it injected?
> >  B)  Come up with an application.page file that has
> >property/service/component/script/etc declarations that are available
> >on ALL pages in the app (perhaps limited by packaging or something).
> >
> >If you guys think it's do-able, several of us would appreciate it.
> >Let me know and I'll add the request to JIRA.
> >
> >-Mike
> >
> >On 4/10/06, Sam Gendler <[EMAIL PROTECTED]> wrote:
> >
> >
> >>How about @InjectObject("spring:someBean") to get whatever resources
> >>you want from spring.  And an @InitialValue() annotation to initialize
> >>things that don't come from spring.  I haven't tried it, but perhaps
> >>@InitialValue("new Logger(this.getClass().getName())") (or whatever
> >>the appropriate ognl syntax would be) on a log property.  The problem
> >>with doing a log object in the base class, of course, is that all log
> >>messages would appear to be from the base class.  You really need a
> >>separate logger instance in your base class and subclass in order to
> >>differentiate exactly where the log messages are truly coming from.
> >>
> >>--sam
> >>
> >>
> >>On 4/9/06, Mark <[EMAIL PROTECTED]> wrote:
> >>
> >>
> >>>Hi Pedro,
> >>>
> >>>this would work, but now you have the LogFactory reference hard-coded.
> >>>
> >>>I am trying to be completely independent and just inject everything.
> >>>
> >>>I found something on the Spring site that is extending BaseEngine, in
> >>>order to add a hook to the application-context into the IEngine
> >>>Implementation:
> >>>http://static.springframework.org/spring/docs/1.2.x/reference/webintegration.html#view-tapestry-exposeappctx
> >>>
> >>>It puts the hook into the Global object. Since this is designed for T3,
> >>>I guess T4 could use an application-scope ApplicationStateObject to do 
> >>>this.
> >>>It could be created in the HiveMind module deployment descriptor:
> >>><contribution configuration-id="tapestry.state.ApplicationObjects">
> >>>    <state-object name="logFactory" scope="application">
> >>>        <create-instance class="some.new.logFactory"/>
> >>>    </state-object>
> >>></contribution>
> >>>
> >>>Then it could be injected in the .page file:
> >>><inject name="registration" type="state" object="logFactory"/>
> >>>
> >>>The question is just: how can I make the BasePageImplementation initiate
> >>>the injection, so that I do not have to do it in each .page file any more:
> >>>
> >>>public class BasePageImplementation extends BasePage {
> >>>    private Log logger;
> >>>
> >>>    public BasePageImplementation() {
> >>>        // Since all page classes are inherited Tapestry generated classes
> >>>        // we use the superclass to initialize the log
> >>>        logger = <getHivemindApplicationObject("logFactory")> // <!--- 
> >>> this is what I am missing! How can I do this?
> >>>    }
> >>>
> >>>    /**
> >>>     * @return Returns the logger.
> >>>     */
> >>>    public Log getLogger() {
> >>>        return logger;
> >>>    }
> >>>}
> >>>
> >>>
> >>>This way, if  want to switch the Log implementation, I can switch the
> >>>LogFactory by just simply changing the hivemind module decriptor.
> >>>So I am just missing the one last part of the puzzle: How can I access
> >>>all the stuff that is defined in the Hivemind configurations from within
> >>>the java objects directly, rather than from the .page files?
> >>>
> >>>Thanks,
> >>>
> >>>MARK
> >>>
> >>>
> >>>
> >>>
> >>>Pedro Viegas wrote:
> >>>
> >>>
> >>>>Why not something like...
> >>>>
> >>>>public class BasePageImplementation extends BasePage {
> >>>>    private Log logger;
> >>>>
> >>>>    public BasePageImplementation() {
> >>>>        // Since all page classes are inherited Tapestry generated classes
> >>>>        // we use the superclass to initialize the log
> >>>>        logger = LogFactory.getLog(this.getClass().getSuperclass());
> >>>>    }
> >>>>
> >>>>    /**
> >>>>     * @return Returns the logger.
> >>>>     */
> >>>>    public Log getLogger() {
> >>>>        return logger;
> >>>>    }
> >>>>}
> >>>>
> >>>>Works for me. :-)
> >>>>
> >>>>
> >>>>On 4/9/06, Mark <[EMAIL PROTECTED]> wrote:
> >>>>
> >>>>
> >>>>
> >>>>>Yes, that's what I have done.
> >>>>>But still - let's assume I have something like
> >>>>>
> >>>>>public abstract class LogAwareBasePage extends BasePage implements
> >>>>>PageBeginRenderListener {
> >>>>>    Log log;
> >>>>>    public void setLog(Log log) { ... }
> >>>>>    public Log getLog() { ... }
> >>>>>}
> >>>>>
> >>>>>I still don't have the log property initialized.
> >>>>>Sure, I could do this:
> >>>>>
> >>>>>public abstract class LogAwareBasePage extends BasePage implements
> >>>>>PageBeginRenderListener {
> >>>>>    Log log = new SomeClassThatImplementsLog("param1", "param2", ...);
> >>>>>    public void setLog(Log log) { ... }
> >>>>>    public Log getLog() { ... }
> >>>>>}
> >>>>>
> >>>>>But this is not runtime-configurable...
> >>>>>
> >>>>>
> >>>>>Or I could do it in my .page file:
> >>>>>
> >>>>><property name="log">ognl:Some OGNL expression</property>
> >>>>>
> >>>>>So I could plug it in the .page files, but that would have to be done in
> >>>>>each .page file again and again. So if I want to switch the Log
> >>>>>implementation, at least I don't have to modify my java code, but I will
> >>>>>have to change every single .page file.
> >>>>>
> >>>>>So I am hoping that I could somehow use Hivemind instead to configure
> >>>>>the injection of the Log implementation, but I don't know how.
> >>>>>
> >>>>>
> >>>>>Also, as an additional challenge: My application architecture is using
> >>>>>Spring for the configuration and property injection on all the other
> >>>>>layers, so ideally, I would like to use Spring to initialize the log
> >>>>>property, so that I do not have to define all the beans twice (once in
> >>>>>Spring and once in Hivemind). Maybe the bridge from the tapestry-spring
> >>>>>project can be used for that???
> >>>>>
> >>>>>Thanks for the help,
> >>>>>
> >>>>>MARK
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>Sam Gendler wrote:
> >>>>>
> >>>>>
> >>>>>
> >>>>>>Define a MyBasePage which has all the properties you want, and then
> >>>>>>make all your pages inherit from that.
> >>>>>>
> >>>>>>--sam
> >>>>>>
> >>>>>>
> >>>>>>On 4/9/06, Mark <[EMAIL PROTECTED]> wrote:
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>>Hello,
> >>>>>>>
> >>>>>>>is there a way to "globally" inject certain properties in a large
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>number
> >>>>>
> >>>>>
> >>>>>
> >>>>>>>of pages, without having to do it in each page specification file?
> >>>>>>>For example, I expect all my pages to have a "log" Property which is an
> >>>>>>>implementation of the commons-logging Log interface.
> >>>>>>>But I want to plug the particular implementation of the Log interface
> >>>>>>>using injection at runtime, just like all the other page properties are
> >>>>>>>plugged at runtime based on the .page specification file as well.
> >>>>>>>However, I don't want to have to include the same property definition
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>in
> >>>>>
> >>>>>
> >>>>>
> >>>>>>>every single page-descriptor, since it is not very well maintainable.
> >>>>>>>Imagine I have 100 pages and now want to change the implementation of
> >>>>>>>the Log interface - I have to change 100 different .page files.
> >>>>>>>
> >>>>>>>So is there a way to do this in a better way?
> >>>>>>>
> >>>>>>>Thanks,
> >>>>>>>
> >>>>>>>MARK
> >>>>>>>
> >>>>>>>---------------------------------------------------------------------
> >>>>>>>To unsubscribe, e-mail: [EMAIL PROTECTED]
> >>>>>>>For additional commands, e-mail: [EMAIL PROTECTED]
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>---------------------------------------------------------------------
> >>>>>>To unsubscribe, e-mail: [EMAIL PROTECTED]
> >>>>>>For additional commands, e-mail: [EMAIL PROTECTED]
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>---------------------------------------------------------------------
> >>>>>To unsubscribe, e-mail: [EMAIL PROTECTED]
> >>>>>For additional commands, e-mail: [EMAIL PROTECTED]
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>--
> >>>>Pedro Viegas
> >>>>
> >>>>
> >>>>
> >>>>
> >>>---------------------------------------------------------------------
> >>>To unsubscribe, e-mail: [EMAIL PROTECTED]
> >>>For additional commands, e-mail: [EMAIL PROTECTED]
> >>>
> >>>
> >>>
> >>>
> >>---------------------------------------------------------------------
> >>To unsubscribe, e-mail: [EMAIL PROTECTED]
> >>For additional commands, e-mail: [EMAIL PROTECTED]
> >>
> >>
> >>
> >>
> >
> >---------------------------------------------------------------------
> >To unsubscribe, e-mail: [EMAIL PROTECTED]
> >For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
> >
> >
>
> --
>
>
> *Cumquat Information Technology*
> De Dreef 19
> 3706 BR Zeist
> T +31 (0)30 - 6940490
> F +31 (0)10 - 6940499
> http://www.cumquat.nl <http://www.cumquat.nl/>
>
> [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>
> M +31 6 22 384 318
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to