You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by rl...@apache.org on 2018/07/25 12:28:22 UTC

[ambari] branch branch-2.7 updated: AMBARI-24333. Raising an error when user is trying to create a view URL with an existing short URL prefix

This is an automated email from the ASF dual-hosted git repository.

rlevas pushed a commit to branch branch-2.7
in repository https://gitbox.apache.org/repos/asf/ambari.git


The following commit(s) were added to refs/heads/branch-2.7 by this push:
     new 1a67af5  AMBARI-24333. Raising an error when user is trying to create a view URL with an existing short URL prefix
1a67af5 is described below

commit 1a67af59eb948f0d3c129a3691084806a132a803
Author: Sandor Molnar <sm...@apache.org>
AuthorDate: Wed Jul 25 08:02:37 2018 +0200

    AMBARI-24333. Raising an error when user is trying to create a view URL with an existing short URL prefix
---
 .../internal/ViewURLResourceProvider.java          | 12 ++++----
 .../apache/ambari/server/orm/dao/ViewURLDAO.java   | 24 +++++++++++++--
 .../ambari/server/orm/entities/ViewURLEntity.java  | 10 ++-----
 .../internal/ViewURLResourceProviderTest.java      | 35 +++++++++++++++++++++-
 4 files changed, 64 insertions(+), 17 deletions(-)

diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewURLResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewURLResourceProvider.java
index 1cf351e..8267492 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewURLResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewURLResourceProvider.java
@@ -55,7 +55,6 @@ import com.google.inject.Inject;
 /**
  * Resource provider for view URLs.
  */
-@SuppressWarnings("Duplicates")
 @StaticallyInject
 public class ViewURLResourceProvider extends AbstractAuthorizedResourceProvider {
 
@@ -268,15 +267,16 @@ public class ViewURLResourceProvider extends AbstractAuthorizedResourceProvider
           throw new IllegalStateException("The view " + viewName + " is not loaded.");
         }
 
-        ViewURLEntity viewUrl = viewInstanceEntity.getViewUrl();
-        Optional<ViewURLEntity> savedUrl = viewURLDAO.findByName(urlEntity.getUrlName());
+        if(viewInstanceEntity.getViewUrl() != null) {
+          throw new AmbariException("The view instance selected already has a linked URL");
+        }
 
-        if(savedUrl.isPresent()){
+        if(viewURLDAO.findByName(urlEntity.getUrlName()).isPresent()){
           throw new AmbariException("This view URL name exists, URL names should be unique");
         }
 
-        if(viewUrl != null) {
-          throw new AmbariException("The view instance selected already has a linked URL");
+        if (viewURLDAO.findBySuffix(urlEntity.getUrlSuffix()).isPresent()) {
+          throw new AmbariException("This view URL suffix has already been recorded, URL suffixes should be unique");
         }
 
         viewURLDAO.save(urlEntity);
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ViewURLDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ViewURLDAO.java
index 93c9852..4ddd8d1 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ViewURLDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ViewURLDAO.java
@@ -21,6 +21,7 @@ package org.apache.ambari.server.orm.dao;
 import java.util.List;
 
 import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
 import javax.persistence.TypedQuery;
 
 import org.apache.ambari.server.orm.RequiresSession;
@@ -42,9 +43,6 @@ public class ViewURLDAO {
    */
   @Inject
   private Provider<EntityManager> entityManagerProvider;
-  @Inject
-  private DaoUtils daoUtils;
-
 
   /**
    * Find all view instances.
@@ -77,6 +75,26 @@ public class ViewURLDAO {
   }
 
   /**
+   * Find URL by suffix
+   *
+   * @param urlSuffix
+   *          the suffix to get the URL by
+   * @return <code>Optional.absent()</code> if no view URL with the given suffix;
+   *         otherwise an appropriate <code>Optional</code> instance holding the
+   *         fetched view URL
+   */
+  @RequiresSession
+  public Optional<ViewURLEntity> findBySuffix(String urlSuffix) {
+    TypedQuery<ViewURLEntity> query = entityManagerProvider.get().createNamedQuery("viewUrlBySuffix", ViewURLEntity.class);
+    query.setParameter("urlSuffix", urlSuffix);
+    try {
+      return Optional.of(query.getSingleResult());
+    } catch (NoResultException e) {
+      return Optional.absent();
+    }
+  }
+
+  /**
    * Save a URL entity
    * @param urlEntity
      */
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewURLEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewURLEntity.java
index 78bb49d..c16fdc3 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewURLEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewURLEntity.java
@@ -41,13 +41,9 @@ import javax.persistence.TableGenerator;
 )
 
 @NamedQueries({
-        @NamedQuery(name = "allViewUrls",
-                query = "SELECT viewUrl FROM ViewURLEntity viewUrl"),
-        @NamedQuery(name = "viewUrlByName", query =
-                "SELECT viewUrlEntity " +
-                        "FROM ViewURLEntity viewUrlEntity " +
-                        "WHERE viewUrlEntity.urlName=:urlName")})
-
+        @NamedQuery(name = "allViewUrls", query = "SELECT viewUrl FROM ViewURLEntity viewUrl"),
+        @NamedQuery(name = "viewUrlByName", query ="SELECT viewUrlEntity FROM ViewURLEntity viewUrlEntity WHERE viewUrlEntity.urlName=:urlName"),
+        @NamedQuery(name = "viewUrlBySuffix", query ="SELECT viewUrlEntity FROM ViewURLEntity viewUrlEntity WHERE viewUrlEntity.urlSuffix=:urlSuffix")})
 
 @Entity
 public class ViewURLEntity {
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewURLResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewURLResourceProviderTest.java
index 1000d9d..197fc15 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewURLResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewURLResourceProviderTest.java
@@ -140,6 +140,7 @@ public class ViewURLResourceProviderTest {
     expect(viewInstanceEntity.getName()).andReturn("test").once();
     expect(viewInstanceEntity.getViewUrl()).andReturn(null).once();
     expect(viewURLDAO.findByName("test")).andReturn(Optional.absent());
+    expect(viewURLDAO.findBySuffix("suffix")).andReturn(Optional.absent());
     Capture<ViewURLEntity> urlEntityCapture = newCapture();
     viewURLDAO.save(capture(urlEntityCapture));
     viewregistry.updateViewInstance(viewInstanceEntity);
@@ -160,7 +161,7 @@ public class ViewURLResourceProviderTest {
   }
 
   @Test(expected = org.apache.ambari.server.controller.spi.SystemException.class)
-  public void testCreateResources_existingUrl() throws Exception {
+  public void testCreateResources_existingUrlName() throws Exception {
     ViewInstanceEntity viewInstanceEntity = createNiceMock(ViewInstanceEntity.class);
     ViewEntity viewEntity = createNiceMock(ViewEntity.class);
     ViewURLResourceProvider provider = new ViewURLResourceProvider();
@@ -191,6 +192,38 @@ public class ViewURLResourceProviderTest {
 
   }
 
+  @Test(expected = org.apache.ambari.server.controller.spi.SystemException.class)
+  public void testCreateResources_existingUrlSuffix() throws Exception {
+    ViewInstanceEntity viewInstanceEntity = createNiceMock(ViewInstanceEntity.class);
+    ViewEntity viewEntity = createNiceMock(ViewEntity.class);
+    ViewURLResourceProvider provider = new ViewURLResourceProvider();
+
+    ViewURLDAO viewURLDAO = createNiceMock(ViewURLDAO.class);
+    setDao(ViewURLResourceProvider.class.getDeclaredField("viewURLDAO"), viewURLDAO);
+    Set<Map<String, Object>> properties = new HashSet<>();
+    Map<String, Object> propertyMap = new HashMap<>();
+    propertyMap.put(ViewURLResourceProvider.URL_NAME,"test");
+    propertyMap.put(ViewURLResourceProvider.URL_SUFFIX,"suffix");
+    propertyMap.put(ViewURLResourceProvider.VIEW_INSTANCE_COMMON_NAME,"FILES");
+    propertyMap.put(ViewURLResourceProvider.VIEW_INSTANCE_NAME,"test");
+    propertyMap.put(ViewURLResourceProvider.VIEW_INSTANCE_VERSION,"1.0.0");
+
+    expect(viewregistry.getInstanceDefinition("FILES","1.0.0","test")).andReturn(viewInstanceEntity);
+    expect(viewregistry.getDefinition("FILES","1.0.0")).andReturn(viewEntity);
+    expect(viewInstanceEntity.getViewEntity()).andReturn(viewEntity).once();
+    expect(viewEntity.getCommonName()).andReturn("FILES").once();
+    expect(viewEntity.isDeployed()).andReturn(true).once();
+    expect(viewEntity.getVersion()).andReturn("1.0.0").once();
+    expect(viewInstanceEntity.getName()).andReturn("test").once();
+    expect(viewInstanceEntity.getViewUrl()).andReturn(null).once();
+    expect(viewURLDAO.findByName("test")).andReturn(Optional.absent());
+    expect(viewURLDAO.findBySuffix("suffix")).andReturn(Optional.of(new ViewURLEntity()));
+    replay(viewregistry,viewEntity,viewInstanceEntity,viewURLDAO);
+    properties.add(propertyMap);
+    SecurityContextHolder.getContext().setAuthentication(TestAuthenticationFactory.createAdministrator());
+    provider.createResources(PropertyHelper.getCreateRequest(properties, null));
+  }
+
 
   @Test
   public void testUpdateResources() throws Exception {