You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by jl...@apache.org on 2012/03/23 07:32:23 UTC

svn commit: r1304205 - in /ofbiz/trunk/applications/product: servicedef/services_maint.xml src/org/ofbiz/product/category/CategoryWorker.java

Author: jleroux
Date: Fri Mar 23 06:32:23 2012
New Revision: 1304205

URL: http://svn.apache.org/viewvc?rev=1304205&view=rev
Log:
A patch from Paul Pipper "Categories - calculated trails" https://issues.apache.org/jira/browse/OFBIZ-4580

I noticed that currently OFBiz misses a simple function to generate a category trail. 
Generating a trail, however, is often useful when generating breadcrums, facetted search results, and proper category trees in general. 
Hence I created getCategoryTrail


Modified:
    ofbiz/trunk/applications/product/servicedef/services_maint.xml
    ofbiz/trunk/applications/product/src/org/ofbiz/product/category/CategoryWorker.java

Modified: ofbiz/trunk/applications/product/servicedef/services_maint.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/servicedef/services_maint.xml?rev=1304205&r1=1304204&r2=1304205&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/servicedef/services_maint.xml (original)
+++ ofbiz/trunk/applications/product/servicedef/services_maint.xml Fri Mar 23 06:32:23 2012
@@ -114,6 +114,16 @@ under the License.
         <attribute name="parentProductCategoryId" type="String" mode="IN" optional="false"/>
         <attribute name="categories" type="java.util.List" mode="INOUT" optional="true"/>
     </service>
+    
+    <service name="getCategoryTrail" engine="java"
+      location="org.ofbiz.product.category.CategoryWorker" invoke="getCategoryTrail">
+        <description> Returns a complete category trail - can be used for exporting proper category trees. 
+        This is mostly useful when used in combination with breadcrumbs,  for building a facetted index tree, 
+        or to export a category tree for migration to another system.
+        Will create the tree from root point to categoryId. </description>
+        <attribute name="productCategoryId" type="String" mode="IN" optional="false"/>
+        <attribute name="trail" type="java.util.List" mode="OUT" optional="true"/>
+    </service>
 
     <service name="checkImageUrlForCategoryAndProduct" engine="simple"
       location="component://product/script/org/ofbiz/product/catalog/CatalogServices.xml" invoke="checkImageUrlForCategoryAndProduct">

Modified: ofbiz/trunk/applications/product/src/org/ofbiz/product/category/CategoryWorker.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/category/CategoryWorker.java?rev=1304205&r1=1304204&r2=1304205&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/src/org/ofbiz/product/category/CategoryWorker.java (original)
+++ ofbiz/trunk/applications/product/src/org/ofbiz/product/category/CategoryWorker.java Fri Mar 23 06:32:23 2012
@@ -19,7 +19,9 @@
 package org.ofbiz.product.category;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 
 import javax.servlet.ServletRequest;
@@ -34,14 +36,18 @@ import org.ofbiz.base.util.UtilFormatOut
 import org.ofbiz.base.util.UtilGenerics;
 import org.ofbiz.base.util.UtilHttp;
 import org.ofbiz.base.util.UtilMisc;
+import org.ofbiz.base.util.UtilProperties;
 import org.ofbiz.base.util.UtilValidate;
 import org.ofbiz.entity.Delegator;
+import org.ofbiz.entity.GenericDelegator;
 import org.ofbiz.entity.GenericEntityException;
 import org.ofbiz.entity.GenericValue;
 import org.ofbiz.entity.condition.EntityCondition;
 import org.ofbiz.entity.condition.EntityOperator;
 import org.ofbiz.entity.util.EntityUtil;
 import org.ofbiz.product.product.ProductWorker;
+import org.ofbiz.service.DispatchContext;
+import org.ofbiz.service.ServiceUtil;
 
 /**
  * CategoryWorker - Worker class to reduce code in JSPs.
@@ -412,4 +418,54 @@ public class CategoryWorker {
             }
         }
     }
+    
+    /**
+     * Returns a complete category trail - can be used for exporting proper category trees. 
+     * This is mostly useful when used in combination with bread-crumbs,  for building a 
+     * faceted index tree, or to export a category tree for migration to another system.
+     * Will create the tree from root point to categoryId. 
+     * 
+     * @param  productCategoryId  id of category the trail should be generated for
+     * @returns List organized trail from root point to categoryId.
+     * */
+    public static Map getCategoryTrail(DispatchContext dctx, Map context) {
+        String productCategoryId = (String) context.get("productCategoryId");
+        Map<String, Object> results = ServiceUtil.returnSuccess();
+        GenericDelegator delegator = (GenericDelegator) dctx.getDelegator();
+        List<String> trailElements = FastList.newInstance();
+        trailElements.add(productCategoryId);
+        String parentProductCategoryId = productCategoryId;
+        while (UtilValidate.isNotEmpty(parentProductCategoryId)) {
+            // find product category rollup
+            try {
+                List<EntityCondition> rolllupConds = FastList.newInstance();
+                rolllupConds.add(EntityCondition.makeCondition("productCategoryId", parentProductCategoryId));
+                rolllupConds.add(EntityUtil.getFilterByDateExpr());
+                List<GenericValue> productCategoryRollups = delegator.findList("ProductCategoryRollup", 
+                        EntityCondition.makeCondition(rolllupConds), null, UtilMisc.toList("sequenceNum"), null, true);
+                if (UtilValidate.isNotEmpty(productCategoryRollups)) {
+                    // add only categories that belong to the top category to trail
+                    for (GenericValue productCategoryRollup : productCategoryRollups) {
+                        String trailCategoryId = productCategoryRollup.getString("parentProductCategoryId");
+                        parentProductCategoryId = trailCategoryId;
+                        if (trailElements.contains(trailCategoryId)) {
+                            break;
+                        } else {
+                            trailElements.add(trailCategoryId);
+                        }
+                    }
+                } else {
+                    parentProductCategoryId = null;
+                }
+            } catch (GenericEntityException e) {
+                Map<String, String> messageMap = UtilMisc.toMap("errMessage", ". Cannot generate trail from product category. ");
+                String errMsg = UtilProperties.getMessage("CommonUiLabels", "CommonDatabaseProblem", messageMap, (Locale) context.get("locale"));
+                Debug.logError(e, errMsg, module);
+                return ServiceUtil.returnError(errMsg);
+            }
+        }
+        Collections.reverse(trailElements);
+        results.put("trail", trailElements);
+        return results;
+    }
 }