You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ha...@apache.org on 2009/02/18 08:42:59 UTC
svn commit: r745399 -
/ofbiz/trunk/specialpurpose/googlebase/src/org/ofbiz/googlebase/ProductsExportToGoogle.java
Author: hansbak
Date: Wed Feb 18 07:42:59 2009
New Revision: 745399
URL: http://svn.apache.org/viewvc?rev=745399&view=rev
Log:
improvement with exception handling, double -> bigdecimal, error message improvement. Component now communicates with google again. Todo:google is complaining some data is missng...
Modified:
ofbiz/trunk/specialpurpose/googlebase/src/org/ofbiz/googlebase/ProductsExportToGoogle.java
Modified: ofbiz/trunk/specialpurpose/googlebase/src/org/ofbiz/googlebase/ProductsExportToGoogle.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/googlebase/src/org/ofbiz/googlebase/ProductsExportToGoogle.java?rev=745399&r1=745398&r2=745399&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/googlebase/src/org/ofbiz/googlebase/ProductsExportToGoogle.java (original)
+++ ofbiz/trunk/specialpurpose/googlebase/src/org/ofbiz/googlebase/ProductsExportToGoogle.java Wed Feb 18 07:42:59 2009
@@ -48,6 +48,7 @@
import org.ofbiz.entity.condition.EntityCondition;
import org.ofbiz.entity.condition.EntityOperator;
import org.ofbiz.service.DispatchContext;
+import org.ofbiz.service.GenericServiceException;
import org.ofbiz.service.LocalDispatcher;
import org.ofbiz.service.ModelService;
import org.ofbiz.service.ServiceUtil;
@@ -97,9 +98,8 @@
} else {
return ServiceUtil.returnFailure(ServiceUtil.getErrorMessage(result));
}
- } catch (Exception e) {
- Debug.logError("Exception in exportToGoogle", module);
- return ServiceUtil.returnFailure(UtilProperties.getMessage(resource, "productsExportToGoogle.exceptionInExportToGoogle", locale));
+ } catch (IOException e) {
+ return ServiceUtil.returnFailure(ServiceUtil.getErrorMessage(result) + "IO Error loading resource :" + e.getMessage());
}
return result;
}
@@ -307,210 +307,211 @@
}
private static Map buildDataItemsXml(DispatchContext dctx, Map context, StringBuffer dataItemsXml) {
- Locale locale = (Locale)context.get("locale");
- List newProductsInGoogle = FastList.newInstance();
- List productsRemovedFromGoogle = FastList.newInstance();
- try {
- GenericDelegator delegator = dctx.getDelegator();
- LocalDispatcher dispatcher = dctx.getDispatcher();
- List selectResult = (List)context.get("selectResult");
- String webSiteUrl = (String)context.get("webSiteUrl");
- String imageUrl = (String)context.get("imageUrl");
- String actionType = (String)context.get("actionType");
- String statusId = (String)context.get("statusId");
- String trackingCodeId = (String)context.get("trackingCodeId");
- String countryCode = (String)context.get("countryCode");
- String webSiteMountPoint = (String)context.get("webSiteMountPoint");
-
- if (!webSiteUrl.startsWith("http://") && !webSiteUrl.startsWith("https://")) {
- webSiteUrl = "http://" + webSiteUrl;
- }
- if (webSiteUrl.endsWith("/")) {
- webSiteUrl = webSiteUrl.substring(0, webSiteUrl.length() - 1);
- }
-
- if (webSiteMountPoint.endsWith("/")) {
- webSiteMountPoint = webSiteMountPoint.substring(0, webSiteMountPoint.length() - 1);
- }
- if (webSiteMountPoint.startsWith("/")) {
- webSiteMountPoint = webSiteMountPoint.substring(1, webSiteMountPoint.length());
- }
-
- String productCurrency = null;
- if ("US".equals(countryCode)) {
- productCurrency = "USD";
- } else if ("GB".equals(countryCode)) {
- productCurrency = "GBP";
- } else if ("DE".equals(countryCode)) {
- productCurrency = "EUR";
- } else {
- Debug.logError("Exception during building data items to Google, Country Code must be either US, UK or DE: "+countryCode, module);
- return ServiceUtil.returnFailure(UtilProperties.getMessage(resource, "productsExportToGoogle.invalidCountryCode", locale));
- }
- // Get the list of products to be exported to Google Base
- List productsList = delegator.findList("Product", EntityCondition.makeCondition("productId", EntityOperator.IN, selectResult), null, null, null, false);
-
- // Get the tracking code
- if (UtilValidate.isEmpty(trackingCodeId) || "_NA_".equals(trackingCodeId)) {
- trackingCodeId = "";
- } else {
- trackingCodeId = "?atc=" + trackingCodeId;
- }
-
- try {
- Document feedDocument = UtilXml.makeEmptyXmlDocument("feed");
- Element feedElem = feedDocument.getDocumentElement();
- feedElem.setAttribute("xmlns", "http://www.w3.org/2005/Atom");
- feedElem.setAttribute("xmlns:openSearch", "http://a9.com/-/spec/opensearchrss/1.0/");
- feedElem.setAttribute("xmlns:g", "http://base.google.com/ns/1.0");
- feedElem.setAttribute("xmlns:batch", "http://schemas.google.com/gdata/batch");
- feedElem.setAttribute("xmlns:app", "http://purl.org/atom/app#");
-
- // Iterate the product list getting all the relevant data
- Iterator productsListItr = productsList.iterator();
- int index = 0;
- String itemActionType = null;
- GenericValue googleProduct;
- while(productsListItr.hasNext()) {
- itemActionType = actionType;
- GenericValue prod = (GenericValue)productsListItr.next();
- String price = getProductPrice(dispatcher, prod);
- if (price == null) {
- Debug.logInfo("Price not found for product [" + prod.getString("productId")+ "]; product will not be exported.", module);
- continue;
- }
- // TODO: improve this (i.e. get the relative path from the properies file)
- String link = webSiteUrl + "/"+webSiteMountPoint+"/control/product/~product_id=" + prod.getString("productId") + trackingCodeId;
- String title = UtilFormatOut.encodeXmlValue(prod.getString("productName"));
- String description = UtilFormatOut.encodeXmlValue(prod.getString("description"));
- String imageLink = "";
- if (UtilValidate.isNotEmpty(prod.getString("largeImageUrl"))) {
- imageLink = webSiteUrl + prod.getString("largeImageUrl");
- } else if (UtilValidate.isNotEmpty(prod.getString("mediumImageUrl"))) {
- imageLink = webSiteUrl + prod.getString("mediumImageUrl");
- } else if (UtilValidate.isNotEmpty(prod.getString("smallImageUrl"))) {
- imageLink = webSiteUrl + prod.getString("smallImageUrl");
- }
-
- String googleProductId = null;
- if (!"insert".equals(actionType)) {
- try {
- googleProduct = delegator.findByPrimaryKey("GoodIdentification", UtilMisc.toMap("productId", prod.getString("productId"), "goodIdentificationTypeId", "GOOGLE_ID"));
- if (UtilValidate.isNotEmpty(googleProduct)) {
- googleProductId = googleProduct.getString("idValue");
- }
- } catch(GenericEntityException gee) {
- Debug.logError("Unable to get the Google id for product [" + prod.getString("productId") + "]: " + gee.getMessage(), module);
- }
- }
- if ("update".equals(actionType) && UtilValidate.isEmpty(googleProductId)) {
- itemActionType = "insert";
- }
- Element entryElem = UtilXml.addChildElement(feedElem, "entry", feedDocument);
- Element batchElem = UtilXml.addChildElement(entryElem, "batch:operation", feedDocument);
- batchElem.setAttribute("type", itemActionType);
-
- // status is draft or deactivate
- if (statusId != null && ("draft".equals(statusId) || "deactivate".equals(statusId))) {
- Element appControlElem = UtilXml.addChildElement(entryElem, "app:control", feedDocument);
- UtilXml.addChildElementValue(appControlElem, "app:draft", "yes", feedDocument);
-
- // status is deactivate
- if ("deactivate".equals(statusId)) {
- UtilXml.addChildElement(appControlElem, "gm:disapproved", feedDocument);
- }
- }
-
- UtilXml.addChildElementValue(entryElem, "title", title, feedDocument);
-
- Element contentElem = UtilXml.addChildElementValue(entryElem, "content", description, feedDocument);
- contentElem.setAttribute("type", "xhtml");
-
- if (UtilValidate.isNotEmpty(googleProductId)) {
- UtilXml.addChildElementValue(entryElem, "id", googleProductId, feedDocument);
- } else {
- UtilXml.addChildElementValue(entryElem, "id", link, feedDocument);
- }
-
- Element linkElem = UtilXml.addChildElement(entryElem, "link", feedDocument);
- linkElem.setAttribute("rel", "alternate");
- linkElem.setAttribute("type", "text/html");
- linkElem.setAttribute("href", link);
-
- UtilXml.addChildElementValue(entryElem, "g:item_type", "products", feedDocument);
- UtilXml.addChildElementValue(entryElem, "g:price", price, feedDocument);
-
- // Might be nicer to load this from the product but for now we'll set it based on the country destination
- UtilXml.addChildElementValue(entryElem, "g:currency", productCurrency, feedDocument);
-
- // Ensure the load goes to the correct country location either US dollar, GB sterling or DE euro
- UtilXml.addChildElementValue(entryElem, "g:target_country", countryCode, feedDocument);
-
- UtilXml.addChildElementValue(entryElem, "g:brand", prod.getString("brandName"), feedDocument);
-
- try {
- googleProduct = delegator.findByPrimaryKey("GoodIdentification", UtilMisc.toMap("productId", prod.getString("productId"), "goodIdentificationTypeId", "SKU"));
- if (UtilValidate.isNotEmpty(googleProduct)) {
- UtilXml.addChildElementValue(entryElem, "g:ean", googleProduct.getString("idValue"), feedDocument);
- }
- } catch(GenericEntityException gee) {
- Debug.logInfo("Unable to get the SKU for product [" + prod.getString("productId") + "]: " + gee.getMessage(), module);
- }
-
- UtilXml.addChildElementValue(entryElem, "g:condition", "new", feedDocument);
- // This is a US specific requirement for product feeds
-// UtilXml.addChildElementValue(entryElem, "g:mpn", "", feedDocument);
-
- // if the product has an image it will be published on Google Product Search
- if (UtilValidate.isNotEmpty(imageLink)) {
- UtilXml.addChildElementValue(entryElem, "g:image_link", imageLink, feedDocument);
- }
- // if the product is exported to google for the first time, we add it to the list
- if ("insert".equals(itemActionType)) {
- newProductsInGoogle.add(prod.getString("productId"));
- productsRemovedFromGoogle.add(null);
- } else if ("delete".equals(itemActionType)) {
- newProductsInGoogle.add(null);
- productsRemovedFromGoogle.add(prod.getString("productId"));
- } else {
- newProductsInGoogle.add(null);
- productsRemovedFromGoogle.add(null);
- }
- index++;
- }
-
- dataItemsXml.append(UtilXml.writeXmlDocument(feedDocument));
- } catch (Exception e) {
- Debug.logError("Exception during building data items to Google", module);
- return ServiceUtil.returnFailure(UtilProperties.getMessage(resource, "productsExportToGoogle.exceptionDuringBuildingDataItemsToGoogle", locale));
- }
- } catch (Exception e) {
- Debug.logError("Exception during building data items to Google", module);
- return ServiceUtil.returnFailure(UtilProperties.getMessage(resource, "productsExportToGoogle.exceptionDuringBuildingDataItemsToGoogle", locale));
- }
- Map result = ServiceUtil.returnSuccess();
- result.put("newProductsInGoogle", newProductsInGoogle);
- result.put("productsRemovedFromGoogle", productsRemovedFromGoogle);
- return result;
+ Locale locale = (Locale)context.get("locale");
+ List newProductsInGoogle = FastList.newInstance();
+ List productsRemovedFromGoogle = FastList.newInstance();
+ try {
+ GenericDelegator delegator = dctx.getDelegator();
+ LocalDispatcher dispatcher = dctx.getDispatcher();
+ List selectResult = (List)context.get("selectResult");
+ String webSiteUrl = (String)context.get("webSiteUrl");
+ String imageUrl = (String)context.get("imageUrl");
+ String actionType = (String)context.get("actionType");
+ String statusId = (String)context.get("statusId");
+ String trackingCodeId = (String)context.get("trackingCodeId");
+ String countryCode = (String)context.get("countryCode");
+ String webSiteMountPoint = (String)context.get("webSiteMountPoint");
+
+ if (!webSiteUrl.startsWith("http://") && !webSiteUrl.startsWith("https://")) {
+ webSiteUrl = "http://" + webSiteUrl;
+ }
+ if (webSiteUrl.endsWith("/")) {
+ webSiteUrl = webSiteUrl.substring(0, webSiteUrl.length() - 1);
+ }
+
+ if (webSiteMountPoint.endsWith("/")) {
+ webSiteMountPoint = webSiteMountPoint.substring(0, webSiteMountPoint.length() - 1);
+ }
+ if (webSiteMountPoint.startsWith("/")) {
+ webSiteMountPoint = webSiteMountPoint.substring(1, webSiteMountPoint.length());
+ }
+
+ String productCurrency = null;
+ if ("US".equals(countryCode)) {
+ productCurrency = "USD";
+ } else if ("GB".equals(countryCode)) {
+ productCurrency = "GBP";
+ } else if ("DE".equals(countryCode)) {
+ productCurrency = "EUR";
+ } else {
+ Debug.logError("Exception during building data items to Google, Country Code must be either US, UK or DE: "+countryCode, module);
+ return ServiceUtil.returnFailure(UtilProperties.getMessage(resource, "productsExportToGoogle.invalidCountryCode", locale));
+ }
+ // Get the list of products to be exported to Google Base
+ List productsList = delegator.findList("Product", EntityCondition.makeCondition("productId", EntityOperator.IN, selectResult), null, null, null, false);
+
+ // Get the tracking code
+ if (UtilValidate.isEmpty(trackingCodeId) || "_NA_".equals(trackingCodeId)) {
+ trackingCodeId = "";
+ } else {
+ trackingCodeId = "?atc=" + trackingCodeId;
+ }
+
+ Document feedDocument = UtilXml.makeEmptyXmlDocument("feed");
+ Element feedElem = feedDocument.getDocumentElement();
+ feedElem.setAttribute("xmlns", "http://www.w3.org/2005/Atom");
+ feedElem.setAttribute("xmlns:openSearch", "http://a9.com/-/spec/opensearchrss/1.0/");
+ feedElem.setAttribute("xmlns:g", "http://base.google.com/ns/1.0");
+ feedElem.setAttribute("xmlns:batch", "http://schemas.google.com/gdata/batch");
+ feedElem.setAttribute("xmlns:app", "http://purl.org/atom/app#");
+
+ // Iterate the product list getting all the relevant data
+ Iterator productsListItr = productsList.iterator();
+ int index = 0;
+ String itemActionType = null;
+ GenericValue googleProduct;
+ while(productsListItr.hasNext()) {
+ itemActionType = actionType;
+ GenericValue prod = (GenericValue)productsListItr.next();
+ String price = getProductPrice(dispatcher, prod);
+ if (price == null) {
+ Debug.logInfo("Price not found for product [" + prod.getString("productId")+ "]; product will not be exported.", module);
+ continue;
+ }
+ // TODO: improve this (i.e. get the relative path from the properies file)
+ String link = webSiteUrl + "/"+webSiteMountPoint+"/control/product/~product_id=" + prod.getString("productId") + trackingCodeId;
+ String title = UtilFormatOut.encodeXmlValue(prod.getString("productName"));
+ String description = UtilFormatOut.encodeXmlValue(prod.getString("description"));
+ String imageLink = "";
+ if (UtilValidate.isNotEmpty(prod.getString("largeImageUrl"))) {
+ imageLink = webSiteUrl + prod.getString("largeImageUrl");
+ } else if (UtilValidate.isNotEmpty(prod.getString("mediumImageUrl"))) {
+ imageLink = webSiteUrl + prod.getString("mediumImageUrl");
+ } else if (UtilValidate.isNotEmpty(prod.getString("smallImageUrl"))) {
+ imageLink = webSiteUrl + prod.getString("smallImageUrl");
+ }
+
+ String googleProductId = null;
+ if (!"insert".equals(actionType)) {
+ try {
+ googleProduct = delegator.findByPrimaryKey("GoodIdentification", UtilMisc.toMap("productId", prod.getString("productId"), "goodIdentificationTypeId", "GOOGLE_ID"));
+ if (UtilValidate.isNotEmpty(googleProduct)) {
+ googleProductId = googleProduct.getString("idValue");
+ }
+ } catch(GenericEntityException gee) {
+ Debug.logError("Unable to obtain GoodIdentification entity value of the Google id for product [" + prod.getString("productId") + "]: " + gee.getMessage(), module);
+ }
+ }
+ if ("update".equals(actionType) && UtilValidate.isEmpty(googleProductId)) {
+ itemActionType = "insert";
+ }
+ Element entryElem = UtilXml.addChildElement(feedElem, "entry", feedDocument);
+ Element batchElem = UtilXml.addChildElement(entryElem, "batch:operation", feedDocument);
+ batchElem.setAttribute("type", itemActionType);
+
+ // status is draft or deactivate
+ if (statusId != null && ("draft".equals(statusId) || "deactivate".equals(statusId))) {
+ Element appControlElem = UtilXml.addChildElement(entryElem, "app:control", feedDocument);
+ UtilXml.addChildElementValue(appControlElem, "app:draft", "yes", feedDocument);
+
+ // status is deactivate
+ if ("deactivate".equals(statusId)) {
+ UtilXml.addChildElement(appControlElem, "gm:disapproved", feedDocument);
+ }
+ }
+
+ UtilXml.addChildElementValue(entryElem, "title", title, feedDocument);
+
+ Element contentElem = UtilXml.addChildElementValue(entryElem, "content", description, feedDocument);
+ contentElem.setAttribute("type", "xhtml");
+
+ if (UtilValidate.isNotEmpty(googleProductId)) {
+ UtilXml.addChildElementValue(entryElem, "id", googleProductId, feedDocument);
+ } else {
+ UtilXml.addChildElementValue(entryElem, "id", link, feedDocument);
+ }
+
+ Element linkElem = UtilXml.addChildElement(entryElem, "link", feedDocument);
+ linkElem.setAttribute("rel", "alternate");
+ linkElem.setAttribute("type", "text/html");
+ linkElem.setAttribute("href", link);
+
+ UtilXml.addChildElementValue(entryElem, "g:item_type", "products", feedDocument);
+ UtilXml.addChildElementValue(entryElem, "g:price", price, feedDocument);
+
+ // Might be nicer to load this from the product but for now we'll set it based on the country destination
+ UtilXml.addChildElementValue(entryElem, "g:currency", productCurrency, feedDocument);
+
+ // Ensure the load goes to the correct country location either US dollar, GB sterling or DE euro
+ UtilXml.addChildElementValue(entryElem, "g:target_country", countryCode, feedDocument);
+
+ UtilXml.addChildElementValue(entryElem, "g:brand", prod.getString("brandName"), feedDocument);
+
+ try {
+ googleProduct = delegator.findByPrimaryKey("GoodIdentification", UtilMisc.toMap("productId", prod.getString("productId"), "goodIdentificationTypeId", "SKU"));
+ if (UtilValidate.isNotEmpty(googleProduct)) {
+ UtilXml.addChildElementValue(entryElem, "g:ean", googleProduct.getString("idValue"), feedDocument);
+ }
+ } catch(GenericEntityException gee) {
+ Debug.logInfo("Unable to get the SKU for product [" + prod.getString("productId") + "]: " + gee.getMessage(), module);
+ }
+
+ UtilXml.addChildElementValue(entryElem, "g:condition", "new", feedDocument);
+ // This is a US specific requirement for product feeds
+ // UtilXml.addChildElementValue(entryElem, "g:mpn", "", feedDocument);
+
+ // if the product has an image it will be published on Google Product Search
+ if (UtilValidate.isNotEmpty(imageLink)) {
+ UtilXml.addChildElementValue(entryElem, "g:image_link", imageLink, feedDocument);
+ }
+ // if the product is exported to google for the first time, we add it to the list
+ if ("insert".equals(itemActionType)) {
+ newProductsInGoogle.add(prod.getString("productId"));
+ productsRemovedFromGoogle.add(null);
+ } else if ("delete".equals(itemActionType)) {
+ newProductsInGoogle.add(null);
+ productsRemovedFromGoogle.add(prod.getString("productId"));
+ } else {
+ newProductsInGoogle.add(null);
+ productsRemovedFromGoogle.add(null);
+ }
+ index++;
+ }
+
+ dataItemsXml.append(UtilXml.writeXmlDocument(feedDocument));
+ } catch (IOException e) {
+ return ServiceUtil.returnError("IO Error creating XML document for Google :" + e.getMessage());
+ } catch (GenericEntityException e) {
+ return ServiceUtil.returnError("Unable to read from product entity: " + e.toString());
+ }
+
+
+ Map result = ServiceUtil.returnSuccess();
+ result.put("newProductsInGoogle", newProductsInGoogle);
+ result.put("productsRemovedFromGoogle", productsRemovedFromGoogle);
+ Debug.log("======returning with result: " + result);
+ return result;
}
private static String getProductPrice(LocalDispatcher dispatcher, GenericValue product) {
String priceString = null;
+ Map<String, Object> map = FastMap.newInstance();
try {
- Map map = dispatcher.runSync("calculateProductPrice", UtilMisc.toMap("product", product));
+ map = dispatcher.runSync("calculateProductPrice", UtilMisc.toMap("product", product));
boolean validPriceFound = ((Boolean)map.get("validPriceFound")).booleanValue();
boolean isSale = ((Boolean)map.get("isSale")).booleanValue();
if (validPriceFound) {
- priceString = UtilFormatOut.formatPrice((Double)map.get("price"));
+ priceString = map.get("price").toString();
}
- } catch(Exception e){
- Debug.logError("Exception calculating price for product [" + product.getString("productId") + "]", module);
+ } catch (GenericServiceException e1) {
+ Debug.logError("calculateProductPrice Service exception getting the product price:" + e1.toString(), module);
}
return priceString;
}
private static Map readResponseFromGoogle(String msg, List newProductsInGoogle, List productsRemovedFromGoogle, LocalDispatcher dispatcher, GenericDelegator delegator, Locale locale) {
List message = FastList.newInstance();
+ // Debug.log("====get xml response from google: " + msg);
try {
Document docResponse = UtilXml.readXmlDocument(msg, true);
Element elemResponse = docResponse.getDocumentElement();
@@ -540,7 +541,7 @@
Debug.logError("Unable to remove Google id for product [" + productId + "]: " + gee.getMessage(), module);
}
}
- String title = UtilXml.childElementValue(atomEntryElement, "atom:title", "");
+ String title = "Google response: " + UtilXml.childElementValue(atomEntryElement, "atom:title", "");
List batchStatusList = UtilXml.childElementList(atomEntryElement, "batch:status");
Iterator batchStatusEntryElemIter = batchStatusList.iterator();
while (batchStatusEntryElemIter.hasNext()) {