Repository: ambari
Updated Branches:
  refs/heads/trunk c74ebac52 -> 6c0f9acef


AMBARI-11516 - Views : Add URLConnectionProvider interface (tbeerbower)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/6c0f9ace
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/6c0f9ace
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/6c0f9ace

Branch: refs/heads/trunk
Commit: 6c0f9acef0f7ada38ebbd59a4fc2a70652050f4c
Parents: c74ebac
Author: tbeerbower <tbeerbo...@hortonworks.com>
Authored: Thu May 28 21:46:27 2015 -0400
Committer: tbeerbower <tbeerbo...@hortonworks.com>
Committed: Thu May 28 21:46:37 2015 -0400

----------------------------------------------------------------------
 .../ambari/server/view/ViewContextImpl.java     |   7 +
 .../server/view/ViewURLStreamProvider.java      |  75 +++++++++--
 .../ambari/server/view/ViewContextImplTest.java |  25 ++++
 .../server/view/ViewURLStreamProviderTest.java  |  81 +++++++++++-
 ambari-views/pom.xml                            |   4 +-
 .../ambari/view/URLConnectionProvider.java      | 130 +++++++++++++++++++
 .../org/apache/ambari/view/ViewContext.java     |   7 +
 7 files changed, 311 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/6c0f9ace/ambari-server/src/main/java/org/apache/ambari/server/view/ViewContextImpl.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewContextImpl.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewContextImpl.java
index 9a4aae2..8788346 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewContextImpl.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewContextImpl.java
@@ -38,6 +38,7 @@ import org.apache.ambari.view.Masker;
 import org.apache.ambari.view.ResourceProvider;
 import org.apache.ambari.view.SecurityException;
 import org.apache.ambari.view.SystemException;
+import org.apache.ambari.view.URLConnectionProvider;
 import org.apache.ambari.view.ViewContext;
 import org.apache.ambari.view.ViewController;
 import org.apache.ambari.view.ViewDefinition;
@@ -263,6 +264,12 @@ public class ViewContextImpl implements ViewContext, 
ViewController {
   }
 
   @Override
+  public URLConnectionProvider getURLConnectionProvider() {
+    ensureURLStreamProvider();
+    return streamProvider;
+  }
+
+  @Override
   public synchronized AmbariStreamProvider getAmbariStreamProvider() {
     if (ambariStreamProvider == null) {
       ambariStreamProvider = viewRegistry.createAmbariStreamProvider();

http://git-wip-us.apache.org/repos/asf/ambari/blob/6c0f9ace/ambari-server/src/main/java/org/apache/ambari/server/view/ViewURLStreamProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewURLStreamProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewURLStreamProvider.java
index bb3b8aa..c8ee284 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewURLStreamProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewURLStreamProvider.java
@@ -20,6 +20,7 @@ package org.apache.ambari.server.view;
 
 import org.apache.ambari.server.controller.internal.URLStreamProvider;
 import org.apache.ambari.server.proxy.ProxyService;
+import org.apache.ambari.view.URLConnectionProvider;
 import org.apache.ambari.view.ViewContext;
 import org.apache.commons.io.IOUtils;
 
@@ -36,7 +37,7 @@ import java.util.Map;
 /**
  * Wrapper around an internal URL stream provider.
  */
-public class ViewURLStreamProvider implements 
org.apache.ambari.view.URLStreamProvider {
+public class ViewURLStreamProvider implements 
org.apache.ambari.view.URLStreamProvider, URLConnectionProvider {
 
   /**
    * The key for the "doAs" header.
@@ -87,7 +88,6 @@ public class ViewURLStreamProvider implements 
org.apache.ambari.view.URLStreamPr
   public InputStream readAs(String spec, String requestMethod, String body, 
Map<String, String> headers,
                             String userName)
       throws IOException {
-
     return readFrom(addDoAs(spec, userName), requestMethod, body, headers);
   }
 
@@ -112,6 +112,55 @@ public class ViewURLStreamProvider implements 
org.apache.ambari.view.URLStreamPr
     return readAs(spec, requestMethod, body, headers, 
viewContext.getUsername());
   }
 
+  @Override
+  public HttpURLConnection getConnection(String spec,
+                                         String requestMethod,
+                                         String body,
+                                         Map<String, String> headers) throws 
IOException {
+    return getHttpURLConnection(spec, requestMethod, headers, body == null ? 
null : body.getBytes());
+  }
+
+  @Override
+  public HttpURLConnection getConnection(String spec,
+                                         String requestMethod,
+                                         InputStream body,
+                                         Map<String, String> headers) throws 
IOException {
+    return getHttpURLConnection(spec, requestMethod, headers, body == null ? 
null : IOUtils.toByteArray(body));
+  }
+
+  @Override
+  public HttpURLConnection getConnectionAs(String spec,
+                                           String requestMethod,
+                                           String body,
+                                           Map<String, String> headers,
+                                           String userName) throws IOException 
{
+    return getConnection(addDoAs(spec, userName), requestMethod, body, 
headers);
+  }
+
+  @Override
+  public HttpURLConnection getConnectionAs(String spec,
+                                           String requestMethod,
+                                           InputStream body,
+                                           Map<String, String> headers,
+                                           String userName) throws IOException 
{
+    return getConnection(addDoAs(spec, userName), requestMethod, body, 
headers);
+  }
+
+  @Override
+  public HttpURLConnection getConnectionAsCurrent(String spec,
+                                                  String requestMethod,
+                                                  String body,
+                                                  Map<String, String> headers) 
throws IOException {
+    return getConnectionAs(spec, requestMethod, body, headers, 
viewContext.getUsername());
+  }
+
+  @Override
+  public HttpURLConnection getConnectionAsCurrent(String spec,
+                                                  String requestMethod,
+                                                  InputStream body,
+                                                  Map<String, String> headers) 
throws IOException {
+    return getConnectionAs(spec, requestMethod, body, headers, 
viewContext.getUsername());
+  }
 
   // ----- helper methods ----------------------------------------------------
 
@@ -133,18 +182,24 @@ public class ViewURLStreamProvider implements 
org.apache.ambari.view.URLStreamPr
   // get the input stream response from the underlying stream provider
   private InputStream getInputStream(String spec, String requestMethod, 
Map<String, String> headers, byte[] info)
       throws IOException {
-    // adapt the headers to the internal URLStreamProvider processURL signature
-    Map<String, List<String>> headerMap = new HashMap<String, List<String>>();
-    for (Map.Entry<String, String> entry : headers.entrySet()) {
-      headerMap.put(entry.getKey(), 
Collections.singletonList(entry.getValue()));
-    }
-
-    HttpURLConnection connection = streamProvider.processURL(spec, 
requestMethod, info, headerMap);
+    HttpURLConnection connection = getHttpURLConnection(spec, requestMethod, 
headers, info);
 
     int responseCode = connection.getResponseCode();
 
     return responseCode >= ProxyService.HTTP_ERROR_RANGE_START ?
         connection.getErrorStream() : connection.getInputStream();
   }
-}
 
+  // get the input stream response from the underlying stream provider
+  private HttpURLConnection getHttpURLConnection(String spec, String 
requestMethod,
+                                                 Map<String, String> headers, 
byte[] info)
+      throws IOException {
+    // adapt the headers to the internal URLStreamProvider processURL signature
+    Map<String, List<String>> headerMap = new HashMap<String, List<String>>();
+    for (Map.Entry<String, String> entry : headers.entrySet()) {
+      headerMap.put(entry.getKey(), 
Collections.singletonList(entry.getValue()));
+    }
+    return streamProvider.processURL(spec, requestMethod, info, headerMap);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6c0f9ace/ambari-server/src/test/java/org/apache/ambari/server/view/ViewContextImplTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/view/ViewContextImplTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/view/ViewContextImplTest.java
index b470da2..e111811 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/view/ViewContextImplTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/view/ViewContextImplTest.java
@@ -27,6 +27,7 @@ import 
org.apache.ambari.server.view.configuration.InstanceConfig;
 import org.apache.ambari.server.view.configuration.InstanceConfigTest;
 import org.apache.ambari.server.view.configuration.ViewConfigTest;
 import org.apache.ambari.view.ResourceProvider;
+import org.apache.ambari.view.ViewContext;
 import org.apache.ambari.view.cluster.Cluster;
 import org.junit.Assert;
 import org.junit.Test;
@@ -198,6 +199,30 @@ public class ViewContextImplTest {
   }
 
   @Test
+  public void testGetURLConnectionProvider() throws Exception {
+    InstanceConfig instanceConfig = 
InstanceConfigTest.getInstanceConfigs().get(0);
+    ViewEntity viewDefinition = ViewEntityTest.getViewEntity();
+    ViewInstanceEntity viewInstanceDefinition = new 
ViewInstanceEntity(viewDefinition, instanceConfig);
+    ViewRegistry viewRegistry = createNiceMock(ViewRegistry.class);
+    ViewURLStreamProvider urlStreamProvider = 
createNiceMock(ViewURLStreamProvider.class);
+
+    ResourceProvider provider = createNiceMock(ResourceProvider.class);
+    Resource.Type type = new Resource.Type("MY_VIEW/myType");
+
+    viewInstanceDefinition.addResourceProvider(type, provider);
+
+    ViewContext viewContext = new ViewContextImpl(viewInstanceDefinition, 
viewRegistry);
+
+    
expect(viewRegistry.createURLStreamProvider(viewContext)).andReturn(urlStreamProvider);
+
+    replay(viewRegistry);
+
+    Assert.assertEquals(urlStreamProvider, 
viewContext.getURLConnectionProvider());
+
+    verify(viewRegistry);
+  }
+
+  @Test
   public void testGetAmbariStreamProvider() throws Exception {
     InstanceConfig instanceConfig = 
InstanceConfigTest.getInstanceConfigs().get(0);
     ViewEntity viewDefinition = ViewEntityTest.getViewEntity();

http://git-wip-us.apache.org/repos/asf/ambari/blob/6c0f9ace/ambari-server/src/test/java/org/apache/ambari/server/view/ViewURLStreamProviderTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/view/ViewURLStreamProviderTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/view/ViewURLStreamProviderTest.java
index e606820..af48c4b 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/view/ViewURLStreamProviderTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/view/ViewURLStreamProviderTest.java
@@ -74,8 +74,6 @@ public class ViewURLStreamProviderTest {
     InputStream inputStream = createNiceMock(InputStream.class);
     ViewContext viewContext = createNiceMock(ViewContext.class);
 
-    String body = null;
-
     Map<String, String> headers = new HashMap<String, String>();
     headers.put("header", "headerValue");
 
@@ -89,7 +87,7 @@ public class ViewURLStreamProviderTest {
 
     ViewURLStreamProvider viewURLStreamProvider = new 
ViewURLStreamProvider(viewContext, streamProvider);
 
-    Assert.assertEquals(inputStream, viewURLStreamProvider.readFrom("spec", 
"requestMethod", body, headers));
+    Assert.assertEquals(inputStream, viewURLStreamProvider.readFrom("spec", 
"requestMethod", (String) null, headers));
 
     verify(streamProvider, urlConnection, inputStream);
   }
@@ -183,8 +181,6 @@ public class ViewURLStreamProviderTest {
     InputStream inputStream = createNiceMock(InputStream.class);
     ViewContext viewContext = createNiceMock(ViewContext.class);
 
-    InputStream body = null;
-
     Map<String, String> headers = new HashMap<String, String>();
     headers.put("header", "headerValue");
 
@@ -198,7 +194,7 @@ public class ViewURLStreamProviderTest {
 
     ViewURLStreamProvider viewURLStreamProvider = new 
ViewURLStreamProvider(viewContext, streamProvider);
 
-    Assert.assertEquals(inputStream, viewURLStreamProvider.readFrom("spec", 
"requestMethod", body, headers));
+    Assert.assertEquals(inputStream, viewURLStreamProvider.readFrom("spec", 
"requestMethod", (InputStream) null, headers));
 
     verify(streamProvider, urlConnection, inputStream);
   }
@@ -259,4 +255,77 @@ public class ViewURLStreamProviderTest {
 
     verify(streamProvider, urlConnection, inputStream, viewContext);
   }
+
+  @Test
+  public void testGetConnection() throws Exception {
+
+    URLStreamProvider streamProvider = createNiceMock(URLStreamProvider.class);
+    HttpURLConnection urlConnection = createNiceMock(HttpURLConnection.class);
+    ViewContext viewContext = createNiceMock(ViewContext.class);
+
+    Map<String, String> headers = new HashMap<String, String>();
+    headers.put("header", "headerValue");
+
+    Map<String, List<String>> headerMap = new HashMap<String, List<String>>();
+    headerMap.put("header", Collections.singletonList("headerValue"));
+
+    expect(streamProvider.processURL(eq("spec"), eq("requestMethod"), 
aryEq("params".getBytes()), eq(headerMap))).andReturn(urlConnection);
+
+    replay(streamProvider, urlConnection);
+
+    ViewURLStreamProvider viewURLStreamProvider = new 
ViewURLStreamProvider(viewContext, streamProvider);
+
+    Assert.assertEquals(urlConnection, 
viewURLStreamProvider.getConnection("spec", "requestMethod", "params", 
headers));
+
+    verify(streamProvider, urlConnection);
+  }
+
+  @Test
+  public void testGetConnectionAs() throws Exception {
+
+    URLStreamProvider streamProvider = createNiceMock(URLStreamProvider.class);
+    HttpURLConnection urlConnection = createNiceMock(HttpURLConnection.class);
+    ViewContext viewContext = createNiceMock(ViewContext.class);
+
+    Map<String, String> headers = new HashMap<String, String>();
+    headers.put("header", "headerValue");
+
+    Map<String, List<String>> headerMap = new HashMap<String, List<String>>();
+    headerMap.put("header", Collections.singletonList("headerValue"));
+
+    expect(streamProvider.processURL(eq("spec?doAs=joe"), eq("requestMethod"), 
aryEq("params".getBytes()), eq(headerMap))).andReturn(urlConnection);
+
+    replay(streamProvider, urlConnection);
+
+    ViewURLStreamProvider viewURLStreamProvider = new 
ViewURLStreamProvider(viewContext, streamProvider);
+
+    Assert.assertEquals(urlConnection, 
viewURLStreamProvider.getConnectionAs("spec", "requestMethod", "params", 
headers, "joe"));
+
+    verify(streamProvider, urlConnection);
+  }
+
+  @Test
+  public void testGetConnectionCurrent() throws Exception {
+
+    URLStreamProvider streamProvider = createNiceMock(URLStreamProvider.class);
+    HttpURLConnection urlConnection = createNiceMock(HttpURLConnection.class);
+    ViewContext viewContext = createNiceMock(ViewContext.class);
+
+    Map<String, String> headers = new HashMap<String, String>();
+    headers.put("header", "headerValue");
+
+    Map<String, List<String>> headerMap = new HashMap<String, List<String>>();
+    headerMap.put("header", Collections.singletonList("headerValue"));
+
+    expect(streamProvider.processURL(eq("spec?doAs=joe"), eq("requestMethod"), 
aryEq("params".getBytes()), eq(headerMap))).andReturn(urlConnection);
+    expect(viewContext.getUsername()).andReturn("joe").anyTimes();
+
+    replay(streamProvider, urlConnection, viewContext);
+
+    ViewURLStreamProvider viewURLStreamProvider = new 
ViewURLStreamProvider(viewContext, streamProvider);
+
+    Assert.assertEquals(urlConnection, 
viewURLStreamProvider.getConnectionAsCurrent("spec", "requestMethod", "params", 
headers));
+
+    verify(streamProvider, urlConnection, viewContext);
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6c0f9ace/ambari-views/pom.xml
----------------------------------------------------------------------
diff --git a/ambari-views/pom.xml b/ambari-views/pom.xml
index 8fcb5ae..59e7026 100644
--- a/ambari-views/pom.xml
+++ b/ambari-views/pom.xml
@@ -127,9 +127,9 @@
                 <configuration>
                     <excludes>
                         <exclude>**/*.json</exclude>
-                    </excludes>
-                    <excludes>
                         <exclude>**/*.iml</exclude>
+                        <exclude>**/*.lst</exclude>
+                        <exclude>**/rat.txt</exclude>
                     </excludes>
                 </configuration>
                 <executions>

http://git-wip-us.apache.org/repos/asf/ambari/blob/6c0f9ace/ambari-views/src/main/java/org/apache/ambari/view/URLConnectionProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-views/src/main/java/org/apache/ambari/view/URLConnectionProvider.java 
b/ambari-views/src/main/java/org/apache/ambari/view/URLConnectionProvider.java
new file mode 100644
index 0000000..d02f964
--- /dev/null
+++ 
b/ambari-views/src/main/java/org/apache/ambari/view/URLConnectionProvider.java
@@ -0,0 +1,130 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.view;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.util.Map;
+
+/**
+ * Provider of a URL connection.
+ */
+public interface URLConnectionProvider {
+  /**
+   * Get the HttpURLConnection specified by the given URL spec.
+   *
+   * @param spec           the String to parse as a URL
+   * @param requestMethod  the HTTP method (GET,POST,PUT,etc.).
+   * @param body           the body of the request; may be null
+   * @param headers        the headers of the request; may be null
+   *
+   * @return the HttpURLConnection to read the input stream from
+   *
+   * @throws java.io.IOException if an error occurred connecting to the server
+   */
+  public HttpURLConnection getConnection(String spec, String requestMethod, 
String body, Map<String, String> headers)
+      throws IOException;
+
+  /**
+   * Get the HttpURLConnection specified by the given URL spec.
+   *
+   * @param spec           the String to parse as a URL
+   * @param requestMethod  the HTTP method (GET,POST,PUT,etc.).
+   * @param body           the body of the request; may be null
+   * @param headers        the headers of the request; may be null
+   *
+   * @return the HttpURLConnection to read the input stream from
+   *
+   * @throws IOException if an error occurred connecting to the server
+   */
+  public HttpURLConnection getConnection(String spec, String requestMethod, 
InputStream body, Map<String, String> headers)
+      throws IOException;
+
+  /**
+   * Get the HttpURLConnection specified by the
+   * given URL spec as the given user.  This method sets the
+   * "doAs" user header to impersonate the user over the request.
+   *
+   * @param spec           the String to parse as a URL
+   * @param requestMethod  the HTTP method (GET,POST,PUT,etc.).
+   * @param body           the body of the request; may be null
+   * @param headers        the headers of the request; may be null
+   * @param userName       the "doAs" user name
+   *
+   * @return the HttpURLConnection to read the input stream from
+   *
+   * @throws IOException if an error occurred connecting to the server
+   */
+  public HttpURLConnection getConnectionAs(String spec, String requestMethod, 
String body, Map<String, String> headers,
+                                           String userName)
+      throws IOException;
+
+  /**
+   * Get the HttpURLConnection specified by the given URL
+   * spec as the given user.  This method sets the
+   * "doAs" user header to impersonate the user over the request.
+   *
+   * @param spec           the String to parse as a URL
+   * @param requestMethod  the HTTP method (GET,POST,PUT,etc.).
+   * @param body           the body of the request; may be null
+   * @param headers        the headers of the request; may be null
+   * @param userName       the "doAs" user name
+   *
+   * @return the HttpURLConnection to read the input stream from
+   *
+   * @throws IOException if an error occurred connecting to the server
+   */
+  public HttpURLConnection getConnectionAs(String spec, String requestMethod, 
InputStream body, Map<String, String> headers,
+                                           String userName) throws IOException;
+
+  /**
+   * Get the HttpURLConnection specified by the given URL
+   * spec as the current user.  This method sets the "doAs" user header to 
impersonate
+   * the user over the request.
+   *
+   * @param spec           the String to parse as a URL
+   * @param requestMethod  the HTTP method (GET,POST,PUT,etc.).
+   * @param body           the body of the request; may be null
+   * @param headers        the headers of the request; may be null
+   *
+   * @return the HttpURLConnection to read the input stream from
+   *
+   * @throws IOException if an error occurred connecting to the server
+   */
+  public HttpURLConnection getConnectionAsCurrent(String spec, String 
requestMethod, String body, Map<String, String> headers)
+      throws IOException;
+
+  /**
+   * Get the HttpURLConnection specified by the given URL spec
+   * as the current user.  This method sets the "doAs" user header to 
impersonate
+   * the user over the request.
+   *
+   * @param spec           the String to parse as a URL
+   * @param requestMethod  the HTTP method (GET,POST,PUT,etc.).
+   * @param body           the body of the request; may be null
+   * @param headers        the headers of the request; may be null
+   *
+   * @return the HttpURLConnection to read the input stream from
+   *
+   * @throws IOException if an error occurred connecting to the server
+   */
+  public HttpURLConnection getConnectionAsCurrent(String spec, String 
requestMethod, InputStream body, Map<String, String> headers)
+      throws IOException;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6c0f9ace/ambari-views/src/main/java/org/apache/ambari/view/ViewContext.java
----------------------------------------------------------------------
diff --git a/ambari-views/src/main/java/org/apache/ambari/view/ViewContext.java 
b/ambari-views/src/main/java/org/apache/ambari/view/ViewContext.java
index 2522486..c0cae80 100644
--- a/ambari-views/src/main/java/org/apache/ambari/view/ViewContext.java
+++ b/ambari-views/src/main/java/org/apache/ambari/view/ViewContext.java
@@ -151,6 +151,13 @@ public interface ViewContext {
   public URLStreamProvider getURLStreamProvider();
 
   /**
+   * Get a URL connection provider.
+   *
+   * @return a connection provider
+   */
+  public URLConnectionProvider getURLConnectionProvider();
+
+  /**
    * Get an Ambari stream provider.
    *
    * @return an Ambari stream provider

Reply via email to