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]