Hey,

Here is a small batch of patches for the SUSE Studio integration part. These
patches include the following changes:

1. Workaround the Studio API that is returning incomplete URLs in certain 
versions
2. Very basic normalization for the SUSE Studio base URL that is entered by a 
user
3. Catch MalformedURLExceptions for not crashing in case of a missing protocol 
etc.

Best regards,
Johannes

-- 
SUSE LINUX Products GmbH, HRB 16746 (AG Nürnberg)
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer
>From 0cc632b53cb828837bfb556758c1b2922d4df96e Mon Sep 17 00:00:00 2001
From: Johannes Renner <jren...@suse.de>
Date: Tue, 13 Nov 2012 13:47:37 +0100
Subject: [PATCH 1/3] Workaround for Studio API returning incomplete URLs

---
 .../frontend/action/renderers/ImagesRenderer.java  |   29 +++++++++++---------
 1 file changed, 16 insertions(+), 13 deletions(-)

diff --git a/java/code/src/com/redhat/rhn/frontend/action/renderers/ImagesRenderer.java b/java/code/src/com/redhat/rhn/frontend/action/renderers/ImagesRenderer.java
index 716c4a5..2859bd8 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/renderers/ImagesRenderer.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/renderers/ImagesRenderer.java
@@ -86,7 +86,7 @@ public class ImagesRenderer extends BaseFragmentRenderer {
      */
     private List<Image> getImages(User user, HttpServletRequest request)
             throws IOException {
-        List<Appliance> ret = new ArrayList<Appliance>();
+        List<Appliance> appliances = new ArrayList<Appliance>();
 
         // Lookup credentials and url
         Credentials creds = CredentialsFactory.lookupStudioCredentials(user);
@@ -97,22 +97,13 @@ public class ImagesRenderer extends BaseFragmentRenderer {
 
             // Get appliance builds from studio
             SUSEStudio studio = new SUSEStudio(studioUser, studioKey, studioUrl);
-            ret = studio.getAppliances();
+            appliances = studio.getAppliances();
         }
         else {
             request.setAttribute(ATTRIB_ERROR_MSG, "images.message.error.nocreds");
         }
 
         // Convert to a list of images
-        return convertAppliances(ret);
-    }
-
-    /**
-     * Convert a list of {@link Appliance}s to a list of {@link Image}s.
-     * @param appliances list of appliances
-     * @return list of images
-     */
-    private List<Image> convertAppliances(List<Appliance> appliances) {
         List<Image> ret = new LinkedList<Image>();
         for (Appliance appliance : appliances) {
             // Create one image object for every build
@@ -124,10 +115,10 @@ public class ImagesRenderer extends BaseFragmentRenderer {
                 Image img = new Image();
                 // Appliance attributes
                 img.setArch(appliance.getArch());
-                img.setEditUrl(appliance.getEditUrl());
+                img.setEditUrl(fixURL(appliance.getEditUrl(), creds));
                 img.setName(appliance.getName());
                 // Build attributes
-                img.setDownloadUrl(build.getDownloadUrl());
+                img.setDownloadUrl(fixURL(build.getDownloadUrl(), creds));
                 img.setId(new Long(build.getId()));
                 img.setImageSize(build.getImageSize());
                 img.setImageType(build.getImageType());
@@ -139,6 +130,18 @@ public class ImagesRenderer extends BaseFragmentRenderer {
     }
 
     /**
+     * Certain versions of SUSE Studio provide relative URLs only,
+     * automatically prepend the base URL in this case.
+     */
+    private String fixURL(String url, Credentials creds) {
+        String ret = url;
+        if (ret != null && ret.startsWith("/")) {
+            ret = creds.getUrl() + ret;
+        }
+        return ret;
+    }
+
+    /**
      * {@inheritDoc}
      */
     @Override
-- 
1.7.10.4

>From 46d46e7752e8c7eb665109de9aaaf3bfaeee35fd Mon Sep 17 00:00:00 2001
From: Johannes Renner <jren...@suse.de>
Date: Tue, 13 Nov 2012 16:24:39 +0100
Subject: [PATCH 2/3] Basic normalization for SUSE Studio base URL

---
 .../action/user/UserCredentialsEditAction.java     |   23 ++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)

diff --git a/java/code/src/com/redhat/rhn/frontend/action/user/UserCredentialsEditAction.java b/java/code/src/com/redhat/rhn/frontend/action/user/UserCredentialsEditAction.java
index 8048eb1..66efc89 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/user/UserCredentialsEditAction.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/user/UserCredentialsEditAction.java
@@ -64,7 +64,7 @@ public class UserCredentialsEditAction extends RhnAction {
             Credentials newCreds = CredentialsFactory.createCredentials();
             newCreds.setUsername(request.getParameter(PARAM_USER).trim());
             newCreds.setPassword(request.getParameter(PARAM_KEY).trim());
-            newCreds.setUrl(request.getParameter(PARAM_URL).trim());
+            newCreds.setUrl(normalizeURL(request.getParameter(PARAM_URL)));
 
             // Check for completeness
             if (newCreds.isEmpty() || newCreds.isComplete()) {
@@ -77,7 +77,8 @@ public class UserCredentialsEditAction extends RhnAction {
                     // Store the credentials
                     creds.setUsername(newCreds.getUsername());
                     creds.setPassword(newCreds.getPassword());
-                    creds.setUrl(newCreds.getUrl());
+                    String url = newCreds.getUrl();
+                    creds.setUrl(url.isEmpty() ? DEFAULT_URL : url);
                     CredentialsFactory.storeCredentials(creds);
                 }
                 ActionMessages messages = new ActionMessages();
@@ -96,4 +97,22 @@ public class UserCredentialsEditAction extends RhnAction {
         }
         return mapping.findForward(RhnHelper.DEFAULT_FORWARD);
     }
+
+    /**
+     * Very basic URL normalization.
+     * @param url
+     * @return url normalized
+     */
+    private String normalizeURL(String url) {
+        String ret = url;
+        if (ret != null) {
+            // trim() and make all lowercase
+            ret = url.trim().toLowerCase();
+            // Remove trailing slashes
+            while (ret.endsWith("/")) {
+                ret = ret.substring(0, ret.length() - 1);
+            }
+        }
+        return ret;
+    }
 }
-- 
1.7.10.4

>From e11683a955cfc9a4c924cdc11010e407b05d4ae6 Mon Sep 17 00:00:00 2001
From: Johannes Renner <jren...@suse.de>
Date: Tue, 13 Nov 2012 16:25:20 +0100
Subject: [PATCH 3/3] Catch MalformedURLException in case of missing protocol
 etc.

---
 .../redhat/rhn/frontend/action/renderers/ImagesRenderer.java   |    8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/java/code/src/com/redhat/rhn/frontend/action/renderers/ImagesRenderer.java b/java/code/src/com/redhat/rhn/frontend/action/renderers/ImagesRenderer.java
index 2859bd8..cb81d0b 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/renderers/ImagesRenderer.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/renderers/ImagesRenderer.java
@@ -16,6 +16,7 @@
 package com.redhat.rhn.frontend.action.renderers;
 
 import java.io.IOException;
+import java.net.MalformedURLException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -73,6 +74,13 @@ public class ImagesRenderer extends BaseFragmentRenderer {
                 request.getSession().setAttribute(ATTRIB_IMAGES_LIST, images);
             }
         }
+        catch (RuntimeException re) {
+            if (re.getCause() instanceof MalformedURLException) {
+                logger.error(re.getMessage());
+                request.setAttribute(ATTRIB_ERROR_MSG, "images.message.error.connection");
+            }
+            else throw re;
+        }
         catch (IOException e) {
             logger.error(e.getMessage());
             request.setAttribute(ATTRIB_ERROR_MSG, "images.message.error.connection");
-- 
1.7.10.4

_______________________________________________
Spacewalk-devel mailing list
Spacewalk-devel@redhat.com
https://www.redhat.com/mailman/listinfo/spacewalk-devel

Reply via email to