Uploaded image for project: 'OFBiz'
  1. OFBiz
  2. OFBIZ-5312

Proposal: URL-Generation Changes (mostly for SEO reasons but not only)

    Details

      Description

      This was proposed by Paul Piper in Nabble 7 months ago. Here is quoted Paul's proposal

      Hey Everyone,

      over at ilscipio (www.ilscipio.com) we developed a set of functional OFBiz changes that we believe the entire community could benefit from. The changes have been implemented in parts in Syracus (www.syracus.net) for a while now, but we figured that some of which are too crucial for ofbiz' success in the long run, so we are considering the contribution (as we did with the SOLR component).

      As you are probably aware, OFBiz has a pretty uncommon way of generating URLs. Most of this has to do with the fact that OFBiz uses a servlet (ControlServlet) to handle all requests. The servlet is mounted at /control, so that it won't interfere with other servlets. Though functionally valid, this has the sideeffect that all urls are actually created on /control, which is neither pretty, nor good by any measures of SEO. It also means that a few 302 redirects are necessary to forward the user from / to /control/main. It also makes requests more complicated, since many forwards are necessary whenever somebody wants to move away from this implementation.

      Since this is hurtful to many of the implementers, I wanted to discuss whether or not you guys would be interested in the changes we have made. The functional changes contain:

      • Removal of /control out of all the urls
      • SEO-friendly URLS
      • Configurable product/category and other URLs
      • Frontpage mapping from /main to /

      It was tested on our end and contains all necessary improvements (Transforms, Sample Configuration, Servlets & Filters) for it to be applicable.

      If interested, I would create a new JIRA ticket for this and after a few minor internal discussions, we will gladly provide the rest of you with it.

      Regards,
      Paul

      There is even a patch, mostly done by Jinghai Shi, that I attach here. Even if it has been already used in Syracus since early this year, some help would be needed to test it thoroughly in OFBiz.

      Then we should discuss if it's the way to go. I believe it is. Who needs a /control/ or /main by default in ecommerce urls? Would you not prefer http://localhost:8080/ecommerce/ over http://localhost:8080/ecommerce/control/main ?

      1. classloaderpatch.txt
        2 kB
        Ingo Wolfmayr
      2. OFBiz-5312-allowpaths-email-jsp-patch-20140625.patch
        21 kB
        Shi Jinghai
      3. OFBIZ-5312-infinite-loop-20141209.patch
        8 kB
        Shi Jinghai
      4. OFBIZ-5312 - ofbiz-ecommerce-seo.patch
        317 kB
        Jacques Le Roux
      5. OFBIZ-5312 - ofbiz-ecommerce-seo.patch
        258 kB
        Jacques Le Roux
      6. OFBIZ-5312 - ofbiz-ecommerce-seo.patch
        258 kB
        Jacques Le Roux
      7. OFBIZ-5312 - ofbiz-ecommerce-seo.patch
        229 kB
        Jacques Le Roux
      8. OFBIZ-5312 - ofbiz-ecommerce-seo.patch
        224 kB
        Parimal Gain
      9. OFBIZ-5312 - ofbiz-ecommerce-seo.patch
        229 kB
        Jacques Le Roux
      10. OFBIZ-5312 - ofbiz-ecommerce-seo.patch
        654 kB
        Jacques Le Roux
      11. OFBIZ-5312 - ofbiz-ecommerce-seo.patch
        654 kB
        Jacques Le Roux
      12. OFBIZ-5312 - ofbiz-ecommerce-seo.patch
        640 kB
        Jacques Le Roux
      13. OFBIZ-5312 - ofbiz-ecommerce-seo.patch
        640 kB
        Jacques Le Roux
      14. OFBIZ-5312 - ofbiz-ecommerce-seo.patch
        109 kB
        Jacques Le Roux
      15. OFBIZ-5312 - ofbiz-ecommerce-seo.patch
        109 kB
        Jacques Le Roux
      16. OFBiz-5312-product-ecommerce-seo.patch
        164 kB
        Shi Jinghai
      17. OFBiz-5312-product-ecommerce-seo-20131031.patch
        79 kB
        Shi Jinghai
      18. OFBiz-5312-product-ecommerce-seo-for-seo-branch.patch
        2 kB
        Shi Jinghai
      19. SeoContextFilter.java.patch
        7 kB
        Jacques Le Roux

        Issue Links

          Activity

          Hide
          jacques.le.roux Jacques Le Roux added a comment - - edited

          == TYPO ==
          Nobody interested or got a chance to look/think-about it?

          Show
          jacques.le.roux Jacques Le Roux added a comment - - edited == TYPO == Nobody interested or got a chance to look/think-about it?
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Same file but with tabs replaced by 4 spaces

          Show
          jacques.le.roux Jacques Le Roux added a comment - Same file but with tabs replaced by 4 spaces
          Hide
          parimal Parimal Gain added a comment -

          Hi Jacques/Paul,

          This seems interesting to me and I will really love to work on it. I am not an seo expert I'll require an
          understanding of architecture of current implemented solution with respect to ofbiz, i.e.
          1.How it will work?
          2.Do I require any additional setting or calling some specific method to form the url.
          3.If yes then From where the method should be called?
          4.Or it will automatically convert the url to SEO friendly url after applying this patch.
          5.Will it cover all url of a site like search result success page url, any content page url along with product page url, category page url, home page url etc.

          After looking into patch I understand that there will be servlets called seoControlServlet and seoCatalogUrlServlet that will filter the request of product and category on the basis of _P and _C or -p and -c. But not clear on other url also there is few classes created like SeoConfigUtil.java, SeoTransform.java and SeoUrlUtil.java, how this will used.

          Also You have mentioned that we have to test application thoroughly, so what all use-cases you think should be cover to test this functionality.

          Note: I'm asking for these info because this all content will help to test the functionality thoroughly.

          Thanks in Advance!!!

          Show
          parimal Parimal Gain added a comment - Hi Jacques/Paul, This seems interesting to me and I will really love to work on it. I am not an seo expert I'll require an understanding of architecture of current implemented solution with respect to ofbiz, i.e. 1.How it will work? 2.Do I require any additional setting or calling some specific method to form the url. 3.If yes then From where the method should be called? 4.Or it will automatically convert the url to SEO friendly url after applying this patch. 5.Will it cover all url of a site like search result success page url, any content page url along with product page url, category page url, home page url etc. After looking into patch I understand that there will be servlets called seoControlServlet and seoCatalogUrlServlet that will filter the request of product and category on the basis of _P and _C or -p and -c. But not clear on other url also there is few classes created like SeoConfigUtil.java, SeoTransform.java and SeoUrlUtil.java, how this will used. Also You have mentioned that we have to test application thoroughly, so what all use-cases you think should be cover to test this functionality. Note: I'm asking for these info because this all content will help to test the functionality thoroughly. Thanks in Advance!!!
          Hide
          jacques.le.roux Jacques Le Roux added a comment - - edited

          Hi Parimal,

          Paul, who sets the requirements, is busy now, he will answer you when available

          Show
          jacques.le.roux Jacques Le Roux added a comment - - edited Hi Parimal, Paul, who sets the requirements, is busy now, he will answer you when available
          Hide
          parimal Parimal Gain added a comment -

          Hi Paul/Jacques,

          Hope you will be available now. Between this time frame I went through the current implementation, following are the observation -
          1. There are following macro used to create user friendly url - <@ofbizCatalogUrl>, <@ofbizCatalogAltUrl>, <@ofbizContentUrl> and <@ofbizContentAltUrl>.
          2. Each macro has its own transformation class, which is used to translate the macro and form the user friendly url.
          3. Default behavior of system to create url is as follows -
          category : http://localhost:8080/ecommerce/products/100/101
          product : http://localhost:8080/ecommerce/products/p_GZ-1000
          4. This default behavior can be override using <@ofbizCatalogAltUrl> and by defining the Product/Category Content of type 'Alternative Url'.
          5. Responsible classes for catalog are : OfbizCatalogAltUrlTransform.java, catalogUrlFilter.java, UrlServletHelper.java and CatalogUrlServlet.java

          Then I go through the patch I observed following thing -
          1. Is this implementation will use any macro or how it will work don't have any clarity.
          2. It also contains Transformation class named SeoTransform.java
          3. It also contains Seo.xml file to filter/configure url (Identified by regex pattern).
          4. This xml configuration will be used/read in SeoConfigUrl.java
          5. Responsible classes for catalog are : SeoTransform.java, SeoCatalogUrlFilter.java, SeoCatalogUrlServlet.java and SeoUrlUtil.java

          Then I applied the patch and tried to run the application, following are the observation -
          1. control has removed from the url.
          2. Frontpage mapping from /main to / is done.
          3. I run the application using standered macro <@ofbizUrl> for category and product i.e. using url 'category?category_id=' and 'product/product_id=' but no difference is observed.
          4. Then I used <@ofbizCatalogAltUrl> with out aleternate url content defined for category and product to create the user friendly url
          and found SeoCatalogUrlFilter.java and SeoCatalogUrlServlet.java is called but not handle this request and forward the url then CatalogUrlFilter.java and CatalogUrlServelet.java handle the request and obviously the url pattern is same as defined in #3 of first section.

          Also Found that SeoTransform.java class is never used to create create seo friendly url. There will be surely one pattern/macro to create the url that I'm not aware of currently.

          So please validate me if I'm missing something or I'm wrong anywhere and update me on how to use the above not used class.

          Show
          parimal Parimal Gain added a comment - Hi Paul/Jacques, Hope you will be available now. Between this time frame I went through the current implementation, following are the observation - 1. There are following macro used to create user friendly url - <@ofbizCatalogUrl>, <@ofbizCatalogAltUrl>, <@ofbizContentUrl> and <@ofbizContentAltUrl>. 2. Each macro has its own transformation class, which is used to translate the macro and form the user friendly url. 3. Default behavior of system to create url is as follows - category : http://localhost:8080/ecommerce/products/100/101 product : http://localhost:8080/ecommerce/products/p_GZ-1000 4. This default behavior can be override using <@ofbizCatalogAltUrl> and by defining the Product/Category Content of type 'Alternative Url'. 5. Responsible classes for catalog are : OfbizCatalogAltUrlTransform.java, catalogUrlFilter.java, UrlServletHelper.java and CatalogUrlServlet.java Then I go through the patch I observed following thing - 1. Is this implementation will use any macro or how it will work don't have any clarity. 2. It also contains Transformation class named SeoTransform.java 3. It also contains Seo.xml file to filter/configure url (Identified by regex pattern). 4. This xml configuration will be used/read in SeoConfigUrl.java 5. Responsible classes for catalog are : SeoTransform.java, SeoCatalogUrlFilter.java, SeoCatalogUrlServlet.java and SeoUrlUtil.java Then I applied the patch and tried to run the application, following are the observation - 1. control has removed from the url. 2. Frontpage mapping from /main to / is done. 3. I run the application using standered macro <@ofbizUrl> for category and product i.e. using url 'category?category_id=' and 'product/product_id=' but no difference is observed. 4. Then I used <@ofbizCatalogAltUrl> with out aleternate url content defined for category and product to create the user friendly url and found SeoCatalogUrlFilter.java and SeoCatalogUrlServlet.java is called but not handle this request and forward the url then CatalogUrlFilter.java and CatalogUrlServelet.java handle the request and obviously the url pattern is same as defined in #3 of first section. Also Found that SeoTransform.java class is never used to create create seo friendly url. There will be surely one pattern/macro to create the url that I'm not aware of currently. So please validate me if I'm missing something or I'm wrong anywhere and update me on how to use the above not used class.
          Hide
          parimal Parimal Gain added a comment -

          Any Information on this ??????

          Show
          parimal Parimal Gain added a comment - Any Information on this ??????
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Seems Paul is still busy, I will try to have a deeper look...

          Show
          jacques.le.roux Jacques Le Roux added a comment - Seems Paul is still busy, I will try to have a deeper look...
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Parimal,

          Paul told me he will look at it next week. I expect to spend some time tomorrow...

          Show
          jacques.le.roux Jacques Le Roux added a comment - Parimal, Paul told me he will look at it next week. I expect to spend some time tomorrow...
          Hide
          parimal Parimal Gain added a comment -

          Thanks Jacques, will look forward for reply from you guy's.

          Show
          parimal Parimal Gain added a comment - Thanks Jacques, will look forward for reply from you guy's.
          Hide
          madppiper Paul Piper added a comment -

          Hi Parimal,

          that is interesting. To get into your statements:

          1. control has removed from the url.

          That is wanted behaviour. The URLs should begin with www.yourdomain.com and then add the directories directly. Having had the /control in between was a leftover from using a servlet as a request handler, it was a bad habit, however, since you would never call any url outside of the handler (even the index.jsp file would only serve as a means to do a redirect) and thus a lot of redirection would take place whenever you would access the calls directly. Having "control" added to the urls isn't good from a url point of view and also not pretty.

          2. Frontpage mapping from /main to / is done.

          This is also the wanted behaviour. The frontpage should always be accessible at / and not /main. Though this is a common behaviour for most web applications, it still isn't ideal to use /main

          3. I run the application using standered macro <@ofbizUrl> for category and product i.e. using url 'category?category_id=' and 'product/product_id=' but no difference is observed.

          Hmm... I will have to look into our implementation again. But if the macros aren't modified, then I would agree that we should discuss doing so in the near future.

          4. Then I used <@ofbizCatalogAltUrl> with out aleternate url content defined for category and product to create the user friendly url
          and found SeoCatalogUrlFilter.java and SeoCatalogUrlServlet.java is called but not handle this request and forward the url then CatalogUrlFilter.java and CatalogUrlServelet.java handle the request and obviously the url pattern is same as defined in #3 of first section.

          This must have to do with the url patterns you defined. Could you send me your configuration?

          Show
          madppiper Paul Piper added a comment - Hi Parimal, that is interesting. To get into your statements: 1. control has removed from the url. That is wanted behaviour. The URLs should begin with www.yourdomain.com and then add the directories directly. Having had the /control in between was a leftover from using a servlet as a request handler, it was a bad habit, however, since you would never call any url outside of the handler (even the index.jsp file would only serve as a means to do a redirect) and thus a lot of redirection would take place whenever you would access the calls directly. Having "control" added to the urls isn't good from a url point of view and also not pretty. 2. Frontpage mapping from /main to / is done. This is also the wanted behaviour. The frontpage should always be accessible at / and not /main. Though this is a common behaviour for most web applications, it still isn't ideal to use /main 3. I run the application using standered macro <@ofbizUrl> for category and product i.e. using url 'category?category_id=' and 'product/product_id=' but no difference is observed. Hmm... I will have to look into our implementation again. But if the macros aren't modified, then I would agree that we should discuss doing so in the near future. 4. Then I used <@ofbizCatalogAltUrl> with out aleternate url content defined for category and product to create the user friendly url and found SeoCatalogUrlFilter.java and SeoCatalogUrlServlet.java is called but not handle this request and forward the url then CatalogUrlFilter.java and CatalogUrlServelet.java handle the request and obviously the url pattern is same as defined in #3 of first section. This must have to do with the url patterns you defined. Could you send me your configuration?
          Hide
          parimal Parimal Gain added a comment -

          Hi Paul,

          I have used the patch as is to test the behavior and use of various classes and configuration and didn't configure anything, anywhere beyond the patch. As I am not aware of the architecture of the functionality so these output(mentioned in above comment) are from your as is patch. If you see the comment, I have asked for the architecture and pattern to use this patch for various urls.

          As I understand the SEO concept of urls till now, the user friendly url creation and implementation with respect to SEO will be achieved if I can achieve following things -
          1. Removal of /control out of all the url’s
          2. SEO-friendly URLS as:
          a. URL for home page: http://www.abcde.com/
          b. URL for category page level 1: http://www.abcde.com/footwear where footwear is the name of category
          c. URL for category page level 2: http://www.abcde.com/footwear/men where footwear is the name of level 1 category
          and men is the name of level 2 category
          d. URL for category page level 3: http://www.abcde.com/footwear/men/shirts where footwear is the name of level 1
          category, men is the name of level 2 category & shirts is the name of level 3 category
          e. URL for product page: http://www.abcde.com/steelcraft-stainless-steel-bliss-thali-set-1032499 OR
          http://www.abcde.com/steelcraft-stainless-steel-bliss-thali-set where steelcraft stainless steel bliss thali set is the name
          of product and 1032499 is the product id
          f. URL for search page: http://www.abcde.com/search/rice-cooker where rice cooker is the keyword searched.
          3. Configurable product/category and other URLs
          4. Frontpage mapping from /main to /
          5. Use only lowercase alphanumeric characters (abc123).
          6. Replace spaces, underscores and other word separators with hyphens .
          7. Remove all special characters, including trademark symbols, exclamation points, and apostrophes.
          8. Remove all encoding that represents special characters, such as %20, %2C.

          Please help me to test this behavior/pattern by explaining the architecture of functionality implemented and how this patch should be used to achieve this and also please validate me if I missed out something or I'm wrong in any point.

          Show
          parimal Parimal Gain added a comment - Hi Paul, I have used the patch as is to test the behavior and use of various classes and configuration and didn't configure anything, anywhere beyond the patch. As I am not aware of the architecture of the functionality so these output(mentioned in above comment) are from your as is patch. If you see the comment, I have asked for the architecture and pattern to use this patch for various urls. As I understand the SEO concept of urls till now, the user friendly url creation and implementation with respect to SEO will be achieved if I can achieve following things - 1. Removal of /control out of all the url’s 2. SEO-friendly URLS as: a. URL for home page: http://www.abcde.com/ b. URL for category page level 1: http://www.abcde.com/footwear where footwear is the name of category c. URL for category page level 2: http://www.abcde.com/footwear/men where footwear is the name of level 1 category and men is the name of level 2 category d. URL for category page level 3: http://www.abcde.com/footwear/men/shirts where footwear is the name of level 1 category, men is the name of level 2 category & shirts is the name of level 3 category e. URL for product page: http://www.abcde.com/steelcraft-stainless-steel-bliss-thali-set-1032499 OR http://www.abcde.com/steelcraft-stainless-steel-bliss-thali-set where steelcraft stainless steel bliss thali set is the name of product and 1032499 is the product id f. URL for search page: http://www.abcde.com/search/rice-cooker where rice cooker is the keyword searched. 3. Configurable product/category and other URLs 4. Frontpage mapping from /main to / 5. Use only lowercase alphanumeric characters (abc123). 6. Replace spaces, underscores and other word separators with hyphens . 7. Remove all special characters, including trademark symbols, exclamation points, and apostrophes. 8. Remove all encoding that represents special characters, such as %20, %2C. Please help me to test this behavior/pattern by explaining the architecture of functionality implemented and how this patch should be used to achieve this and also please validate me if I missed out something or I'm wrong in any point.
          Hide
          parimal Parimal Gain added a comment -

          Hi Paul,

          For testing these use cases your input is required, without that getting stuck.

          Show
          parimal Parimal Gain added a comment - Hi Paul, For testing these use cases your input is required, without that getting stuck.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Thanks for your interest in this feature Parimal,

          With last Paul's answer I suppose you guessed he is pretty busy at the moment and can't answer you thoroughly. Though I did not write the patch (Jinghai Shi did most of it on Paul's requirements), I will try to have a closer look in order to answer your questions. Could you share here what you did already, with a patch or something?

          Show
          jacques.le.roux Jacques Le Roux added a comment - Thanks for your interest in this feature Parimal, With last Paul's answer I suppose you guessed he is pretty busy at the moment and can't answer you thoroughly. Though I did not write the patch (Jinghai Shi did most of it on Paul's requirements), I will try to have a closer look in order to answer your questions. Could you share here what you did already, with a patch or something?
          Hide
          parimal Parimal Gain added a comment - - edited

          Hi Jacques,
          Till now I have gone through the current OOTB implementation and then looked at patch, applied the patch as is and then tested it for above use case. According to current implementation in OOTB there is two part - 1st is creating user friendly url and 2nd is handling the url. Creating user friendly url is done through macro calling and transformation classes and handling that url is done through filter and servlet definition.
          Similarly this patch also contains the transform and filter class, so I assume this should have the above two part. But this patch does not tell about any macro.
          So my question is how we will create the seo urls mentioned in above use cases?
          How the SeoConfig.xml file will be used? although I understand that replacement of main to / is configured in this file and handle through SeoContextFilter.java class but I couldn't understand how that url will be handled which are having parameters (Like use case for search url is mentioned above) or more generic for what all purpose this file will be used?

          Show
          parimal Parimal Gain added a comment - - edited Hi Jacques, Till now I have gone through the current OOTB implementation and then looked at patch, applied the patch as is and then tested it for above use case. According to current implementation in OOTB there is two part - 1st is creating user friendly url and 2nd is handling the url. Creating user friendly url is done through macro calling and transformation classes and handling that url is done through filter and servlet definition. Similarly this patch also contains the transform and filter class, so I assume this should have the above two part. But this patch does not tell about any macro. So my question is how we will create the seo urls mentioned in above use cases? How the SeoConfig.xml file will be used? although I understand that replacement of main to / is configured in this file and handle through SeoContextFilter.java class but I couldn't understand how that url will be handled which are having parameters (Like use case for search url is mentioned above) or more generic for what all purpose this file will be used?
          Hide
          shi.jinghai Shi Jinghai added a comment -

          Hi Parimal,

          I reviewed the patch and compared it with the original work, several files are missing, CatalogUrlSeoTransform.java, CatalogAltUrlSeoTransform.java and etc. which can be configured as ofbizCatalogUrl and ofbizCatalogAltUrl in freemarkerTransforms.properties to replace current implements.

          BTW, the url in freemarker macro body () will not be transformed, only the parameters are transformed, i.e.
          <@ofbizCatalogAltUrl productId=miniProduct.productId/>
          <@ofbizCatalogAltUrl productCategoryId=requestParameters.category_id?exists productId=miniProduct.productId/>

          Show
          shi.jinghai Shi Jinghai added a comment - Hi Parimal, I reviewed the patch and compared it with the original work, several files are missing, CatalogUrlSeoTransform.java, CatalogAltUrlSeoTransform.java and etc. which can be configured as ofbizCatalogUrl and ofbizCatalogAltUrl in freemarkerTransforms.properties to replace current implements. BTW, the url in freemarker macro body () will not be transformed, only the parameters are transformed, i.e. <@ofbizCatalogAltUrl productId=miniProduct.productId/> <@ofbizCatalogAltUrl productCategoryId=requestParameters.category_id?exists productId=miniProduct.productId/>
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Thanks Jinghai,

          Happy to hear of you again . I found 11 of them in the Syracus project, I will add them soon in a zip files...

          The names are
          CatalogAltUrlSeoTransform.java
          CatalogUrlSeoFilter.java
          CatalogUrlSeoTransform.java
          SeoCatalogUrlFilter.java
          SeoCatalogUrlServlet.java
          SeoConfigUtil.java
          SeoContentUrlFilter.java
          SeoContextFilter.java
          SeoControlServlet.java
          SeoTransform.java
          SeoUrlUtil.java

          Hopefully we will not miss anything else, I will try to find this out.

          Show
          jacques.le.roux Jacques Le Roux added a comment - Thanks Jinghai, Happy to hear of you again . I found 11 of them in the Syracus project, I will add them soon in a zip files... The names are CatalogAltUrlSeoTransform.java CatalogUrlSeoFilter.java CatalogUrlSeoTransform.java SeoCatalogUrlFilter.java SeoCatalogUrlServlet.java SeoConfigUtil.java SeoContentUrlFilter.java SeoContextFilter.java SeoControlServlet.java SeoTransform.java SeoUrlUtil.java Hopefully we will not miss anything else, I will try to find this out.
          Hide
          shi.jinghai Shi Jinghai added a comment -

          Thank you Jacques! Sorry for the late reply.

          There are 2 more files: config/urlregexp.xml and dtds/urlregexp.xsd. They are used while generating seo-friendly urls with a product or category name and filtering specail characters in the name.

          Show
          shi.jinghai Shi Jinghai added a comment - Thank you Jacques! Sorry for the late reply. There are 2 more files: config/urlregexp.xml and dtds/urlregexp.xsd. They are used while generating seo-friendly urls with a product or category name and filtering specail characters in the name.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Thanks JInghai,

          I was also wondering about
          UrlRegexpConfigUtil.java
          UrlRegexpContextFilter.java
          UrlRegexpTransform.java
          UrlUtil.java

          I guess I shoull add them also?

          Show
          jacques.le.roux Jacques Le Roux added a comment - Thanks JInghai, I was also wondering about UrlRegexpConfigUtil.java UrlRegexpContextFilter.java UrlRegexpTransform.java UrlUtil.java I guess I shoull add them also?
          Hide
          shi.jinghai Shi Jinghai added a comment -

          Yes please .

          The UrlRegexpTransform can be configured as ofbizUrl macro.

          Show
          shi.jinghai Shi Jinghai added a comment - Yes please . The UrlRegexpTransform can be configured as ofbizUrl macro.
          Hide
          pfm.smits Pierre Smits added a comment -

          Hi all,

          I had a quick review of the latest patch and I found that in SeoConfig.xml following is suggested:
          + <description>sample: remove /ecommerce/main</description>
          + <seo>
          + <url-pattern>^/ecommerce/main$</url-pattern>
          + <replacement>/ecommerce/</replacement>
          + </seo>
          + <forward>
          + <url-pattern>^/ecommerce/main$</url-pattern>
          + <replacement>/ecommerce/</replacement>
          +

          The section /ecommerce/ seems to me like hard-coding a value of a variable.
          In current ecommerce component there is not only an ecommerce webapp, but also a ecomclone webapp. Besides that, one might expect that an organisation that uses the product will use it to have more than one ecommerce solution. Like proposed in the ecommerce component.

          Also, in a multi-tenant environment it is to be expected that more than one tenant will engage in offering ecommerce, but also that is possible that said tenants have more than 1 ecommerce component.
          Therefore, I suggest that you rethink this defining of the value of the variable.

          Regards,

          Pierre

          Show
          pfm.smits Pierre Smits added a comment - Hi all, I had a quick review of the latest patch and I found that in SeoConfig.xml following is suggested: + <description>sample: remove /ecommerce/main</description> + <seo> + <url-pattern>^/ecommerce/main$</url-pattern> + <replacement>/ecommerce/</replacement> + </seo> + <forward> + <url-pattern>^/ecommerce/main$</url-pattern> + <replacement>/ecommerce/</replacement> + The section /ecommerce/ seems to me like hard-coding a value of a variable. In current ecommerce component there is not only an ecommerce webapp, but also a ecomclone webapp. Besides that, one might expect that an organisation that uses the product will use it to have more than one ecommerce solution. Like proposed in the ecommerce component. Also, in a multi-tenant environment it is to be expected that more than one tenant will engage in offering ecommerce, but also that is possible that said tenants have more than 1 ecommerce component. Therefore, I suggest that you rethink this defining of the value of the variable. Regards, Pierre
          Hide
          parimal Parimal Gain added a comment -

          HI Jacques/Jinghai,
          Thanks for your conformation of missing items, I was thinking the same that there is something missing. One more thing I wanted to address here is it will be good (if possible) we can prepare a small document that describe all classes and configuration require or "How To" document to test complete functionality.

          Show
          parimal Parimal Gain added a comment - HI Jacques/Jinghai, Thanks for your conformation of missing items, I was thinking the same that there is something missing. One more thing I wanted to address here is it will be good (if possible) we can prepare a small document that describe all classes and configuration require or "How To" document to test complete functionality.
          Hide
          pfm.smits Pierre Smits added a comment -

          In SeoContextFilter.java with following excerpt of code:

          List<GenericValue> tenants = delegator.findList("Tenant", EntityCondition.makeCondition("domainName", serverName), null, UtilMisc.toList("-createdStamp"), null, false);

          it is tried to get the tenantId from the values in entity Tenant based on the assumption that the serverName (coming from httpRequest.getServerName() ) equals the domainName in the tenant record.

          However, following possibilities may and can occur:
          1. no domainName is set in the tenant record,
          2. a domainName is set, but is different than the serverName resolved
          3. a tenant has multiple ecommerce websites (serverNames) - in combination with the above 2 points,

          The domainName on the tenant record was, if I understand it correctly, to provide users of the backend components with a URL (serverName) that is unique. Not for eCommerce purposes. For eCommerce, amongst other reasons, the entity 'WebSite' was constructed.

          Show
          pfm.smits Pierre Smits added a comment - In SeoContextFilter.java with following excerpt of code: List<GenericValue> tenants = delegator.findList("Tenant", EntityCondition.makeCondition("domainName", serverName), null, UtilMisc.toList("-createdStamp"), null, false); it is tried to get the tenantId from the values in entity Tenant based on the assumption that the serverName (coming from httpRequest.getServerName() ) equals the domainName in the tenant record. However, following possibilities may and can occur: 1. no domainName is set in the tenant record, 2. a domainName is set, but is different than the serverName resolved 3. a tenant has multiple ecommerce websites (serverNames) - in combination with the above 2 points, The domainName on the tenant record was, if I understand it correctly, to provide users of the backend components with a URL (serverName) that is unique. Not for eCommerce purposes. For eCommerce, amongst other reasons, the entity 'WebSite' was constructed.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Here is a new completed patch
          Notes:

          • I have added the files urlregexp.xml and urlregexp.xsd in their OFBiz conventional places
          • I placed the 4 transform classes in specialpurpose\ecommerce\src\org\ofbiz\ecommerce\webapp\control\ftl. Because by OFBiz conventions this is where they are supposed to be, so I moved SeoTransform.java there. Else I keep the Syracus directories structure. . The new ones are
            CatalogAltUrlSeoTransform.java
            UrlRegexpTransform.java
            CatalogUrlSeoTransform.java
          • I have also added those files in specialpurpose\ecommerce\src\org\ofbiz\ecommerce\webapp
            CatalogUrlSeoFilter.java
            CategoryUrlServlet.java
            ControlServlet.java
            ProductUrlServlet.java
            UrlRegexpConfigUtil.java
            UrlRegexpContextFilter.java
            UrlUtil.java
          • I commented out the authorization part in UrlRegexpContextFilter.java (no longer exists in OFBiz trunk), I mean getAuthz() and AbstractAuthorization.clearThreadLocal()
          • tests pass without problems

          Questions to Jinghai:

          1. Why do we need?
            Index: specialpurpose/ecommerce/build.xml
            ===================================================================
            --- specialpurpose/ecommerce/build.xml	(revision 1532805)
            +++ specialpurpose/ecommerce/build.xml	(working copy)
            @@ -48,5 +48,6 @@
                     <fileset dir="../../applications/order/build/lib" includes="*.jar"/>
                     <fileset dir="../../applications/accounting/build/lib" includes="*.jar"/>
                     <fileset dir="../../applications/securityext/build/lib" includes="*.jar"/>
            +        <fileset dir="../../framework/base/lib/scripting" includes="*.jar"/>
                 </path>
             </project>
            
          2. I found several differences between your patch and Syracus for SeoContextFilter.java (see attached SeoContextFilter.java.patch for diff). I saw that in your patch you also removed getAuthz() and AbstractAuthorization.clearThreadLocal() which reassured me about that (I was not anxious ;o). The main point is your moving of the block which begins by // Debug.logInfo("In ContextFilter.doFilter, FORWARDED_FROM_SERVLET is NOT set", module); I suppose your patch is newer, because I checked in my working copy of Syracus and found that you did not touch SeoContextFilter.java since Februrary 2013. Am'I right?
          Show
          jacques.le.roux Jacques Le Roux added a comment - Here is a new completed patch Notes: I have added the files urlregexp.xml and urlregexp.xsd in their OFBiz conventional places I placed the 4 transform classes in specialpurpose\ecommerce\src\org\ofbiz\ecommerce\webapp\control\ftl. Because by OFBiz conventions this is where they are supposed to be, so I moved SeoTransform.java there. Else I keep the Syracus directories structure. . The new ones are CatalogAltUrlSeoTransform.java UrlRegexpTransform.java CatalogUrlSeoTransform.java I have also added those files in specialpurpose\ecommerce\src\org\ofbiz\ecommerce\webapp CatalogUrlSeoFilter.java CategoryUrlServlet.java ControlServlet.java ProductUrlServlet.java UrlRegexpConfigUtil.java UrlRegexpContextFilter.java UrlUtil.java I commented out the authorization part in UrlRegexpContextFilter.java (no longer exists in OFBiz trunk), I mean getAuthz() and AbstractAuthorization.clearThreadLocal() tests pass without problems Questions to Jinghai: Why do we need? Index: specialpurpose/ecommerce/build.xml =================================================================== --- specialpurpose/ecommerce/build.xml (revision 1532805) +++ specialpurpose/ecommerce/build.xml (working copy) @@ -48,5 +48,6 @@ <fileset dir= "../../applications/order/build/lib" includes= "*.jar" /> <fileset dir= "../../applications/accounting/build/lib" includes= "*.jar" /> <fileset dir= "../../applications/securityext/build/lib" includes= "*.jar" /> + <fileset dir= "../../framework/base/lib/scripting" includes= "*.jar" /> </path> </project> I found several differences between your patch and Syracus for SeoContextFilter.java (see attached SeoContextFilter.java.patch for diff). I saw that in your patch you also removed getAuthz() and AbstractAuthorization.clearThreadLocal() which reassured me about that (I was not anxious ;o). The main point is your moving of the block which begins by // Debug.logInfo("In ContextFilter.doFilter, FORWARDED_FROM_SERVLET is NOT set", module); I suppose your patch is newer, because I checked in my working copy of Syracus and found that you did not touch SeoContextFilter.java since Februrary 2013. Am'I right?
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Another last question to Jinghai: did you add specific tests for the new feature?

          Thanks all for support, reviews tests and comments are most welcome...

          Show
          jacques.le.roux Jacques Le Roux added a comment - Another last question to Jinghai: did you add specific tests for the new feature? Thanks all for support, reviews tests and comments are most welcome...
          Hide
          jacques.le.roux Jacques Le Roux added a comment - - edited

          == ANOTHER QUESTION TO JINGHAI ==
          Quoting Parimal:

          One more thing I wanted to address here is it will be good (if possible) we can prepare a small document that describe all classes and configuration require or "How To" document to test complete functionality.

          I will try to have that, but not this week I fear... BTW Jinghai could you help on this (you know this stuff more than me)?

          Show
          jacques.le.roux Jacques Le Roux added a comment - - edited == ANOTHER QUESTION TO JINGHAI == Quoting Parimal: One more thing I wanted to address here is it will be good (if possible) we can prepare a small document that describe all classes and configuration require or "How To" document to test complete functionality. I will try to have that, but not this week I fear... BTW Jinghai could you help on this (you know this stuff more than me)?
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Pierre, about your question on SeoConfig: I did not check code yet, but it seems to me that this could be by component (Jinghai, Paul?).
          If it is I will then move SeoConfig.xsd higher (not sure where yet, anyway depends on following for now)
          If it's not this must be an improvement I agree on.

          Show
          jacques.le.roux Jacques Le Roux added a comment - Pierre, about your question on SeoConfig: I did not check code yet, but it seems to me that this could be by component (Jinghai, Paul?). If it is I will then move SeoConfig.xsd higher (not sure where yet, anyway depends on following for now) If it's not this must be an improvement I agree on.
          Hide
          jacques.le.roux Jacques Le Roux added a comment - - edited

          == IN LAST PATCH ==
          I did not notice that Jinghai already used a dtds sub directory, I rather stick to convention, put all in a dtd sub-dir and remove dtds

          Show
          jacques.le.roux Jacques Le Roux added a comment - - edited == IN LAST PATCH == I did not notice that Jinghai already used a dtds sub directory, I rather stick to convention, put all in a dtd sub-dir and remove dtds
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          OK, it seems Java files need some formatting, I will do so in a next patch (no functional changes expected)

          Show
          jacques.le.roux Jacques Le Roux added a comment - OK, it seems Java files need some formatting, I will do so in a next patch (no functional changes expected)
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Last patch version: completly formatted patch

          Show
          jacques.le.roux Jacques Le Roux added a comment - Last patch version: completly formatted patch
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Forgot to recreate the patch after formatting the urlregexp.xml file

          Show
          jacques.le.roux Jacques Le Roux added a comment - Forgot to recreate the patch after formatting the urlregexp.xml file
          Hide
          shi.jinghai Shi Jinghai added a comment -

          Thanks Jacques,

          I'll work on it in this weekend.

          Show
          shi.jinghai Shi Jinghai added a comment - Thanks Jacques, I'll work on it in this weekend.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Since we don't know yet if this proposal will also fix the 3 related issues (we expect so), I have also made these issues "depended upon by". When we will (hopefully) commit this proposal we will clarify and either close these issues or consider them again...

          Reminder: the issues are

          • OFBIZ-4535 Search using Russian word (maybe others) causes distortion and failed product search
          • OFBIZ-2837 Wildcard (%) characters in search fields are manipulated/truncated in screens throughout the system
          • OFBIZ-5030 OfbizCatalogAltUrlTransform does not generate SessionId
          Show
          jacques.le.roux Jacques Le Roux added a comment - Since we don't know yet if this proposal will also fix the 3 related issues (we expect so), I have also made these issues "depended upon by". When we will (hopefully) commit this proposal we will clarify and either close these issues or consider them again... Reminder: the issues are OFBIZ-4535 Search using Russian word (maybe others) causes distortion and failed product search OFBIZ-2837 Wildcard (%) characters in search fields are manipulated/truncated in screens throughout the system OFBIZ-5030 OfbizCatalogAltUrlTransform does not generate SessionId
          Hide
          jacques.le.roux Jacques Le Roux added a comment - - edited

          == PLEASE TEST ==
          For those who did not know yet, this feature is used in ilscipio's Syracus ecommerce demo site (based on OFBiz)

          It would be great if people could test it also there, since this patch comes from this site against an OFBIz version around R11.04)

          Show
          jacques.le.roux Jacques Le Roux added a comment - - edited == PLEASE TEST == For those who did not know yet, this feature is used in ilscipio 's Syracus ecommerce demo site (based on OFBiz) It would be great if people could test it also there, since this patch comes from this site against an OFBIz version around R11.04)
          Hide
          komdata Sebastian Wachinger added a comment - - edited

          I am on of those lunatics brave souls not only using trunk in production sites, but also daring to try out and test patches like the one discussed right here, because I really want to use this important feature asap. After all, having perfect URLs is a key requirement.

          So what I would like to know is:
          Can this here patch coexist with the solution aka CatalogUrlFilter introduced by Hans, or does it break anything?

          For now I would like to continue using CatalogUrlFilter in one existing ecommerce app, and try Paul's solution in another new ecommerce app on the same OFBiz system (of course each with its respectively tailored web.xml).

          Full disclosure: I am doing this on our own projects, not for those of our clients, so the well earned reputation of the great OFBiz framework won't get tarnished either way.

          Show
          komdata Sebastian Wachinger added a comment - - edited I am on of those lunatics brave souls not only using trunk in production sites, but also daring to try out and test patches like the one discussed right here, because I really want to use this important feature asap. After all, having perfect URLs is a key requirement. So what I would like to know is: Can this here patch coexist with the solution aka CatalogUrlFilter introduced by Hans, or does it break anything? For now I would like to continue using CatalogUrlFilter in one existing ecommerce app, and try Paul's solution in another new ecommerce app on the same OFBiz system (of course each with its respectively tailored web.xml ). Full disclosure: I am doing this on our own projects, not for those of our clients, so the well earned reputation of the great OFBiz framework won't get tarnished either way.
          Hide
          jacques.le.roux Jacques Le Roux added a comment - - edited

          HI Sebastian,

          We rely on lunatics, err... brave souls, thanks for you help. We aim to replace Hans's solution, but I dunoo if both can coexist, I guess not wanted, see how Syracus renders URLs...

          Show
          jacques.le.roux Jacques Le Roux added a comment - - edited HI Sebastian, We rely on lunatics , err... brave souls, thanks for you help. We aim to replace Hans's solution, but I dunoo if both can coexist, I guess not wanted, see how Syracus renders URLs...
          Hide
          madppiper Paul Piper added a comment -

          Both can coexist, btw. and actually should coexist. Having a filter for the dynamic pages (products, catalog/category) is the proper way to maintain those without much problem. Our goal was rather to give more flexibility with URLS as a whole, catalog included.

          Oh and btw, if things get urgent, feel free to drop me a line

          Show
          madppiper Paul Piper added a comment - Both can coexist, btw. and actually should coexist. Having a filter for the dynamic pages (products, catalog/category) is the proper way to maintain those without much problem. Our goal was rather to give more flexibility with URLS as a whole, catalog included. Oh and btw, if things get urgent, feel free to drop me a line
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Hi Paul,

          Then we wil need to fix Hans's current implementation, see linked issues... We hoped that replacing it would remove those, anyway we will see then...

          Show
          jacques.le.roux Jacques Le Roux added a comment - Hi Paul, Then we wil need to fix Hans's current implementation, see linked issues... We hoped that replacing it would remove those, anyway we will see then...
          Hide
          parimal Parimal Gain added a comment -

          Hi Jacques,

          Latest patch for this issue contains lots of file with duplicate entry, some file are repeating 3 times and some files are repeating 4 times, I have reviewed a 2-3 file and found no difference but couldn't look to all file, so is these file added to verify with Jinghai purposely or its added mistakenly????

          Show
          parimal Parimal Gain added a comment - Hi Jacques, Latest patch for this issue contains lots of file with duplicate entry, some file are repeating 3 times and some files are repeating 4 times, I have reviewed a 2-3 file and found no difference but couldn't look to all file, so is these file added to verify with Jinghai purposely or its added mistakenly????
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Hi Parimal,

          You are right, I don't clearly understand why. When I generate the patch, using any Subversion client, the entries are indeed duplicated. Fortunately, using the cmd line worked cleanly, here is a new patch attached, please check

          Show
          jacques.le.roux Jacques Le Roux added a comment - Hi Parimal, You are right, I don't clearly understand why. When I generate the patch, using any Subversion client, the entries are indeed duplicated. Fortunately, using the cmd line worked cleanly, here is a new patch attached, please check
          Hide
          parimal Parimal Gain added a comment -

          Hi Jacques,
          Thanks for the new patch. After applying the patch when try to build the project its returning following error :
          ofbiz\specialpurpose\ecommerce\src\org\ofbiz\ecommerce\webapp\control\ftl\CatalogAltUrlSeoTransform.java:143: makeProductUrl(javax.servlet.http.HttpServletRequest,java.lang.String,java.lang.String,java.lang.String) in org.ofbiz.product.category.CatalogUrlFilter cannot be applied to
          (org.ofbiz.entity.Delegator,org.ofbiz.product.product.ProductContentWrapper, <nulltype>, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
          url = CatalogUrlSeoFilter.makeProductUrl(delegator, wrapper, null, ((StringModel) prefix).getAsString(), previousCategoryId, productCategoryId, ....

          Looking to the issue I found that CatalogUrlSeoFilter.makeProductUrl( .... method called from CatalogAltUrlSeoTransform.java to make url but CatalogUrlSeoFilter.java class don't have any method with that name although the parent class (CatalogUrlFilter.java) have method with same name but number of argument is not same.

          So I think this patch still missing something or have added wrong java class.

          Show
          parimal Parimal Gain added a comment - Hi Jacques, Thanks for the new patch. After applying the patch when try to build the project its returning following error : ofbiz\specialpurpose\ecommerce\src\org\ofbiz\ecommerce\webapp\control\ftl\CatalogAltUrlSeoTransform.java:143: makeProductUrl(javax.servlet.http.HttpServletRequest,java.lang.String,java.lang.String,java.lang.String) in org.ofbiz.product.category.CatalogUrlFilter cannot be applied to (org.ofbiz.entity.Delegator,org.ofbiz.product.product.ProductContentWrapper, <nulltype>, java.lang.String, java.lang.String, java.lang.String, java.lang.String) url = CatalogUrlSeoFilter.makeProductUrl(delegator, wrapper, null, ((StringModel) prefix).getAsString(), previousCategoryId, productCategoryId, .... Looking to the issue I found that CatalogUrlSeoFilter.makeProductUrl( .... method called from CatalogAltUrlSeoTransform.java to make url but CatalogUrlSeoFilter.java class don't have any method with that name although the parent class (CatalogUrlFilter.java) have method with same name but number of argument is not same. So I think this patch still missing something or have added wrong java class.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Thanks for feedback Parimal,

          My bad, I bindly re-created the patch w/o checking it was compiling. I will have a look...

          Show
          jacques.le.roux Jacques Le Roux added a comment - Thanks for feedback Parimal, My bad, I bindly re-created the patch w/o checking it was compiling. I will have a look...
          Hide
          parimal Parimal Gain added a comment -

          Hi Jacques,
          One more thing here is some file in patch is having '(revision 0)' as text in its name, so its not recognizing correct name as it should be, while running the project. (I have modified the method signature to build the application).

          Show
          parimal Parimal Gain added a comment - Hi Jacques, One more thing here is some file in patch is having '(revision 0)' as text in its name, so its not recognizing correct name as it should be, while running the project. (I have modified the method signature to build the application).
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Yes I noticed that too for a moment, and I believe it's the reason I got an issue with all my svn clients. It's due to the original patch I got from Syracus repo.
          Could you please update the patch here with your own now (keep the same name) ?

          Show
          jacques.le.roux Jacques Le Roux added a comment - Yes I noticed that too for a moment, and I believe it's the reason I got an issue with all my svn clients. It's due to the original patch I got from Syracus repo. Could you please update the patch here with your own now (keep the same name) ?
          Hide
          parimal Parimal Gain added a comment -

          Hi Jacques,
          Here I'm attaching the patch that I have modified to build and run with out any error.
          But I suppose if method is called for the above mention java class then the implementation of that method also persists, that needs to verify once.
          Also if the document could be provided then it will be very helpful to test the functionality ASAP.

          Show
          parimal Parimal Gain added a comment - Hi Jacques, Here I'm attaching the patch that I have modified to build and run with out any error. But I suppose if method is called for the above mention java class then the implementation of that method also persists, that needs to verify once. Also if the document could be provided then it will be very helpful to test the functionality ASAP.
          Hide
          parimal Parimal Gain added a comment -

          Hi Jacquaes/Paul/Jinghai,

          Here is the result of initial testing:
          1. After applying the patch I have submitted I'm able to build and run the application.
          2. After some modification in CatalogUrlSeoTransform.java I'm able to create the User friendly url.
          3. Modification done in makeCategoryUrl() and makeProductUrl() and the modification is :
          Removed: urlBuilder.append(((HttpServletRequest) request.getSession().getServletContext()).getContextPath());
          Added : urlBuilder.append(request.getSession().getServletContext().getContextPath());
          4. Following Url is created:
          Category Url : http://localhost:8080/ecommerce/category/small-gizmos-101.html
          Product Url : http://localhost:8080/ecommerce/product/round-gizmo-gz-2644.html
          5. When clicked on any category or product with above pattern its return 404 Not Found error and in console following error occurred:
          [ControlServlet.java:140:INFO ] [[[product(Domain:http://localhost)] Request Begun, encoding=[UTF-8]- total:since last(Begin):0.0]]
          [CmsEvents.java:145:INFO ] Path INFO for Alias: product/round-gizmo-gz-2644.html
          [CmsEvents.java:391:WARN ] Could not verify contentId [product] to webSiteId [WebStore], returning code 404

          Looking at the issue I found that these request are handling through ControlServlet.java instead of SeoCatalogUrlServlet.java because web.xml has defined the as

          <servlet-mapping>
          <servlet-name>SeoCatalogUrlServlet</servlet-name>
          <url-pattern>/products/*</url-pattern>
          </servlet-mapping>

          So my question is what configuration needs to do to handle these requests or how category and product request will be handled?????

          Show
          parimal Parimal Gain added a comment - Hi Jacquaes/Paul/Jinghai, Here is the result of initial testing: 1. After applying the patch I have submitted I'm able to build and run the application. 2. After some modification in CatalogUrlSeoTransform.java I'm able to create the User friendly url. 3. Modification done in makeCategoryUrl() and makeProductUrl() and the modification is : Removed: urlBuilder.append(((HttpServletRequest) request.getSession().getServletContext()).getContextPath()); Added : urlBuilder.append(request.getSession().getServletContext().getContextPath()); 4. Following Url is created: Category Url : http://localhost:8080/ecommerce/category/small-gizmos-101.html Product Url : http://localhost:8080/ecommerce/product/round-gizmo-gz-2644.html 5. When clicked on any category or product with above pattern its return 404 Not Found error and in console following error occurred: [ControlServlet.java:140:INFO ] [[ [product(Domain:http://localhost)] Request Begun, encoding= [UTF-8] - total:since last(Begin):0.0]] [CmsEvents.java:145:INFO ] Path INFO for Alias: product/round-gizmo-gz-2644.html [CmsEvents.java:391:WARN ] Could not verify contentId [product] to webSiteId [WebStore] , returning code 404 Looking at the issue I found that these request are handling through ControlServlet.java instead of SeoCatalogUrlServlet.java because web.xml has defined the as <servlet-mapping> <servlet-name>SeoCatalogUrlServlet</servlet-name> <url-pattern>/products/*</url-pattern> </servlet-mapping> So my question is what configuration needs to do to handle these requests or how category and product request will be handled?????
          Hide
          shi.jinghai Shi Jinghai added a comment -

          Thanks Parimal,

          I'm working on the 404 problem and refining the implements as well. I'll try to submit a patch today.

          Show
          shi.jinghai Shi Jinghai added a comment - Thanks Parimal, I'm working on the 404 problem and refining the implements as well. I'll try to submit a patch today.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Hi Parimal, Jinghai, Pierre,

          @Parimal, I have applied your patch on a fresh trunk checkout (thanks for the change in freemarkerTransforms.properties i missed). I then created a patch (I attach it here to keep this step clear) before beginning to work on issues I crossed while compiling.

          It's the same than yours but with svn properties for files. Also I replaced
          CatalogUrlSeoFilter.makeProductUrl((HttpServletRequest),...
          CatalogUrlFilter.makeProductUrl(delegator,....
          I'm not quite sure of that yet, but I think the reason is because I was misleaded by Eclipse which suggested CatalogUrlSeoFilter. which extends CatalogUrlFilter. This is certainly due to the change I made to the directory structure (new ftl sub-dir). I will clarify that soon...

          Now I'm facing issues with ConfigXMLReader that Adrian just refactored (I'm using trunk HEAD). I will commit soon a completed patch for trunk HEAD ...

          @Jinghai, I was wondering about freemarkerTransforms.properties files and sharing transform macros with other webapps. I think it's not an issue to let those classes in ecommerce since we (OFBiz team) decided to keep this component in specialpurpose in future OFBiz releases. Anyway we can see that later... Please answer to my questions

          @Pierre, I have still to address your questions about tenants...

          Show
          jacques.le.roux Jacques Le Roux added a comment - Hi Parimal, Jinghai, Pierre, @Parimal, I have applied your patch on a fresh trunk checkout (thanks for the change in freemarkerTransforms.properties i missed). I then created a patch (I attach it here to keep this step clear) before beginning to work on issues I crossed while compiling. It's the same than yours but with svn properties for files. Also I replaced CatalogUrlSeoFilter.makeProductUrl((HttpServletRequest),... CatalogUrlFilter.makeProductUrl(delegator,.... I'm not quite sure of that yet, but I think the reason is because I was misleaded by Eclipse which suggested CatalogUrlSeoFilter. which extends CatalogUrlFilter. This is certainly due to the change I made to the directory structure (new ftl sub-dir). I will clarify that soon... Now I'm facing issues with ConfigXMLReader that Adrian just refactored (I'm using trunk HEAD). I will commit soon a completed patch for trunk HEAD ... @Jinghai, I was wondering about freemarkerTransforms.properties files and sharing transform macros with other webapps. I think it's not an issue to let those classes in ecommerce since we (OFBiz team) decided to keep this component in specialpurpose in future OFBiz releases. Anyway we can see that later... Please answer to my questions @Pierre, I have still to address your questions about tenants...
          Hide
          shi.jinghai Shi Jinghai added a comment -

          Hi Jacques,

          Currently, there's a configuration:
          <allowed-context-paths>/:/ecommerce</allowed-context-paths>
          it's used to check whether it's a frontstore context path, if it is, use the seo transform, if not, fall back to the original one.

          On the freemarkerTransforms.properties, I'd suggest to comment out the new methods, i.e.:
          ofbizCatalogAltUrl=org.ofbiz.product.category.OfbizCatalogAltUrlTransform
          ofbizCatalogUrl=org.ofbiz.product.category.CatalogUrlDirective

          1. ofbizCatalogAltUrl=org.ofbiz.ecommerce.webapp.control.ftl.CatalogAltUrlSeoTransform
          2. ofbizCatalogUrl=org.ofbiz.ecommerce.webapp.control.ftl.CatalogUrlSeoTransform
            Let user decide whether to use them.

          Not sure what's the better way to resolve this dependence problem.

          Show
          shi.jinghai Shi Jinghai added a comment - Hi Jacques, Currently, there's a configuration: <allowed-context-paths>/:/ecommerce</allowed-context-paths> it's used to check whether it's a frontstore context path, if it is, use the seo transform, if not, fall back to the original one. On the freemarkerTransforms.properties, I'd suggest to comment out the new methods, i.e.: ofbizCatalogAltUrl=org.ofbiz.product.category.OfbizCatalogAltUrlTransform ofbizCatalogUrl=org.ofbiz.product.category.CatalogUrlDirective ofbizCatalogAltUrl=org.ofbiz.ecommerce.webapp.control.ftl.CatalogAltUrlSeoTransform ofbizCatalogUrl=org.ofbiz.ecommerce.webapp.control.ftl.CatalogUrlSeoTransform Let user decide whether to use them. Not sure what's the better way to resolve this dependence problem.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Thanks Jinghai,

          Ha yes indeed, I found
          <allowed-context-paths>/:/syracus</allowed-context-paths> in urlregexp.xml
          I have changed it to
          <allowed-context-paths>/:/ecommerce</allowed-context-paths>
          I have still a lot to discover

          For the dependency issue, in my next patch (soon) I will move those transfom in the product component, which should not be dependent on ecommerce.

          BTW, there are questions in my "Last Thursday 12:15" comment that you left behind, could you please review them?

          Show
          jacques.le.roux Jacques Le Roux added a comment - Thanks Jinghai, Ha yes indeed, I found <allowed-context-paths>/:/syracus</allowed-context-paths> in urlregexp.xml I have changed it to <allowed-context-paths>/:/ecommerce</allowed-context-paths> I have still a lot to discover For the dependency issue, in my next patch (soon) I will move those transfom in the product component, which should not be dependent on ecommerce. BTW, there are questions in my "Last Thursday 12:15" comment that you left behind, could you please review them?
          Hide
          parimal Parimal Gain added a comment -

          Yes it is another change that I forget to mention in my comment.

          Show
          parimal Parimal Gain added a comment - Yes it is another change that I forget to mention in my comment.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Mmm... the product dependency from ecommerce issue needs more work, because there are deeper import dependencies, like
          import org.ofbiz.ecommerce.webapp.UrlRegexpConfigUtil;
          import org.ofbiz.ecommerce.webapp.UrlUtil;
          I hope that resolving them will no open a can of worms...

          So I attach my last patch version which applies on trunk HEAD and contains some minor (non functional) other fixes. I will continue to work on these dependencies...

          Show
          jacques.le.roux Jacques Le Roux added a comment - Mmm... the product dependency from ecommerce issue needs more work, because there are deeper import dependencies, like import org.ofbiz.ecommerce.webapp.UrlRegexpConfigUtil; import org.ofbiz.ecommerce.webapp.UrlUtil; I hope that resolving them will no open a can of worms... So I attach my last patch version which applies on trunk HEAD and contains some minor (non functional) other fixes. I will continue to work on these dependencies...
          Hide
          jacques.le.roux Jacques Le Roux added a comment - - edited

          Errr, again the last patch contains too much files. I removed it and will create a new one with hopefully the dependencies fixed...

          Show
          jacques.le.roux Jacques Le Roux added a comment - - edited Errr, again the last patch contains too much files. I removed it and will create a new one with hopefully the dependencies fixed...
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Jinghai,

          OK, I found the reason for
          <fileset dir="../../framework/base/lib/scripting" includes="*.jar"/>
          add
          forget it

          Show
          jacques.le.roux Jacques Le Roux added a comment - Jinghai, OK, I found the reason for <fileset dir="../../framework/base/lib/scripting" includes="*.jar"/> add forget it
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          It was easy to resolve the dependencies. Unfortunately I want to also move the existing product/category transforms into a ftl sub-dir (yes, I'm a purist). When I do that I need to change the package names and add imports (with other minor stuff there also). But then svn keeps removing the files but adds only the changes in the moved files and not the whole. So it can't be applied later on a trunk HEAD working copy, which is quite stupid (I use last svn version). I tried several ways to prevent that, none worked so far :/

          I will continue later...

          Show
          jacques.le.roux Jacques Le Roux added a comment - It was easy to resolve the dependencies. Unfortunately I want to also move the existing product/category transforms into a ftl sub-dir (yes, I'm a purist). When I do that I need to change the package names and add imports (with other minor stuff there also). But then svn keeps removing the files but adds only the changes in the moved files and not the whole. So it can't be applied later on a trunk HEAD working copy, which is quite stupid (I use last svn version). I tried several ways to prevent that, none worked so far :/ I will continue later...
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Actually this was my bad since start. I should have installed these feature in product component and not in ecommerce as it's done in Syracus. After all, even if it's used in ecommerce OOTB, it's category and product related and so should be in product component. So then there are no dependencies issues, and it's easy to share/use at specialpurpose or hot-deploy levels.

          The last patch I attach here, is done this way. I did a cursorily review and changed some minor things (mostly removed useless empty lines in variables declarations). I will continue to review, but this patch version sounds good enough for now.

          Show
          jacques.le.roux Jacques Le Roux added a comment - Actually this was my bad since start. I should have installed these feature in product component and not in ecommerce as it's done in Syracus. After all, even if it's used in ecommerce OOTB, it's category and product related and so should be in product component. So then there are no dependencies issues, and it's easy to share/use at specialpurpose or hot-deploy levels. The last patch I attach here, is done this way. I did a cursorily review and changed some minor things (mostly removed useless empty lines in variables declarations). I will continue to review, but this patch version sounds good enough for now.
          Hide
          jacques.le.roux Jacques Le Roux added a comment - - edited

          == TYPO ==
          There was a small typo in previous patch: (.ftl.ftl.)
          ofbizCatalogUrl=org.ofbiz.product.category.ftl.ftl.CatalogUrlSeoTransform
          this one fixes it.

          Anyway there is till this 404 issue Parimal spoke about and Jinghai is investigating (I will not for now )

          For instance on http://localhost:8080/ecommerce/product/Tiny-Gizmo-gz-1000.html you get a 404 and in log:

              [java] 2013-10-23 17:08:43,843 (http-bio-0.0.0.0-8080-exec-2) [   SeoContextFilter.java:264:WARN ] [Filtered request]: /ecommerce/images/blog.css (404)
              [java] 2013-10-23 17:08:43,843 (http-bio-0.0.0.0-8080-exec-2) [     ControlServlet.java:145:INFO ] [[[error(Domain:http://localhost)] Request Begun, encoding=[UTF-8]- total:0.0,since last(Begin):0.0]]
              [java] 2013-10-23 17:08:43,859 (http-bio-0.0.0.0-8080-exec-2) [          CmsEvents.java:145:INFO ] Path INFO for Alias: error/404.jsp
          [...]
            [java] 2013-10-23 17:09:04,281 (http-bio-0.0.0.0-8080-exec-5) [          CmsEvents.java:145:INFO ] Path INFO for Alias: product/Tiny-Gizmo-gz-1000.html
            [java] 2013-10-23 17:09:04,296 (http-bio-0.0.0.0-8080-exec-5) [          CmsEvents.java:391:WARN ] Could not verify contentId [product] to webSiteId [WebStore], returning code: 404
            [java] 2013-10-23 17:09:04,406 (http-bio-0.0.0.0-8080-exec-5) [     RequestHandler.java:747:INFO ] Ran Event [java:org.ofbiz.content.cms.CmsEvents#cms] from [request], result is [success]
          
          Show
          jacques.le.roux Jacques Le Roux added a comment - - edited == TYPO == There was a small typo in previous patch: (.ftl.ftl.) ofbizCatalogUrl=org.ofbiz.product.category.ftl.ftl.CatalogUrlSeoTransform this one fixes it. Anyway there is till this 404 issue Parimal spoke about and Jinghai is investigating (I will not for now ) For instance on http://localhost:8080/ecommerce/product/Tiny-Gizmo-gz-1000.html you get a 404 and in log: [java] 2013-10-23 17:08:43,843 (http-bio-0.0.0.0-8080-exec-2) [ SeoContextFilter.java:264:WARN ] [Filtered request]: /ecommerce/images/blog.css (404) [java] 2013-10-23 17:08:43,843 (http-bio-0.0.0.0-8080-exec-2) [ ControlServlet.java:145:INFO ] [[[error(Domain:http: //localhost)] Request Begun, encoding=[UTF-8]- total:0.0,since last(Begin):0.0]] [java] 2013-10-23 17:08:43,859 (http-bio-0.0.0.0-8080-exec-2) [ CmsEvents.java:145:INFO ] Path INFO for Alias: error/404.jsp [...] [java] 2013-10-23 17:09:04,281 (http-bio-0.0.0.0-8080-exec-5) [ CmsEvents.java:145:INFO ] Path INFO for Alias: product/Tiny-Gizmo-gz-1000.html [java] 2013-10-23 17:09:04,296 (http-bio-0.0.0.0-8080-exec-5) [ CmsEvents.java:391:WARN ] Could not verify contentId [product] to webSiteId [WebStore], returning code: 404 [java] 2013-10-23 17:09:04,406 (http-bio-0.0.0.0-8080-exec-5) [ RequestHandler.java:747:INFO ] Ran Event [java:org.ofbiz.content.cms.CmsEvents#cms] from [request], result is [success]
          Hide
          shi.jinghai Shi Jinghai added a comment -

          Merged the 2 xml config files into 1 (SeoConfig.xml) and changed config util java file accordingly.

          Show
          shi.jinghai Shi Jinghai added a comment - Merged the 2 xml config files into 1 (SeoConfig.xml) and changed config util java file accordingly.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Hi Jinghai,

          After a cursorily review, I see that your patch is incomplete, but anyway could you explain some of your changes please

          • adding urlregexp.xml in SeoConfig.xml (and I guess same for xsf files)
          • framework/webapp/config/freemarkerTransforms.properties
          • CatalogAltUrlSeoTransform.java renamed SeoCatalogAltUrlTransform.java and changed
          • CatalogUrlSeoTransform.java renamed SeoCatalogUrlTransform.java and changed

          I understand it's not easy to exchange through patches when we have no branches, so I have created https://svn.apache.org/repos/asf/ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23 with my last patch applied... I'm just checking it out now, I will confirm all is ok later...

          Show
          jacques.le.roux Jacques Le Roux added a comment - Hi Jinghai, After a cursorily review, I see that your patch is incomplete, but anyway could you explain some of your changes please adding urlregexp.xml in SeoConfig.xml (and I guess same for xsf files) framework/webapp/config/freemarkerTransforms.properties CatalogAltUrlSeoTransform.java renamed SeoCatalogAltUrlTransform.java and changed CatalogUrlSeoTransform.java renamed SeoCatalogUrlTransform.java and changed I understand it's not easy to exchange through patches when we have no branches, so I have created https://svn.apache.org/repos/asf/ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23 with my last patch applied... I'm just checking it out now, I will confirm all is ok later...
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          OK the branch is correct, you can use it

          Show
          jacques.le.roux Jacques Le Roux added a comment - OK the branch is correct, you can use it
          Hide
          shi.jinghai Shi Jinghai added a comment -

          Hi Jacques,

          This patch is for the seo branch you created last night. There's a bug while checking whether a url path is a category url and it's fixed.

          Several files are for ofbiz old version and can be removed:
          CategoryUrlServlet.java: for /category/ servlet
          ProductUrlServlet.java: for /product/ servlet
          SeoCatalogUrlFilter.java: I cannot remember why it's here. I guess it's because some method is invisible in old version of CatalogUrlFilter.java, so I copied it here.

          Show
          shi.jinghai Shi Jinghai added a comment - Hi Jacques, This patch is for the seo branch you created last night. There's a bug while checking whether a url path is a category url and it's fixed. Several files are for ofbiz old version and can be removed: CategoryUrlServlet.java: for /category/ servlet ProductUrlServlet.java: for /product/ servlet SeoCatalogUrlFilter.java: I cannot remember why it's here. I guess it's because some method is invisible in old version of CatalogUrlFilter.java, so I copied it here.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Thanks Jinghai,

          Your patch is in the branch. Things seem to go well now, there are no longer 404 on product pages at least.

          So guys it's ready to test, just checkout the branch and... enjoy...

          Show
          jacques.le.roux Jacques Le Roux added a comment - Thanks Jinghai, Your patch is in the branch. Things seem to go well now, there are no longer 404 on product pages at least. So guys it's ready to test, just checkout the branch and... enjoy...
          Hide
          jacques.le.roux Jacques Le Roux added a comment - - edited

          == FEEL FREE TO DEBUG ==
          Ha just got this on http://localhost:8080/ecommerce/login

          ERROR in error page, (infinite loop or error page not found with name [/error/error.jsp]), but here is the text just in case it helps you: org.ofbiz.webapp.control.RequestHandlerException: Not accepting insecure form data posted to a secure request

           ---- exception report ----------------------------------------------------------
           Error in request handler:
           Exception: org.ofbiz.webapp.control.RequestHandlerException
           Message: Not accepting insecure form data posted to a secure request
           ---- stack trace ---------------------------------------------------------------
           org.ofbiz.webapp.control.RequestHandlerException: Not accepting insecure form data posted to a secure request
           org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:280)
           org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:219)
           org.ofbiz.webapp.control.ControlServlet.doPost(ControlServlet.java:91)
          

          I will have a look... today... If noboby beats me on it.

          Show
          jacques.le.roux Jacques Le Roux added a comment - - edited == FEEL FREE TO DEBUG == Ha just got this on http://localhost:8080/ecommerce/login ERROR in error page, (infinite loop or error page not found with name [/error/error.jsp] ), but here is the text just in case it helps you: org.ofbiz.webapp.control.RequestHandlerException: Not accepting insecure form data posted to a secure request ---- exception report ---------------------------------------------------------- Error in request handler: Exception: org.ofbiz.webapp.control.RequestHandlerException Message: Not accepting insecure form data posted to a secure request ---- stack trace --------------------------------------------------------------- org.ofbiz.webapp.control.RequestHandlerException: Not accepting insecure form data posted to a secure request org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:280) org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:219) org.ofbiz.webapp.control.ControlServlet.doPost(ControlServlet.java:91) I will have a look... today... If noboby beats me on it.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Just as a note: it's not related to this branch. I can reproduce on a clean trunk working copy

          Show
          jacques.le.roux Jacques Le Roux added a comment - Just as a note: it's not related to this branch. I can reproduce on a clean trunk working copy
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Parimal,

          To clarify testing: all should work like before but the urls should be SEO friendly. So it's more about breaking it, thanks!

          Show
          jacques.le.roux Jacques Le Roux added a comment - Parimal, To clarify testing: all should work like before but the urls should be SEO friendly. So it's more about breaking it, thanks!
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          For the login bug: if I revert to r1535128 even with SEO changes, it works correctly, not with r1535129. So the pb was introduced there. I will have a look and will warn Adrian on dev ML.

          Show
          jacques.le.roux Jacques Le Roux added a comment - For the login bug: if I revert to r1535128 even with SEO changes, it works correctly, not with r1535129. So the pb was introduced there. I will have a look and will warn Adrian on dev ML.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Jinghai,

          I have removed CategoryUrlServlet and ProductUrlServlet classes from the branch

          Show
          jacques.le.roux Jacques Le Roux added a comment - Jinghai, I have removed CategoryUrlServlet and ProductUrlServlet classes from the branch
          Hide
          parimal Parimal Gain added a comment -

          Hi jacques,

          Here I have noticed that the changes Jinghai suggested on 24/10/2013 00:55 with patch is not included in branch i.e. In branch there is still two config file SeoConfig.xml and UrlRegexp.xml. Is this is not relevant?

          Also I request you please attach the latest and complete patch as things has been finalized so that it can be tested to other branch also without digging into files and code level changes.

          Show
          parimal Parimal Gain added a comment - Hi jacques, Here I have noticed that the changes Jinghai suggested on 24/10/2013 00:55 with patch is not included in branch i.e. In branch there is still two config file SeoConfig.xml and UrlRegexp.xml. Is this is not relevant? Also I request you please attach the latest and complete patch as things has been finalized so that it can be tested to other branch also without digging into files and code level changes.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Hi Parimal,

          Yes I believe we can indeed merge the SeoConfig and UrlRegexp xml and xsd files. Not a biggie for now but I will do.

          OK, I will create a complete patch from the branch against the trunk HEAD

          Show
          jacques.le.roux Jacques Le Roux added a comment - Hi Parimal, Yes I believe we can indeed merge the SeoConfig and UrlRegexp xml and xsd files. Not a biggie for now but I will do. OK, I will create a complete patch from the branch against the trunk HEAD
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Parimal,

          I finally think it's better to let you create the patch between the branch and your branch of the trunk when you need it. Because things will continue to change on both sides and I don't see myself updating patches for you . You just have to merge the seo branch in your branch or trunk and then you are able to create a patch from the newly merged working copy.

          Show
          jacques.le.roux Jacques Le Roux added a comment - Parimal, I finally think it's better to let you create the patch between the branch and your branch of the trunk when you need it. Because things will continue to change on both sides and I don't see myself updating patches for you . You just have to merge the seo branch in your branch or trunk and then you are able to create a patch from the newly merged working copy.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Note: I'm still considering

          • To remove SeoCatalogUrlFilter.java
          • To add
            #ofbizUrl=org.ofbiz.webapp.ftl.OfbizUrlTransform
            ofbizUrl=org.ofbiz.product.category.ftl.UrlRegexpTransform
            into framework/webapp freemarkerTransforms.properties
          Show
          jacques.le.roux Jacques Le Roux added a comment - Note: I'm still considering To remove SeoCatalogUrlFilter.java To add #ofbizUrl=org.ofbiz.webapp.ftl.OfbizUrlTransform ofbizUrl=org.ofbiz.product.category.ftl.UrlRegexpTransform into framework/webapp freemarkerTransforms.properties
          Hide
          jacques.le.roux Jacques Le Roux added a comment - - edited

          == TYPO (PATCH READY) ==
          I have

          • As suggested by Jinghai, merged SeoConfig and urlregexp files into SeoConfig files only
          • Removed SeoCatalogUrlFilter.java, it's not used and only a kind of duplicate of CatalogUrlFilter.java

          Parimal, I will create a patch for you now

          Show
          jacques.le.roux Jacques Le Roux added a comment - - edited == TYPO (PATCH READY) == I have As suggested by Jinghai, merged SeoConfig and urlregexp files into SeoConfig files only Removed SeoCatalogUrlFilter.java, it's not used and only a kind of duplicate of CatalogUrlFilter.java Parimal, I will create a patch for you now
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Patch done by a merge from seo branch to trunk HEAD (r1535432)

          Show
          jacques.le.roux Jacques Le Roux added a comment - Patch done by a merge from seo branch to trunk HEAD (r1535432)
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          BTW Parimal, in your "15/Oct/13 11:16" comment you stated a number of SEO requirements. I think most of what you wrote is now done. And the feature is already flexible/parametrizable enough to allow more, or missing if needed. Anyway this can be enhanced of course...

          Show
          jacques.le.roux Jacques Le Roux added a comment - BTW Parimal, in your "15/Oct/13 11:16" comment you stated a number of SEO requirements. I think most of what you wrote is now done. And the feature is already flexible/parametrizable enough to allow more, or missing if needed. Anyway this can be enhanced of course...
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          When doing

          As suggested by Jinghai, merged SeoConfig and urlregexp files into SeoConfig files only

          I missed a change for URL_REGEXP_CONFIG_FILENAME in UrlRegexpConfigUtil.java. Committed in SEO branch at revision: 1535575
          Parimal please update your patch

          I will try to do a complete review of the added/changed code in branch tomorrow...

          Show
          jacques.le.roux Jacques Le Roux added a comment - When doing As suggested by Jinghai, merged SeoConfig and urlregexp files into SeoConfig files only I missed a change for URL_REGEXP_CONFIG_FILENAME in UrlRegexpConfigUtil.java. Committed in SEO branch at revision: 1535575 Parimal please update your patch I will try to do a complete review of the added/changed code in branch tomorrow...
          Hide
          parimal Parimal Gain added a comment -

          Thanks Jacques. Yes I'll test all scenario I have stated, on latest patch and will come back if I require more information.

          Show
          parimal Parimal Gain added a comment - Thanks Jacques. Yes I'll test all scenario I have stated, on latest patch and will come back if I require more information.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Trunk HEAD merged

          Show
          jacques.le.roux Jacques Le Roux added a comment - Trunk HEAD merged
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Reminder for myself, the points I want at least to check before considering a merge in trunk:

          Others are encouraged to check also

          Show
          jacques.le.roux Jacques Le Roux added a comment - Reminder for myself, the points I want at least to check before considering a merge in trunk: The Perl5Matcher Perl5Compiler are not thread safe . Check if it could be an issue here (if separated instances should be created per thread) Check Pierre Smits's comment above about multi-tenant in ecommerce Check the use org.ofbiz.product.category.ftl.UrlRegexpTransform instead of org.ofbiz.webapp.ftl.OfbizUrlTransform for ofbizUrl macro Others are encouraged to check also
          Hide
          parimal Parimal Gain added a comment -

          Hi jacques/Jinghai,

          I have some quick question here :
          1. After converting two config file to one file replacing special character is not working because UrlRegexpConfigUtil.getNameFilters().keySet() return empty list although I have modified URL_REGEXP_CONFIG_FILENAME to "SeoConfig.xml" in UrlRegexpConfigUtil.java.
          2. While making user friendly url converting productId/categoryId to lowercase and then converting it to upper case while handling the url is not good Idea because there is no restriction on productId definition, so if the Id is in mixed case then while handling will not get correct productId and it will not display product page.
          3. What is the purpose of UrlRegexpConfigUtil.getSpecialProductId(tempProductId).

          Show
          parimal Parimal Gain added a comment - Hi jacques/Jinghai, I have some quick question here : 1. After converting two config file to one file replacing special character is not working because UrlRegexpConfigUtil.getNameFilters().keySet() return empty list although I have modified URL_REGEXP_CONFIG_FILENAME to "SeoConfig.xml" in UrlRegexpConfigUtil.java. 2. While making user friendly url converting productId/categoryId to lowercase and then converting it to upper case while handling the url is not good Idea because there is no restriction on productId definition, so if the Id is in mixed case then while handling will not get correct productId and it will not display product page. 3. What is the purpose of UrlRegexpConfigUtil.getSpecialProductId(tempProductId).
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Hi Parimal,

          1. I have maybe missed something else, I will double check
          2. I will check and change that
          3. I let Jinghai answer
          Show
          jacques.le.roux Jacques Le Roux added a comment - Hi Parimal, I have maybe missed something else, I will double check I will check and change that I let Jinghai answer
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          I just reviewed UrlRegexpContextFilter.java and I see a number of swallowed catches, I don't like that much. At least we should put <<Debug.logError(e, module);>> when we have no ideas about what's going, and that's what I will do for all added classes here.

          Show
          jacques.le.roux Jacques Le Roux added a comment - I just reviewed UrlRegexpContextFilter.java and I see a number of swallowed catches, I don't like that much. At least we should put <<Debug.logError(e, module);>> when we have no ideas about what's going, and that's what I will do for all added classes here.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Actually, following Jinghai's code, I will rather use debug warnings in most places

          Show
          jacques.le.roux Jacques Le Roux added a comment - Actually, following Jinghai's code, I will rather use debug warnings in most places
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Done, also trunk HEAD merged

          Show
          jacques.le.roux Jacques Le Roux added a comment - Done, also trunk HEAD merged
          Hide
          parimal Parimal Gain added a comment - - edited

          Hi Jacques/Jinghai,

          While testing I got couple of more question here, I have some short of answers for these but it will be good to get answers from you guys. Questiones are -
          1. Url contains category/ or product/ as prefix - Is it posible to remove this prefix from the category and product url? Although I know these prefix is used to differanciate the category and product request at filtration level, I'm asking these for posiblity, and if yes then what should the best approch?
          2. Changing the url pattern of category is configurable using config files or it require customization at code level?
          eg. - Current url for category contains the name of current category only er-respective of category level, but in my comment the pattern contains parent/child hierarchy including level. So is it configurable using config file?
          3. Adding the productId/categoryId in url should be configurable, so that business can take decision on the basis of there requiement and intrest.
          4. How the content url can be configured? - For the seo perspective I feel the url should be Domain_Name/content/content_name.
          5. Similarly the url for search should be Domain_Name/search/keyword - so these urls can be configured?
          6. Configuration files and its utility class contains various configuration parameters and there respective effect in url, but I think most of us don't know about all parameters. So it will be really helpful if at lease these paramerers can be defined.

          Thanks in Advance!!!

          Show
          parimal Parimal Gain added a comment - - edited Hi Jacques/Jinghai, While testing I got couple of more question here, I have some short of answers for these but it will be good to get answers from you guys. Questiones are - 1. Url contains category/ or product/ as prefix - Is it posible to remove this prefix from the category and product url? Although I know these prefix is used to differanciate the category and product request at filtration level, I'm asking these for posiblity, and if yes then what should the best approch? 2. Changing the url pattern of category is configurable using config files or it require customization at code level? eg. - Current url for category contains the name of current category only er-respective of category level, but in my comment the pattern contains parent/child hierarchy including level. So is it configurable using config file? 3. Adding the productId/categoryId in url should be configurable, so that business can take decision on the basis of there requiement and intrest. 4. How the content url can be configured? - For the seo perspective I feel the url should be Domain_Name/content/content_name. 5. Similarly the url for search should be Domain_Name/search/keyword - so these urls can be configured? 6. Configuration files and its utility class contains various configuration parameters and there respective effect in url, but I think most of us don't know about all parameters. So it will be really helpful if at lease these paramerers can be defined. Thanks in Advance!!!
          Hide
          shi.jinghai Shi Jinghai added a comment -

          Hi Parimal,

          Honestly, I don't know SEO, I only implemented the requirements Paul and Jacques mentioned in this issue. I'm not sure whether making url easy to read and understand for human is a rule of SEO, but I do keep it, this is the reason why name is lower-cased, id is upper-cased and special characters are replaced.

          Not sure the content url and search url part, I can't remember I worked on them.

          Now I can visit apache svn and jira now which I couldn't several days ago. I'll update the code and make it work as required if it does not.

          Show
          shi.jinghai Shi Jinghai added a comment - Hi Parimal, Honestly, I don't know SEO, I only implemented the requirements Paul and Jacques mentioned in this issue. I'm not sure whether making url easy to read and understand for human is a rule of SEO, but I do keep it, this is the reason why name is lower-cased, id is upper-cased and special characters are replaced. Not sure the content url and search url part, I can't remember I worked on them. Now I can visit apache svn and jira now which I couldn't several days ago. I'll update the code and make it work as required if it does not.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Hi Jinghai,

          Thanks for the clarification. Special characters should be UTF-8 encoded. But, since for different product and categories names we don't fear duplicated contents, there are no needs to change them, we can keep the original product and categories names, I believe it's even better. Could you take this part (points 2 and 3 of Parima's "Last Monday 11:21" comment)?

          I will try to handle the merging of the two config files, notably I will refactor the *ConfigUtil.java into one only files, like we did for xml and xsd.

          Show
          jacques.le.roux Jacques Le Roux added a comment - Hi Jinghai, Thanks for the clarification. Special characters should be UTF-8 encoded. But, since for different product and categories names we don't fear duplicated contents, there are no needs to change them, we can keep the original product and categories names, I believe it's even better. Could you take this part (points 2 and 3 of Parima's "Last Monday 11:21" comment)? I will try to handle the merging of the two config files, notably I will refactor the *ConfigUtil.java into one only files, like we did for xml and xsd.
          Hide
          parimal Parimal Gain added a comment -

          Hi Jinghai,
          I'm also not the SEO expert, I'm talking about the point mentioned in the initial requirement from Paul's discussion i.e.
          — Configurable product/category and other URLs
          so what this means, can a business configure the product/category url according to there understanding or requirement like I have one example of category hierarchy (I'm not considering which one will be good) or the pattern this solution has(displaying the name of current category only) is fixed and if some business wanted to change the pattern then the code have to be customized?

          Show
          parimal Parimal Gain added a comment - Hi Jinghai, I'm also not the SEO expert, I'm talking about the point mentioned in the initial requirement from Paul's discussion i.e. — Configurable product/category and other URLs so what this means, can a business configure the product/category url according to there understanding or requirement like I have one example of category hierarchy (I'm not considering which one will be good) or the pattern this solution has(displaying the name of current category only) is fixed and if some business wanted to change the pattern then the code have to be customized?
          Hide
          shi.jinghai Shi Jinghai added a comment -

          Hi Jacques,

          I made the following changes in this patch:
          1. Merged UrlUtil.java into SeoUrlUtil.java
          2. Merged UrlRegexpConfigUtil.java into SeoConfigUtil.java
          3. Changed all DEFAULT_MASK to READ_ONLY_MASK as it's suggested in Perl5Compiler javadoc
          4. Replaced RequestHandler.getDefaultServerRootUrl in CatalogAltUrlSeoTransform.java with OfbizUrlBuilder methods

          Show
          shi.jinghai Shi Jinghai added a comment - Hi Jacques, I made the following changes in this patch: 1. Merged UrlUtil.java into SeoUrlUtil.java 2. Merged UrlRegexpConfigUtil.java into SeoConfigUtil.java 3. Changed all DEFAULT_MASK to READ_ONLY_MASK as it's suggested in Perl5Compiler javadoc 4. Replaced RequestHandler.getDefaultServerRootUrl in CatalogAltUrlSeoTransform.java with OfbizUrlBuilder methods
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Thanks Jinghai,

          Your patch is in SEO branch at revision: 1537495 .

          After a complete review, I

          • replaced all tabs by 4 spaces
          • removed empty lines in variables declarations
          • formatted some expressions to stay on same (not too long) line

          I noticed that UrlRegexpConfigUtil.getForwardPatterns() has been replaced by SeoConfigUtil.getSeoPatterns()
          I guess it's ok since done twice and seems not a wrong C/P

          Show
          jacques.le.roux Jacques Le Roux added a comment - Thanks Jinghai, Your patch is in SEO branch at revision: 1537495 . After a complete review, I replaced all tabs by 4 spaces removed empty lines in variables declarations formatted some expressions to stay on same (not too long) line I noticed that UrlRegexpConfigUtil.getForwardPatterns() has been replaced by SeoConfigUtil.getSeoPatterns() I guess it's ok since done twice and seems not a wrong C/P
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Above I noted to check:

          1. The Perl5Matcher Perl5Compiler are not thread safe. Check if it could be an issue here (if separated instances should be created per thread)
          2. Check Pierre Smits's comment above about multi-tenant in ecommerce
          3. Check the use org.ofbiz.product.category.ftl.UrlRegexpTransform instead of org.ofbiz.webapp.ftl.OfbizUrlTransform for ofbizUrl macro

          1. is now OK (well done Jinghai)
          2. TODO
          3. TODO
          Show
          jacques.le.roux Jacques Le Roux added a comment - Above I noted to check: 1. The Perl5Matcher Perl5Compiler are not thread safe. Check if it could be an issue here (if separated instances should be created per thread) 2. Check Pierre Smits's comment above about multi-tenant in ecommerce 3. Check the use org.ofbiz.product.category.ftl.UrlRegexpTransform instead of org.ofbiz.webapp.ftl.OfbizUrlTransform for ofbizUrl macro is now OK (well done Jinghai) TODO TODO
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          I merged trunk HEAD in SEO branch at revision: 1537507

          Show
          jacques.le.roux Jacques Le Roux added a comment - I merged trunk HEAD in SEO branch at revision: 1537507
          Hide
          madppiper Paul Piper added a comment -


          1. Url contains category/ or product/ as prefix - Is it posible to remove this prefix from the category and product url? Although I know these prefix is used to differanciate the category and product request at filtration level, I'm asking these for posiblity, and if yes then what should the best approch?

          You do need to have "some" prefix to work your way around one or the other, so removing it entirely is not really an option at this moment. Otherwise you risk problems when a category "shoe" also happens to be in the identifier for a product of sorts. From a SEO perspective, an identifier doesn't hurt, more importantly you have to make sure that the urls are unique and contain some of the keywords connected to the page they deliver. So I would say: let's focus on the proper url structure frist, before moving on.

          2. Changing the url pattern of category is configurable using config files or it require customization at code level?
          eg. - Current url for category contains the name of current category only er-respective of category level, but in my comment the pattern contains parent/child hierarchy including level. So is it configurable using config file?

          I am uncertain I understand correctly. What is the behavior you want to achieve? It should be configurable in most cases...

          3. Adding the productId/categoryId in url should be configurable, so that business can take decision on the basis of there requiement and intrest.

          Unless we add a new entity that maps Ids to paths, there is currently no way to go without the ids. From a SEO perspective, it doesn't hurt, however and is probably the best way to keep urls unique. Even with auto-generated full urls, it may be that you have to add a number to keep urls unique, so I say it isn't really a necessity anyway.

          4. How the content url can be configured? - For the seo perspective I feel the url should be Domain_Name/content/content_name.

          We focused on most of the other aspects of the auto-generated urls. I do agree that we may want to take a second look at the cms implementation for ofbiz...

          5. Similarly the url for search should be Domain_Name/search/keyword - so these urls can be configured?

          In addition to 4. I think that both could be implemented without too much effort. Take a look at how the products / categories were handled. Perhaps you can supply a patch?

          6. Configuration files and its utility class contains various configuration parameters and there respective effect in url, but I think most of us don't know about all parameters. So it will be really helpful if at lease these paramerers can be defined.

          What would be the benefit? Shouldn't we rather begin documenting the parameters we use within ofbiz applications?

          Show
          madppiper Paul Piper added a comment - 1. Url contains category/ or product/ as prefix - Is it posible to remove this prefix from the category and product url? Although I know these prefix is used to differanciate the category and product request at filtration level, I'm asking these for posiblity, and if yes then what should the best approch? You do need to have "some" prefix to work your way around one or the other, so removing it entirely is not really an option at this moment. Otherwise you risk problems when a category "shoe" also happens to be in the identifier for a product of sorts. From a SEO perspective, an identifier doesn't hurt, more importantly you have to make sure that the urls are unique and contain some of the keywords connected to the page they deliver. So I would say: let's focus on the proper url structure frist, before moving on. 2. Changing the url pattern of category is configurable using config files or it require customization at code level? eg. - Current url for category contains the name of current category only er-respective of category level, but in my comment the pattern contains parent/child hierarchy including level. So is it configurable using config file? I am uncertain I understand correctly. What is the behavior you want to achieve? It should be configurable in most cases... 3. Adding the productId/categoryId in url should be configurable, so that business can take decision on the basis of there requiement and intrest. Unless we add a new entity that maps Ids to paths, there is currently no way to go without the ids. From a SEO perspective, it doesn't hurt, however and is probably the best way to keep urls unique. Even with auto-generated full urls, it may be that you have to add a number to keep urls unique, so I say it isn't really a necessity anyway. 4. How the content url can be configured? - For the seo perspective I feel the url should be Domain_Name/content/content_name. We focused on most of the other aspects of the auto-generated urls. I do agree that we may want to take a second look at the cms implementation for ofbiz... 5. Similarly the url for search should be Domain_Name/search/keyword - so these urls can be configured? In addition to 4. I think that both could be implemented without too much effort. Take a look at how the products / categories were handled. Perhaps you can supply a patch? 6. Configuration files and its utility class contains various configuration parameters and there respective effect in url, but I think most of us don't know about all parameters. So it will be really helpful if at lease these paramerers can be defined. What would be the benefit? Shouldn't we rather begin documenting the parameters we use within ofbiz applications?
          Hide
          jacques.le.roux Jacques Le Roux added a comment - - edited

          Above I noted to check:

          1. While making user friendly url converting productId/categoryId to lowercase and then converting it to upper case while handling the url is not good Idea because there is no restriction on productId definition, so if the Id is in mixed case then while handling will not get correct productId and it will not display product page
          2. Check Pierre Smits's comment above about multi-tenant in ecommerce
          3. Check the use org.ofbiz.product.category.ftl.UrlRegexpTransform instead of org.ofbiz.webapp.ftl.OfbizUrlTransform for ofbizUrl macro

          1. TODO : Special characters should be UTF-8 encoded. But, since for different product and categories names we don't fear duplicated contents, there are no needs to change them, we can keep the original product and categories names, I believe it's even better.
          2. TODO
          3. TODO
          Show
          jacques.le.roux Jacques Le Roux added a comment - - edited Above I noted to check: 1. While making user friendly url converting productId/categoryId to lowercase and then converting it to upper case while handling the url is not good Idea because there is no restriction on productId definition, so if the Id is in mixed case then while handling will not get correct productId and it will not display product page 2. Check Pierre Smits's comment above about multi-tenant in ecommerce 3. Check the use org.ofbiz.product.category.ftl.UrlRegexpTransform instead of org.ofbiz.webapp.ftl.OfbizUrlTransform for ofbizUrl macro TODO : Special characters should be UTF-8 encoded. But, since for different product and categories names we don't fear duplicated contents, there are no needs to change them, we can keep the original product and categories names, I believe it's even better. TODO TODO
          Hide
          parimal Parimal Gain added a comment -

          Hi Paul,

          You do need to have "some" prefix to work your way around one or the other, so removing it entirely is not really an option at this moment. Otherwise you risk problems when a category "shoe" also happens to be in the identifier for a product of sorts. From a SEO perspective, an identifier doesn't hurt, more importantly you have to make sure that the urls are unique and contain some of the keywords connected to the page they deliver. So I would say: let's focus on the proper url structure frist, before moving on.

          Ya I checked the effect of removing it. Thanks for the useful tips

          I am uncertain I understand correctly. What is the behavior you want to achieve? It should be configurable in most cases...

          I'm talking about the configuration of url structure depending upon the category level.
          eg. Current Pattern : http://localhost:8080/ecommerce/category/small-gizmos-101.html
          Asking Pattern : http://www.abcde.com/footwear/sports/men
          where footwear is the name of level 1 category, sports is the name of level 2 category & men is the name of level 3 category.

          Unless we add a new entity that maps Ids to paths, there is currently no way to go without the ids. From a SEO perspective, it doesn't hurt, however and is probably the best way to keep urls unique. Even with auto-generated full urls, it may be that you have to add a number to keep urls unique, so I say it isn't really a necessity anyway.

          You are right, Currently it's not possible. Thanks !!!!

          In addition to 4. I think that both could be implemented without too much effort. Take a look at how the products / categories were handled. Perhaps you can supply a patch?

          SeoContentUrlFilter.java exists in the patch, so I thought its already done. BTW I'll try and submit the patch if possible.

          What would be the benefit? Shouldn't we rather begin documenting the parameters we use within ofbiz applications?

          It will be really good if all parameters used in OFBiz configuration can be documented, but I believe documenting/defining the SEO parameters could be the start and since its currently in the testing phase so every body can understand the purpose of each parameters and can test its effect on url with different value ............

          Show
          parimal Parimal Gain added a comment - Hi Paul, You do need to have "some" prefix to work your way around one or the other, so removing it entirely is not really an option at this moment. Otherwise you risk problems when a category "shoe" also happens to be in the identifier for a product of sorts. From a SEO perspective, an identifier doesn't hurt, more importantly you have to make sure that the urls are unique and contain some of the keywords connected to the page they deliver. So I would say: let's focus on the proper url structure frist, before moving on. Ya I checked the effect of removing it. Thanks for the useful tips I am uncertain I understand correctly. What is the behavior you want to achieve? It should be configurable in most cases... I'm talking about the configuration of url structure depending upon the category level. eg. Current Pattern : http://localhost:8080/ecommerce/category/small-gizmos-101.html Asking Pattern : http://www.abcde.com/footwear/sports/men where footwear is the name of level 1 category, sports is the name of level 2 category & men is the name of level 3 category. Unless we add a new entity that maps Ids to paths, there is currently no way to go without the ids. From a SEO perspective, it doesn't hurt, however and is probably the best way to keep urls unique. Even with auto-generated full urls, it may be that you have to add a number to keep urls unique, so I say it isn't really a necessity anyway. You are right, Currently it's not possible. Thanks !!!! In addition to 4. I think that both could be implemented without too much effort. Take a look at how the products / categories were handled. Perhaps you can supply a patch? SeoContentUrlFilter.java exists in the patch, so I thought its already done. BTW I'll try and submit the patch if possible. What would be the benefit? Shouldn't we rather begin documenting the parameters we use within ofbiz applications? It will be really good if all parameters used in OFBiz configuration can be documented, but I believe documenting/defining the SEO parameters could be the start and since its currently in the testing phase so every body can understand the purpose of each parameters and can test its effect on url with different value ............
          Hide
          komdata Sebastian Wachinger added a comment - - edited

          I tested the seo-branch and it works. Big THANKS to all involved!

          Now I want to add my 2 cents:

          • I would opt for having the category and product name in lower case in the URL
          • but the product ID in its original case (for example we do have all SKUs in upper case)
          • I think we should get rid of the .html suffix. I could not find any arguments pro using it, and it sure does not look pretty.
          Show
          komdata Sebastian Wachinger added a comment - - edited I tested the seo-branch and it works. Big THANKS to all involved! Now I want to add my 2 cents: I would opt for having the category and product name in lower case in the URL but the product ID in its original case (for example we do have all SKUs in upper case) I think we should get rid of the .html suffix. I could not find any arguments pro using it, and it sure does not look pretty.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Hi Sebastian,

          1. I don't agree. We should have a sole url to a category or product. This to prevent duplicated contents which are a major SEO concern. See point 2 below.
          2. Thanks for the reminder, I indeed already answered to this point at https://issues.apache.org/jira/browse/OFBIZ-5312?focusedCommentId=13808947 and asked there Jinghai to have a look at it. Please Jinghai could you answer? Else I will have a look as soon as I will get a chance
          3. I have no clear idea about that, why do you find it not pretty? So I believe it's a moot point, and I can't find clear SEO reasons for this Googling for "seo suffix html". I have asked a SEO specialist. Paul any explanations this was picked?
          Show
          jacques.le.roux Jacques Le Roux added a comment - Hi Sebastian, I don't agree. We should have a sole url to a category or product. This to prevent duplicated contents which are a major SEO concern. See point 2 below. Thanks for the reminder, I indeed already answered to this point at https://issues.apache.org/jira/browse/OFBIZ-5312?focusedCommentId=13808947 and asked there Jinghai to have a look at it. Please Jinghai could you answer? Else I will have a look as soon as I will get a chance I have no clear idea about that, why do you find it not pretty? So I believe it's a moot point, and I can't find clear SEO reasons for this Googling for "seo suffix html". I have asked a SEO specialist. Paul any explanations this was picked?
          Hide
          komdata Sebastian Wachinger added a comment - - edited

          Hi Jacques,

          I guess you are right, let's just keep the names of categories, products and product IDs the way they are defined in the catalog, no need really to meddle here with upper/lower case.

          The .html suffix . . . well, sometimes you end up publishing deep links to a product page on places like a facebook page, and maybe it's indeed just a matter of taste, but for my liking URLs look better without geeky stuff like file extensions that carry no meaning to the average user without technical background.
          And of course we introduce another error source, now what was it again, .html or .htm . . . SEO-wise it doesn't matter anyway.

          I think it probably might be a good idea to quote the latest comment from Paul on OFBIZ-4535 in this thread as well:

          So now upper and lower case both work, and the product bit can be used or not or be replaced at will?

          that is indeed less than ideal. It probably derives from the fact that only the productId/categoryId is evaluated in the url structure, and not the rest of the string. It probably isn't "too dangerous" if the generated URL is kept the same, but it is risky and not ideal to say the least. If we do not want to implement a url database on an entity level, i would propose to build a simple filter that:

          1. Looks up request URL
          2. Identifies productid/categoryid/catalogid/contentid in the string
          3. Uses the generator to generate a new request url
          4. matches both, the generated string and the request url and does a request redirect if they don't match...

          Show
          komdata Sebastian Wachinger added a comment - - edited Hi Jacques, I guess you are right, let's just keep the names of categories, products and product IDs the way they are defined in the catalog, no need really to meddle here with upper/lower case. The .html suffix . . . well, sometimes you end up publishing deep links to a product page on places like a facebook page, and maybe it's indeed just a matter of taste, but for my liking URLs look better without geeky stuff like file extensions that carry no meaning to the average user without technical background. And of course we introduce another error source, now what was it again, .html or .htm . . . SEO-wise it doesn't matter anyway. I think it probably might be a good idea to quote the latest comment from Paul on OFBIZ-4535 in this thread as well: So now upper and lower case both work, and the product bit can be used or not or be replaced at will? that is indeed less than ideal. It probably derives from the fact that only the productId/categoryId is evaluated in the url structure, and not the rest of the string. It probably isn't "too dangerous" if the generated URL is kept the same, but it is risky and not ideal to say the least. If we do not want to implement a url database on an entity level, i would propose to build a simple filter that: 1. Looks up request URL 2. Identifies productid/categoryid/catalogid/contentid in the string 3. Uses the generator to generate a new request url 4. matches both, the generated string and the request url and does a request redirect if they don't match...
          Hide
          madppiper Paul Piper added a comment -
          • I would opt for having the category and product name in lower case in the URL
          • but the product ID in its original case (for example we do have all SKUs in upper case)
          • I think we should get rid of the .html suffix. I could not find any arguments pro using it, and it sure does not look pretty.

          Upper and lowercase do not make a difference from a seo perspective, so a change would only be for the aesthetics. From a technical perspective, however, a change like this is quite dangerous, as we are bound to the id strings themselves and cannot assume that "myProductId1" is equal to "myproductid1". Since OFBiz uses Strings to identify products and such, it is possible that users actually use the upper-and-lowercases for differentiating items. Admittedly it is not a strong point, but it is one we have to keep in mind. So since we are only talking aesthetics and nowadays URLs have the tendency not to be typed out anymore, i would leave it as is.

          We can get rid of the html, however. It doesn't add anything and is just a personal preference...

          Show
          madppiper Paul Piper added a comment - I would opt for having the category and product name in lower case in the URL but the product ID in its original case (for example we do have all SKUs in upper case) I think we should get rid of the .html suffix. I could not find any arguments pro using it, and it sure does not look pretty. Upper and lowercase do not make a difference from a seo perspective, so a change would only be for the aesthetics. From a technical perspective, however, a change like this is quite dangerous, as we are bound to the id strings themselves and cannot assume that "myProductId1" is equal to "myproductid1". Since OFBiz uses Strings to identify products and such, it is possible that users actually use the upper-and-lowercases for differentiating items. Admittedly it is not a strong point, but it is one we have to keep in mind. So since we are only talking aesthetics and nowadays URLs have the tendency not to be typed out anymore, i would leave it as is. We can get rid of the html, however. It doesn't add anything and is just a personal preference...
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Paul I believe you did not get my point: we shall have an unique url to get to a category or product. And it should be the one the user entered for those, either upper or lower cased, we shall respect and keep it that way. This for 2 reasons:

          1. keep things consistent for OFBIz users (ie the people handling content)
          2. for seo reasons, to avoid duplicated content with mixed upper case lower case possiblities, to allow only one path to one ressource. Because URLs are case sensitive and, er... if things did not change, so is Google.

          As Parimal and Sebastian reported, this is not what the seo branch is currently doing. So we need to fix that. I will if Jinghai does not beat me on it (please Jinghai if you begin to work on it let me know, I'm currently working on some other OFBiz stuff).

          BTW the same exists on Syracus, for instance both works:

          This is a problem. See for instance the point 10 here http://moz.com/blog/11-best-practices-for-urls. Though it's ok for us to keep upper cases, if users define them like that. We shall only guarantee that an unique ulr will be rendered to get to a categ or product in all cases. And that this url will respect the strings the users entered when creating them, be them upper or lower cases.

          I think we all agree on .html being a moot point. Keeping it or not should be eventually discussed with the community when we will merge the branck in trunk (also a way to commit more people in this issue )

          Show
          jacques.le.roux Jacques Le Roux added a comment - Paul I believe you did not get my point: we shall have an unique url to get to a category or product . And it should be the one the user entered for those, either upper or lower cased, we shall respect and keep it that way. This for 2 reasons: keep things consistent for OFBIz users (ie the people handling content) for seo reasons, to avoid duplicated content with mixed upper case lower case possiblities, to allow only one path to one ressource. Because URLs are case sensitive and, er... if things did not change, so is Google. As Parimal and Sebastian reported, this is not what the seo branch is currently doing. So we need to fix that. I will if Jinghai does not beat me on it (please Jinghai if you begin to work on it let me know, I'm currently working on some other OFBiz stuff). BTW the same exists on Syracus, for instance both works: http://syracus.net/product/Miss-Cayley-s-Adventures-3401.html http://syracus.net/product/miss-cayley-s-adventures-3401.html This is a problem. See for instance the point 10 here http://moz.com/blog/11-best-practices-for-urls . Though it's ok for us to keep upper cases, if users define them like that. We shall only guarantee that an unique ulr will be rendered to get to a categ or product in all cases. And that this url will respect the strings the users entered when creating them, be them upper or lower cases. I think we all agree on .html being a moot point. Keeping it or not should be eventually discussed with the community when we will merge the branck in trunk (also a way to commit more people in this issue )
          Hide
          madppiper Paul Piper added a comment -

          Actually, i think this time around i think you are the one misunderstanding me

          I am also saying that we must have unique urls. However, there is two ways of making sure that only 1 delivers the content.

          1) You can store the urls in a list and thus make them all persistent
          2) You can introduce a filter to lookup and redirect to the proper url, if a bad one was used.

          The second one is the one easier to implement at this stage and probably less time consuming...

          Show
          madppiper Paul Piper added a comment - Actually, i think this time around i think you are the one misunderstanding me I am also saying that we must have unique urls. However, there is two ways of making sure that only 1 delivers the content. 1) You can store the urls in a list and thus make them all persistent 2) You can introduce a filter to lookup and redirect to the proper url, if a bad one was used. The second one is the one easier to implement at this stage and probably less time consuming...
          Hide
          jacques.le.roux Jacques Le Roux added a comment - - edited

          == TYPO no real changes ==

          1. There is something I just noticed and is clearly an issue. When you get to a category, from the left category tree, the url does not change. Note that it works from the breadcrumb.
          2. Also there is something we should discuss and was already asked/reported by Parimal. Currently the branch does not create complete paths to sub-categories. For instance, from the breadcrumb, you get to http://localhost:8080/ecommerce/category/large-gizmos-102.html but not http://localhost:8080/ecommerce/category/gismos-100/large-gizmos-102.html. From an SEO POV I don't see a need for the second, but for OFBiz users (those handling content) it could be better to have the choice. I mean a choice because if you have 10 levels or more (you never know what people can come with ) with only the 2nd possibilty OFBiz would render far too long URLs, notably if the category names are long.
          3. Also I think we should allow to not add the category number in the url. And allow to stick to the "product category name" as defined by users. Same for the "internal product name", this should be documented options (properties) for both
            • categoryUrlWithNumber
            • productUrlWithNumber
          Show
          jacques.le.roux Jacques Le Roux added a comment - - edited == TYPO no real changes == There is something I just noticed and is clearly an issue. When you get to a category, from the left category tree, the url does not change. Note that it works from the breadcrumb. Also there is something we should discuss and was already asked/reported by Parimal. Currently the branch does not create complete paths to sub-categories. For instance, from the breadcrumb, you get to http://localhost:8080/ecommerce/category/large-gizmos-102.html but not http://localhost:8080/ecommerce/category/gismos-100/large-gizmos-102.html . From an SEO POV I don't see a need for the second, but for OFBiz users (those handling content) it could be better to have the choice. I mean a choice because if you have 10 levels or more (you never know what people can come with ) with only the 2nd possibilty OFBiz would render far too long URLs, notably if the category names are long. Also I think we should allow to not add the category number in the url. And allow to stick to the "product category name" as defined by users. Same for the "internal product name", this should be documented options (properties) for both categoryUrlWithNumber productUrlWithNumber
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Paul I agree with your solution 2 (you were not quite clear in your 1st comment, saying "i would leave it as is." )

          Now it's about code. I will wait Jinghai's feedback before possibly diving into it. I will need to review more before committing anyway...

          Show
          jacques.le.roux Jacques Le Roux added a comment - Paul I agree with your solution 2 (you were not quite clear in your 1st comment, saying "i would leave it as is." ) Now it's about code. I will wait Jinghai's feedback before possibly diving into it. I will need to review more before committing anyway...
          Hide
          madppiper Paul Piper added a comment -

          To be a bit clearer: The comment "i would leave it as is" was about the question of whether or not we should enforce lowercase urls for everything... that part is still something to be left untouched, imho

          Show
          madppiper Paul Piper added a comment - To be a bit clearer: The comment "i would leave it as is" was about the question of whether or not we should enforce lowercase urls for everything... that part is still something to be left untouched, imho
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          I agree

          Show
          jacques.le.roux Jacques Le Roux added a comment - I agree
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          I just thought about the html suffix. In OFBiz ecommerce context, I still consider it a moot point. So we should provide a property for user choice, say "productWithHmlSuffix". And to mimic REST, where ressources are simply URLs without suffixes, I suggest to use "productWithHmlSuffix=N" OOTB (ie use a property which default to no ".html" suffix).

          Show
          jacques.le.roux Jacques Le Roux added a comment - I just thought about the html suffix. In OFBiz ecommerce context, I still consider it a moot point. So we should provide a property for user choice, say "productWithHmlSuffix". And to mimic REST, where ressources are simply URLs without suffixes, I suggest to use "productWithHmlSuffix=N" OOTB (ie use a property which default to no ".html" suffix).
          Hide
          komdata Sebastian Wachinger added a comment - - edited

          Very good idea! Indeed this does not have to be a one size fits all thing, just let the user choose what's best for his project.

          Talking about choices, while testing this branch I noticed the category issue you mentioned on Thursday, and I second the user-option solution you proposed.

          Show
          komdata Sebastian Wachinger added a comment - - edited Very good idea! Indeed this does not have to be a one size fits all thing, just let the user choose what's best for his project. Talking about choices, while testing this branch I noticed the category issue you mentioned on Thursday, and I second the user-option solution you proposed.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          I merged trunk HEAD in SEO branch at revision: 1540814

          Show
          jacques.le.roux Jacques Le Roux added a comment - I merged trunk HEAD in SEO branch at revision: 1540814
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          I noticed something wrong I wrote above. Quoting myself:

          3. Also I think we should allow to not add the category number in the url. And allow to stick to the "product category name" as defined by users. Same for the "internal product name", this should be documented options (properties) for both

          • categoryUrlWithNumber
          • productUrlWithNumber

          This is obviously impossible (as Paul already answered to Parimal above). Because the Category and Product have both their respective Ids as primary key. So we need to keep at least the Ids to be sure to generate unique URLs for both Categories and Products. However, to shorten the URLs, OFBiz users could want to remove the "product category name" or/and the the "internal product name". So the properties should rather be named.

          • categoryUrlWithOnlyNumber
          • productUrlWithOnlyNumber
            My thought was initially that there was something redundant there, I just picked the wrong one
          Show
          jacques.le.roux Jacques Le Roux added a comment - I noticed something wrong I wrote above. Quoting myself: 3. Also I think we should allow to not add the category number in the url. And allow to stick to the "product category name" as defined by users. Same for the "internal product name", this should be documented options (properties) for both categoryUrlWithNumber productUrlWithNumber This is obviously impossible (as Paul already answered to Parimal above). Because the Category and Product have both their respective Ids as primary key. So we need to keep at least the Ids to be sure to generate unique URLs for both Categories and Products. However, to shorten the URLs, OFBiz users could want to remove the "product category name" or/and the the "internal product name". So the properties should rather be named. categoryUrlWithOnlyNumber productUrlWithOnlyNumber My thought was initially that there was something redundant there, I just picked the wrong one
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          And to be fair with myself (hahaha), it's because I remembered that for Product creation only the internal name is mandatory, which confused me (then the productId is generated). For categories it's even more confusing. Nothing is needed, you can create a category without name, only its type is compulsory (given by a dropdown). I'd have to check what happens then, notably regarding i18n, I guess it's OK...

          Show
          jacques.le.roux Jacques Le Roux added a comment - And to be fair with myself (hahaha), it's because I remembered that for Product creation only the internal name is mandatory, which confused me (then the productId is generated). For categories it's even more confusing. Nothing is needed, you can create a category without name, only its type is compulsory (given by a dropdown). I'd have to check what happens then, notably regarding i18n, I guess it's OK...
          Hide
          jacques.le.roux Jacques Le Roux added a comment - - edited

          Here is a summary of the curent state of the branch , and new requirements specifications:

          Current state (issues in bold)

          1. Only the OFBiz moutpoint (eg ecommerce) is used to define the "primary url". So we have http://localhost:8080/ecommerce/ instead of previously http://localhost:8080/ecommerce/control/main.
          2. The /category/ and /product/ part of the url (prefixes) are mandatories. This to discriminate in case of (unlikely but possible) same Ids for both a category and a product.
          3. Only 1 level of category is supported, no complete paths to sub-categories.
          4. The internal product name or category name AND the product or category Ids are used to build the urls.
          5. The generated urls end with the suffix ".html".
          6. You can get to a category or product with different urls. All mixed combinations of upper or lower cases are possible, even for the /category/ and /product/ prefixes. This is a NO-NO in a SEO perspective, because of possible duplicated contents.
          7. When you get to a category, from the left category tree, the url does not change. Note that it works from the breadcrumb.



          New requirements/propositions "specifications" (issues in bold). Each of these new requirements, must be handled in a separated sub-task (Jira issues).

          1. Like we have /category/ and /product/, adding /catalog/ in the generated urls should be considered.
          2. The /category/ and /product/ prefixes should always be in lower case.
          3. The categoryId and productId part of the generated urls must respect user enterered or generated case (they are primary keys and only them, with /category/ and /product/ prefixes, guarantee urls unicity).
          4. Though you can create a product with special characters (not ANSI), an url like <<http://localhost:8080/ecommerce/çà-test.html>> (rendered as shown) is not supported. Special characters should be UTF-8 encoded and corresponding pages correctly rendered.
          5. About the ."html" suffix, we all agreed having it or not is a moot point. So we will provide a property for user choice, say "productWithHmlSuffix". And to mimic REST, where ressources are simply URLs without suffixes, we will use "productWithHmlSuffix=N" OOTB (ie use a property which default to no ".html" suffix).
          6. Check Pierre Smits's comment above about multi-tenant in ecommerce.
          7. Configuration of the content and search urls, Parimal respectively suggested Domain_Name/content/content_name and Domain_Name/search/keyword.
          8. Documentation of SEO generated urls parameters.
          9. We could introduce multi levels for categories, ie complete paths to sub-categories. For instance, from the breadcrumb, you get to http://localhost:8080/ecommerce/category/large-gizmos-102.html but not http://localhost:8080/ecommerce/category/gismos-100/large-gizmos-102.html. From an SEO POV there is no need for the second. But for OFBiz users (those handling content) it could be nice to have the choice. It must be a choice (using a property) because if you have 10 levels or more (you never know what people can come with ) with the 2nd possibilty only, OFBiz would render far too long URLs. Notably if the category names are long. This is optional, by default 1 level of category will be used.
          10. To shorten URLs, OFBiz users could want to remove the "product category name" or/and the the "internal product name" from the generated urls. So we should allow to not add them. This should be documented options (properties) for both
            • categoryUrlWithOnlyNumber
            • productUrlWithOnlyNumber.



          Technical notes

          1. About Special characters to UTF-8 encoded in generated urls, see SeoContextFilter.java comment: <<"// check to make sure the requested url is allowed>>
          2. The new effort for content and search urls could be based on the work done for category and product. SeoContentUrlFilter.java must be checked to see if not (partially?) already done.
          3. In a comment above, I noted that "The Perl5Matcher Perl5Compiler are not thread safe". This was handled by Jinghai using the Perl5Compiler.READ_ONLY_MASK field. It's a thread safe implementation and I also noticed Jinghai used local caches (userExceptionPatterns and seoPatterns Maps) for multiple compiled patterns (fixed unique asciiPattern and regexpIfMatch are not concerned). As noted in the oro Javadoc, there is a small pattern matching overhead when using Perl5Compiler.READ_ONLY_MASK. The OFBiz OOTB ComilerMatcher class can be used to workaround this if really necessary. I believe we don't need to worry about that OOTB, but it's worth to be noted here.
          4. Check the use org.ofbiz.product.category.ftl.UrlRegexpTransform instead of org.ofbiz.webapp.ftl.OfbizUrlTransform for ofbizUrl macro.



          Please add a comment, if you see something is wrong, missing or complete, thanks!

          Show
          jacques.le.roux Jacques Le Roux added a comment - - edited Here is a summary of the curent state of the branch , and new requirements specifications: Current state (issues in bold) Only the OFBiz moutpoint (eg ecommerce) is used to define the "primary url". So we have http://localhost:8080/ecommerce/ instead of previously http://localhost:8080/ecommerce/control/main . The /category/ and /product/ part of the url (prefixes) are mandatories. This to discriminate in case of (unlikely but possible) same Ids for both a category and a product. Only 1 level of category is supported, no complete paths to sub-categories. The internal product name or category name AND the product or category Ids are used to build the urls. The generated urls end with the suffix ".html". You can get to a category or product with different urls . All mixed combinations of upper or lower cases are possible, even for the /category/ and /product/ prefixes. This is a NO-NO in a SEO perspective, because of possible duplicated contents . When you get to a category, from the left category tree, the url does not change. Note that it works from the breadcrumb. New requirements/propositions "specifications" (issues in bold). Each of these new requirements, must be handled in a separated sub-task (Jira issues). Like we have /category/ and /product/, adding /catalog/ in the generated urls should be considered. The /category/ and /product/ prefixes should always be in lower case. The categoryId and productId part of the generated urls must respect user enterered or generated case (they are primary keys and only them, with /category/ and /product/ prefixes, guarantee urls unicity). Though you can create a product with special characters (not ANSI), an url like << http://localhost:8080/ecommerce/ çà-test.html>> (rendered as shown) is not supported. Special characters should be UTF-8 encoded and corresponding pages correctly rendered . About the ."html" suffix, we all agreed having it or not is a moot point. So we will provide a property for user choice, say "productWithHmlSuffix". And to mimic REST, where ressources are simply URLs without suffixes, we will use "productWithHmlSuffix=N" OOTB (ie use a property which default to no ".html" suffix). Check Pierre Smits's comment above about multi-tenant in ecommerce . Configuration of the content and search urls, Parimal respectively suggested Domain_Name/content/content_name and Domain_Name/search/keyword. Documentation of SEO generated urls parameters. We could introduce multi levels for categories, ie complete paths to sub-categories. For instance, from the breadcrumb, you get to http://localhost:8080/ecommerce/category/large-gizmos-102.html but not http://localhost:8080/ecommerce/category/gismos-100/large-gizmos-102.html . From an SEO POV there is no need for the second. But for OFBiz users (those handling content) it could be nice to have the choice. It must be a choice (using a property) because if you have 10 levels or more (you never know what people can come with ) with the 2nd possibilty only, OFBiz would render far too long URLs. Notably if the category names are long. This is optional, by default 1 level of category will be used. To shorten URLs, OFBiz users could want to remove the "product category name" or/and the the "internal product name" from the generated urls. So we should allow to not add them. This should be documented options (properties) for both categoryUrlWithOnlyNumber productUrlWithOnlyNumber. Technical notes About Special characters to UTF-8 encoded in generated urls, see SeoContextFilter.java comment: <<"// check to make sure the requested url is allowed>> The new effort for content and search urls could be based on the work done for category and product. SeoContentUrlFilter.java must be checked to see if not (partially?) already done. In a comment above, I noted that "The Perl5Matcher Perl5Compiler are not thread safe". This was handled by Jinghai using the Perl5Compiler.READ_ONLY_MASK field. It's a thread safe implementation and I also noticed Jinghai used local caches (userExceptionPatterns and seoPatterns Maps) for multiple compiled patterns (fixed unique asciiPattern and regexpIfMatch are not concerned). As noted in the oro Javadoc, there is a small pattern matching overhead when using Perl5Compiler.READ_ONLY_MASK. The OFBiz OOTB ComilerMatcher class can be used to workaround this if really necessary. I believe we don't need to worry about that OOTB, but it's worth to be noted here. Check the use org.ofbiz.product.category.ftl.UrlRegexpTransform instead of org.ofbiz.webapp.ftl.OfbizUrlTransform for ofbizUrl macro. Please add a comment, if you see something is wrong, missing or complete, thanks!
          Hide
          parimal Parimal Gain added a comment - - edited

          Hi Jacques,

          You have consolidate all thing very well, I don't think there is any point missing or wrong. While looking and testing more I found one more additional point to discussed here with respect to OOTB and that is making the product url as business defined. In OOTB there is facility to define alternate url with respect to locale in Product Content section. This is very good functionality in perspective of internationalization of product url. This facility enable business user to define product url for a product according to the business requirement and locality of the business. So while creating SEO friendly url for product this feature should pick up with high priority in comparison with product name, But in current SEO implementation while making product url 'alternate url' from Product Content is picked up if product do not have defined product name with it.

          In my opinion product name from alternate url should picked up first and if alternate url is not defined then should look for product name. Also to get the product name, system should not only check for product.productName but it should look for PRODUCT_NAME from product content and product.internalName as well, as the name can be defined any where of the three places. What do you think ????

          Show
          parimal Parimal Gain added a comment - - edited Hi Jacques, You have consolidate all thing very well, I don't think there is any point missing or wrong. While looking and testing more I found one more additional point to discussed here with respect to OOTB and that is making the product url as business defined. In OOTB there is facility to define alternate url with respect to locale in Product Content section. This is very good functionality in perspective of internationalization of product url. This facility enable business user to define product url for a product according to the business requirement and locality of the business. So while creating SEO friendly url for product this feature should pick up with high priority in comparison with product name, But in current SEO implementation while making product url 'alternate url' from Product Content is picked up if product do not have defined product name with it. In my opinion product name from alternate url should picked up first and if alternate url is not defined then should look for product name. Also to get the product name, system should not only check for product.productName but it should look for PRODUCT_NAME from product content and product.internalName as well, as the name can be defined any where of the three places. What do you think ????
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          I will work to fix the point 6 of Current state above.

          Show
          jacques.le.roux Jacques Le Roux added a comment - I will work to fix the point 6 of Current state above.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          I just got back to this after I thought a bit more about the point 6 of Current state above. What I wrote does not make sense. Goggle, and other spiders bots, don't try to generate random pages. They just follow the links the pages give them. So since we are not trying to generate all possible cases/URLs, but just allow users to enter them manually, it's not an issue. Allowing users entering similar URLs is not bad. It's actually a comfort for them, which does not impair SEO results. One worry less, let's get to point 7 now...

          Show
          jacques.le.roux Jacques Le Roux added a comment - I just got back to this after I thought a bit more about the point 6 of Current state above. What I wrote does not make sense. Goggle, and other spiders bots, don't try to generate random pages. They just follow the links the pages give them. So since we are not trying to generate all possible cases/URLs, but just allow users to enter them manually, it's not an issue. Allowing users entering similar URLs is not bad. It's actually a comfort for them, which does not impair SEO results. One worry less, let's get to point 7 now...
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          I thought about the point 7 and I believe it's finally also not an issue. Because even if people can make this happen I believe spider bots can't. Because this is an action only possible at the UI level (through JS). So, in this case, bots can't follow a link and act on the categories tree. I have to double check it in code, but for now I can't see how it could be possible for bots to find a problem there.

          Show
          jacques.le.roux Jacques Le Roux added a comment - I thought about the point 7 and I believe it's finally also not an issue. Because even if people can make this happen I believe spider bots can't. Because this is an action only possible at the UI level (through JS). So, in this case, bots can't follow a link and act on the categories tree. I have to double check it in code, but for now I can't see how it could be possible for bots to find a problem there.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          I ran Xenu locally and found some 404 issues (those are ok in trunk demo)

          I will have a look at that soon...

          Show
          jacques.le.roux Jacques Le Roux added a comment - I ran Xenu locally and found some 404 issues (those are ok in trunk demo) Though I'm able to create a çà-test product and it shows in main page, its link fails: http://localhost:8080/ecommerce/%E7%E0-test.html The links to product from ecommerce/showAllPromotions (for instance there are much other pages) fail, for instance http://localhost:8080/ecommerce/control/product?category_id=20111&product_id=GZ-1006 http://localhost:8080/ecommerce/images/blog.css http://localhost:8080/ecommerce/images/productAdditionalView.js http://localhost:8080/images/products/small/handshake_01.png javascript:javascript:addItem(); linked from page(s): http://localhost:8080/ecommerce/product/Giant-Widget-with-feature-explosion-wg-9944.html I will have a look at that soon...
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          At r1560069, I fixed an issue with the product link to ecommerce from catalog.

          At r1560072, I removed the systematical lowering/uppering of product and categories names and Ids in ecommerce urls which was problematic (you could easily create confusing states from backend)
          So this removes it to allow differentiating for instance
          ecommerce/product/Tiny-Gizmo-GZ-1000.html
          and
          ecommerce/product/tiny-gizmo-gz-1000.html

          Also I saw no reasons for isSpecialProductId so, at r1560074,I commented/deprecated it out and deprecated related methods. If I have missed somethiing, please Jinghai explain,thanks!

          Show
          jacques.le.roux Jacques Le Roux added a comment - At r1560069, I fixed an issue with the product link to ecommerce from catalog. At r1560072, I removed the systematical lowering/uppering of product and categories names and Ids in ecommerce urls which was problematic (you could easily create confusing states from backend) So this removes it to allow differentiating for instance ecommerce/product/Tiny-Gizmo-GZ-1000.html and ecommerce/product/tiny-gizmo-gz-1000.html Also I saw no reasons for isSpecialProductId so, at r1560074,I commented/deprecated it out and deprecated related methods. If I have missed somethiing, please Jinghai explain,thanks!
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Before commiting this (and later answering to last Parimal's question), I wanted to see how to handle not ASCII product names, like "Ça-test". Because I thought they were currently handled. Actually you can create a product with such an Id and internal name and even get to it in ecommerce from Catalog with an url like http://localhost:8080/ecommerce/control/product?externalLoginKey=EL884925753542&product_id=%C3%A7%C3%A0-test
          or
          http://localhost:8080/ecommerce/control/product?externalLoginKey=EL884925753542&product_id=Ça-test

          But then you can't add this product in the cart even if you add a price to it. It fails at

           [java] ---- runtime exception report --------------------------------------------------
           [java] Problems parsing quantity string: 1
           [java] Exception: java.lang.NullPointerException
           [java] Message: null
           [java] ---- stack trace ---------------------------------------------------------------
           [java] java.lang.NullPointerException
           [java] org.ofbiz.product.product.ProductWorker.isDecimalQuantityOrderAllowed(ProductWorker.java:1188)
           [java] org.ofbiz.order.shoppingcart.ShoppingCartEvents.addToCart(ShoppingCartEvents.java:468)
          

          With a productId value of "çà -test"

          So at the moment, in the trunk also, we would need to restrain the Id and Internal Name of product to ASCII. That could be a problem from a global perspective, to be discussed and revisited...

          Show
          jacques.le.roux Jacques Le Roux added a comment - Before commiting this (and later answering to last Parimal's question), I wanted to see how to handle not ASCII product names, like "Ça-test". Because I thought they were currently handled. Actually you can create a product with such an Id and internal name and even get to it in ecommerce from Catalog with an url like http://localhost:8080/ecommerce/control/product?externalLoginKey=EL884925753542&product_id=%C3%A7%C3%A0-test or http://localhost:8080/ecommerce/control/product?externalLoginKey=EL884925753542&product_id= Ça-test But then you can't add this product in the cart even if you add a price to it. It fails at [java] ---- runtime exception report -------------------------------------------------- [java] Problems parsing quantity string: 1 [java] Exception: java.lang.NullPointerException [java] Message: null [java] ---- stack trace --------------------------------------------------------------- [java] java.lang.NullPointerException [java] org.ofbiz.product.product.ProductWorker.isDecimalQuantityOrderAllowed(ProductWorker.java:1188) [java] org.ofbiz.order.shoppingcart.ShoppingCartEvents.addToCart(ShoppingCartEvents.java:468) With a productId value of "çà -test" So at the moment, in the trunk also, we would need to restrain the Id and Internal Name of product to ASCII. That could be a problem from a global perspective, to be discussed and revisited...
          Hide
          madppiper Paul Piper added a comment -

          Are you sure this is not related to your DB settings? If you have anything but UTF-8 enabled on the DB-side, the product lookup will fail

          Show
          madppiper Paul Piper added a comment - Are you sure this is not related to your DB settings? If you have anything but UTF-8 enabled on the DB-side, the product lookup will fail
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          No I checked it then, Entity Maintenance in Webtools retrieve the correct record, so do the code in isDecimalQuantityOrderAllowed()

          delegator.findOne("Product", Boolean.TRUE, UtilMisc.toMap("productId", poductId))
          

          If you change the poductId value (note the typo ) by hand in Eclipse Debugger. The problem is ahead of this method, and not specific to the branch, the trunk has the same issue.

          Show
          jacques.le.roux Jacques Le Roux added a comment - No I checked it then, Entity Maintenance in Webtools retrieve the correct record, so do the code in isDecimalQuantityOrderAllowed() delegator.findOne( "Product" , Boolean .TRUE, UtilMisc.toMap( "productId" , poductId)) If you change the poductId value (note the typo ) by hand in Eclipse Debugger. The problem is ahead of this method, and not specific to the branch, the trunk has the same issue.
          Hide
          anilpatel Anil K Patel added a comment - - edited

          Its little confusing, Why go through all this pain when Ofbiz CMS has native support for custom URL. See following URL and associated website page data and source code.

          http://localhost:8080/cmssite/cms/CMSS_DEMO_SCREEN

          I have used above reference code in our demo webstore, check following links to see working examples,

          Category page: https://ofbizdemo.hotwaxmedia.com/bottoms
          Product page: https://ofbizdemo.hotwaxmedia.com/black-bell-bottoms
          Static page: https://ofbizdemo.hotwaxmedia.com/terms-and-conditions

          Show
          anilpatel Anil K Patel added a comment - - edited Its little confusing, Why go through all this pain when Ofbiz CMS has native support for custom URL. See following URL and associated website page data and source code. http://localhost:8080/cmssite/cms/CMSS_DEMO_SCREEN I have used above reference code in our demo webstore, check following links to see working examples, Category page: https://ofbizdemo.hotwaxmedia.com/bottoms Product page: https://ofbizdemo.hotwaxmedia.com/black-bell-bottoms Static page: https://ofbizdemo.hotwaxmedia.com/terms-and-conditions
          Hide
          madppiper Paul Piper added a comment -

          Hi Anil,

          it would require more than a reference to a demo of yours to understand how you implemented it. Yes, using the "custom url" is another method, but would require a data change as well. It also doesn't fix the problems any better than the solution provided here. If I understand correctly, you would have to set the custom urls for all the categories and products - which certainly isn't functional (but correct me if I am wrong).

          As pointed out before, even this solution here is only a step in between, but cannot be the final answer. Ideally we should consider adding a URL entity that keeps track of all urls available, which could then be used to actually redirect within the filter chain based on partial matches. As you can imagine, it gets quite complicated quite easily, so this is what will have to do for now...

          Show
          madppiper Paul Piper added a comment - Hi Anil, it would require more than a reference to a demo of yours to understand how you implemented it. Yes, using the "custom url" is another method, but would require a data change as well. It also doesn't fix the problems any better than the solution provided here. If I understand correctly, you would have to set the custom urls for all the categories and products - which certainly isn't functional (but correct me if I am wrong). As pointed out before, even this solution here is only a step in between, but cannot be the final answer. Ideally we should consider adding a URL entity that keeps track of all urls available, which could then be used to actually redirect within the filter chain based on partial matches. As you can imagine, it gets quite complicated quite easily, so this is what will have to do for now...
          Hide
          anilpatel Anil K Patel added a comment -

          My suggestion does not fix any problem because, This Jira issue like many others is trying to fix a problem that does not exist.

          Before contributors can expect help from experts in community they need to demonstrate that they deserve it.

          In this case please go learn about content and website entity model and CMS implementation. You will find that all SEO requirements were addressed in OFBIz way before SEO term was coined.

          Webpathalias entity tracks all the valid URL and it's content associations.

          Show
          anilpatel Anil K Patel added a comment - My suggestion does not fix any problem because, This Jira issue like many others is trying to fix a problem that does not exist. Before contributors can expect help from experts in community they need to demonstrate that they deserve it. In this case please go learn about content and website entity model and CMS implementation. You will find that all SEO requirements were addressed in OFBIz way before SEO term was coined. Webpathalias entity tracks all the valid URL and it's content associations.
          Hide
          madppiper Paul Piper added a comment -

          Anil K Patel: I will let your harsh words speak for themselves. Please refrain from any further comment on this ticket if you are not providing any help. Users of ofbiz are longing for this functionality and if you are blocking it, then you are keeping a vital change from them.

          Show
          madppiper Paul Piper added a comment - Anil K Patel : I will let your harsh words speak for themselves. Please refrain from any further comment on this ticket if you are not providing any help. Users of ofbiz are longing for this functionality and if you are blocking it, then you are keeping a vital change from them.
          Hide
          anilpatel Anil K Patel added a comment -

          Paul
          OFBiz has application (cmssite) application for those who want to learn, how to best use ofbiz cms.

          I have long term commitment to OFBiz, I will object to any contribution that has bad impact on project. This contribution is one of them.

          If you want to instead use code from this Jira ticket, I have no issues. I have objection to adding it to ofbiz trunk.

          Show
          anilpatel Anil K Patel added a comment - Paul OFBiz has application (cmssite) application for those who want to learn, how to best use ofbiz cms. I have long term commitment to OFBiz, I will object to any contribution that has bad impact on project. This contribution is one of them. If you want to instead use code from this Jira ticket, I have no issues. I have objection to adding it to ofbiz trunk.
          Hide
          madppiper Paul Piper added a comment -

          Anil, the OFBiz CMS Component is just that - a component. It is a special purpose app on top of that - so the current state is a rather "experimental one" to begin with. Starting with r13.x these are slated for removal, btw.Not to mention that each component should be able to run rather independently and frankly, the CMS is a lousy one as that to begin with.

          Sorry to say this, but you provide absolutely no answers to the points raised and absolutely fail to reason how your "solution" would even address the problem of having a store with potentially thousands of products and/or categories. Instead of helping on the questions raised or tasks at hand, you try to block a critical contribution to this project.

          Show
          madppiper Paul Piper added a comment - Anil, the OFBiz CMS Component is just that - a component. It is a special purpose app on top of that - so the current state is a rather "experimental one" to begin with. Starting with r13.x these are slated for removal, btw.Not to mention that each component should be able to run rather independently and frankly, the CMS is a lousy one as that to begin with. Sorry to say this, but you provide absolutely no answers to the points raised and absolutely fail to reason how your "solution" would even address the problem of having a store with potentially thousands of products and/or categories. Instead of helping on the questions raised or tasks at hand, you try to block a critical contribution to this project.
          Hide
          anilpatel Anil K Patel added a comment -

          Ofbiz CMS is one of the fundamental components. Its not slated for removal, In fact none of the components are slated for removal. Your statement of CMS "the CMS is lousy one as that to begin with" tells me that you have not taken time to learn enough about it.

          SEO requirements of Website are best handled by CMS used. In OFBiz "cmssite" is good example of building CMS website. First step to learn to build SEO friendly webstore is to learn Ofbiz CMS and study cmssite example application. Your resistance to learn OFBiz CMS clearly tells, you are not yet ready to learn advanced topics like website SEO.

          As far as this ticket is concerned, its not even valid. Only way I help with ticket is by not allowing people to add code for something that already exists in system.

          Show
          anilpatel Anil K Patel added a comment - Ofbiz CMS is one of the fundamental components. Its not slated for removal, In fact none of the components are slated for removal. Your statement of CMS "the CMS is lousy one as that to begin with" tells me that you have not taken time to learn enough about it. SEO requirements of Website are best handled by CMS used. In OFBiz "cmssite" is good example of building CMS website. First step to learn to build SEO friendly webstore is to learn Ofbiz CMS and study cmssite example application. Your resistance to learn OFBiz CMS clearly tells, you are not yet ready to learn advanced topics like website SEO. As far as this ticket is concerned, its not even valid. Only way I help with ticket is by not allowing people to add code for something that already exists in system.
          Hide
          jacopoc Jacopo Cappellato added a comment -

          @Paul: The WebSitePathAlias entity mentioned by Anil is declared in the application/content component and not in specialpurpose/cmssite component. The cmssite component is just an example of client code.

          Show
          jacopoc Jacopo Cappellato added a comment - @Paul: The WebSitePathAlias entity mentioned by Anil is declared in the application/content component and not in specialpurpose/cmssite component. The cmssite component is just an example of client code.
          Hide
          minifreak Jonatan Soto added a comment -

          Hi Anil,

          Seems that you have decided unilaterally that this feature is not needed because you find it as duplicated. Well maybe you are speaking for some other people we don't know, but correct me if I'm wrong, this is a community where democracy is the way to go. Your position looks like the other way around (autocracy) so I would open a vote for it. At least reading the comments of this ticket doesn't seems that other users finds it useless and duplicated as you do.

          Show
          minifreak Jonatan Soto added a comment - Hi Anil, Seems that you have decided unilaterally that this feature is not needed because you find it as duplicated. Well maybe you are speaking for some other people we don't know, but correct me if I'm wrong, this is a community where democracy is the way to go. Your position looks like the other way around (autocracy) so I would open a vote for it. At least reading the comments of this ticket doesn't seems that other users finds it useless and duplicated as you do.
          Hide
          anilpatel Anil K Patel added a comment -

          Jonaton,
          I did not say this feature is not needed, instead I am saying OFBiz has this feature.

          Show
          anilpatel Anil K Patel added a comment - Jonaton, I did not say this feature is not needed, instead I am saying OFBiz has this feature.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          I must say I'm quite disappointed by Anil's abrupt answer. So far, Parimal and Sebastian were the only persons to be really interested. They did some tests and gave us valuable feedbacks. I want to go ahead, so I need feedbacks from other persons, notably committers. What I like in this feature is it's an automated way to get SEO friendly URLs for all categories and products. You don't have to use the content component at all, it simplifies much things and I find it a good idea.

          If ever we can't get an agreement about changing ecommerce, because there should not be only one way to go, I have an idea about creating a new "ecomseo" ecommerce component.

          This should not be too hard to achieve without changing what currently exists in trunk HEAD. First, note that the only difference in ecommerce is the web.xml file, which calls different servlets and filters. So we could use the same strategy as for ecomclone webapp under ecommerce component. There are also few changes outside (I don't count new files which have any impact)

          • in webapp component (tiny changes)
            • RequestHandler.java (rather an improvement)
            • freemarkerTransforms.properties (ecomseo can use another file)
          • in product component (tiny changes)
            • freemarkerTransforms.properties (ecomseo can use another file)
            • CatalogMenus.xml and ProductScreens.xml (can be adapted to work in both cases by using the right ecomLink value
            • build.xml (not a problem, framework/base/lib/scripting can be added)
          Show
          jacques.le.roux Jacques Le Roux added a comment - I must say I'm quite disappointed by Anil's abrupt answer. So far, Parimal and Sebastian were the only persons to be really interested. They did some tests and gave us valuable feedbacks. I want to go ahead, so I need feedbacks from other persons, notably committers. What I like in this feature is it's an automated way to get SEO friendly URLs for all categories and products. You don't have to use the content component at all, it simplifies much things and I find it a good idea. If ever we can't get an agreement about changing ecommerce, because there should not be only one way to go, I have an idea about creating a new "ecomseo" ecommerce component. This should not be too hard to achieve without changing what currently exists in trunk HEAD. First, note that the only difference in ecommerce is the web.xml file, which calls different servlets and filters. So we could use the same strategy as for ecomclone webapp under ecommerce component. There are also few changes outside (I don't count new files which have any impact) in webapp component (tiny changes) RequestHandler.java (rather an improvement) freemarkerTransforms.properties (ecomseo can use another file) in product component (tiny changes) freemarkerTransforms.properties (ecomseo can use another file) CatalogMenus.xml and ProductScreens.xml (can be adapted to work in both cases by using the right ecomLink value build.xml (not a problem, framework/base/lib/scripting can be added)
          Hide
          pfm.smits Pierre Smits added a comment -

          Given that I also contributed to this issue, you can rest assured that I am also interested in this new feature. Moreover, when looking at the watchers of this issue I see that there are 14 watchers and 4 persons voted (besides the reporter) for this.

          I would say that would constitute enough interest for this improvement/enhancement/new feature.

          Furthermore, I would say that the statement earlier regarding the aspect of the content component sufficing for SEO configuration/handling is like saying that a bicycle is sufficient to get you from a to b. Even when a car would provide the same faster and would provide a better experience/satisfaction for the user.

          Show
          pfm.smits Pierre Smits added a comment - Given that I also contributed to this issue, you can rest assured that I am also interested in this new feature. Moreover, when looking at the watchers of this issue I see that there are 14 watchers and 4 persons voted (besides the reporter) for this. I would say that would constitute enough interest for this improvement/enhancement/new feature. Furthermore, I would say that the statement earlier regarding the aspect of the content component sufficing for SEO configuration/handling is like saying that a bicycle is sufficient to get you from a to b. Even when a car would provide the same faster and would provide a better experience/satisfaction for the user.
          Hide
          anilpatel Anil K Patel added a comment -

          Everybody has interest in SEO of Webstore application. I am not against it. My point is, OFBiz CMS already got it. There is no need for all the code contributed in this Jira ticket.

          Show
          anilpatel Anil K Patel added a comment - Everybody has interest in SEO of Webstore application. I am not against it. My point is, OFBiz CMS already got it. There is no need for all the code contributed in this Jira ticket.
          Hide
          pfm.smits Pierre Smits added a comment -

          Anil,

          Many seem make a point of having a different opinion than you have. Which is actually a good thing. Difference of opinion can lead to consensus and having more than one option available is always beneficial. What you're saying sounds like vendor lock-in. And that is not a good thing.

          I am also surmising that you won't be contributing to this issue anything more than sharing your functional insights of the contentmgr component, nor assist in maintaining the code if and when committed to trunk (this is a presumption based on your statements in this issue). If so, you can rest assured that it will not add to the burden of the workload you currently have (9 JIRA issues, IIRC).

          Regards,

          Pierre

          Show
          pfm.smits Pierre Smits added a comment - Anil, Many seem make a point of having a different opinion than you have. Which is actually a good thing. Difference of opinion can lead to consensus and having more than one option available is always beneficial. What you're saying sounds like vendor lock-in. And that is not a good thing. I am also surmising that you won't be contributing to this issue anything more than sharing your functional insights of the contentmgr component, nor assist in maintaining the code if and when committed to trunk (this is a presumption based on your statements in this issue). If so, you can rest assured that it will not add to the burden of the workload you currently have (9 JIRA issues, IIRC). Regards, Pierre
          Hide
          anilpatel Anil K Patel added a comment -

          Pierre,
          What do you mean by vendor lock in? I am referencing to code that exists in OFBiz for years.

          Every line of code added to project is liability to its users. This is why I have strong objection to adding code from this Jira to OFBiz trunk.

          Show
          anilpatel Anil K Patel added a comment - Pierre, What do you mean by vendor lock in? I am referencing to code that exists in OFBiz for years. Every line of code added to project is liability to its users. This is why I have strong objection to adding code from this Jira to OFBiz trunk.
          Hide
          madppiper Paul Piper added a comment -

          Anil,

          you do realize that any project is driven by constant improvement. Blocking necessary updates simply because you think that "Every line of code added to the project is a liability to its users" is a dead-end.

          Show
          madppiper Paul Piper added a comment - Anil, you do realize that any project is driven by constant improvement. Blocking necessary updates simply because you think that "Every line of code added to the project is a liability to its users" is a dead-end.
          Hide
          anilpatel Anil K Patel added a comment -

          Constant improvement is good thing and I am all for it. This Jira issue is about adding code to project for adding a feature to application that already exists for years. In fact OFBiz has it for years and is implemented in very well.

          Contributors of this Jira issue should take time to learn about OFBiz CMS and good use of it.

          Adding unnecessary code to Project is bad thing.

          Show
          anilpatel Anil K Patel added a comment - Constant improvement is good thing and I am all for it. This Jira issue is about adding code to project for adding a feature to application that already exists for years. In fact OFBiz has it for years and is implemented in very well. Contributors of this Jira issue should take time to learn about OFBiz CMS and good use of it. Adding unnecessary code to Project is bad thing.
          Hide
          komdata Sebastian Wachinger added a comment -

          Dear All,

          it is quite interesting to hear about that already existing URL feature in the CMS component. I would be grateful for a comparison of the existing feature mentioned by Anil and the solution proposed here by Paul, maybe some feature chart covering the pros and cons of both approaches.

          I for my part surely are no expert (yet) on Ofbiz, but always willing to learn in order to adopt this great project in the best way possible. Keeping a complex framework like Ofbiz on track for many years is no mean feat, I would not go as far to speak of democracy in this context but rather of a collaboration of likeminded individuals pursuing a common goal for the common good or something like that.

          So what is the historic background behind the URL feature in the CMS component, the CatalogUrlFilter done by Hans Bakker and the proposal by Paul?

          Show
          komdata Sebastian Wachinger added a comment - Dear All, it is quite interesting to hear about that already existing URL feature in the CMS component. I would be grateful for a comparison of the existing feature mentioned by Anil and the solution proposed here by Paul, maybe some feature chart covering the pros and cons of both approaches. I for my part surely are no expert (yet) on Ofbiz, but always willing to learn in order to adopt this great project in the best way possible. Keeping a complex framework like Ofbiz on track for many years is no mean feat, I would not go as far to speak of democracy in this context but rather of a collaboration of likeminded individuals pursuing a common goal for the common good or something like that. So what is the historic background behind the URL feature in the CMS component, the CatalogUrlFilter done by Hans Bakker and the proposal by Paul?
          Hide
          anilpatel Anil K Patel added a comment - - edited

          SEO is not just about URL, it also includes setting up Meta data for the webpage, keeping URL alive after product is discontinued etc. This is why using OFBiz CMS is better then trying to just generate SEO friendly URL.

          A document you can refer to: https://cwiki.apache.org/confluence/display/OFBIZ/OFBiz+Content+Management+How+to

          Step 1: in this direction is to learn How to setup CMS managed webpage using OFBiz CMS. A good example to learn it is to study code in cmssite application.

          Step 2: Study Website, WebsiteContent, WebsitePathAlias entity, Study code in org.ofbiz.content.cms.CmsEvents, observe when following controller entry in ecommerce component gets called
          <request-map uri="cms">
          <event type="java" path="org.ofbiz.content.cms.CmsEvents" invoke="cms"/>
          <response name="success" type="none"/>
          <response name="error" type="view" value="error"/>
          </request-map>

          After going through all this code you will be able to setup Content as webpage, associate it with Website and setup WebsitePathAlias for the content. Here is example from my test data,

          <WebSite webSiteId="WebStore" siteName="HWM Shop Demo" productStoreId="9000" allowProductStoreChange="N"/>
          <Content contentId="FIRST_EDITION" contentTypeId="WEB_SITE_PUB_PT" contentName="Webstore Site Publish Point" description="Root publish point for shopdemo website" statusId="CTNT_PUBLISHED"/>
          <WebSiteContent webSiteId="WebStore" contentId="FIRST_EDITION" webSiteContentTypeId="PUBLISH_POINT" fromDate="2001-01-01 00:00:00"/>
          <Content contentId="PRODUCT_WEB_PAGE" contentTypeId="DOCUMENT" contentName="Product Web Page" decoratorContentId="PRODUCT_PAGE_DEC" statusId="CTNT_PUBLISHED"/>
          <WebSiteContent webSiteId="WebStore" contentId="PRODUCT_WEB_PAGE" webSiteContentTypeId="PRODUCT_PAGE" fromDate="2001-01-01 00:00:00"/>
          <ContentAssoc contentId="FIRST_EDITION" contentIdTo="PRODUCT_WEB_PAGE" contentAssocTypeId="SUB_CONTENT" fromDate="2001-01-01 00:00:00"/>
          <ProductContent productId="SUN_HAT" contentId="PRODUCT_WEB_PAGE" productContentTypeId="WEB_PAGE" fromDate="2012-01-11 12:00:00.0"/>

          <WebSitePathAlias webSiteId="WebStore" pathAlias="Sun-Hat-Content-Page" contentId="PRODUCT_WEB_PAGE"/>

          The above webpage can be accessed with following URL,
          https://locahost/Sun-Hat-Content-Page

          If you setup website/webpage using OFBiz cms then, there is no need of CatalogUrlFilter. Like code in this Jira ticket, all the code related to CatalogUrlFilter is not needed and should be removed from OFBiz.

          Many thanks to Jacopo and Scott for helping me learn OFBiz CMS.

          Show
          anilpatel Anil K Patel added a comment - - edited SEO is not just about URL, it also includes setting up Meta data for the webpage, keeping URL alive after product is discontinued etc. This is why using OFBiz CMS is better then trying to just generate SEO friendly URL. A document you can refer to: https://cwiki.apache.org/confluence/display/OFBIZ/OFBiz+Content+Management+How+to Step 1: in this direction is to learn How to setup CMS managed webpage using OFBiz CMS. A good example to learn it is to study code in cmssite application. Step 2: Study Website, WebsiteContent, WebsitePathAlias entity, Study code in org.ofbiz.content.cms.CmsEvents, observe when following controller entry in ecommerce component gets called <request-map uri="cms"> <event type="java" path="org.ofbiz.content.cms.CmsEvents" invoke="cms"/> <response name="success" type="none"/> <response name="error" type="view" value="error"/> </request-map> After going through all this code you will be able to setup Content as webpage, associate it with Website and setup WebsitePathAlias for the content. Here is example from my test data, <WebSite webSiteId="WebStore" siteName="HWM Shop Demo" productStoreId="9000" allowProductStoreChange="N"/> <Content contentId="FIRST_EDITION" contentTypeId="WEB_SITE_PUB_PT" contentName="Webstore Site Publish Point" description="Root publish point for shopdemo website" statusId="CTNT_PUBLISHED"/> <WebSiteContent webSiteId="WebStore" contentId="FIRST_EDITION" webSiteContentTypeId="PUBLISH_POINT" fromDate="2001-01-01 00:00:00"/> <Content contentId="PRODUCT_WEB_PAGE" contentTypeId="DOCUMENT" contentName="Product Web Page" decoratorContentId="PRODUCT_PAGE_DEC" statusId="CTNT_PUBLISHED"/> <WebSiteContent webSiteId="WebStore" contentId="PRODUCT_WEB_PAGE" webSiteContentTypeId="PRODUCT_PAGE" fromDate="2001-01-01 00:00:00"/> <ContentAssoc contentId="FIRST_EDITION" contentIdTo="PRODUCT_WEB_PAGE" contentAssocTypeId="SUB_CONTENT" fromDate="2001-01-01 00:00:00"/> <ProductContent productId="SUN_HAT" contentId="PRODUCT_WEB_PAGE" productContentTypeId="WEB_PAGE" fromDate="2012-01-11 12:00:00.0"/> <WebSitePathAlias webSiteId="WebStore" pathAlias="Sun-Hat-Content-Page" contentId="PRODUCT_WEB_PAGE"/> The above webpage can be accessed with following URL, https://locahost/Sun-Hat-Content-Page If you setup website/webpage using OFBiz cms then, there is no need of CatalogUrlFilter. Like code in this Jira ticket, all the code related to CatalogUrlFilter is not needed and should be removed from OFBiz. Many thanks to Jacopo and Scott for helping me learn OFBiz CMS.
          Hide
          madppiper Paul Piper added a comment - - edited

          Hi Sebastian,

          you can ignore the part about the META-Data and such. Though it is correct, all options here rely on HTML-Templates for that - since it is a different topic altogether and you probably already have your own, we left it out of this picture.

          As described above the task itself focuses only on a subpart of onpage optimziation efforts, namely:

          • Removal of /control out of all the urls
          • SEO-friendly URLS
          • Configurable product/category and other URLs
          • Frontpage mapping from /main to /

          There are other things you can do to optimize your pages, but they are out of scope here, because the most-prominent ones rely on you actively changing your content. To fix the above you have to work with the OFBiz Request-Flow and predominantly the Controlservlet. From a technical perspective there is no easy way to get around the overall OFBiz structure, so the Controlservlet (/control) cannot be removed easily.

          There are three ways, that I can think of, to achieve our goal

          1) Implement Transforms, Sample Configuration, Servlets & Filters to generate and handle new URLS as defined (handled by this ticket)
          2) Make use of the CMS functionality to generate custom URLs and map to each product/category/page accordingly (described by Anil)
          3) Rework the Servlet-Structure entirely and rely on Filters & Transforms to remove the current dependency (more effort - not in focus). Store URLs in new Entity, Implement Filters to validate URLs and redirect on partial matches

          I created the following map of pros and cons for you to visualize it a bit further:

            Transforms, Filters & Servlets Use of CMS Controlservlet replacement
          Method
          • Implementation of Transforms to generate new URLs.
          • Implementation of Filters to Validate Request URls and forward internally
          • Configuration-File Implementation to allow custom "logic" to set automatic URL generation
          • Reuse Database Structure.
          • Add new Page to each Product & Category
          • Ignore /control until checkout
          • Rework Servlet Structure & Remove Controlservlet or rely on Filters where the controlservlet is never called directly
          • Store all URLs in a database
          • Match every request to Database, forward accordingly
          Pros
          • No Changes on Controlservlet necessary
          • Very versatile and configurable by User
          • Works automatically for Categories
          • Works automatically for Products
          • Very lightweight
          • Replaces /control/main
          • Works OOTB (no changes necessary)
          • Fixes duplicate content
          • May simplify OFBiz Request-Architecture
          • Fixes /control/ problem for good
          Cons
          • Potentially duplicate content
          • Doesn't "fix" partial matches
          • No historisation of former URLs
          • Potentially duplicate content
          • Doesn't "fix" partial matches
          • No historisation of former URLs
          • No automatic generation of URLs for Products
          • No automatic generation of URLs for Categories
          • Increases DB (Database entries)
          • Requires additional manual work for all entries --> potentially risky when used by non-tech people
          • Very difficult to implement
          • May not be compatible with setup at all
          • Hard-Changes to code necessary
          • Currently not available
          Show
          madppiper Paul Piper added a comment - - edited Hi Sebastian, you can ignore the part about the META-Data and such. Though it is correct, all options here rely on HTML-Templates for that - since it is a different topic altogether and you probably already have your own, we left it out of this picture. As described above the task itself focuses only on a subpart of onpage optimziation efforts, namely: Removal of /control out of all the urls SEO-friendly URLS Configurable product/category and other URLs Frontpage mapping from /main to / There are other things you can do to optimize your pages, but they are out of scope here, because the most-prominent ones rely on you actively changing your content. To fix the above you have to work with the OFBiz Request-Flow and predominantly the Controlservlet. From a technical perspective there is no easy way to get around the overall OFBiz structure, so the Controlservlet (/control) cannot be removed easily. There are three ways, that I can think of, to achieve our goal 1) Implement Transforms, Sample Configuration, Servlets & Filters to generate and handle new URLS as defined (handled by this ticket) 2) Make use of the CMS functionality to generate custom URLs and map to each product/category/page accordingly (described by Anil) 3) Rework the Servlet-Structure entirely and rely on Filters & Transforms to remove the current dependency (more effort - not in focus). Store URLs in new Entity, Implement Filters to validate URLs and redirect on partial matches I created the following map of pros and cons for you to visualize it a bit further:   Transforms, Filters & Servlets Use of CMS Controlservlet replacement Method Implementation of Transforms to generate new URLs. Implementation of Filters to Validate Request URls and forward internally Configuration-File Implementation to allow custom "logic" to set automatic URL generation Reuse Database Structure. Add new Page to each Product & Category Ignore /control until checkout Rework Servlet Structure & Remove Controlservlet or rely on Filters where the controlservlet is never called directly Store all URLs in a database Match every request to Database, forward accordingly Pros No Changes on Controlservlet necessary Very versatile and configurable by User Works automatically for Categories Works automatically for Products Very lightweight Replaces /control/main Works OOTB (no changes necessary) Fixes duplicate content May simplify OFBiz Request-Architecture Fixes /control/ problem for good Cons Potentially duplicate content Doesn't "fix" partial matches No historisation of former URLs Potentially duplicate content Doesn't "fix" partial matches No historisation of former URLs No automatic generation of URLs for Products No automatic generation of URLs for Categories Increases DB (Database entries) Requires additional manual work for all entries --> potentially risky when used by non-tech people Very difficult to implement May not be compatible with setup at all Hard-Changes to code necessary Currently not available
          Hide
          anilpatel Anil K Patel added a comment -

          The information provided by Paul is wrong.

          Show
          anilpatel Anil K Patel added a comment - The information provided by Paul is wrong.
          Hide
          pfm.smits Pierre Smits added a comment -

          Anil,

          Could you elaborate on which aspect of information provided by Paul is wrong?

          Regards,

          Pierre

          Show
          pfm.smits Pierre Smits added a comment - Anil, Could you elaborate on which aspect of information provided by Paul is wrong? Regards, Pierre
          Hide
          anilpatel Anil K Patel added a comment -

          I have provided enough information on how to deliver SEO friendly web page using ofbiz. I don't think I have responsibility to answer Paul's inaccurate report. It's my responsibility to let's readers know that it's wrong. Now it's upto readers to trust him or me.

          As far as code getting applied to ofbiz trunk is concerned, I am totally against it.

          Show
          anilpatel Anil K Patel added a comment - I have provided enough information on how to deliver SEO friendly web page using ofbiz. I don't think I have responsibility to answer Paul's inaccurate report. It's my responsibility to let's readers know that it's wrong. Now it's upto readers to trust him or me. As far as code getting applied to ofbiz trunk is concerned, I am totally against it.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Hi Anil,

          I understand you are against the intially proposed changes, because this would change your way of doing and you are satisifed with it, this is respectable.

          Now I proposed another way which would not change the current situation but would add an alternative to it, I suppose you are not against a such proposition, right?

          Show
          jacques.le.roux Jacques Le Roux added a comment - Hi Anil, I understand you are against the intially proposed changes, because this would change your way of doing and you are satisifed with it, this is respectable. Now I proposed another way which would not change the current situation but would add an alternative to it, I suppose you are not against a such proposition, right?
          Hide
          anilpatel Anil K Patel added a comment -

          Jacques,
          Our real challenge is make OFBiz feature rich and at the same time keep it lean. This is best achieved when we advantage of what's available OOTB. For sure it means lot of work to understand and make best use of rich OOTB code.

          I find it hard to accept to add more code because some people don't want to spend time to learn about existing feature.

          Show
          anilpatel Anil K Patel added a comment - Jacques, Our real challenge is make OFBiz feature rich and at the same time keep it lean. This is best achieved when we advantage of what's available OOTB. For sure it means lot of work to understand and make best use of rich OOTB code. I find it hard to accept to add more code because some people don't want to spend time to learn about existing feature.
          Hide
          madppiper Paul Piper added a comment -

          Anil K Patel,

          Well, I can understand your reasoning, but would not agree on this matter. If I am not mistaken, it is these cases where we can bring this up to a vote in the ml, correct?

          Show
          madppiper Paul Piper added a comment - Anil K Patel , Well, I can understand your reasoning, but would not agree on this matter. If I am not mistaken, it is these cases where we can bring this up to a vote in the ml, correct?
          Hide
          anilpatel Anil K Patel added a comment -

          Paul,
          What exactly will you bring to Mailing list for vote?

          Show
          anilpatel Anil K Patel added a comment - Paul, What exactly will you bring to Mailing list for vote?
          Hide
          adrianc@hlmksw.com Adrian Crum added a comment -

          Anil,

          You can't expect everyone to see inside your head. Please be specific about what you see wrong with Paul's chart.

          Your approach in this issue has been smug and adversarial. Please try to be more cooperative and helpful.

          Show
          adrianc@hlmksw.com Adrian Crum added a comment - Anil, You can't expect everyone to see inside your head. Please be specific about what you see wrong with Paul's chart. Your approach in this issue has been smug and adversarial. Please try to be more cooperative and helpful.
          Hide
          anilpatel Anil K Patel added a comment -

          Paul mentions below points as cons of CMS approach. Please see my response to them.

          This issue is about SEO and Paul starts by saying we can ignore Page Meta data. SEO is not just about URL, we have to consider many things.

          Potentially duplicate content
          Anil> With CMS approach you don't have this issue.

          Doesn't "fix" partial matches
          Anil > Partial Matches may cause duplicate content issue. Its not good for SEO.

          No historisation of former URLs
          Anil > WebsitePathAlias entity keeps all valid URLs. When a URL no more exists, you can forward request for a path alias to something else by setting aliasTo field.

          No automatic generation of URLs for Products
          Anil > Automatic URL generation is bad idea but if needed, Simple eca can be put in place to maintain pathAlias field value e.g When Product name is modified.

          No automatic generation of URLs for Categories
          Anil > Same as for Product page URL.
          Increases DB (Database entries)
          Anil > I am surprised this is a bad thing.

          Requires additional manual work for all entries --> potentially risky when used by non-tech people
          Anil > Maintaining Content data is not much different from maintaining Product data. With right scripts data maintenance is not that hard.

          I can be helpful if Paul will take time to understand CMS, I hate it when people take wrong approach and expect others to defend.

          Show
          anilpatel Anil K Patel added a comment - Paul mentions below points as cons of CMS approach. Please see my response to them. This issue is about SEO and Paul starts by saying we can ignore Page Meta data. SEO is not just about URL, we have to consider many things. Potentially duplicate content Anil> With CMS approach you don't have this issue. Doesn't "fix" partial matches Anil > Partial Matches may cause duplicate content issue. Its not good for SEO. No historisation of former URLs Anil > WebsitePathAlias entity keeps all valid URLs. When a URL no more exists, you can forward request for a path alias to something else by setting aliasTo field. No automatic generation of URLs for Products Anil > Automatic URL generation is bad idea but if needed, Simple eca can be put in place to maintain pathAlias field value e.g When Product name is modified. No automatic generation of URLs for Categories Anil > Same as for Product page URL. Increases DB (Database entries) Anil > I am surprised this is a bad thing. Requires additional manual work for all entries --> potentially risky when used by non-tech people Anil > Maintaining Content data is not much different from maintaining Product data. With right scripts data maintenance is not that hard. I can be helpful if Paul will take time to understand CMS, I hate it when people take wrong approach and expect others to defend.
          Hide
          madppiper Paul Piper added a comment -

          Anil, I am sorry that I have to say that, but please continue reading after my first sentence. I said "you can ignore the part about the META-Data and such. Though it is correct, all options here rely on HTML-Templates for that - since it is a different topic altogether and you probably already have your own, we left it out of this picture."

          This means: Yes, content is also part of the onpage-optimisation efforts. Your "meta-data" are part of that, and added through your templates. This ticket is simply not about any of that.

          Potentially duplicate content
          Anil> With CMS approach you don't have this issue.

          That is simply not the case. The OFBiz controlservlet handles all requests in the end. What you fail to mention is that the ofbiz cms integration works as follows:

          1) Request-Redirect Request to "cms" request map, as in:

          <request-map uri="main">
              <security https="false" auth="false"/>
              <response name="success" type="request" value="cms"/>
          </request-map>
          

          2) Handle Request in CMS Event

           <request-map uri="cms">
                  <event type="java" path="org.ofbiz.content.cms.CmsEvents" invoke="cms"/>
                  <response name="success" type="none"/>
                  <response name="error" type="view" value="error"/>
              </request-map>
          

          3) Set response within the CMS event:

          if (statusCode == HttpServletResponse.SC_OK || hasErrorPage) {
                          // create the template map
                          MapStack<String> templateMap = MapStack.create();
                          ScreenRenderer.populateContextForRequest(templateMap, null, request, response, servletContext);
                          templateMap.put("statusCode", statusCode);
          
                          // make the link prefix
                          ServletContext ctx = (ServletContext) request.getAttribute("servletContext");
                          RequestHandler rh = (RequestHandler) ctx.getAttribute("_REQUEST_HANDLER_");
                          templateMap.put("_REQUEST_HANDLER_", rh);
          
                          response.setStatus(statusCode);
          

          This does not override or change the normal behavior of the OFBiz Controlservlet or other servlets in place. OOTB OFbiz has one other servlet that handles product and catalog data:

             <servlet-mapping>
                  <servlet-name>CatalogUrlServlet</servlet-name>
                  <url-pattern>/products/*</url-pattern>
              </servlet-mapping>
          

          these calls will remain unless you remove them. The same applies to all /control/* calls handled by the controlservlet. So unless you rework the entire way ofbiz handles requests, you are stuck with potentially duplciated content -> precisely at /control/* and /products/*, not even mentioning the filters.

          No historisation of former URLs
          Anil > WebsitePathAlias entity keeps all valid URLs. When a URL no more exists, you can forward request for a path alias to something else by setting aliasTo field.

          That is not a historisation - a historisation is the storage of former urls and redirect of those to the new urls if they changed. It could be implemented using the CMS entities, but currently they do not exist and you would also require a filter to handle these request-redirects.

          No automatic generation of URLs for Products
          Anil > Automatic URL generation is bad idea but if needed, Simple eca can be put in place to maintain pathAlias field value e.g When Product name is modified.

          ECAs may not be a solution for bulk data. In your demo you only serve less than 25 products per store. I have worked on implementations with up to 1.6 Mio products. It simply may not be feasible to keep this overhead on store.

          Increases DB (Database entries)
          Anil > I am surprised this is a bad thing.

          Again - the further you move away from the "few items per store" example, the more reasonable it becomes to store less. Databases typically still don't perform all that well with large indices and performance goes out the window

          Requires additional manual work for all entries --> potentially risky when used by non-tech people
          Anil > Maintaining Content data is not much different from maintaining Product data. With right scripts data maintenance is not that hard.

          You are a developer, you may be able to handle 4 entries per product. Your average customer won't ... you can trust me on this.

          Show
          madppiper Paul Piper added a comment - Anil, I am sorry that I have to say that, but please continue reading after my first sentence. I said "you can ignore the part about the META-Data and such. Though it is correct, all options here rely on HTML-Templates for that - since it is a different topic altogether and you probably already have your own, we left it out of this picture." This means: Yes, content is also part of the onpage-optimisation efforts. Your "meta-data" are part of that, and added through your templates. This ticket is simply not about any of that. Potentially duplicate content Anil> With CMS approach you don't have this issue. That is simply not the case. The OFBiz controlservlet handles all requests in the end. What you fail to mention is that the ofbiz cms integration works as follows: 1) Request-Redirect Request to "cms" request map, as in: <request-map uri= "main" > <security https= " false " auth= " false " /> <response name= "success" type= "request" value= "cms" /> </request-map> 2) Handle Request in CMS Event <request-map uri= "cms" > <event type= "java" path= "org.ofbiz.content.cms.CmsEvents" invoke= "cms" /> <response name= "success" type= "none" /> <response name= "error" type= "view" value= "error" /> </request-map> 3) Set response within the CMS event: if (statusCode == HttpServletResponse.SC_OK || hasErrorPage) { // create the template map MapStack< String > templateMap = MapStack.create(); ScreenRenderer.populateContextForRequest(templateMap, null , request, response, servletContext); templateMap.put( "statusCode" , statusCode); // make the link prefix ServletContext ctx = (ServletContext) request.getAttribute( "servletContext" ); RequestHandler rh = (RequestHandler) ctx.getAttribute( "_REQUEST_HANDLER_" ); templateMap.put( "_REQUEST_HANDLER_" , rh); response.setStatus(statusCode); This does not override or change the normal behavior of the OFBiz Controlservlet or other servlets in place. OOTB OFbiz has one other servlet that handles product and catalog data: <servlet-mapping> <servlet-name>CatalogUrlServlet</servlet-name> <url-pattern>/products/*</url-pattern> </servlet-mapping> these calls will remain unless you remove them. The same applies to all /control/* calls handled by the controlservlet. So unless you rework the entire way ofbiz handles requests, you are stuck with potentially duplciated content -> precisely at /control/* and /products/*, not even mentioning the filters. No historisation of former URLs Anil > WebsitePathAlias entity keeps all valid URLs. When a URL no more exists, you can forward request for a path alias to something else by setting aliasTo field. That is not a historisation - a historisation is the storage of former urls and redirect of those to the new urls if they changed. It could be implemented using the CMS entities, but currently they do not exist and you would also require a filter to handle these request-redirects. No automatic generation of URLs for Products Anil > Automatic URL generation is bad idea but if needed, Simple eca can be put in place to maintain pathAlias field value e.g When Product name is modified. ECAs may not be a solution for bulk data. In your demo you only serve less than 25 products per store. I have worked on implementations with up to 1.6 Mio products. It simply may not be feasible to keep this overhead on store. Increases DB (Database entries) Anil > I am surprised this is a bad thing. Again - the further you move away from the "few items per store" example, the more reasonable it becomes to store less. Databases typically still don't perform all that well with large indices and performance goes out the window Requires additional manual work for all entries --> potentially risky when used by non-tech people Anil > Maintaining Content data is not much different from maintaining Product data. With right scripts data maintenance is not that hard. You are a developer, you may be able to handle 4 entries per product. Your average customer won't ... you can trust me on this.
          Hide
          madppiper Paul Piper added a comment -

          And on a sidenote

          I can be helpful if Paul will take time to understand CMS, I hate it when people take wrong approach and expect others to defend.

          Please refrain from these statements. You said this at least 4 times in this thread. Apparently you are trying to insult me - have fun with that, but for a PMC member it is a lousy way of handling requests and commitment.

          Show
          madppiper Paul Piper added a comment - And on a sidenote I can be helpful if Paul will take time to understand CMS, I hate it when people take wrong approach and expect others to defend. Please refrain from these statements. You said this at least 4 times in this thread. Apparently you are trying to insult me - have fun with that, but for a PMC member it is a lousy way of handling requests and commitment.
          Hide
          anilpatel Anil K Patel added a comment -

          At this point I give up. Interested parties can take steps in their best interest.

          Show
          anilpatel Anil K Patel added a comment - At this point I give up. Interested parties can take steps in their best interest.
          Hide
          komdata Sebastian Wachinger added a comment - - edited

          @Paul and Anil: Thank you very much for providing the additional information I asked for, even with detailed sample code and feature chart; this made things much clearer for me, your effort is highly appreciated! Actually the discussion initiated by Anil came exactly at the right time for me*.

          Now I am developer, user and (sometimes) customer all at the same time, so from a user's perspective I would say the learning curve of Ofbiz is steep enough as it is, so why not offer different approaches fitting different needs and use cases? Following the proposal by Jacques we can add some flexibility without breaking anything or bloating the codebase too much. Improved usability will always be vital for the widespread acceptance of the whole Ofbiz framework.

          *As luck would have it, we are just now in the process of setting up a new shop with multilingual product names. In this context I want to ask if the proposal by Parimal has been dealt with already or is earmarked for inclusion This would cover a real important aspect and improve usability concerning the automatic generation of multilingual URLs.
          As for now I use the "Alternative URL" product content for this, which again always will be a very useful feature when the product name remains unilingual but for the product page you need different URLs for different languages for improved SEO, or when you change the product name but want to retain the URL.


          Finally regarding that discussion about the .html suffix, rightfully branded a moot point by Jacques:
          I simply changed <category-url-suffix>.html</category-url-suffix> to <category-url-suffix></category-url-suffix> in line 16 of applications/product/config/SeoConfig.xml, and the .html is gone for me, so I'd say no need for further action here.

          Show
          komdata Sebastian Wachinger added a comment - - edited @Paul and Anil: Thank you very much for providing the additional information I asked for, even with detailed sample code and feature chart; this made things much clearer for me, your effort is highly appreciated! Actually the discussion initiated by Anil came exactly at the right time for me*. Now I am developer, user and (sometimes) customer all at the same time, so from a user's perspective I would say the learning curve of Ofbiz is steep enough as it is, so why not offer different approaches fitting different needs and use cases? Following the proposal by Jacques we can add some flexibility without breaking anything or bloating the codebase too much. Improved usability will always be vital for the widespread acceptance of the whole Ofbiz framework. *As luck would have it, we are just now in the process of setting up a new shop with multilingual product names. In this context I want to ask if the proposal by Parimal has been dealt with already or is earmarked for inclusion This would cover a real important aspect and improve usability concerning the automatic generation of multilingual URLs. As for now I use the "Alternative URL" product content for this, which again always will be a very useful feature when the product name remains unilingual but for the product page you need different URLs for different languages for improved SEO, or when you change the product name but want to retain the URL. — Finally regarding that discussion about the .html suffix, rightfully branded a moot point by Jacques: I simply changed <category-url-suffix>.html</category-url-suffix> to <category-url-suffix></category-url-suffix> in line 16 of applications/product/config/SeoConfig.xml , and the .html is gone for me, so I'd say no need for further action here.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Thanks for your feedback Sebastian,

          No, the Parimal's proposition has not been handled yet. I have not looked into programmatic details of its inclusion, but I'd not be agains it a priori.

          Show
          jacques.le.roux Jacques Le Roux added a comment - Thanks for your feedback Sebastian, No, the Parimal's proposition has not been handled yet. I have not looked into programmatic details of its inclusion, but I'd not be agains it a priori.
          Hide
          jacques.le.roux Jacques Le Roux added a comment - - edited

          == FIXED BAD GRAMMAR ==
          Thanks Paul for providing the table and a detailled flow.

          I also want to add that tough "Potentially duplicate content" is theoritical. The only things wich matters is if bots (search engines spiders) are able to reach those potentially duplicated contents. I believe it's not possible, so it's not really a concern. It's not possible because bots follow the links the site provide them. They don't generate anything. So they are not able to found theoritical duplicated contents.

          This is a very important point in SEO, because duplicate contents can dramatically degrade your position in SERP which is what really matter at the end of the day.

          Also I'm not quite sure what "partial matches" means but it seems to me that they relate to the same concept that "duplicate content"' seen from a reversed perspective (user searching). If I'm right then they also don't matter in OFBiz.

          Show
          jacques.le.roux Jacques Le Roux added a comment - - edited == FIXED BAD GRAMMAR == Thanks Paul for providing the table and a detailled flow. I also want to add that tough "Potentially duplicate content" is theoritical. The only things wich matters is if bots (search engines spiders) are able to reach those potentially duplicated contents. I believe it's not possible, so it's not really a concern. It's not possible because bots follow the links the site provide them. They don't generate anything. So they are not able to found theoritical duplicated contents. This is a very important point in SEO, because duplicate contents can dramatically degrade your position in SERP which is what really matter at the end of the day. Also I'm not quite sure what "partial matches" means but it seems to me that they relate to the same concept that "duplicate content"' seen from a reversed perspective (user searching). If I'm right then they also don't matter in OFBiz.
          Hide
          madppiper Paul Piper added a comment -

          Jacques Le Roux:

          I noticed a few minor things we should improve upon in a later release:

          1)

          <char-filters>
          <char-filter>
          <character-pattern>\u00fc</character-pattern>
          <replacement>ue</replacement>
          </char-filter>
          <char-filter>
          <character-pattern>\u00e4</character-pattern>
          <replacement>ae</replacement>
          </char-filter>
          <char-filter>
          <character-pattern>\u00f6</character-pattern>
          <replacement>oe</replacement>
          </char-filter>
          <char-filter>
          <character-pattern>\u00df</character-pattern>
          <replacement>ss</replacement>
          </char-filter>
          <char-filter>
          <character-pattern>\\+</character-pattern>
          <replacement>und</replacement>
          </char-filter>
          <char-filter>
          <character-pattern>\u0026</character-pattern>
          <replacement>und</replacement>
          </char-filter>
          <char-filter>
          <character-pattern>è</character-pattern>
          <replacement>e</replacement>
          </char-filter>
          

          This is currently a "german" interpretation, as the ampersand character (&) is being replaced by "und" in the urls. It also misses other diacritics entirely.
          I think we can actually get rid of this and rather use the Java Normalizer for this in the java code. It will do the same thing and handles internationalisation nicely:

          string = Normalizer.normalize(string, Normalizer.Form.NFD);
          string = string.replaceAll("[^\\p{ASCII}]", "");
          

          2) Currently the SeoConfig.xml is located in /application/product/config - i would argue that we should move this to either /framework/common/config or /specialpurpose/ecommerce/config as it affects more aspects than the productUrls and is also rather ecommerce specific at the current state.

          3) You asked me about "partial matches":
          In general the ids are what's important and not the remainder of the string, so you can add more or less text in front of the ids and it should still work. It is a moot point, since they are autogenerated the same way throughout the entire application, but we may want to redirecting a user if the request-url doesn't match the final, generated url. All we'd have to do is add a check in the filter, generate the url again based on the id, compare both and redirect if they don't match.

          Show
          madppiper Paul Piper added a comment - Jacques Le Roux : I noticed a few minor things we should improve upon in a later release: 1) < char -filters> < char -filter> <character-pattern>\u00fc</character-pattern> <replacement>ue</replacement> </ char -filter> < char -filter> <character-pattern>\u00e4</character-pattern> <replacement>ae</replacement> </ char -filter> < char -filter> <character-pattern>\u00f6</character-pattern> <replacement>oe</replacement> </ char -filter> < char -filter> <character-pattern>\u00df</character-pattern> <replacement>ss</replacement> </ char -filter> < char -filter> <character-pattern>\\+</character-pattern> <replacement>und</replacement> </ char -filter> < char -filter> <character-pattern>\u0026</character-pattern> <replacement>und</replacement> </ char -filter> < char -filter> <character-pattern>è</character-pattern> <replacement>e</replacement> </ char -filter> This is currently a "german" interpretation, as the ampersand character (&) is being replaced by "und" in the urls. It also misses other diacritics entirely. I think we can actually get rid of this and rather use the Java Normalizer for this in the java code. It will do the same thing and handles internationalisation nicely: string = Normalizer.normalize(string, Normalizer.Form.NFD); string = string.replaceAll( "[^\\p{ASCII}]" , ""); 2) Currently the SeoConfig.xml is located in /application/product/config - i would argue that we should move this to either /framework/common/config or /specialpurpose/ecommerce/config as it affects more aspects than the productUrls and is also rather ecommerce specific at the current state. 3) You asked me about "partial matches": In general the ids are what's important and not the remainder of the string, so you can add more or less text in front of the ids and it should still work. It is a moot point, since they are autogenerated the same way throughout the entire application, but we may want to redirecting a user if the request-url doesn't match the final, generated url. All we'd have to do is add a check in the filter, generate the url again based on the id, compare both and redirect if they don't match.
          Hide
          komdata Sebastian Wachinger added a comment - - edited

          To optimize SEO we allegedly should include the page's language in the URL. For those using Google Webmaster Tools it seems to be considered best practice to have a URL like example.com/de/ (if you do not use subdomains de.example.com or specific TLDs example.de).

          Maybe it's a good idea to take this information from the Locale String of the Product Name and/or Alternative URL product content in order to automatically generate the URL (based again on Parimal's proposition).
          I think this would also work for multi-regional websites, e.g. example.com/es-es/ and example.com/es-mx/ (same language, different region).

          Speaking of product pages we would have URLs like example.com/product/en/Product-Name-product-id. In case I did not miss any repercussions, do you think this can and should be done?

          Show
          komdata Sebastian Wachinger added a comment - - edited To optimize SEO we allegedly should include the page's language in the URL. For those using Google Webmaster Tools it seems to be considered best practice to have a URL like example.com/de/ (if you do not use subdomains de.example.com or specific TLDs example.de ). Maybe it's a good idea to take this information from the Locale String of the Product Name and/or Alternative URL product content in order to automatically generate the URL (based again on Parimal's proposition ). I think this would also work for multi-regional websites, e.g. example.com/es-es/ and example.com/es-mx/ (same language, different region). Speaking of product pages we would have URLs like example.com/product/en/Product-Name-product-id . In case I did not miss any repercussions, do you think this can and should be done?
          Hide
          madppiper Paul Piper added a comment -

          Hi Sebastian,

          that is a pretty good idea. Unfortunately though, OFBiz handles the localisation a bit differently. Within OFBiz you set the locale through a GET-Parameter, where it will be stored in session and the pages will churn out the content based on the set locale.

          You could try to add another filter that would set the locale based on the url, update the transforms to include the locale and update the regexp to handle the urls correctly. It does sound a little hacky to me, however :/

          Show
          madppiper Paul Piper added a comment - Hi Sebastian, that is a pretty good idea. Unfortunately though, OFBiz handles the localisation a bit differently. Within OFBiz you set the locale through a GET-Parameter, where it will be stored in session and the pages will churn out the content based on the set locale. You could try to add another filter that would set the locale based on the url, update the transforms to include the locale and update the regexp to handle the urls correctly. It does sound a little hacky to me, however :/
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Anil, all committers,

          I thank you for giving your opinion. You are against, but at least you made the effort to express yourself and set out your arguments. I expected more feedback from other committers. Even if, like Jacopo said (in a not so polite way regarding the work done) <<(the task history is a huge mess)>>, it's not easy now to follow how things progressed in this issue (was of course easier to follow from start...).

          For a such important issue, I'd have expected much earlier committers's comments. Notably from you who are against after 6 months of exchanges and work! Anyway adding rants to this issues will not help. So now, that I have said what I had on the heart, it's enough, let's see things in a positive way.

          To answer your concern about keeping OFBiz lean. I also understand this worry. We went too far adding stuff in OFBiz. And some are now hardly maintained. Without speaking about the issue of having new releases of ~150MB (w/o specialpurpose components but ecommerce) and especially a just checked out trunk (so with svn data) of ~500MB!

          So I agree with you about reusing as much as possible existing features. But going the ecomclone way, the new feature will be feature rich and as lean as possible. I don't expect much more than 200KB with around 20 files max. Also I did not all that work w/o the ambition of maintaining this code, nobody will have to worry about it, for hopefully a long period...

          So to clarify, I will create a Jira issue, and attach a patch in the following weeks. Then we can discuss about it again...

          Show
          jacques.le.roux Jacques Le Roux added a comment - Anil, all committers, I thank you for giving your opinion. You are against, but at least you made the effort to express yourself and set out your arguments. I expected more feedback from other committers. Even if, like Jacopo said (in a not so polite way regarding the work done) <<(the task history is a huge mess)>>, it's not easy now to follow how things progressed in this issue (was of course easier to follow from start...). For a such important issue, I'd have expected much earlier committers's comments. Notably from you who are against after 6 months of exchanges and work! Anyway adding rants to this issues will not help. So now, that I have said what I had on the heart, it's enough, let's see things in a positive way. To answer your concern about keeping OFBiz lean. I also understand this worry. We went too far adding stuff in OFBiz. And some are now hardly maintained. Without speaking about the issue of having new releases of ~150MB (w/o specialpurpose components but ecommerce) and especially a just checked out trunk (so with svn data) of ~500MB! So I agree with you about reusing as much as possible existing features. But going the ecomclone way, the new feature will be feature rich and as lean as possible. I don't expect much more than 200KB with around 20 files max. Also I did not all that work w/o the ambition of maintaining this code, nobody will have to worry about it, for hopefully a long period... So to clarify, I will create a Jira issue, and attach a patch in the following weeks. Then we can discuss about it again...
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          I will hopefully get back to this soon, before I forget all the details :/

          Show
          jacques.le.roux Jacques Le Roux added a comment - I will hopefully get back to this soon, before I forget all the details :/
          Hide
          iwolf Ingo Wolfmayr added a comment - - edited

          Hi,

          after testing the seo branch if found the following problems (comparing actual seo branch vs. trunk with demo data):

          1) robots.txt - set in allowedPaths (web.xml)

          SeoContextFilter
          [java] requestInfo:
          [java] httpRequest.getServletPath():
          --> which results in a 404

          ContextFilter
          [java] requestInfo: /*
          [java] httpRequest.getServletPath(): /robots.txt

          2) When sending the "confirmation mail", the inluded urls (link to product, continue shopping) are missing the host information.

          3) webapp/src/org/ofbiz/webapp/WebAppUtil
          getControlServletPath has a if clause checking "org.ofbiz.webapp.control.ControlServlet".equals(servletDef.getServletClass())

          as it is null with "ecommerce web.xml" the getControlServletPath throws an Exception

          Show
          iwolf Ingo Wolfmayr added a comment - - edited Hi, after testing the seo branch if found the following problems (comparing actual seo branch vs. trunk with demo data): 1) robots.txt - set in allowedPaths (web.xml) SeoContextFilter [java] requestInfo: [java] httpRequest.getServletPath(): --> which results in a 404 ContextFilter [java] requestInfo: /* [java] httpRequest.getServletPath(): /robots.txt 2) When sending the "confirmation mail", the inluded urls (link to product, continue shopping) are missing the host information. 3) webapp/src/org/ofbiz/webapp/WebAppUtil getControlServletPath has a if clause checking "org.ofbiz.webapp.control.ControlServlet".equals(servletDef.getServletClass()) as it is null with "ecommerce web.xml" the getControlServletPath throws an Exception
          Hide
          shi.jinghai Shi Jinghai added a comment -

          Thanks Ingo's comment.

          The bugs are confirmed and fixed in this patch.

          The test cases are:
          1. JSP files: /ecommerce/index.jsp, /ecommerce/error/404.jsp

          2. allowPaths: /ecommerce/images/blog.css, /ecommerce/robots.txt

          3. Original /products urls: /ecommerce/products/p_ENCHILADAS, /ecommerce/products/p_10000

          4. Place an order, check the product urls in Order Confirmation Notice email.

          Kind Regards,

          Show
          shi.jinghai Shi Jinghai added a comment - Thanks Ingo's comment. The bugs are confirmed and fixed in this patch. The test cases are: 1. JSP files: /ecommerce/index.jsp, /ecommerce/error/404.jsp 2. allowPaths: /ecommerce/images/blog.css, /ecommerce/robots.txt 3. Original /products urls: /ecommerce/products/p_ENCHILADAS, /ecommerce/products/p_10000 4. Place an order, check the product urls in Order Confirmation Notice email. Kind Regards,
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Hi Jinghai,

          Thanks a bunch

          Show
          jacques.le.roux Jacques Le Roux added a comment - Hi Jinghai, Thanks a bunch
          Hide
          iwolf Ingo Wolfmayr added a comment -

          Hi Jinghai,

          I can confirm that your patch fixes the issues. Everything does work just perfect. Thanks a lot!

          Cheers,
          Ingo

          Show
          iwolf Ingo Wolfmayr added a comment - Hi Jinghai, I can confirm that your patch fixes the issues. Everything does work just perfect. Thanks a lot! Cheers, Ingo
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Thanks for the feedback Ingo,

          I hope will soon proceed at the creation of a new webapp under ecommerce in trunk as I explained above. People will then have 4 possibilities:

          • use ecommerce as is or as a basis of their own customisations
          • use the way Anil (barely) explained
          • use the new ecomseo component I will create
          • use commercial tools like http://www.cato-commerce.com/
          Show
          jacques.le.roux Jacques Le Roux added a comment - Thanks for the feedback Ingo, I hope will soon proceed at the creation of a new webapp under ecommerce in trunk as I explained above. People will then have 4 possibilities: use ecommerce as is or as a basis of their own customisations use the way Anil (barely) explained use the new ecomseo component I will create use commercial tools like http://www.cato-commerce.com/
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Thanks Jinghai,

          Your patch is in the SEO branch.

          Show
          jacques.le.roux Jacques Le Roux added a comment - Thanks Jinghai, Your patch is in the SEO branch.
          Hide
          iwolf Ingo Wolfmayr added a comment -

          Due to trunk Revision 1624549 the following files need to be update or build will fail:

          ../applications/product/src/org/ofbiz/product/category/SeoContextFilter.java
          ../applications/product/src/org/ofbiz/product/category/UrlRegexpContextFilter.java

          I create a patch file.

          Show
          iwolf Ingo Wolfmayr added a comment - Due to trunk Revision 1624549 the following files need to be update or build will fail: ../applications/product/src/org/ofbiz/product/category/SeoContextFilter.java ../applications/product/src/org/ofbiz/product/category/UrlRegexpContextFilter.java I create a patch file.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Thanks Ingo,

          Your patch is in the SEO branch. I did not put your change in build.xml though. Because I still expect to merge back this branch in trunk, when I will get a chance...

          Show
          jacques.le.roux Jacques Le Roux added a comment - Thanks Ingo, Your patch is in the SEO branch. I did not put your change in build.xml though. Because I still expect to merge back this branch in trunk, when I will get a chance...
          Hide
          iwolf Ingo Wolfmayr added a comment -

          When a file is missing (for example runtime/uploads/.../10000.jpeg) the application runs into an endless loop.

          java.io.FileNotFoundException: No file found: ...runtime/uploads/.../10000.jpeg

          [java] at org.ofbiz.content.data.DataResourceWorker.getContentFile(DataResourceWorker.java:422) ~[ofbiz-content.jar:?]
          [java] at org.ofbiz.content.data.DataResourceWorker.getDataResourceStream(DataResourceWorker.java:1057) ~[ofbiz-content.jar:?]
          [java] at org.ofbiz.content.data.DataEvents.serveObjectData(DataEvents.java:185) [ofbiz-content.jar:?]
          [java] at sun.reflect.GeneratedMethodAccessor68.invoke(Unknown Source) ~[?:?]
          [java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_67]
          [java] at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_67]
          [java] at org.ofbiz.webapp.event.JavaEventHandler.invoke(JavaEventHandler.java:93) [ofbiz-webapp.jar:?]
          [java] at org.ofbiz.webapp.event.JavaEventHandler.invoke(JavaEventHandler.java:79) [ofbiz-webapp.jar:?]
          [java] at org.ofbiz.webapp.control.RequestHandler.runEvent(RequestHandler.java:755) [ofbiz-webapp.jar:?]
          [java] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:475) [ofbiz-webapp.jar:?]
          [java] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) [ofbiz-webapp.jar:?]
          [java] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) [ofbiz-product.jar:?]
          [java] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) [servlet-api-3.0.jar:?]
          [java] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) [servlet-api-3.0.jar:?]
          [java] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) [tomcat-7.0.55-catalina.jar:7.0.55]
          [java] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [tomcat-7.0.55-catalina.jar:7.0.55]
          [java] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) [tomcat-7.0.55-catalina.jar:7.0.55]
          [java] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) [tomcat-7.0.55-catalina.jar:7.0.55]
          [java] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) [tomcat-7.0.55-catalina.jar:7.0.55]
          [java] at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) [ofbiz-webapp.jar:?]
          [java] at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) [ofbiz-webapp.jar:?]
          [java] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) [ofbiz-webapp.jar:?]
          [java] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) [ofbiz-webapp.jar:?]
          [java] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) [ofbiz-product.jar:?]
          [java] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) [servlet-api-3.0.jar:?]
          [java] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) [servlet-api-3.0.jar:?]
          [java] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) [tomcat-7.0.55-catalina.jar:7.0.55]
          [java] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [tomcat-7.0.55-catalina.jar:7.0.55]
          [java] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) [tomcat-7.0.55-catalina.jar:7.0.55]
          [java] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) [tomcat-7.0.55-catalina.jar:7.0.55]
          [java] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) [tomcat-7.0.55-catalina.jar:7.0.55]

          Show
          iwolf Ingo Wolfmayr added a comment - When a file is missing (for example runtime/uploads/.../10000.jpeg) the application runs into an endless loop. java.io.FileNotFoundException: No file found: ...runtime/uploads/.../10000.jpeg [java] at org.ofbiz.content.data.DataResourceWorker.getContentFile(DataResourceWorker.java:422) ~ [ofbiz-content.jar:?] [java] at org.ofbiz.content.data.DataResourceWorker.getDataResourceStream(DataResourceWorker.java:1057) ~ [ofbiz-content.jar:?] [java] at org.ofbiz.content.data.DataEvents.serveObjectData(DataEvents.java:185) [ofbiz-content.jar:?] [java] at sun.reflect.GeneratedMethodAccessor68.invoke(Unknown Source) ~ [?:?] [java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~ [?:1.7.0_67] [java] at java.lang.reflect.Method.invoke(Method.java:606) ~ [?:1.7.0_67] [java] at org.ofbiz.webapp.event.JavaEventHandler.invoke(JavaEventHandler.java:93) [ofbiz-webapp.jar:?] [java] at org.ofbiz.webapp.event.JavaEventHandler.invoke(JavaEventHandler.java:79) [ofbiz-webapp.jar:?] [java] at org.ofbiz.webapp.control.RequestHandler.runEvent(RequestHandler.java:755) [ofbiz-webapp.jar:?] [java] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:475) [ofbiz-webapp.jar:?] [java] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) [ofbiz-webapp.jar:?] [java] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) [ofbiz-product.jar:?] [java] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) [servlet-api-3.0.jar:?] [java] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) [servlet-api-3.0.jar:?] [java] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) [tomcat-7.0.55-catalina.jar:7.0.55] [java] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [tomcat-7.0.55-catalina.jar:7.0.55] [java] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) [tomcat-7.0.55-catalina.jar:7.0.55] [java] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) [tomcat-7.0.55-catalina.jar:7.0.55] [java] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) [tomcat-7.0.55-catalina.jar:7.0.55] [java] at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) [ofbiz-webapp.jar:?] [java] at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) [ofbiz-webapp.jar:?] [java] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) [ofbiz-webapp.jar:?] [java] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) [ofbiz-webapp.jar:?] [java] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) [ofbiz-product.jar:?] [java] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) [servlet-api-3.0.jar:?] [java] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) [servlet-api-3.0.jar:?] [java] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) [tomcat-7.0.55-catalina.jar:7.0.55] [java] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [tomcat-7.0.55-catalina.jar:7.0.55] [java] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) [tomcat-7.0.55-catalina.jar:7.0.55] [java] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) [tomcat-7.0.55-catalina.jar:7.0.55] [java] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) [tomcat-7.0.55-catalina.jar:7.0.55]
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Could you specify the context, by an use case for instance? Just give some steps to allow to reproduce. What I try to understand is if this is specific to the branch or if this also exists in the trunk HEAD.

          Show
          jacques.le.roux Jacques Le Roux added a comment - Could you specify the context, by an use case for instance? Just give some steps to allow to reproduce. What I try to understand is if this is specific to the branch or if this also exists in the trunk HEAD.
          Hide
          iwolf Ingo Wolfmayr added a comment -

          I create an image teaser on the start page of the ecommerce application. The images are retrieved via src="<@ofbizContentUrl>/stream?contentId=id</@ofbizContentUrl>"
          Everything works fine until an image is removed from the folder (../runtime/uploads/...). Then you get the error messages above. I will check with the trunk version. No problem in 13.07.

          Show
          iwolf Ingo Wolfmayr added a comment - I create an image teaser on the start page of the ecommerce application. The images are retrieved via src="<@ofbizContentUrl>/stream?contentId=id</@ofbizContentUrl>" Everything works fine until an image is removed from the folder (../runtime/uploads/...). Then you get the error messages above. I will check with the trunk version. No problem in 13.07.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Thanks Ingo, I guess it's the same in trunk than in R13.07.

          Show
          jacques.le.roux Jacques Le Roux added a comment - Thanks Ingo, I guess it's the same in trunk than in R13.07.
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          When this will be done OFBIZ-5805 can be closed

          Show
          jacques.le.roux Jacques Le Roux added a comment - When this will be done OFBIZ-5805 can be closed
          Hide
          jalmasi Josip Almasi added a comment -

          I get that when first user attempts to access the store:

          2014-11-29 11:19:20,997 |http-bio-8080-exec-7 |ContentWorker |E| No dataResourceId found for contentId: CONTENT_ERROR

          OFBIZ hangs, wasting 100% CPU.
          No other log entries.

          For starters, I'll attempt to print out contentId and see what's missing.
          Any pointers on how to proceed?

          Show
          jalmasi Josip Almasi added a comment - I get that when first user attempts to access the store: 2014-11-29 11:19:20,997 |http-bio-8080-exec-7 |ContentWorker |E| No dataResourceId found for contentId: CONTENT_ERROR OFBIZ hangs, wasting 100% CPU. No other log entries. For starters, I'll attempt to print out contentId and see what's missing. Any pointers on how to proceed?
          Hide
          madppiper Paul Piper added a comment -

          Looks like an issue with the contentworker, rather than this patch...

          Show
          madppiper Paul Piper added a comment - Looks like an issue with the contentworker, rather than this patch...
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Josip,

          Can you confirm you are using the SEO branch?

          Show
          jacques.le.roux Jacques Le Roux added a comment - Josip, Can you confirm you are using the SEO branch?
          Hide
          jalmasi Josip Almasi added a comment -

          Apsolutelly, fresh checkout, default theme.
          I'm using it with my production database, postgres, 13.7.

          Show
          jalmasi Josip Almasi added a comment - Apsolutelly, fresh checkout, default theme. I'm using it with my production database, postgres, 13.7.
          Hide
          shi.jinghai Shi Jinghai added a comment -

          Thanks Josip,

          I'll check the bug you mentioned today.

          Show
          shi.jinghai Shi Jinghai added a comment - Thanks Josip, I'll check the bug you mentioned today.
          Hide
          shi.jinghai Shi Jinghai added a comment -

          I updated to the latest seo branch, ran "clean build start", visited http://localhost:8080/ecommerce/, no error was found.

          To Josip:
          Could you pls figure out what url causes the bug you met?

          Show
          shi.jinghai Shi Jinghai added a comment - I updated to the latest seo branch, ran "clean build start", visited http://localhost:8080/ecommerce/ , no error was found. To Josip: Could you pls figure out what url causes the bug you met?
          Hide
          jalmasi Josip Almasi added a comment -

          I will certanly try.

          I'm resonably sure what caused missing content:
          I clicked on SEO button in my catalog. This generated a number of alt content for a number of products and categories. Then ecommerce died.
          I deleted generated things to make web shop work. There still may be something remaining.
          All that happened with 13.07.

          Then I accessed the same database with SEO branch.
          First user to access ecommerce causes cpu load 100%. This is the last html line displayed:
          <!-- Begin Template component://ecommerce/webapp/ecommerce/catalog/miniassocprods.ftl -->
          Second user causes 200%, third 300% load...

          Show
          jalmasi Josip Almasi added a comment - I will certanly try. I'm resonably sure what caused missing content: I clicked on SEO button in my catalog. This generated a number of alt content for a number of products and categories. Then ecommerce died. I deleted generated things to make web shop work. There still may be something remaining. All that happened with 13.07. Then I accessed the same database with SEO branch. First user to access ecommerce causes cpu load 100%. This is the last html line displayed: <!-- Begin Template component://ecommerce/webapp/ecommerce/catalog/miniassocprods.ftl --> Second user causes 200%, third 300% load...
          Hide
          madppiper Paul Piper added a comment -

          I don't think that the reason you describe is related to this patch. At least to my knowledge there is no "seo button" provided by this patch, nor does it use the alt-urls generated within the catalog... Shi Jinghai: can you validate my assessment?

          Show
          madppiper Paul Piper added a comment - I don't think that the reason you describe is related to this patch. At least to my knowledge there is no "seo button" provided by this patch, nor does it use the alt-urls generated within the catalog... Shi Jinghai : can you validate my assessment?
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          Josip you said,

          Apsolutelly, fresh checkout, default theme.

          Can you confirm you reproduce this error using a fresh checkout of the SEO branch using only the demo-data? If so please give your steps, thanks.

          Show
          jacques.le.roux Jacques Le Roux added a comment - Josip you said, Apsolutelly, fresh checkout, default theme. Can you confirm you reproduce this error using a fresh checkout of the SEO branch using only the demo-data? If so please give your steps, thanks.
          Hide
          jalmasi Josip Almasi added a comment - - edited


          That would surelly be already spotted.
          Obviously something is wrong with my data.

          Is there a way to migrate 13.07 data to SEO branch?

          In the meantime, here's stacktrace of the thread eating up CPU:

               [java] "http-bio-8080-exec-1" daemon prio=10 tid=0x00007fbd1c033800 nid=0x2fe8 runnable [0x00007fbd6f2a4000]
               [java]    java.lang.Thread.State: RUNNABLE
               [java] 	at org.ofbiz.entity.GenericEntity.get(GenericEntity.java:372)
               [java] 	at org.ofbiz.entity.GenericEntity.getString(GenericEntity.java:679)
               [java] 	at org.ofbiz.content.webapp.ftl.LimitedSubContentCacheTransform$1.getRandomEntity(LimitedSubContentCacheTransform.java:308)
               [java] 	at org.ofbiz.content.webapp.ftl.LimitedSubContentCacheTransform$1.getNextMatchingEntity(LimitedSubContentCacheTransform.java:321)
               [java] 	at org.ofbiz.content.webapp.ftl.LimitedSubContentCacheTransform$1.afterBody(LimitedSubContentCacheTransform.java:213)
               [java] 	at freemarker.core.Environment.visitAndTransform(Environment.java:371)
               [java] 	at freemarker.core.UnifiedCall.accept(UnifiedCall.java:104)
               [java] 	at freemarker.core.Environment.visit(Environment.java:257)
               [java] 	at freemarker.core.MixedContent.accept(MixedContent.java:57)
               [java] 	at freemarker.core.Environment.visit(Environment.java:257)
               [java] 	at freemarker.core.Environment.process(Environment.java:235)
               [java] 	at org.ofbiz.base.util.template.FreeMarkerWorker.renderTemplate(FreeMarkerWorker.java:256)
               [java] 	at org.ofbiz.widget.screen.HtmlWidget.renderHtmlTemplate(HtmlWidget.java:157)
               [java] 	at org.ofbiz.widget.screen.HtmlWidget$HtmlTemplate.renderWidgetString(HtmlWidget.java:202)
               [java] 	at org.ofbiz.widget.screen.HtmlWidget.renderWidgetString(HtmlWidget.java:130)
               [java] 	at org.ofbiz.widget.screen.ModelScreenWidget$PlatformSpecific.renderWidgetString(ModelScreenWidget.java:1100)
               [java] 	at org.ofbiz.widget.screen.ModelScreenWidget.renderSubWidgetsString(ModelScreenWidget.java:103)
               [java] 	at org.ofbiz.widget.screen.ModelScreenWidget$Section.renderWidgetString(ModelScreenWidget.java:270)
               [java] 	at org.ofbiz.widget.screen.ModelScreen.renderScreenString(ModelScreen.java:164)
               [java] 	at org.ofbiz.widget.screen.ScreenFactory.renderReferencedScreen(ScreenFactory.java:210)
               [java] 	at org.ofbiz.widget.screen.ModelScreenWidget$IncludeScreen.renderWidgetString(ModelScreenWidget.java:695)
               [java] 	at org.ofbiz.widget.screen.ModelScreenWidget.renderSubWidgetsString(ModelScreenWidget.java:103)
               [java] 	at org.ofbiz.widget.screen.ModelScreenWidget$Section.renderWidgetString(ModelScreenWidget.java:270)
               [java] 	at org.ofbiz.widget.screen.ModelScreen.renderScreenString(ModelScreen.java:164)
               [java] 	at org.ofbiz.widget.screen.ScreenFactory.renderReferencedScreen(ScreenFactory.java:210)
               [java] 	at org.ofbiz.widget.screen.ModelScreenWidget$IncludeScreen.renderWidgetString(ModelScreenWidget.java:695)
               [java] 	at org.ofbiz.widget.screen.ModelScreenWidget.renderSubWidgetsString(ModelScreenWidget.java:103)
               [java] 	at org.ofbiz.widget.screen.ModelScreenWidget$Container.renderWidgetString(ModelScreenWidget.java:423)
               [java] 	at org.ofbiz.widget.screen.ModelScreenWidget.renderSubWidgetsString(ModelScreenWidget.java:103)
               [java] 	at org.ofbiz.widget.screen.ModelScreenWidget$Container.renderWidgetString(ModelScreenWidget.java:423)
               [java] 	at org.ofbiz.widget.screen.ModelScreenWidget.renderSubWidgetsString(ModelScreenWidget.java:103)
               [java] 	at org.ofbiz.widget.screen.ModelScreenWidget$Section.renderWidgetString(ModelScreenWidget.java:270)
               [java] 	at org.ofbiz.widget.screen.ModelScreenWidget.renderSubWidgetsString(ModelScreenWidget.java:103)
               [java] 	at org.ofbiz.widget.screen.ModelScreenWidget$Section.renderWidgetString(ModelScreenWidget.java:270)
               [java] 	at org.ofbiz.widget.screen.ModelScreen.renderScreenString(ModelScreen.java:164)
               [java] 	at org.ofbiz.widget.screen.ScreenFactory.renderReferencedScreen(ScreenFactory.java:210)
               [java] 	at org.ofbiz.widget.screen.ModelScreenWidget$DecoratorScreen.renderWidgetString(ModelScreenWidget.java:763)
               [java] 	at org.ofbiz.widget.screen.ModelScreenWidget.renderSubWidgetsString(ModelScreenWidget.java:103)
               [java] 	at org.ofbiz.widget.screen.ModelScreenWidget$Section.renderWidgetString(ModelScreenWidget.java:270)
               [java] 	at org.ofbiz.widget.screen.ModelScreen.renderScreenString(ModelScreen.java:164)
               [java] 	at org.ofbiz.widget.screen.ScreenRenderer.render(ScreenRenderer.java:133)
               [java] 	at org.ofbiz.widget.screen.ScreenRenderer.render(ScreenRenderer.java:95)
               [java] 	at org.ofbiz.widget.screen.MacroScreenViewHandler.render(MacroScreenViewHandler.java:97)
               [java] 	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987)
               [java] 	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674)
               [java] 	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210)
               [java] 	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85)
               [java] 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
               [java] 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
               [java] 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
               [java] 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
               [java] 	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748)
               [java] 	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:486)
               [java] 	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:411)
               [java] 	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:338)
               [java] 	at org.ofbiz.product.category.SeoContextFilter.doFilter(SeoContextFilter.java:255)
               [java] 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
               [java] 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
               [java] 	at org.ofbiz.product.category.SeoContentUrlFilter.doFilter(SeoContentUrlFilter.java:107)
               [java] 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
               [java] 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
               [java] 	at org.ofbiz.product.category.CatalogUrlFilter.doFilter(CatalogUrlFilter.java:336)
               [java] 	at org.ofbiz.product.category.CatalogUrlSeoFilter.doFilter(CatalogUrlSeoFilter.java:68)
               [java] 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
               [java] 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
               [java] 	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
               [java] 	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
               [java] 	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
               [java] 	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
               [java] 	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
               [java] 	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
               [java] 	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
               [java] 	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
               [java] 	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
               [java] 	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
               [java] 	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
               [java] 	- locked <0x00000000e6054538> (a org.apache.tomcat.util.net.SocketWrapper)
               [java] 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
               [java] 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
               [java] 	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
               [java] 	at java.lang.Thread.run(Thread.java:744)
          
          Show
          jalmasi Josip Almasi added a comment - - edited That would surelly be already spotted. Obviously something is wrong with my data. Is there a way to migrate 13.07 data to SEO branch? In the meantime, here's stacktrace of the thread eating up CPU: [java] "http-bio-8080-exec-1" daemon prio=10 tid=0x00007fbd1c033800 nid=0x2fe8 runnable [0x00007fbd6f2a4000] [java] java.lang. Thread .State: RUNNABLE [java] at org.ofbiz.entity.GenericEntity.get(GenericEntity.java:372) [java] at org.ofbiz.entity.GenericEntity.getString(GenericEntity.java:679) [java] at org.ofbiz.content.webapp.ftl.LimitedSubContentCacheTransform$1.getRandomEntity(LimitedSubContentCacheTransform.java:308) [java] at org.ofbiz.content.webapp.ftl.LimitedSubContentCacheTransform$1.getNextMatchingEntity(LimitedSubContentCacheTransform.java:321) [java] at org.ofbiz.content.webapp.ftl.LimitedSubContentCacheTransform$1.afterBody(LimitedSubContentCacheTransform.java:213) [java] at freemarker.core.Environment.visitAndTransform(Environment.java:371) [java] at freemarker.core.UnifiedCall.accept(UnifiedCall.java:104) [java] at freemarker.core.Environment.visit(Environment.java:257) [java] at freemarker.core.MixedContent.accept(MixedContent.java:57) [java] at freemarker.core.Environment.visit(Environment.java:257) [java] at freemarker.core.Environment.process(Environment.java:235) [java] at org.ofbiz.base.util.template.FreeMarkerWorker.renderTemplate(FreeMarkerWorker.java:256) [java] at org.ofbiz.widget.screen.HtmlWidget.renderHtmlTemplate(HtmlWidget.java:157) [java] at org.ofbiz.widget.screen.HtmlWidget$HtmlTemplate.renderWidgetString(HtmlWidget.java:202) [java] at org.ofbiz.widget.screen.HtmlWidget.renderWidgetString(HtmlWidget.java:130) [java] at org.ofbiz.widget.screen.ModelScreenWidget$PlatformSpecific.renderWidgetString(ModelScreenWidget.java:1100) [java] at org.ofbiz.widget.screen.ModelScreenWidget.renderSubWidgetsString(ModelScreenWidget.java:103) [java] at org.ofbiz.widget.screen.ModelScreenWidget$Section.renderWidgetString(ModelScreenWidget.java:270) [java] at org.ofbiz.widget.screen.ModelScreen.renderScreenString(ModelScreen.java:164) [java] at org.ofbiz.widget.screen.ScreenFactory.renderReferencedScreen(ScreenFactory.java:210) [java] at org.ofbiz.widget.screen.ModelScreenWidget$IncludeScreen.renderWidgetString(ModelScreenWidget.java:695) [java] at org.ofbiz.widget.screen.ModelScreenWidget.renderSubWidgetsString(ModelScreenWidget.java:103) [java] at org.ofbiz.widget.screen.ModelScreenWidget$Section.renderWidgetString(ModelScreenWidget.java:270) [java] at org.ofbiz.widget.screen.ModelScreen.renderScreenString(ModelScreen.java:164) [java] at org.ofbiz.widget.screen.ScreenFactory.renderReferencedScreen(ScreenFactory.java:210) [java] at org.ofbiz.widget.screen.ModelScreenWidget$IncludeScreen.renderWidgetString(ModelScreenWidget.java:695) [java] at org.ofbiz.widget.screen.ModelScreenWidget.renderSubWidgetsString(ModelScreenWidget.java:103) [java] at org.ofbiz.widget.screen.ModelScreenWidget$Container.renderWidgetString(ModelScreenWidget.java:423) [java] at org.ofbiz.widget.screen.ModelScreenWidget.renderSubWidgetsString(ModelScreenWidget.java:103) [java] at org.ofbiz.widget.screen.ModelScreenWidget$Container.renderWidgetString(ModelScreenWidget.java:423) [java] at org.ofbiz.widget.screen.ModelScreenWidget.renderSubWidgetsString(ModelScreenWidget.java:103) [java] at org.ofbiz.widget.screen.ModelScreenWidget$Section.renderWidgetString(ModelScreenWidget.java:270) [java] at org.ofbiz.widget.screen.ModelScreenWidget.renderSubWidgetsString(ModelScreenWidget.java:103) [java] at org.ofbiz.widget.screen.ModelScreenWidget$Section.renderWidgetString(ModelScreenWidget.java:270) [java] at org.ofbiz.widget.screen.ModelScreen.renderScreenString(ModelScreen.java:164) [java] at org.ofbiz.widget.screen.ScreenFactory.renderReferencedScreen(ScreenFactory.java:210) [java] at org.ofbiz.widget.screen.ModelScreenWidget$DecoratorScreen.renderWidgetString(ModelScreenWidget.java:763) [java] at org.ofbiz.widget.screen.ModelScreenWidget.renderSubWidgetsString(ModelScreenWidget.java:103) [java] at org.ofbiz.widget.screen.ModelScreenWidget$Section.renderWidgetString(ModelScreenWidget.java:270) [java] at org.ofbiz.widget.screen.ModelScreen.renderScreenString(ModelScreen.java:164) [java] at org.ofbiz.widget.screen.ScreenRenderer.render(ScreenRenderer.java:133) [java] at org.ofbiz.widget.screen.ScreenRenderer.render(ScreenRenderer.java:95) [java] at org.ofbiz.widget.screen.MacroScreenViewHandler.render(MacroScreenViewHandler.java:97) [java] at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) [java] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) [java] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) [java] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) [java] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) [java] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) [java] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) [java] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [java] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) [java] at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:486) [java] at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:411) [java] at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:338) [java] at org.ofbiz.product.category.SeoContextFilter.doFilter(SeoContextFilter.java:255) [java] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [java] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [java] at org.ofbiz.product.category.SeoContentUrlFilter.doFilter(SeoContentUrlFilter.java:107) [java] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [java] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [java] at org.ofbiz.product.category.CatalogUrlFilter.doFilter(CatalogUrlFilter.java:336) [java] at org.ofbiz.product.category.CatalogUrlSeoFilter.doFilter(CatalogUrlSeoFilter.java:68) [java] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [java] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [java] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) [java] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) [java] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) [java] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) [java] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) [java] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) [java] at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) [java] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) [java] at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) [java] at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) [java] at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314) [java] - locked <0x00000000e6054538> (a org.apache.tomcat.util.net.SocketWrapper) [java] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [java] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [java] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [java] at java.lang. Thread .run( Thread .java:744)
          Hide
          jacques.le.roux Jacques Le Roux added a comment -

          There should not be data model issues, check https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=7045166

          Though I did not digg in your stack trace in detail, its top is not related to SEO specific things but the conventional content component: LimitedSubContentCacheTransform.getRandomEntity().

          Show
          jacques.le.roux Jacques Le Roux added a comment - There should not be data model issues, check https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=7045166 Though I did not digg in your stack trace in detail, its top is not related to SEO specific things but the conventional content component: LimitedSubContentCacheTransform.getRandomEntity().
          Hide
          jalmasi Josip Almasi added a comment -

          OK thanks for info.

          Show
          jalmasi Josip Almasi added a comment - OK thanks for info.
          Hide
          jalmasi Josip Almasi added a comment - - edited

          Now fresh install of the branch, with demo data.
          Click on 'ask the experts forum' resulted in endless loop, eating up 200% cpu.
          The app can't stop with ant stop, process has to be killed.

          Branch or trunk, I don't know, but something is so badly broken I can't even try out the branch.
          Guess I'll leave it for some better times then.

          Here's stack trace if anyone's interested:

          2014-12-03 14:12:22,977 |http-bio-8080-exec-4 |ControlServlet                |E|
           Error in request handler: 
          java.lang.NullPointerException
          	at org.apache.catalina.connector.OutputBuffer.realWriteChars(OutputBuffer.java:475) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.tomcat.util.buf.CharChunk.flushBuffer(CharChunk.java:464) ~[tomcat-7.0.57-tomcat-coyote.jar:7.0.57]
          	at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:353) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:331) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.connector.Response.flushBuffer(Response.java:610) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.connector.ResponseFacade.flushBuffer(ResponseFacade.java:306) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:996) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?]
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?]
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57]
          	at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?]
          	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?]
          
          Show
          jalmasi Josip Almasi added a comment - - edited Now fresh install of the branch, with demo data. Click on 'ask the experts forum' resulted in endless loop, eating up 200% cpu. The app can't stop with ant stop, process has to be killed. Branch or trunk, I don't know, but something is so badly broken I can't even try out the branch. Guess I'll leave it for some better times then. Here's stack trace if anyone's interested: 2014-12-03 14:12:22,977 |http-bio-8080-exec-4 |ControlServlet |E| Error in request handler: java.lang.NullPointerException at org.apache.catalina.connector.OutputBuffer.realWriteChars(OutputBuffer.java:475) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.tomcat.util.buf.CharChunk.flushBuffer(CharChunk.java:464) ~[tomcat-7.0.57-tomcat-coyote.jar:7.0.57] at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:353) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:331) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.connector.Response.flushBuffer(Response.java:610) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.connector.ResponseFacade.flushBuffer(ResponseFacade.java:306) ~[tomcat-7.0.57-catalina.jar:7.0.57] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:160) ~[servlet-api-3.0.jar:3.0.FR] at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:996) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.ofbiz.webapp.view.JspViewHandler.render(JspViewHandler.java:77) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.renderView(RequestHandler.java:987) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:674) ~[ofbiz-webapp.jar:?] at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) ~[ofbiz-webapp.jar:?] at org.ofbiz.product.category.SeoControlServlet.doGet(SeoControlServlet.java:85) ~[ofbiz-product.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) ~[servlet-api-3.0.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-3.0.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) ~[tomcat-7.0.57-catalina.jar:7.0.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) ~[tomcat-7.0.57-catalina.jar:7.0.57] at or