svn commit: r554593 - in /ofbiz/trunk/applications/product: config/ servicedef/ src/org/ofbiz/product/product/ webapp/catalog/WEB-INF/ webapp/catalog/find/

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r554593 - in /ofbiz/trunk/applications/product: config/ servicedef/ src/org/ofbiz/product/product/ webapp/catalog/WEB-INF/ webapp/catalog/find/

jacopoc
Author: jacopoc
Date: Mon Jul  9 03:14:05 2007
New Revision: 554593

URL: http://svn.apache.org/viewvc?view=rev&rev=554593
Log:
Applied patch by Marco Risaliti (OFBIZ-1095) with further improvements to the Google export interface.

Modified:
    ofbiz/trunk/applications/product/config/ProductUiLabels.properties
    ofbiz/trunk/applications/product/config/ProductUiLabels_it.properties
    ofbiz/trunk/applications/product/servicedef/services.xml
    ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearchEvents.java
    ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductsExportToGoogle.java
    ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/controller.xml
    ofbiz/trunk/applications/product/webapp/catalog/find/ExportForms.xml

Modified: ofbiz/trunk/applications/product/config/ProductUiLabels.properties
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/config/ProductUiLabels.properties?view=diff&rev=554593&r1=554592&r2=554593
==============================================================================
--- ofbiz/trunk/applications/product/config/ProductUiLabels.properties (original)
+++ ofbiz/trunk/applications/product/config/ProductUiLabels.properties Mon Jul  9 03:14:05 2007
@@ -557,6 +557,9 @@
 ProductExpireDate=Expire Date
 ProductExpireResultsFrom=Expire Results From
 ProductExplodeOrderItems=Explode Order Items
+ProductExportDeactivated=Deactivated
+ProductExportPublish=Publish
+ProductExportPublishDraft=Publish Draft
 ProductExportToGoogle=Export To Google Base
 ProductExportNoTrackingRequested=Not Requested
 ProductFacilities=Facilities
@@ -1481,8 +1484,10 @@
 productevents.thru_date_not_formatted_correctly=Thru Date not formatted correctly.
 productevents.updatemode_not_specified=Update Mode was not specified, but is required.
 productsExportToGoogle.errorDuringAuthenticationToGoogle=Error during authentication to Google Account
+productsExportToGoogle.errorInTheResponseFromGoogle=Error in the response from Google :
 productsExportToGoogle.exceptionDuringBuildingDataItemsToGoogle=Exception occurred during building data items to Google Base
 productsExportToGoogle.exceptionInExportToGoogle=Exception in exportToGoogle
+productsExportToGoogle.exceptionReadingResponseFromGoogle=Exception reading response from Google
 productsExportToGoogle.productItemsSentCorrecltyToGoogle=Product items sent correclty to Google Base
 productsearchevents.added_x_product_category_members=Added ${numAdded} product category members.
 productsearchevents.error_getting_search_results=Error getting search results: ${errSearchResult}.
@@ -1491,6 +1496,7 @@
 productsearchevents.no_results_found_probably_error_constraints=No results found, probably because there was an error or were no constraints.
 productsearchevents.removed_x_items=removed ${numRemoved} items.
 productsearchevents.thruDate_not_formatted_properly=The thruDate is not formatted properly: ${errDateFormat}.
+productsearchevents.exceptionCallingExportToGoogle=Exception calling exportToGoogle
 productservices.both_productId_and_productIdTo_cannot_be_defined=Both productId and productIdTo cannot be defined.
 productservices.both_productId_and_productIdTo_cannot_be_null=Both productId and productIdTo cannot be null.
 productservices.cannot_build_feature_tree_full=Cannot build feature tree: featureList is null.
@@ -1866,4 +1872,5 @@
 FormFieldTitle_monthsInPastLimit=Months In Past Limit
 FormFieldTitle_picklistBinId=Picklist Bin
 FormFieldTitle_webSiteUrl=Web Site Url
-FormFieldTitle_trackingCodeId=Tracking Code Id
\ No newline at end of file
+FormFieldTitle_trackingCodeId=Tracking Code Id
+FormFieldTitle_actionType=Action Type

Modified: ofbiz/trunk/applications/product/config/ProductUiLabels_it.properties
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/config/ProductUiLabels_it.properties?view=diff&rev=554593&r1=554592&r2=554593
==============================================================================
--- ofbiz/trunk/applications/product/config/ProductUiLabels_it.properties (original)
+++ ofbiz/trunk/applications/product/config/ProductUiLabels_it.properties Mon Jul  9 03:14:05 2007
@@ -1467,8 +1467,10 @@
 productevents.thru_date_not_formatted_correctly=Data A non formattata correttamente.
 productevents.updatemode_not_specified=Modo di Aggiornamento non \u00e8 stato specificato, ma \u00e8 richiesto.
 productsExportToGoogle.errorDuringAuthenticationToGoogle=Errore durante l\'autenticazione su Google Account
+productsExportToGoogle.errorInTheResponseFromGoogle=Errore nella risposta di Google :
 productsExportToGoogle.exceptionDuringBuildingDataItemsToGoogle=Eccezione accaduta durante la creazione dei dati prodotti per Google Base
 productsExportToGoogle.exceptionInExportToGoogle=Eccezione in exportToGoogle
+productsExportToGoogle.exceptionReadingResponseFromGoogle=Eccezione leggendo la risposta da Google
 productsExportToGoogle.productItemsSentCorrecltyToGoogle=Prodotti inviati correttamente su Google Base
 productsearchevents.added_x_product_category_members=Aggiunti ${numAdded} membri prodotto categoria.
 productsearchevents.error_getting_search_results=Errore leggendo i risultati di ricerca: ${errSearchResult}.
@@ -1477,6 +1479,7 @@
 productsearchevents.no_results_found_probably_error_constraints=Nessun risultato trovato, probabilmente perch\u00e9 c'era un'errore o nessuna costrizione.
 productsearchevents.removed_x_items=${numRemoved} righe cancellate.
 productsearchevents.thruDate_not_formatted_properly=La Data A non \u00e8 stata formattata propriamente: ${errDateFormat}.
+productsearchevents.exceptionCallingExportToGoogle=Eccezione durante l'esecuzione di exportToGoogle
 productservices.both_productId_and_productIdTo_cannot_be_defined=Entrambi productId e productIdTo non sono stati definiti.
 productservices.both_productId_and_productIdTo_cannot_be_null=Entrambi productId e productIdTo non possono essere nulli.
 productservices.cannot_build_feature_tree_full=Non \u00e8 possibli costruire l'albero delle caratteristiche build feature tree: featureList \u00e8 nulla.
@@ -1853,3 +1856,4 @@
 FormFieldTitle_picklistBinId=Lista di Prelievo
 FormFieldTitle_webSiteUrl=Url Sito Web
 FormFieldTitle_trackingCodeId=Codice Tracciatura
+FormFieldTitle_actionType=Tipo Azione

Modified: ofbiz/trunk/applications/product/servicedef/services.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/servicedef/services.xml?view=diff&rev=554593&r1=554592&r2=554593
==============================================================================
--- ofbiz/trunk/applications/product/servicedef/services.xml (original)
+++ ofbiz/trunk/applications/product/servicedef/services.xml Mon Jul  9 03:14:05 2007
@@ -1126,4 +1126,14 @@
         <attribute type="String" mode="IN" name="statusId" optional="false"/>
         <attribute type="String" mode="IN" name="trackingCodeId" optional="true"/>
     </service>
+    <service name="searchExportProductListToGoogle" engine="java"
+             location="org.ofbiz.product.product.ProductSearchEvents" invoke="searchExportProductListToGoogle" auth="true">
+        <description>Export products to Google Base</description>
+        <attribute type="String" mode="IN" name="webSiteUrl" optional="false"/>
+        <attribute type="String" mode="IN" name="imageUrl" optional="false"/>
+        <attribute type="String" mode="IN" name="actionType" optional="false"/>
+        <attribute type="String" mode="IN" name="statusId" optional="false"/>
+        <attribute type="List" mode="IN" name="selectResult" optional="true"/>
+        <attribute type="String" mode="IN" name="trackingCodeId" optional="true"/>
+    </service>
 </services>

Modified: ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearchEvents.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearchEvents.java?view=diff&rev=554593&r1=554592&r2=554593
==============================================================================
--- ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearchEvents.java (original)
+++ ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearchEvents.java Mon Jul  9 03:14:05 2007
@@ -45,6 +45,10 @@
 import org.ofbiz.entity.util.EntityUtil;
 import org.ofbiz.product.product.ProductSearch.ProductSearchContext;
 import org.ofbiz.product.product.ProductSearch.ResultSortOrder;
+import org.ofbiz.service.DispatchContext;
+import org.ofbiz.service.GenericServiceException;
+import org.ofbiz.service.LocalDispatcher;
+import org.ofbiz.service.ServiceUtil;
 
 /**
  * Product Search Related Events
@@ -448,6 +452,57 @@
 
         request.setAttribute("productExportList", productExportList);
         return "success";
+    }
+
+    public static Map searchExportProductListToGoogle(DispatchContext dctx, Map context) {
+        LocalDispatcher dispatcher = dctx.getDispatcher();
+        HttpServletRequest request = (HttpServletRequest) context.get("request");
+        Locale locale = (Locale)context.get("locale");
+        List productExportList = (List) context.get("selectResult");
+
+        try {
+            boolean beganTransaction = TransactionUtil.begin(DEFAULT_TX_TIMEOUT);
+            try {
+                if (UtilValidate.isEmpty(productExportList)) {
+                    // If the passed list of product ids is empty, get the list from the search parameters in the request
+                    EntityListIterator eli = getProductSearchResults(request);
+                    if (eli == null) {
+                        return ServiceUtil.returnFailure(UtilProperties.getMessage(resource, "productsearchevents.no_results_found_probably_error_constraints", locale));
+                    }
+
+                    GenericValue searchResultView = null;
+                    while ((searchResultView = (GenericValue) eli.next()) != null) {
+                        productExportList.add(searchResultView.getString("mainProductId"));
+                    }
+                    eli.close();
+                }
+                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");
+                
+                // Export all the products to Google Base
+                try {
+                    Map exportResult = dispatcher.runSync("exportProductsToGoogle", UtilMisc.toMap("selectResult", productExportList, "webSiteUrl", webSiteUrl,
+                                                          "imageUrl", imageUrl, "actionType", actionType, "statusId", statusId, "trackingCodeId", trackingCodeId));
+                    if (ServiceUtil.isError(exportResult)) {
+                        return ServiceUtil.returnError(ServiceUtil.getErrorMessage(exportResult));
+                    }
+                } catch (GenericServiceException e) {
+                    Debug.logError(e, "Exception calling exportToGoogle", module);
+                    return ServiceUtil.returnError(UtilProperties.getMessage(resource, "productsearchevents.exceptionCallingExportToGoogle", locale));
+                }
+            } catch (GenericEntityException e) {
+                return ServiceUtil.returnFailure(UtilProperties.getMessage(resource, "productsearchevents.error_getting_search_results", locale));
+            } finally {
+                TransactionUtil.commit(beganTransaction);
+            }
+        } catch (GenericTransactionException e) {
+            return ServiceUtil.returnFailure(UtilProperties.getMessage(resource, "productsearchevents.error_getting_search_results", locale));
+        }
+        
+        return ServiceUtil.returnSuccess();
     }
 
     public static EntityListIterator getProductSearchResults(HttpServletRequest request) {

Modified: ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductsExportToGoogle.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductsExportToGoogle.java?view=diff&rev=554593&r1=554592&r2=554593
==============================================================================
--- ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductsExportToGoogle.java (original)
+++ ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductsExportToGoogle.java Mon Jul  9 03:14:05 2007
@@ -19,7 +19,6 @@
 package org.ofbiz.product.product;
 
 import java.io.BufferedReader;
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
@@ -32,15 +31,10 @@
 import java.util.Locale;
 import java.util.Map;
 import java.util.StringTokenizer;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 import javolution.util.FastMap;
 
-import org.apache.xml.serialize.OutputFormat;
-import org.apache.xml.serialize.XMLSerializer;
 import org.ofbiz.base.util.Debug;
-import org.ofbiz.base.util.StringUtil;
 import org.ofbiz.base.util.UtilFormatOut;
 import org.ofbiz.base.util.UtilMisc;
 import org.ofbiz.base.util.UtilProperties;
@@ -86,11 +80,12 @@
             Map result = buildDataItemsXml(dctx, context, dataItemsXml);
             if (!ServiceUtil.isFailure(result)) {
                 String token = authenticate(authenticationUrl, accountEmail, accountPassword);
-
                 if (token != null) {    
-                    result = postItem(token, postItemsUrl, developerKey, dataItemsXml);
-                    if (ServiceUtil.isFailure(result))
-                        return ServiceUtil.returnFailure(ServiceUtil.getErrorMessage(result));
+                    result = postItem(token, postItemsUrl, developerKey, dataItemsXml, locale);
+                    String msg = ServiceUtil.getErrorMessage(result);
+                    if (msg != null && msg.length() > 0) {
+                        return ServiceUtil.returnFailure(msg);
+                    }
                 } else {
                     Debug.logError("Error during authentication to Google Account", module);
                     return ServiceUtil.returnFailure(UtilProperties.getMessage(resource, "productsExportToGoogle.errorDuringAuthenticationToGoogle", locale));
@@ -128,7 +123,7 @@
         StringTokenizer tokenizer = new StringTokenizer(postOutput, "=\n ");
       
         while (tokenizer.hasMoreElements()) {
-            if (tokenizer.nextToken().equals("Auth")) {
+            if ("Auth".equals(tokenizer.nextToken())) {
                 if (tokenizer.hasMoreElements()) {
                     token = tokenizer.nextToken();
                 }
@@ -188,7 +183,7 @@
         return outputBuilder.toString();
     }
     
-    private static Map postItem(String token, String postItemsUrl, String developerKey, StringBuffer dataItems) throws IOException {
+    private static Map postItem(String token, String postItemsUrl, String developerKey, StringBuffer dataItems, Locale locale) throws IOException {
         HttpURLConnection connection = (HttpURLConnection)(new URL(postItemsUrl)).openConnection();
       
         connection.setDoInput(true);
@@ -205,12 +200,18 @@
         int responseCode = connection.getResponseCode();
         InputStream inputStream;
         Map result = FastMap.newInstance();
-        if (responseCode == HttpURLConnection.HTTP_CREATED) {
-            inputStream = connection.getInputStream();
-            result = ServiceUtil.returnSuccess(toString(inputStream));
-        } else if (responseCode == HttpURLConnection.HTTP_OK) {
+        if (responseCode == HttpURLConnection.HTTP_CREATED || responseCode == HttpURLConnection.HTTP_OK) {
             inputStream = connection.getInputStream();
-            result = ServiceUtil.returnSuccess(toString(inputStream));
+            String response = toString(inputStream);
+            if (response != null && response.length() > 0) {
+                result = readResponseFromGoogle(response, locale);
+                String msg = ServiceUtil.getErrorMessage(result);
+                if (msg != null && msg.length() > 0) {
+                    return ServiceUtil.returnFailure(msg);
+                } else {
+                    return ServiceUtil.returnSuccess();
+                }
+            }
         } else {
             inputStream = connection.getErrorStream();
             result = ServiceUtil.returnFailure(toString(inputStream));
@@ -269,6 +270,18 @@
                      Element batchElem = UtilXml.addChildElement(entryElem, "batch:operation", feedDocument);
                      batchElem.setAttribute("type", actionType);
                     
+                     // status is draft or deactivate
+                     if (statusId != null && ("draft".equals(statusId) || "deactivate".equals(statusId))) {
+                         Element appControlElem = UtilXml.addChildElement(entryElem, "app:control", feedDocument);
+                         appControlElem.setAttribute("xmlns:app", "http://purl.org/atom/app&#35;");
+                         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);
@@ -284,13 +297,10 @@
                      UtilXml.addChildElementValue(entryElem, "g:item_type", "products", feedDocument);
                      UtilXml.addChildElementValue(entryElem, "g:price", price, feedDocument);
                     
+                     // if the product has an image it will be published on Google Product Search
                      if (UtilValidate.isNotEmpty(image_link)) {
                          UtilXml.addChildElementValue(entryElem, "g:image_link", image_link, feedDocument);
                      }
-                    
-                     Element appControlElem = UtilXml.addChildElement(entryElem, "app:control", feedDocument);
-                     appControlElem.setAttribute("xmlns:app", "http://purl.org/atom/app#");
-                     UtilXml.addChildElementValue(appControlElem, "app:draft", "yes", feedDocument);
                  }
                 
                  dataItemsXml.append(UtilXml.writeXmlDocument(feedDocument));
@@ -318,5 +328,35 @@
             Debug.logError("Exception calculating price for product [" + product.getString("productId") + "]", module);
         }
         return priceString;
+    }
+    
+    private static Map readResponseFromGoogle(String msg, Locale locale) {
+        StringBuffer message = new StringBuffer();
+        try {
+            Document docResponse = UtilXml.readXmlDocument(msg, true);
+            Element elemResponse = docResponse.getDocumentElement();
+            List atomEntryList = UtilXml.childElementList(elemResponse, "atom:entry");
+            Iterator atomEntryElemIter = atomEntryList.iterator();
+            while (atomEntryElemIter.hasNext()) {
+                Element atomEntryElement = (Element)atomEntryElemIter.next();
+                List batchInterruptedEntryList = UtilXml.childElementList(atomEntryElement, "batch:interrupted");
+                Iterator batchInterruptedEntryElemIter = batchInterruptedEntryList.iterator();
+                while (batchInterruptedEntryElemIter.hasNext()) {
+                    Element batchInterruptedEntryElement = (Element)batchInterruptedEntryElemIter.next();
+                    String reason = batchInterruptedEntryElement.getAttribute("reason");
+                    message.append(reason);
+                }
+            }
+        } catch (Exception e) {
+            Debug.logError("Exception reading response from Google", module);
+            return ServiceUtil.returnFailure(UtilProperties.getMessage(resource, "productsExportToGoogle.exceptionReadingResponseFromGoogle", locale));
+        }
+        
+        if (message.length() > 0) {
+            Debug.logError("Error in the response from Google " + message.toString(), module);
+            message.insert(0, UtilProperties.getMessage(resource, "productsExportToGoogle.errorInTheResponseFromGoogle", locale));
+            return ServiceUtil.returnFailure(message.toString());
+        }
+        return ServiceUtil.returnSuccess();
     }
 }

Modified: ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/controller.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/controller.xml?view=diff&rev=554593&r1=554592&r2=554593
==============================================================================
--- ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/controller.xml (original)
+++ ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/controller.xml Mon Jul  9 03:14:05 2007
@@ -2385,6 +2385,13 @@
         <response name="error" type="view" value="ProductsExportToGoogle"/>
     </request-map>
     
+    <request-map uri="searchExportProductListToGoogle">
+        <security https="true" auth="true"/>
+        <event type="service" path="" invoke="searchExportProductListToGoogle"/>
+        <response name="success" type="view" value="ProductsExportToGoogle"/>
+        <response name="error" type="view" value="ProductsExportToGoogle"/>
+    </request-map>
+    
     <!-- end of request mappings -->
 
     <!-- View Mappings -->

Modified: ofbiz/trunk/applications/product/webapp/catalog/find/ExportForms.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/webapp/catalog/find/ExportForms.xml?view=diff&rev=554593&r1=554592&r2=554593
==============================================================================
--- ofbiz/trunk/applications/product/webapp/catalog/find/ExportForms.xml (original)
+++ ofbiz/trunk/applications/product/webapp/catalog/find/ExportForms.xml Mon Jul  9 03:14:05 2007
@@ -20,7 +20,7 @@
 
 <forms xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://www.ofbiz.org/dtds/widget-form.xsd">
-    <form name="ProductsExportToGoogle" type="single" target="exportProductsToGoogle">
+    <form name="ProductsExportToGoogle" type="single" target="searchExportProductListToGoogle">
         <field name="selectResult"><hidden/></field>
         <field name="webSiteUrl"><text size="50" maxlength="250"/></field>
         <field name="imageUrl"><text size="50" maxlength="250"/></field>
@@ -33,14 +33,16 @@
                 -->
             </drop-down>
         </field>
-        <field name="statusId" widget-style="selectBox">
-            <drop-down no-current-selected-key="deactivate">
+        <field name="statusId">
+            <drop-down no-current-selected-key="draft">
+                <!--
                 <option key="deactivate" description="${uiLabelMap.ProductExportDeactivated}"/>
+                -->
                 <option key="draft" description="${uiLabelMap.ProductExportPublishDraft}"/>
                 <option key="publish" description="${uiLabelMap.ProductExportPublish}"/>
             </drop-down>
         </field>
-        <field name="trackingCodeId" widget-style="selectBox">
+        <field name="trackingCodeId">
             <drop-down no-current-selected-key="_NA_">
                 <option key="_NA_" description="${uiLabelMap.ProductExportNoTrackingRequested}"/>
                 <entity-options entity-name="TrackingCode" description="${description}">