How on earth could this work?  Each main-decorator specifies an
appheaderTemplate which displays the navigation menu for that application,
how is the user navigating between the various applications that you have
bundled into one?  Have you replaced/altered the GlobalDecorator to display
the "sub" applications?

I really don't think your following best practices here and that is exactly
why you are having troubles.  If you want to have a single component in
which to maintain your customizations you should follow the ecomclone
example and put a webapp entry for each base app in your ofbiz-component.xml
.

Regards
Scott

On 23/11/2007, Jonathon -- Improov <[EMAIL PROTECTED]> wrote:
>
> BJ,
>
> Understood. As I had suspected, you wanted a single look, single
> application, one tab.
>
> > I am not moving any code from the trunk or ver 4.0 into my app.
>
> Yes, you're doing great extending OFBiz cleanly.
>
> > If I changes something like say the order statuses then the code I
> changed,
> > as well as the screens are in my application.
>
> Sounds right. Extension codes are cleanly separated from original OFBiz
> codes.
>
> > to get back to the original problem I need a way to declare the
> > mainDecoratorLocation that has different paths so it can be read when
> the
> > controller for that component is read.
>
> As mentioned, you need to change ConfigXMLReader, possibly ControlServlet
> and RequestManager. Just
> add a new top-level (below <site-conf>) element called
> "<main-decorator-loc>". The ConfigXMLReader
> will prepend the webapp name to "mainDecoratorLocation", so you get
> something like
> "ordermgr:mainDecoratorLocation".
>
> Or easier, simply change those same classes to read the web.xml file
> instead. Read the web.xml
> file in the same folder as the included (<include>) controller.xml .
>
> > then I will let what ever reads it preappend the component name to
> > mainDecoratorLocation, and track it.
>
> You need to change ModelScreenWidget, and add some additional processing
> for attribute "location".
>
> Whenever ModelScreenWidget sees in attribute "location" a value of
> "${parameters.mainDecoratorLocation}", it will create a
> FlexibleStringExpander with string
> "${parameters.ordermgr:mainDecoratorLocation}" instead.
>
> I too love to cleanly organize code like this, rather than mess up OFBiz's
> internals. I wish you
> success in implementing this, which is easy enough. Hope you can get this
> into OFBiz SVN so I can
> have it too. :)
>
> Jonathon
> BJ Freeman wrote:
> > Just to clarify, I consider my app an overlay.
> > I am not moving any code from the trunk or ver 4.0 into my app.
> > for instance I am merging two ftl in Ordermgr.
> > I do create a widget but the ftl are till in ordermgr.
> > this saves a lot of re-integration when the trunk or relase base
> changes.
> > so client will see what ever the ordermgr controller serves up once the
> > client does an action.
> >
> > If I changes something like say the order statuses then the code I
> > changed, as well as the screens are in my application.
> >
> > to return to my menu, they click on the only tab visible, which is my
> > application tab.
> >
> > I do have Ecas and services in my app that extends ofbiz, but is unique
> > to Yahoo functions.
> >
> > so to upgrade from the release to the trunk, I just move my app into the
> > trunk copy I made and add the folder to the trunks component-load.xml
> >
> > to get back to the original problem I need a way to declare the
> > mainDecoratorLocation that has different paths so it can be read when
> > the controller for that component is read.
> > then I will let what ever reads it preappend the component name to
> > mainDecoratorLocation, and track it.
> >
> > so time to dig into the code.
> > :)
> >
> >
> > Jonathon -- Improov sent the following on 11/22/2007 3:22 AM:
> >> Your use case seems valid.
> >>
> >> In a nutshell, you're simply cloning a webapp, and then extending it
> >> with your own requests and features.
> >>
> >> That's great. It means you won't have to repeat the scores of request
> >> maps in the webapp you're cloning.
> >>
> >> That said, it's pretty scary to see 6 webapps rolled into 1 (your
> custom
> >> webapp, where you extend original OFBiz codes). Still, it's just a
> >> matter of splitting up those 6 webapps into 6 custom webapps, something
> >> you may do when you have time.
> >>
> >> I can see where having the mainDecoratorLocation parameter tied to the
> >> webapp (controller.xml) can be useful. But I find it hard to vote for
> >> making this extension to the OFBiz framework. You can simply extend
> >> webapp "workeffort" with "myworkeffort", and use the same
> >> mainDecoratorLocation that "workeffort" uses. In short, there's a
> simple
> >> and useful workaround now.
> >>
> >> Over time, it will be nice to be able to clone "workeffort" and let it
> >> use its own mainDecoratorLocation, while my extensions in
> "myworkeffort"
> >> use a different mainDecoratorLocation. No clash.
> >>
> >> I think I've worn myself out trying to explain technical issues in
> >> technical terms. Let me try an analogy. So, for the last time...
> >>
> >> Customer: "I want a hamburger."
> >>
> >> Cashier: "What's the code to activate my POS machine?"
> >>
> >> Customer: "I don't know?"
> >>
> >> Cashier: "Sorry, you need to know, or no hamburger for you."
> >>
> >> Customer: "Don't you know?"
> >>
> >> Cashier: "I know it for that other POS machine, not this one. You're
> >> ordering a hamburger from this one, so I can't serve you unless you got
> >> the code!"
> >>
> >> Customer: "I want to talk to your manager."
> >>
> >> Cashier: "Alright. He'll probably ask you write some codes to read the
> >> web.xml file in that other POS machine and retrieve the code
> >> (mainDecoratorLocation) there, so be prepared."
> >>
> >> Jonathon
> >>
> >> BJ Freeman wrote:
> >>> I have some screens I handle differently.
> >>> I have kept from going crazy by calling the ones and let the
> controller
> >>> in that app handle it.
> >>> I have not had any problems so far, except for mainDecoratorLocation
> >>>
> >>> and from what I am reading it should not be where it is to follow best
> >>> practices.
> >>>
> >>> question is where to put it.
> >>>
> >>>
> >>>
> >>> Chris Howe sent the following on 11/22/2007 12:10 AM:
> >>>> Why are you opposed to running 6 separate webapps under a component?
> >>>> mycomponent/webapp
> >>>>                                    /myworkeffort
> >>>>                                    /mypartymgr
> >>>>                                    /mymarketing
> >>>>                                    /myordermgr
> >>>>                                    /myaccounting
> >>>>
> >>>>                                    /myyahoo
> >>>>
> >>>>
> >>>> I can almost guarantee you'll drive yourself insane with request-maps
> >>>> and view-maps overriding each other and giving unexpected results.
> >>>>
> >>>> ----- Original Message ----
> >>>> From: BJ Freeman <[EMAIL PROTECTED]>
> >>>> To: [email protected]
> >>>> Sent: Thursday, November 22, 2007 1:58:37 AM
> >>>> Subject: Re: mainDecoratorLocation change to
> >>>> [applicationname]mainDecoratorLocation
> >>>>
> >>>> my controller has
> >>>>
> >>>>   <!-- request handler for workeffort specific calls -->
> >>>>     <include
> >>>>
> location="component://workeffort/webapp/workeffort/WEB-INF/controller.xml"/>
> >>>>
> >>>>
> >>>>     <!-- request handler for partymgr specific calls -->
> >>>>     <include
> >>>> location="component://party/webapp/partymgr/WEB-INF/controller.xml"/>
> >>>>    <!-- request handler for marketing specific calls -->
> >>>>     <include
> >>>>
> location="component://marketing/webapp/marketing/WEB-INF/controller.xml"/>
> >>>>
> >>>>
> >>>>    <!-- request handler for ordermgr specific calls -->
> >>>>     <include
> >>>> location="component://order/webapp/ordermgr/WEB-INF/controller.xml"/>
> >>>>    <!-- request handler for accounting specific calls -->
> >>>>     <include
> >>>>
> location="component://accounting/webapp/accounting/WEB-INF/controller.xml"/>
> >>>>
> >>>>
> >>>>     <!-- request handler for yahoo specific calls note this should be
> >>>> the last one loaded -->
> >>>>     <include
> >>>>
> location="component://yahoo/webapp/yahoo/WEB-INF/businessesnetworcontroller.xml"/>
> >>>>
> >>>>
> >>>>
> >>>>
> >>>> the last one is mine.
> >>>> I have a menu that has a target of
> >>>>         <menu-item name="partymgr"
> >>>> title="${uiLabelMap.YahooPatrymgr}"><link
> >>>>  target="partymgr"/></menu-item>
> >>>>
> >>>> and in my controller I have
> >>>>    <view-map name="partymgr" type="screen"
> >>>> page="component://party/widget/partymgr/PartyScreens.xml#findparty"/>
> >>>>
> >>>> now if I don't have a mainDecoratorLocation defined in my web.xml for
> >>>>   <context-param>
> >>>>     <param-name>mainDecoratorLocation</param-name>
> >>>>
> >>>>
> <param-value>component://party/widget/partymgr/CommonScreens.xml</param-value>
> >>>>
> >>>>     <description>The location of the main-decorator screen to use for
> >>>> this webapp; referred to as a context variable in screen def XML
> >>>> files.</description>
> >>>>   </context-param>
> >>>>
> >>>> the screen for PartyScreens complains it can not find it.
> >>>>
> >>>>
> >>>> Chris Howe sent the following on 11/21/2007 10:16 PM:
> >>>>> Making the variable _name webapp specific would break the entire
> >>>>  point of the variable.
> >>>>> The variable is webapp specific (meaning it's defined by the
> webapp),
> >>>>  but the variable _name is not.  There are no
> >>>>  partyMainDecoratorLocation variables, only mainDecoratorLocation.
> >>>>> BJ,  would it be possible for you to explain the webapp your
> >>>>  developing.  Off the top of my head, I'm unable to picture a
> >>>> scenario where
> >>>>  wanting to maintain the decorator for two web applications is
> >>>> beneficial
> >>>>  and would keep one sane.  The only scenario that I can think of that
> >>>>  even comes close is because of two different conventions being used
> >>>> in the
> >>>>  screens of different components.
> >>>>> ----- Original Message ----
> >>>>> From: Jonathon -- Improov <[EMAIL PROTECTED]>
> >>>>> To: [email protected]
> >>>>> Sent: Thursday, November 22, 2007 12:03:18 AM
> >>>>> Subject: Re: mainDecoratorLocation change to
> >>>>  [applicationname]mainDecoratorLocation
> >>>>>  > Making the variable name webapp specific breaks the entire point
> >>>>  of
> >>>>>  the
> >>>>>  > variable.
> >>>>>
> >>>>> The way the screen widgets are written now, the parameter
> >>>>>  "mainDecoratorLocation" is already webapp-specific.
> >>>>>
> >>>>> The key question is where we want to tie mainDecoratorLocation to.
> If
> >>>>>  it is specific to webapps, we tie it to controller.xml, so that
> >>>>> views defined in a webapp will
> >>>>>  always use the decorator defined for that webapp. But if it is
> >>>>> specific to an OFBiz component,
> >>>>>  then we tie it to a component config, like in
> >>>>> component://party/config/SomeConfigFile.xml
> >>>>  .
> >>>>> Obviously, the screen widgets expect a correct value from
> >>>>>  ${parameters.mainDecoratorLocation}. Where should this be
> >>>>> specified? If it is not webapp-specific, then
> >>>>  does
> >>>>>  that imply screen widgets look for a global OFBiz-wide
> >>>>> ${parameters.mainDecoratorLocation}
> >>>>>  somewhere?
> >>>>>
> >>>>> If the variable name "mainDecoratorLocation" wasn't webapp-specific,
> >>>>  we
> >>>>>  wouldn't have this thread complaining about clashing or missing
> >>>>> "mainDecoratorLocation"
> >>>>>  parameters when combining controller.xml(s) from multiple webapps.
> >>>>>
> >>>>>  > For example, do you determine the variable from the included
> >>>>>  controller of
> >>>>>  > the request-map or from the view-map.  You would likely choose
> the
> >>>>>  view.  If
> >>>>>  > it's the view, how do you determine when that component has
> >>>>  multiple
> >>>>>  webapp
> >>>>>  > as in product, etc/.
> >>>>>
> >>>>> I would choose neither the request map nor the view map. I suggest
> >>>>>  tying "mainDecoratorLocation" to controller.xml itself.
> >>>>>
> >>>>> If "mainDecoratorLocation" were view-specific, we would tie it to a
> >>>>>  view map.
> >>>>>
> >>>>> As the screen widgets are written now, they are webapp-specific.
> >>>>>
> >>>>> Jonathon
> >>>>>
> >>>>> Chris Howe wrote:
> >>>>>> Hi Jonathon,
> >>>>>>
> >>>>>> Making the variable name webapp specific breaks the entire point of
> >>>>>  the
> >>>>>> variable.  I'm under the impression that most deployments of OFBiz
> >>>>>  use very
> >>>>>> few of the applications as is, OOTB.  Taking away the ability to
> >>>>>  change
> >>>>>> the decoration of the application puts that much more burden on
> >>>>>  custom
> >>>>>> applications to maintain a code base that is already maintained by
> >>>>>  the
> >>>>>> community when all they want to do is extend and tweak subtle
> areas.
> >>>>>>
> >>>>>> The solution of further processing of the web.xml context-params in
> >>>>>  order to fill the
> >>>>>> context starts to pull us away from the design of traditional web
> >>>>>> applications.  This has the effect of steepening the learning
> curve.
> >>>>>    In addition, there is too much ambiguity in deciding which
> >>>>>  mainDecoratorLocation would be chosen that I think it really would
> >>>>  be best to
> >>>>>  determine it through a custom preprocessor so that one would end up
> >>>>  with
> >>>>>  the desired results.  For example, do you determine the variable
> >>>>  from
> >>>>>  the included controller of the request-map or from the view-map.
> >>>>   You
> >>>>>  would likely choose the view.  If it's the view, how do you
> >>>>  determine
> >>>>>  when that component has multiple webapp as in product, etc/.
> >>>>>> ----- Original Message ----
> >>>>>> From: Jonathon -- Improov <[EMAIL PROTECTED]>
> >>>>>> To: [email protected]
> >>>>>> Sent: Wednesday, November 21, 2007 10:56:14 PM
> >>>>>> Subject: Re: mainDecoratorLocation change to
> >>>>>  [applicationname]mainDecoratorLocation
> >>>>>> I think BJ's method is fine. It's the only way to couple the
> >>>>>>  webapp-specific parameter "mainDecorationLocation" to a particular
> >>>>>> webapp, and to decouple it
> >>>>>>  from the single global servlet context (single to a webapp).
> >>>>>>
> >>>>>> Say a parent webapp includes the controller.xml of a child webapp,
> >>>>  we
> >>>>>>  use "parent" and "child" so it's easy for me to write here.
> >>>>>>
> >>>>>> When we <include> the child's controller.xml from the parent
> webapp,
> >>>>>>  the servlet context is still the parent's, not a mix of 2 webapps.
> >>>>>> There will be only one
> >>>>>>  "mainDecoratorLocation" parameter for all the widgets listed in
> >>>>>> both controller.xml(s).
> >>>>>>
> >>>>>> When we need to process the views (or widgets) specified in the
> >>>>>  child's
> >>>>>>  controller.xml, we need to do something extra. Those views require
> >>>>>> a specific
> >>>>>>  "mainDecoratorLocation" value in order to work, say
> >>>>>> "component://child/widget/MainDecorScreens.xml". The parent will
> >>>>>>  need to play by those rules, and create "mainDecoratorLocation"
> >>>>>> with that expected value for the
> >>>>>>  child's views to work. Specifically, I mean "for the child's views
> >>>>>> to work in the parent's
> >>>>>>  servlet context".
> >>>>>>
> >>>>>> The problem comes when the parent also has its own
> >>>>>>  "mainDecoratorLocation", say
> >>>>>> "component://parent/widget/MainDecorScreens.xml". Then there is a
> >>>>>>  clash. Because the 2 webapps' widgets operate in a single servlet
> >>>>>> context, there can only be one
> >>>>>>  parameter "mainDecoratorLocation" for both webapps.
> >>>>>>
> >>>>>> BJ's method is the only quick fix there is. Decouple
> >>>>>>  "mainDecoratorLocation" from the global servlet context, and
> >>>>>> encapsulate that attribute together with the
> >>>>>>  widgets that require that particular attribute with a particular
> >>>>>> value.
> >>>>>>
> >>>>>> That means changing all widgets to point to say
> >>>>>>  "<webapp-name>:mainDecoratorLocation". Another solution could be
> >>>>>> to add a new attribute to <decorator-screen>, like
> >>>>>>  "param-location" which automatically hunts for a parameter named
> >>>>>>  "<webapp-name>:mainDecoratorLocation". So a value of
> >>>>>> "myDecoratorLocation" might prompt the widget engine to look for a
> >>>>>>  parameter named "<webapp-name>:myDecoratorLocation".
> >>>>>>
> >>>>>> That is a simple fix.
> >>>>>>
> >>>>>> For a better fix, we need to truly decouple "mainDecoratorLocation"
> >>>>>>  from the global servlet context (web.xml), and put it into the
> >>>>>> controller.xml. The widget
> >>>>>>  engine could look in the controller.xml for a variable
> >>>>>> "mainDecoratorLocation" every time it
> >>>>>>  processes a screen widget. That would ensure perfect re-usability
> >>>>>> of any included widgets
> >>>>>>  (included with a controller <include>), without the need to meddle
> >>>>>> with passing in the expected
> >>>>>>  "mainDecoratorLocation" for those included widgets.
> >>>>>>
> >>>>>> Some changes to ConfigXMLReader, RequestManager and ControlServlet
> >>>>>  may
> >>>>>>  be required.
> >>>>>>
> >>>>>> Hope that makes sense.
> >>>>>>
> >>>>>> I love how OFBiz already has many powerful "clean extension"
> >>>>>>  mechanisms, much like object-oriented programming and
> >>>>>> sub-classing. This "mainDecoratorLocation" thing may
> >>>>>  be
> >>>>>>  a good area to work on.
> >>>>>>
> >>>>>> Jonathon
> >>>>>>
> >>>>>> BJ Freeman wrote:
> >>>>>>> so far you and I are on the same page.
> >>>>>>> I thinks the confusion is, I am not defining a
> >>>>  mainDecoratorLocation
> >>>>>>> for my application. So this is not about how to use
> >>>>>>  ainDecoratorLocation
> >>>>>>> in my web.xml for my widgets.
> >>>>>>> the web.xml has been used to provide context for widget's
> >>>>>>> mainDecoratorLocation, which as you point out is a component.
> >>>>>>>
> >>>>>>>
> >>>>>>> here are the steps:
> >>>>>>> include another controller in your apps controller.
> >>>>>>> Now the mainDecoratorLocation is defined in the web.xml of the
> >>>>>>  included
> >>>>>>> controller, but not mine.
> >>>>>>> so if I don't delcare a mainDecoratorLocation in my web.xml I get
> >>>>  an
> >>>>>>> error, about the mainDecoratorLocation not being found, when I
> >>>>>  access
> >>>>>>> the included controls widget.
> >>>>>>> If I define a mainDecoratorLocation in my web.xml that has the
> path
> >>>>>>  for
> >>>>>>> one of the application that is included in my controller, it works
> >>>>>>  fine.
> >>>>>>> But just for that application.
> >>>>>>> This lets me only define one mainDecoratorLocation for all
> included
> >>>>>>> controllers.
> >>>>>>> so I can not define a mainDecoratorLocation in my web.xml for each
> >>>>>>> application with the path defined in the application web.xml.
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>> Chris Howe sent the following on 11/21/2007 6:39 PM:
> >>>>>>>> No, the feature of mainDecoratorLocation is the webapp being
> >>>>  called
> >>>>>>  defines the default value of mainDecoratorLocation.  You should be
> >>>>>  able
> >>>>>>  to run a pre-processor to override the value that is found in the
> >>>>>>  called webapp's web.xml file.
> >>>>>>>> It may help to identify here the difference in terminology that
> is
> >>>>>>  used.  There's a component and a web application.  The web
> >>>>>  application
> >>>>>>  is what is generally under the webapp folder and does not include
> >>>>>  the
> >>>>>>  widgets.  The widgets (form, screen, tree, menu) belong to the
> >>>>>  component,
> >>>>>>  not the webapp.
> >>>>>>>> The controller controls the web application along with the
> context
> >>>>>>  provided by the web.xml definitions.  So, if I have webapp: myApp,
> >>>>>  the
> >>>>>>  context should be provided by the web.xml file in the web
> >>>>>  application
> >>>>>>  myApp, at least by default.  Simply because you are including
> >>>>>  elements
> >>>>>>  from another document does not mean you should change what
> provides
> >>>>>  the
> >>>>>>  default context.
> >>>>>>>> webapp/myApp
> >>>>>>>>                         /WEB-INF
> >>>>>>>>                                       /controller.xml <--Controls
> >>>>>>  web application myApp
> >>>>>>>>                                       /web.xml
> >>>>   <--provides
> >>>>>>  context for web application myApp
> >>>>>>>> ----- Original Message ----
> >>>>>>>> From: BJ Freeman <[EMAIL PROTECTED]>
> >>>>>>>> To: [email protected]
> >>>>>>>> Sent: Wednesday, November 21, 2007 7:59:52 PM
> >>>>>>>> Subject: Re: mainDecoratorLocation change to
> >>>>>>  [applicationname]mainDecoratorLocation
> >>>>>>>> If i understand you correctly the path to mainDecoratorLocation
> >>>>>>  should
> >>>>>>>> be the same for all apps.
> >>>>>>>> however if the path is in the application should it not be
> >>>>>>  distinguish
> >>>>>>>> for that application?
> >>>>>>>>
> >>>>>>>> Chris Howe sent the following on 11/21/2007 5:50 PM:
> >>>>>>>>> The "problem" that you're having is the exact feature that is
> >>>>>>  created
> >>>>>>>>  by mainDecoratorLocation.  Appending [applicationname] breaks
> >>>>  that
> >>>>>>>>  feature.   Are you unable to override
> >>>>>>  parameters.mainDecoratorLocation
> >>>>>>>>  through a preprocessor or by another means?
> >>>>>>>>> ----- Original Message ----
> >>>>>>>>> From: BJ Freeman <[EMAIL PROTECTED]>
> >>>>>>>>> To: [email protected]
> >>>>>>>>> Sent: Wednesday, November 21, 2007 7:02:18 PM
> >>>>>>>>> Subject: mainDecoratorLocation change to
> >>>>>>>>  [applicationname]mainDecoratorLocation
> >>>>>>>>> when including other controllers, the context for
> >>>>>>>>  mainDecoratorLocation
> >>>>>>>>> has to be defined in the web.xml of the home controller
> location.
> >>>>>>>>>
> >>>>>>>>> this causes a problem when all the application use
> >>>>>>>>>  mainDecoratorLocation.
> >>>>>>>>>
> >>>>>>>>> so would like to propose that the mainDecoratorLocation is used
> >>>>>  for
> >>>>>>>>  the
> >>>>>>>>> framework/common/webapp/
> >>>>>>>>>
> >>>>>>>>> and preappend the application name to mainDecoratorLocation
> >>>>>>>>> ([applicationname]mainDecoratorLocation)  in the applications
> >>>>>>>>  web.xml.
> >>>>>>>>
> >>>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>
> >>>>
> >>>>
> >>>>
> >>>
> >>
> >>
> >>
> >
> >
>
>

Reply via email to