Author: psharples
Date: Thu Sep 27 17:19:35 2012
New Revision: 1391110

URL: http://svn.apache.org/viewvc?rev=1391110&view=rev
Log:
Updated marketplace call to check if existing instances of w3c widgets are 
already deployed in rave.  Additionally added a temporary bug fix for an issue 
caused in wookie 0.10.0 (which has been fixed for 0.13.0)

Modified:
    
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/api/rpc/MarketplaceAPI.java
    
rave/trunk/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/service/impl/WookieWidgetService.java

Modified: 
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/api/rpc/MarketplaceAPI.java
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/api/rpc/MarketplaceAPI.java?rev=1391110&r1=1391109&r2=1391110&view=diff
==============================================================================
--- 
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/api/rpc/MarketplaceAPI.java
 (original)
+++ 
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/api/rpc/MarketplaceAPI.java
 Thu Sep 27 17:19:35 2012
@@ -20,6 +20,7 @@ package org.apache.rave.portal.web.api.r
 
 import org.apache.rave.portal.model.Widget;
 import org.apache.rave.portal.service.WidgetMarketplaceService;
+import org.apache.rave.portal.service.WidgetService;
 import org.apache.rave.portal.web.api.rpc.model.RpcOperation;
 import org.apache.rave.portal.web.api.rpc.model.RpcResult;
 import org.apache.rave.portal.web.validator.NewWidgetValidator;
@@ -43,11 +44,13 @@ public class MarketplaceAPI {
     private static final Logger logger = 
LoggerFactory.getLogger(MarketplaceAPI.class);
     private final WidgetMarketplaceService marketplaceService;
     private final NewWidgetValidator widgetValidator;
+    private final WidgetService widgetService;
 
     @Autowired
-    public MarketplaceAPI(WidgetMarketplaceService marketplaceService, 
NewWidgetValidator validator) {
+    public MarketplaceAPI(WidgetMarketplaceService marketplaceService, 
NewWidgetValidator validator, WidgetService widgetService) {
         this.marketplaceService = marketplaceService;
         this.widgetValidator = validator;
+        this.widgetService = widgetService;
     }
 
     @ResponseBody
@@ -57,16 +60,19 @@ public class MarketplaceAPI {
         return new RpcOperation<Widget>() {
              @Override
              public Widget execute() {
+                 Widget widget = null;
                  // TODO - improve info sent back to marketplace, rather then 
just writing to the console
                  try {
-                    Widget widget =  marketplaceService.getWidgetMetadata(url, 
providerType);
+                    widget =  marketplaceService.getWidgetMetadata(url, 
providerType);
                     if(widget == null){
                         return null;
                     }
                     BeanPropertyBindingResult results = new 
BeanPropertyBindingResult(widget, "widget");
                     widgetValidator.validate(widget, results);
                     if (results.hasErrors()) {
-                        logger.error(results.toString());
+                        if(results.hasFieldErrors("url") && 
results.getFieldError("url").toString().contains("widget.url.exists")){
+                            return 
widgetService.getWidgetByUrl(widget.getUrl());
+                        }
                         return null;
                     }
                     return marketplaceService.addWidget(widget);

Modified: 
rave/trunk/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/service/impl/WookieWidgetService.java
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/service/impl/WookieWidgetService.java?rev=1391110&r1=1391109&r2=1391110&view=diff
==============================================================================
--- 
rave/trunk/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/service/impl/WookieWidgetService.java
 (original)
+++ 
rave/trunk/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/service/impl/WookieWidgetService.java
 Thu Sep 27 17:19:35 2012
@@ -18,12 +18,17 @@
  */
 
 package org.apache.rave.provider.w3c.service.impl;
+import java.io.BufferedReader;
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.rave.portal.model.User;
@@ -36,7 +41,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class WookieWidgetService implements WidgetProviderService {
-  private static Logger logger = 
LoggerFactory.getLogger(WookieWidgetService.class);
+    private static Logger logger = 
LoggerFactory.getLogger(WookieWidgetService.class);
 
     private final String wookieServerUrl; // = "http://localhost:8080/wookie";;
     private final String wookieApiKey; // = "TEST";
@@ -119,8 +124,9 @@ public class WookieWidgetService impleme
             widget.setTitle(wookieWidget.getTitle());
             widget.setType("W3C");
             widget.setThumbnailUrl(wookieWidget.getIcon().toString());
-        } catch (WookieConnectorException e) {
-            logger.error(e.getMessage());
+        } catch (WookieConnectorException e){
+            logger.warn(e.getMessage());
+            return returnURLFromConfig(tempWgtFile);
         } catch (MalformedURLException e) {
             logger.error("Malformed url error. " + e.getMessage());
         } catch (IOException e) {
@@ -133,6 +139,41 @@ public class WookieWidgetService impleme
         }
         return widget;
     }
+    
+    // This function compensates for a bug in wookie-0.10.0.  The 
postWidget(tempWgtFile,  adminUsername, adminPassword)
+    // call will only accept new widgets and not allow you to update existing 
widgets, without already knowing the
+    // widgets Id attribute (this is the same as the 'url' attribute in rave)
+    // In some cases (the marketplace for example) we need to know the widgets 
Id (rave url) when we only have
+    // the original file.wgt.  This method tries to find the .wgt id in the 
config file of the downloaded zip file
+    // so we can determine if it has already been added to rave without having 
to reimport to wookie.
+    // This routine does not generate identifiers, as wookie would on empty 
<id> elements found in the config.xml.
+    // NOTE: this has been fixed in wookie 0.13.0 onwards
+    private Widget returnURLFromConfig(File wgtFile){
+        Widget widget = null;
+        try {
+            final ZipFile zipFile = new ZipFile(wgtFile);
+            ZipEntry entry = zipFile.getEntry("config.xml");
+            InputStream input = zipFile.getInputStream(entry);
+            BufferedReader br = new BufferedReader(new 
InputStreamReader(input, "UTF-8"));
+            try {
+                String line = null;
+                while (( line = br.readLine()) != null){
+                    if(line.contains("id=")){
+                        String val = line.substring(line.indexOf("id=")+4, 
line.indexOf("\"", line.indexOf("id=")+5));
+                        widget = new W3CWidget();
+                        widget.setUrl(val);
+                        return widget;
+                    }
+                }
+            }
+            finally {
+                input.close();
+            }
+        } catch (Exception e) {
+            logger.error(e.getMessage());
+        }
+        return widget;
+    }
 
     private String normalizeFileName(URL urlPath){
         String filename;
@@ -164,7 +205,6 @@ public class WookieWidgetService impleme
     @SuppressWarnings("deprecation")
     private W3CWidget getWidgetForViewer(Widget widget, String sharedDataKey, 
User viewer){
        try {
-            // TODO: parameters for WookieConnectorService should not be fixed 
in code.
             connectorService = getWookieConnectorService(wookieServerUrl, 
wookieApiKey, sharedDataKey);
             org.apache.wookie.connector.framework.User user = new 
org.apache.wookie.connector.framework.User(String.valueOf(viewer.getUsername()),
 viewer.getUsername());
             connectorService.setCurrentUser(user);


Reply via email to