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]