Author: jleroux
Date: Sat Nov 1 10:19:32 2008 New Revision: 709726 URL: http://svn.apache.org/viewvc?rev=709726&view=rev Log: A patch from Nicolas Malin "Refactoring product search by id" (https://issues.apache.org/jira/browse/OFBIZ-2027) - OFBIZ-2027 Modified: ofbiz/trunk/applications/product/servicedef/services.xml ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductServices.java ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductWorker.java ofbiz/trunk/specialpurpose/hhfacility/src/org/ofbiz/hhfacility/FacilityServices.java ofbiz/trunk/specialpurpose/pos/src/org/ofbiz/pos/PosTransaction.java Modified: ofbiz/trunk/applications/product/servicedef/services.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/servicedef/services.xml?rev=709726&r1=709725&r2=709726&view=diff ============================================================================== --- ofbiz/trunk/applications/product/servicedef/services.xml (original) +++ ofbiz/trunk/applications/product/servicedef/services.xml Sat Nov 1 10:19:32 2008 @@ -203,6 +203,17 @@ <auto-attributes mode="IN" include="pk" optional="false"/> <auto-attributes mode="IN" include="nonpk" optional="true"/> </service> + + <service name="findProductsById" engine="java" auth="true" + location="org.ofbiz.product.ProductServices" invoke="findProductByGoodIdentification"> + <description>Find the productId corresponding to a reference and a reference type</description> + <attribute type="String" mode="IN" name="idToFind" optional="false"/> + <attribute type="String" mode="IN" name="goodIdentificationTypeId" optional="true"/> + <attribute type="String" mode="IN" name="searchProductFirst" optional="true"/> + <attribute type="String" mode="IN" name="searchAllId" optional="true"/> + <attribute type="GenericValue" mode="OUT" name="product" optional="true"/> + <attribute type="List" mode="OUT" name="productsFound" optional="true"/> + </service> <!-- Product Association Services --> Modified: ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductServices.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductServices.java?rev=709726&r1=709725&r2=709726&view=diff ============================================================================== --- ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductServices.java (original) +++ ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductServices.java Sat Nov 1 10:19:32 2008 @@ -1101,5 +1101,46 @@ } return ServiceUtil.returnSuccess(); } + + /** + * Finds productId(s) corresponding to a product reference, productId or a GoodIdentification idValue + * @param dctx + * @param context + * @param context.productId use to search with productId or goodIdentification.idValue + * @return a GenericValue with a productId and a List of complementary productId found + */ + public static Map<String, Object> findProductById(DispatchContext ctx, Map<String, Object> context) { + GenericDelegator delegator = ctx.getDelegator(); + String idToFind = (String) context.get("idToFind"); + String goodIdentificationTypeId = (String) context.get("goodIdentificationTypeId"); + String searchProductFirstContext = (String) context.get("searchProductFirst"); + String searchAllIdContext = (String) context.get("searchAllId"); + + boolean searchProductFirst = UtilValidate.isNotEmpty(searchProductFirstContext) && "N".equals(searchProductFirstContext) ? false : true; + boolean searchAllId = UtilValidate.isNotEmpty(searchAllIdContext)&& "Y".equals(searchAllIdContext) ? true : false; + + GenericValue product = null; + List<GenericValue> productsFound = null; + try { + productsFound = ProductWorker.findProductsById(delegator, idToFind, goodIdentificationTypeId, searchProductFirst, searchAllId); + } catch (GenericEntityException e) { + Debug.logError(e, module); + ServiceUtil.returnError(e.getMessage()); + } + + if (UtilValidate.isNotEmpty(productsFound)) { + LinkedList<GenericValue> productsList = new LinkedList<GenericValue>(); + // gets the first productId of the List + product = EntityUtil.getFirst(productsFound); + // remove this productId + productsFound.remove(0); + } + + Map<String, Object> result = ServiceUtil.returnSuccess(); + result.put("product", product); + result.put("productsList", productsFound); + + return result; + } } Modified: ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductWorker.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductWorker.java?rev=709726&r1=709725&r2=709726&view=diff ============================================================================== --- ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductWorker.java (original) +++ ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductWorker.java Sat Nov 1 10:19:32 2008 @@ -850,30 +850,64 @@ return null; } - public static String findProductId(GenericDelegator delegator, String idToFind, String goodIdentificationTypeId) throws GenericEntityException { - // first lookup and see if this is the Product PK - GenericValue product = delegator.findByPrimaryKeyCache("Product", UtilMisc.toMap("productId", idToFind)); - String productId = null; - - if (product == null) { - // no product record found; no check good identification - Map goodIdLookup = UtilMisc.toMap("idValue", idToFind); - if (UtilValidate.isNotEmpty(goodIdentificationTypeId)) { - goodIdLookup.put("goodIdentificationTypeId", goodIdentificationTypeId); - } - List goodIds = delegator.findByAndCache("GoodIdentification", goodIdLookup, UtilMisc.toList("-createdStamp")); + + /** + * Generic service to find product by id. + * By default return the product find by productId + * but you can pass searchProductFirst at false if you want search in goodIdentification before + * or pass searchAllId at true to find all product with this id (product.productId and goodIdentification.idValue) + * @param delegator + * @param idToFind + * @param goodIdentificationTypeId + * @param searchProductFirst + * @param searchAllId + * @return + * @throws GenericEntityException + */ + public static List<GenericValue> findProductsById( GenericDelegator delegator, + String idToFind, String goodIdentificationTypeId, + boolean searchProductFirst, boolean searchAllId) throws GenericEntityException { + + if (Debug.infoOn()) Debug.logInfo("Analyze goodIdentification: entered id = " + idToFind + ", goodIdentificationTypeId = " + goodIdentificationTypeId, module); + + GenericValue product = null; + List<GenericValue> productsFound = null; + + // 1) look if the idToFind given is a real productId + if (searchProductFirst) { + product = delegator.findByPrimaryKeyCache("Product", UtilMisc.toMap("productId", idToFind)); + } - // sorted by createdStamp; so pull out the most current entry - GenericValue lastGoodId = EntityUtil.getFirst(goodIds); - if (lastGoodId != null) { - productId = lastGoodId.getString("productId"); + if (searchAllId || (searchProductFirst && UtilValidate.isEmpty(product))) { + // 2) Retrieve product in GoodIdentification + Map<String, String> conditions = UtilMisc.toMap("idValue", idToFind); + if (UtilValidate.isNotEmpty(goodIdentificationTypeId)) { + conditions.put("goodIdentificationTypeId", goodIdentificationTypeId); } - } else { - productId = product.getString("productId"); + productsFound = delegator.findByAndCache("GoodIdentificationAndProduct", conditions, UtilMisc.toList("productId")); + } + + if (! searchProductFirst) { + product = delegator.findByPrimaryKeyCache("Product", UtilMisc.toMap("productId", idToFind)); + } + + if (UtilValidate.isNotEmpty(product)){ + if (UtilValidate.isNotEmpty(productsFound)) productsFound.add(product); + else productsFound = UtilMisc.toList(product); } + if (Debug.infoOn()) Debug.logInfo("Analyze goodIdentification: found product.productId = " + product + ", and list : " + productsFound, module); + return productsFound; + } - if (productId != null) { - return productId; + public static List<GenericValue> findProductsById( GenericDelegator delegator, String idToFind, String goodIdentificationTypeId) + throws GenericEntityException { + return findProductsById(delegator, idToFind, goodIdentificationTypeId, true, false); + } + + public static String findProductId(GenericDelegator delegator, String idToFind, String goodIdentificationTypeId) throws GenericEntityException { + GenericValue product = findProduct(delegator, idToFind, goodIdentificationTypeId); + if (UtilValidate.isNotEmpty(product)) { + return product.getString("productId"); } else { return null; } @@ -884,53 +918,30 @@ } public static GenericValue findProduct(GenericDelegator delegator, String idToFind, String goodIdentificationTypeId) throws GenericEntityException { - // first lookup and see if this is the Product PK - GenericValue product = delegator.findByPrimaryKeyCache("Product", UtilMisc.toMap("productId", idToFind)); - - if (product == null) { - // no product record found; no check good identification - Map goodIdLookup = UtilMisc.toMap("idValue", idToFind); - if (UtilValidate.isNotEmpty(goodIdentificationTypeId)) { - goodIdLookup.put("goodIdentificationTypeId", goodIdentificationTypeId); - } - List goodIds = delegator.findByAndCache("GoodIdentification", goodIdLookup, UtilMisc.toList("-createdStamp")); - - // sorted by createdStamp; so pull out the most current entry - GenericValue lastGoodId = EntityUtil.getFirst(goodIds); - if (lastGoodId != null) { - product = lastGoodId.getRelatedOneCache("Product"); - } - } - - if (product != null) { - return product; - } else { - return null; - } + List<GenericValue> products = findProductsById(delegator, idToFind, goodIdentificationTypeId); + GenericValue product = EntityUtil.getFirst(products); + return product; } - public static List findProducts(GenericDelegator delegator, String idToFind, String goodIdentificationTypeId) throws GenericEntityException { - // first lookup and see if this is the Product PK - GenericValue product = delegator.findByPrimaryKeyCache("Product", UtilMisc.toMap("productId", idToFind)); - List products = FastList.newInstance(); - if (product == null) { - // no product record found; no check good identification - Map goodIdLookup = UtilMisc.toMap("idValue", idToFind); - if (UtilValidate.isNotEmpty(goodIdentificationTypeId)) { - goodIdLookup.put("goodIdentificationTypeId", goodIdentificationTypeId); - } - List goodIds = delegator.findByAndCache("GoodIdentification", goodIdLookup, UtilMisc.toList("-createdStamp")); - - // sorted by createdStamp; so pull out the most current entry - if (goodIds != null) { - Iterator<GenericValue> i = goodIds.iterator(); - while (i.hasNext()) { - GenericValue v = i.next(); - products.add(v.getRelatedOneCache("Product")); + public static List<GenericValue> findProducts(GenericDelegator delegator, String idToFind, String goodIdentificationTypeId) throws GenericEntityException { + List<GenericValue> productsByIds = findProductsById(delegator, idToFind, goodIdentificationTypeId); + List<GenericValue> products = null; + if (UtilValidate.isNotEmpty(productsByIds)){ + for (GenericValue product : productsByIds){ + GenericValue productToAdd = product; + //retreive product GV if the actual genericValue came from viewEntity + if (! "Product".equals(product.getEntityName())) { + productToAdd = delegator.findByPrimaryKeyCache("Product", UtilMisc.toMap("productId", product.get("productId"))); + } + + if (UtilValidate.isEmpty(products)) { + products = UtilMisc.toList(productToAdd); + } + else { + products.add(productToAdd); } } } - return products; } Modified: ofbiz/trunk/specialpurpose/hhfacility/src/org/ofbiz/hhfacility/FacilityServices.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/hhfacility/src/org/ofbiz/hhfacility/FacilityServices.java?rev=709726&r1=709725&r2=709726&view=diff ============================================================================== --- ofbiz/trunk/specialpurpose/hhfacility/src/org/ofbiz/hhfacility/FacilityServices.java (original) +++ ofbiz/trunk/specialpurpose/hhfacility/src/org/ofbiz/hhfacility/FacilityServices.java Sat Nov 1 10:19:32 2008 @@ -32,6 +32,7 @@ import org.ofbiz.entity.GenericDelegator; import org.ofbiz.entity.GenericEntityException; import org.ofbiz.entity.GenericValue; +import org.ofbiz.product.product.ProductWorker; import org.ofbiz.service.DispatchContext; import org.ofbiz.service.GenericServiceException; import org.ofbiz.service.LocalDispatcher; @@ -41,39 +42,19 @@ public static final String module = FacilityServices.class.getName(); - public static Map findProductsById(DispatchContext dctx, Map context) { + public static Map findProductsById(DispatchContext dctx, Map context) { GenericDelegator delegator = dctx.getDelegator(); String facilityId = (String) context.get("facilityId"); String idValue = (String) context.get("idValue"); GenericValue product = null; - List productsFound = null; + List<GenericValue> productsFound = null; - GenericValue productItem = null; - if (UtilValidate.isNotEmpty(idValue)) { - // First lets find the productId from the Sku(s) - try { - productsFound = delegator.findByAnd("GoodIdentificationAndProduct", - UtilMisc.toMap("idValue", idValue), UtilMisc.toList("productId")); - } catch (GenericEntityException e) { - Debug.logError(e, module); - throw new GeneralRuntimeException(e.getMessage()); - } - } - - // Now do a direct lookup.. - productItem = null; try { - productItem = delegator.findByPrimaryKey("Product", UtilMisc.toMap("productId", idValue)); + productsFound = ProductWorker.findProductsById(delegator, idValue, null, false, true); } catch (GenericEntityException e) { Debug.logError(e, module); throw new GeneralRuntimeException(e.getMessage()); } - if (productItem != null) { - if (productsFound == null) { - productsFound = new ArrayList(); - } - productsFound.add(productItem); - } // Send back the results Map result = ServiceUtil.returnSuccess(); Modified: ofbiz/trunk/specialpurpose/pos/src/org/ofbiz/pos/PosTransaction.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/pos/src/org/ofbiz/pos/PosTransaction.java?rev=709726&r1=709725&r2=709726&view=diff ============================================================================== --- ofbiz/trunk/specialpurpose/pos/src/org/ofbiz/pos/PosTransaction.java (original) +++ ofbiz/trunk/specialpurpose/pos/src/org/ofbiz/pos/PosTransaction.java Sat Nov 1 10:19:32 2008 @@ -63,6 +63,7 @@ import org.ofbiz.pos.screen.SaveSale; import org.ofbiz.product.config.ProductConfigWrapper; import org.ofbiz.product.config.ProductConfigWrapper.ConfigOption; +import org.ofbiz.product.product.ProductWorker; import org.ofbiz.product.store.ProductStoreWorker; import org.ofbiz.service.GenericServiceException; import org.ofbiz.service.LocalDispatcher; @@ -192,15 +193,7 @@ } public List lookupItem(String sku) throws GeneralException { - // first check for the product - GenericValue product = session.getDelegator().findByPrimaryKey("Product", UtilMisc.toMap("productId", sku)); - if (product != null) { - return UtilMisc.toList(product); - } else { - // not found; so we move on to GoodIdentification - return session.getDelegator().findByAnd("GoodIdentificationAndProduct", - UtilMisc.toMap("idValue", sku), UtilMisc.toList("productId")); - } + return ProductWorker.findProductsById( session.getDelegator(), sku, null); } public String getOrderId() { |
Free forum by Nabble | Edit this page |