Browse Source

AMBARI-5677 - Ambari Views : Ability to handle name + version views and view instances

tbeerbower 11 years ago
parent
commit
6d33c32407
26 changed files with 667 additions and 96 deletions
  1. 7 1
      ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java
  2. 1 1
      ambari-server/src/main/java/org/apache/ambari/server/api/resources/ViewResourceDefinition.java
  3. 58 0
      ambari-server/src/main/java/org/apache/ambari/server/api/resources/ViewVersionResourceDefinition.java
  4. 13 3
      ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewExternalSubResourceService.java
  5. 25 14
      ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewInstanceService.java
  6. 4 4
      ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewService.java
  7. 14 3
      ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewSubResourceService.java
  8. 185 0
      ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewVersionService.java
  9. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
  10. 24 9
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java
  11. 4 17
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewResourceProvider.java
  12. 159 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewVersionResourceProvider.java
  13. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/spi/Resource.java
  14. 39 2
      ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewEntity.java
  15. 4 4
      ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java
  16. 1 1
      ambari-server/src/main/java/org/apache/ambari/server/view/ViewContextImpl.java
  17. 5 1
      ambari-server/src/main/java/org/apache/ambari/server/view/ViewExternalSubResourceProvider.java
  18. 41 21
      ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java
  19. 11 4
      ambari-server/src/main/java/org/apache/ambari/server/view/ViewSubResourceProvider.java
  20. 1 1
      ambari-server/src/test/java/org/apache/ambari/server/api/resources/ViewResourceDefinitionTest.java
  21. 51 0
      ambari-server/src/test/java/org/apache/ambari/server/api/resources/ViewVersionResourceDefinitionTest.java
  22. 7 1
      ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewEntityTest.java
  23. 2 2
      ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewInstanceEntityTest.java
  24. 1 1
      ambari-server/src/test/java/org/apache/ambari/server/view/ViewContextImplTest.java
  25. 3 3
      ambari-server/src/test/java/org/apache/ambari/server/view/ViewRegistryTest.java
  26. 3 3
      ambari-server/src/test/java/org/apache/ambari/server/view/ViewSubResourceDefinitionTest.java

+ 7 - 1
ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java

@@ -201,9 +201,15 @@ public class ResourceInstanceFactoryImpl implements ResourceInstanceFactory {
         resourceDefinition = new ViewResourceDefinition();
         resourceDefinition = new ViewResourceDefinition();
         break;
         break;
 
 
+      case ViewVersion:
+        resourceDefinition = new ViewVersionResourceDefinition();
+        break;
+
       case ViewInstance:
       case ViewInstance:
         Set<SubResourceDefinition> subResourceDefinitions =
         Set<SubResourceDefinition> subResourceDefinitions =
-            ViewRegistry.getInstance().getSubResourceDefinitions(mapIds.get(Resource.Type.View));
+            ViewRegistry.getInstance().getSubResourceDefinitions(
+                mapIds.get(Resource.Type.View),
+                mapIds.get(Resource.Type.ViewVersion));
 
 
         resourceDefinition = new ViewInstanceResourceDefinition(subResourceDefinitions);
         resourceDefinition = new ViewInstanceResourceDefinition(subResourceDefinitions);
         break;
         break;

+ 1 - 1
ambari-server/src/main/java/org/apache/ambari/server/api/resources/ViewResourceDefinition.java

@@ -53,6 +53,6 @@ public class ViewResourceDefinition extends BaseResourceDefinition {
 
 
   @Override
   @Override
   public Set<SubResourceDefinition> getSubResourceDefinitions() {
   public Set<SubResourceDefinition> getSubResourceDefinitions() {
-    return Collections.singleton(new SubResourceDefinition(Resource.Type.ViewInstance));
+    return Collections.singleton(new SubResourceDefinition(Resource.Type.ViewVersion));
   }
   }
 }
 }

+ 58 - 0
ambari-server/src/main/java/org/apache/ambari/server/api/resources/ViewVersionResourceDefinition.java

@@ -0,0 +1,58 @@
+/**
+ * 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.server.api.resources;
+
+import org.apache.ambari.server.controller.spi.Resource;
+
+import java.util.Collections;
+import java.util.Set;
+
+
+/**
+ * View version resource definition.
+ */
+public class ViewVersionResourceDefinition extends BaseResourceDefinition {
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Construct a view version resource definition.
+   */
+  public ViewVersionResourceDefinition() {
+    super(Resource.Type.ViewVersion);
+  }
+
+
+  // ----- ResourceDefinition ------------------------------------------------
+
+  @Override
+  public String getPluralName() {
+    return "versions";
+  }
+
+  @Override
+  public String getSingularName() {
+    return "version";
+  }
+
+  @Override
+  public Set<SubResourceDefinition> getSubResourceDefinitions() {
+    return Collections.singleton(new SubResourceDefinition(Resource.Type.ViewInstance));
+  }
+}

+ 13 - 3
ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewExternalSubResourceService.java

@@ -20,6 +20,7 @@ package org.apache.ambari.server.api.services;
 
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
 import org.apache.ambari.server.api.resources.ResourceInstance;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.orm.entities.ViewEntity;
 import org.apache.ambari.server.orm.entities.ViewInstanceEntity;
 import org.apache.ambari.server.orm.entities.ViewInstanceEntity;
 
 
 import javax.ws.rs.GET;
 import javax.ws.rs.GET;
@@ -49,6 +50,11 @@ public class ViewExternalSubResourceService  extends BaseService {
    */
    */
   private final String viewName;
   private final String viewName;
 
 
+  /**
+   * The view version.
+   */
+  private final String version;
+
   /**
   /**
    * The instance name.
    * The instance name.
    */
    */
@@ -63,8 +69,11 @@ public class ViewExternalSubResourceService  extends BaseService {
   // ----- Constructors ------------------------------------------------------
   // ----- Constructors ------------------------------------------------------
 
 
   public ViewExternalSubResourceService(Resource.Type type, ViewInstanceEntity viewInstanceDefinition) {
   public ViewExternalSubResourceService(Resource.Type type, ViewInstanceEntity viewInstanceDefinition) {
+    ViewEntity viewEntity = viewInstanceDefinition.getViewEntity();
+
     this.type         = type;
     this.type         = type;
-    this.viewName     = viewInstanceDefinition.getViewName();
+    this.viewName     = viewEntity.getCommonName();
+    this.version      = viewEntity.getVersion();
     this.instanceName = viewInstanceDefinition.getName();
     this.instanceName = viewInstanceDefinition.getName();
   }
   }
 
 
@@ -81,7 +90,7 @@ public class ViewExternalSubResourceService  extends BaseService {
   @Produces("text/plain")
   @Produces("text/plain")
   public Response getResources(@Context HttpHeaders headers, @Context UriInfo ui) {
   public Response getResources(@Context HttpHeaders headers, @Context UriInfo ui) {
     return handleRequest(headers, null, ui, Request.Type.GET,
     return handleRequest(headers, null, ui, Request.Type.GET,
-        createServiceResource(viewName, instanceName));
+        createResource(viewName, instanceName));
   }
   }
 
 
   /**
   /**
@@ -126,9 +135,10 @@ public class ViewExternalSubResourceService  extends BaseService {
    *
    *
    * @return a view instance resource
    * @return a view instance resource
    */
    */
-  private ResourceInstance createServiceResource(String viewName, String instanceName) {
+  private ResourceInstance createResource(String viewName, String instanceName) {
     Map<Resource.Type,String> mapIds = new HashMap<Resource.Type, String>();
     Map<Resource.Type,String> mapIds = new HashMap<Resource.Type, String>();
     mapIds.put(Resource.Type.View, viewName);
     mapIds.put(Resource.Type.View, viewName);
+    mapIds.put(Resource.Type.ViewVersion, version);
     mapIds.put(Resource.Type.ViewInstance, instanceName);
     mapIds.put(Resource.Type.ViewInstance, instanceName);
     return createResource(type, mapIds);
     return createResource(type, mapIds);
   }
   }

+ 25 - 14
ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewInstanceService.java

@@ -44,7 +44,12 @@ public class ViewInstanceService extends BaseService {
   /**
   /**
    * Parent view name.
    * Parent view name.
    */
    */
-  private String m_viewName;
+  private final String viewName;
+
+  /**
+   * The view version.
+   */
+  private final String version;
 
 
 
 
   // ----- Constructors ------------------------------------------------------
   // ----- Constructors ------------------------------------------------------
@@ -53,11 +58,16 @@ public class ViewInstanceService extends BaseService {
    * Construct a view instance service.
    * Construct a view instance service.
    *
    *
    * @param viewName  the view id
    * @param viewName  the view id
+   * @param version   the version
    */
    */
-  public ViewInstanceService(String viewName) {
-    m_viewName = viewName;
+  public ViewInstanceService(String viewName, String version) {
+    this.viewName = viewName;
+    this.version  = version;
   }
   }
 
 
+
+  // ----- ViewInstanceService -----------------------------------------------
+
   /**
   /**
    * Handles URL: /views/{viewID}/instances/{instanceID}
    * Handles URL: /views/{viewID}/instances/{instanceID}
    * Get a specific instance.
    * Get a specific instance.
@@ -75,7 +85,7 @@ public class ViewInstanceService extends BaseService {
                              @PathParam("instanceName") String instanceName) {
                              @PathParam("instanceName") String instanceName) {
 
 
     return handleRequest(headers, null, ui, Request.Type.GET,
     return handleRequest(headers, null, ui, Request.Type.GET,
-        createServiceResource(m_viewName, instanceName));
+        createResource(viewName, version, instanceName));
   }
   }
 
 
   /**
   /**
@@ -91,7 +101,7 @@ public class ViewInstanceService extends BaseService {
   @Produces("text/plain")
   @Produces("text/plain")
   public Response getServices(@Context HttpHeaders headers, @Context UriInfo ui) {
   public Response getServices(@Context HttpHeaders headers, @Context UriInfo ui) {
     return handleRequest(headers, null, ui, Request.Type.GET,
     return handleRequest(headers, null, ui, Request.Type.GET,
-        createServiceResource(m_viewName, null));
+        createResource(viewName, version,  null));
   }
   }
 
 
   /**
   /**
@@ -111,7 +121,7 @@ public class ViewInstanceService extends BaseService {
   public Response createService(String body, @Context HttpHeaders headers, @Context UriInfo ui,
   public Response createService(String body, @Context HttpHeaders headers, @Context UriInfo ui,
                                 @PathParam("instanceName") String instanceName) {
                                 @PathParam("instanceName") String instanceName) {
     return handleRequest(headers, body, ui, Request.Type.POST,
     return handleRequest(headers, body, ui, Request.Type.POST,
-        createServiceResource(m_viewName, instanceName));
+        createResource(viewName, version,  instanceName));
   }
   }
 
 
   /**
   /**
@@ -129,7 +139,7 @@ public class ViewInstanceService extends BaseService {
   public Response createServices(String body, @Context HttpHeaders headers, @Context UriInfo ui) {
   public Response createServices(String body, @Context HttpHeaders headers, @Context UriInfo ui) {
 
 
     return handleRequest(headers, body, ui, Request.Type.POST,
     return handleRequest(headers, body, ui, Request.Type.POST,
-        createServiceResource(m_viewName, null));
+        createResource(viewName, version,  null));
   }
   }
 
 
   /**
   /**
@@ -149,7 +159,7 @@ public class ViewInstanceService extends BaseService {
   public Response updateService(String body, @Context HttpHeaders headers, @Context UriInfo ui,
   public Response updateService(String body, @Context HttpHeaders headers, @Context UriInfo ui,
                                 @PathParam("instanceName") String instanceName) {
                                 @PathParam("instanceName") String instanceName) {
 
 
-    return handleRequest(headers, body, ui, Request.Type.PUT, createServiceResource(m_viewName, instanceName));
+    return handleRequest(headers, body, ui, Request.Type.PUT, createResource(viewName, version,  instanceName));
   }
   }
 
 
   /**
   /**
@@ -166,7 +176,7 @@ public class ViewInstanceService extends BaseService {
   @Produces("text/plain")
   @Produces("text/plain")
   public Response updateServices(String body, @Context HttpHeaders headers, @Context UriInfo ui) {
   public Response updateServices(String body, @Context HttpHeaders headers, @Context UriInfo ui) {
 
 
-    return handleRequest(headers, body, ui, Request.Type.PUT, createServiceResource(m_viewName, null));
+    return handleRequest(headers, body, ui, Request.Type.PUT, createResource(viewName, version,  null));
   }
   }
 
 
   /**
   /**
@@ -185,7 +195,7 @@ public class ViewInstanceService extends BaseService {
   public Response deleteService(@Context HttpHeaders headers, @Context UriInfo ui,
   public Response deleteService(@Context HttpHeaders headers, @Context UriInfo ui,
                                 @PathParam("instanceName") String instanceName) {
                                 @PathParam("instanceName") String instanceName) {
 
 
-    return handleRequest(headers, null, ui, Request.Type.DELETE, createServiceResource(m_viewName, instanceName));
+    return handleRequest(headers, null, ui, Request.Type.DELETE, createResource(viewName, version,  instanceName));
   }
   }
 
 
   /**
   /**
@@ -200,18 +210,18 @@ public class ViewInstanceService extends BaseService {
                                             @PathParam("resources") String resources) {
                                             @PathParam("resources") String resources) {
 
 
     ViewInstanceEntity instanceDefinition =
     ViewInstanceEntity instanceDefinition =
-        ViewRegistry.getInstance().getInstanceDefinition(m_viewName, instanceName);
+        ViewRegistry.getInstance().getInstanceDefinition(viewName, version, instanceName);
 
 
     if (instanceDefinition == null) {
     if (instanceDefinition == null) {
       throw new IllegalArgumentException("A view instance " +
       throw new IllegalArgumentException("A view instance " +
-          m_viewName + "/" + instanceName + " can not be found.");
+          viewName + "/" + instanceName + " can not be found.");
     }
     }
 
 
     Object service = instanceDefinition.getService(resources);
     Object service = instanceDefinition.getService(resources);
 
 
     if (service == null) {
     if (service == null) {
       throw new IllegalArgumentException("A resource type " + resources + " for view instance " +
       throw new IllegalArgumentException("A resource type " + resources + " for view instance " +
-          m_viewName + "/" + instanceName + " can not be found.");
+          viewName + "/" + instanceName + " can not be found.");
     }
     }
     return service;
     return service;
   }
   }
@@ -227,9 +237,10 @@ public class ViewInstanceService extends BaseService {
    *
    *
    * @return a view instance resource
    * @return a view instance resource
    */
    */
-  private ResourceInstance createServiceResource(String viewName, String instanceName) {
+  private ResourceInstance createResource(String viewName, String viewVersion, String instanceName) {
     Map<Resource.Type,String> mapIds = new HashMap<Resource.Type, String>();
     Map<Resource.Type,String> mapIds = new HashMap<Resource.Type, String>();
     mapIds.put(Resource.Type.View, viewName);
     mapIds.put(Resource.Type.View, viewName);
+    mapIds.put(Resource.Type.ViewVersion, viewVersion);
     mapIds.put(Resource.Type.ViewInstance, instanceName);
     mapIds.put(Resource.Type.ViewInstance, instanceName);
     return createResource(Resource.Type.ViewInstance, mapIds);
     return createResource(Resource.Type.ViewInstance, mapIds);
   }
   }

+ 4 - 4
ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewService.java

@@ -137,11 +137,11 @@ public class ViewService extends BaseService {
    *
    *
    * @param viewName  view id
    * @param viewName  view id
    *
    *
-   * @return the hosts service
+   * @return the versions service
    */
    */
-  @Path("{viewName}/instances")
-  public ViewInstanceService getInstanceHandler(@PathParam("viewName") String viewName) {
-    return new ViewInstanceService(viewName);
+  @Path("{viewName}/versions")
+  public ViewVersionService getInstanceHandler(@PathParam("viewName") String viewName) {
+    return new ViewVersionService(viewName);
   }
   }
 
 
 
 

+ 14 - 3
ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewSubResourceService.java

@@ -20,6 +20,8 @@ package org.apache.ambari.server.api.services;
 
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
 import org.apache.ambari.server.api.resources.ResourceInstance;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.orm.entities.ViewEntity;
+import org.apache.ambari.server.orm.entities.ViewInstanceEntity;
 import org.apache.ambari.view.ViewResourceHandler;
 import org.apache.ambari.view.ViewResourceHandler;
 
 
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.HttpHeaders;
@@ -42,6 +44,11 @@ public class ViewSubResourceService extends BaseService implements ViewResourceH
    */
    */
   private final String viewName;
   private final String viewName;
 
 
+  /**
+   * The view version.
+   */
+  private final String version;
+
   /**
   /**
    * The associated view instance name.
    * The associated view instance name.
    */
    */
@@ -53,10 +60,13 @@ public class ViewSubResourceService extends BaseService implements ViewResourceH
   /**
   /**
    * Construct a view sub-resource service.
    * Construct a view sub-resource service.
    */
    */
-  public ViewSubResourceService(Resource.Type type, String viewName, String instanceName) {
+  public ViewSubResourceService(Resource.Type type, ViewInstanceEntity viewInstanceDefinition) {
+    ViewEntity viewEntity = viewInstanceDefinition.getViewEntity();
+
     this.type         = type;
     this.type         = type;
-    this.viewName     = viewName;
-    this.instanceName = instanceName;
+    this.viewName     = viewEntity.getCommonName();
+    this.version      = viewEntity.getVersion();
+    this.instanceName = viewInstanceDefinition.getName();
   }
   }
 
 
 
 
@@ -76,6 +86,7 @@ public class ViewSubResourceService extends BaseService implements ViewResourceH
     Map<Resource.Type,String> mapIds = new HashMap<Resource.Type,String>();
     Map<Resource.Type,String> mapIds = new HashMap<Resource.Type,String>();
 
 
     mapIds.put(Resource.Type.View, viewName);
     mapIds.put(Resource.Type.View, viewName);
+    mapIds.put(Resource.Type.ViewVersion, version);
     mapIds.put(Resource.Type.ViewInstance, instanceName);
     mapIds.put(Resource.Type.ViewInstance, instanceName);
 
 
     if (resourceId != null) {
     if (resourceId != null) {

+ 185 - 0
ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewVersionService.java

@@ -0,0 +1,185 @@
+/**
+ * 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.server.api.services;
+
+import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.controller.spi.Resource;
+
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * Service responsible for view version resource requests.
+ */
+public class ViewVersionService extends BaseService {
+
+  /**
+   * Parent view name.
+   */
+  private final String viewName;
+
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Construct a view version service.
+   *
+   * @param viewName  the view name
+   */
+  public ViewVersionService(String viewName) {
+    this.viewName = viewName;
+  }
+
+
+  // ----- ViewVersionService ------------------------------------------------
+
+  /**
+   * Handles: GET /versions/{version}
+   * Get a specific view version.
+   *
+   * @param headers  http headers
+   * @param ui       uri info
+   * @param version  version id
+   *
+   * @return view instance representation
+   */
+  @GET
+  @Path("{version}")
+  @Produces("text/plain")
+  public Response getVersions(@Context HttpHeaders headers, @Context UriInfo ui,
+                          @PathParam("version") String version) {
+
+    return handleRequest(headers, null, ui, Request.Type.GET, createResource(viewName, version));
+  }
+
+  /**
+   * Handles: GET  /versions
+   * Get all views versions.
+   *
+   * @param headers  http headers
+   * @param ui       uri info
+   *
+   * @return view collection resource representation
+   */
+  @GET
+  @Produces("text/plain")
+  public Response getVersions(@Context HttpHeaders headers, @Context UriInfo ui) {
+
+    return handleRequest(headers, null, ui, Request.Type.GET, createResource(viewName, null));
+  }
+
+  /**
+   * Handles: POST /versions/{version}
+   * Create a specific view version.
+   *
+   * @param headers    http headers
+   * @param ui         uri info
+   * @param version    the version
+   *
+   * @return information regarding the created view
+   */
+  @POST
+  @Path("{version}")
+  @Produces("text/plain")
+  public Response createVersions(String body, @Context HttpHeaders headers, @Context UriInfo ui,
+                             @PathParam("version") String version) {
+
+    return handleRequest(headers, body, ui, Request.Type.POST, createResource(viewName, version));
+  }
+
+  /**
+   * Handles: PUT /versions/{version}
+   * Update a specific view version.
+   *
+   * @param headers   http headers
+   * @param ui        uri info
+   * @param version   the version
+   *
+   * @return information regarding the updated view
+   */
+  @PUT
+  @Path("{version}")
+  @Produces("text/plain")
+  public Response updateVersions(String body, @Context HttpHeaders headers, @Context UriInfo ui,
+                             @PathParam("version") String version) {
+
+    return handleRequest(headers, body, ui, Request.Type.PUT, createResource(viewName, version));
+  }
+
+  /**
+   * Handles: DELETE /versions/{version}
+   * Delete a specific view version.
+   *
+   * @param headers   http headers
+   * @param ui        uri info
+   * @param version   version id
+   *
+   * @return information regarding the deleted view version
+   */
+  @DELETE
+  @Path("{version}")
+  @Produces("text/plain")
+  public Response deleteVersions(@Context HttpHeaders headers, @Context UriInfo ui,
+                             @PathParam("version") String version) {
+
+    return handleRequest(headers, null, ui, Request.Type.DELETE, createResource(viewName, version));
+  }
+
+  /**
+   * Get the instances sub-resource
+   *
+   * @param version  the version
+   *
+   * @return the instance service
+   */
+  @Path("{version}/instances")
+  public ViewInstanceService getInstanceHandler(@PathParam("version") String version) {
+
+    return new ViewInstanceService(viewName, version);
+  }
+
+
+  // ----- helper methods ----------------------------------------------------
+
+  /**
+   * Create a view resource.
+   *
+   * @param viewName view name
+   *
+   * @return a view resource instance
+   */
+  private ResourceInstance createResource(String viewName, String version) {
+    Map<Resource.Type,String> mapIds = new HashMap<Resource.Type, String>();
+    mapIds.put(Resource.Type.View, viewName);
+    mapIds.put(Resource.Type.ViewVersion, version);
+    return createResource(Resource.Type.ViewVersion, mapIds);
+  }
+}

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java

@@ -63,6 +63,8 @@ public class DefaultProviderModule extends AbstractProviderModule {
         return new TaskAttemptResourceProvider(propertyIds, keyPropertyIds);
         return new TaskAttemptResourceProvider(propertyIds, keyPropertyIds);
       case View:
       case View:
         return new ViewResourceProvider();
         return new ViewResourceProvider();
+      case ViewVersion:
+        return new ViewVersionResourceProvider();
       case ViewInstance:
       case ViewInstance:
         return new ViewInstanceResourceProvider();
         return new ViewInstanceResourceProvider();
       case Blueprint:
       case Blueprint:

+ 24 - 9
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java

@@ -52,6 +52,7 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
    * View instance property id constants.
    * View instance property id constants.
    */
    */
   public static final String VIEW_NAME_PROPERTY_ID     = "ViewInstanceInfo/view_name";
   public static final String VIEW_NAME_PROPERTY_ID     = "ViewInstanceInfo/view_name";
+  public static final String VIEW_VERSION_PROPERTY_ID  = "ViewInstanceInfo/version";
   public static final String INSTANCE_NAME_PROPERTY_ID = "ViewInstanceInfo/instance_name";
   public static final String INSTANCE_NAME_PROPERTY_ID = "ViewInstanceInfo/instance_name";
   public static final String PROPERTIES_PROPERTY_ID    = "ViewInstanceInfo/properties";
   public static final String PROPERTIES_PROPERTY_ID    = "ViewInstanceInfo/properties";
   public static final String DATA_PROPERTY_ID          = "ViewInstanceInfo/instance_data";
   public static final String DATA_PROPERTY_ID          = "ViewInstanceInfo/instance_data";
@@ -69,6 +70,7 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
   private static Map<Resource.Type, String> keyPropertyIds = new HashMap<Resource.Type, String>();
   private static Map<Resource.Type, String> keyPropertyIds = new HashMap<Resource.Type, String>();
   static {
   static {
     keyPropertyIds.put(Resource.Type.View, VIEW_NAME_PROPERTY_ID);
     keyPropertyIds.put(Resource.Type.View, VIEW_NAME_PROPERTY_ID);
+    keyPropertyIds.put(Resource.Type.ViewVersion, VIEW_VERSION_PROPERTY_ID);
     keyPropertyIds.put(Resource.Type.ViewInstance, INSTANCE_NAME_PROPERTY_ID);
     keyPropertyIds.put(Resource.Type.ViewInstance, INSTANCE_NAME_PROPERTY_ID);
   }
   }
 
 
@@ -78,6 +80,7 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
   private static Set<String> propertyIds = new HashSet<String>();
   private static Set<String> propertyIds = new HashSet<String>();
   static {
   static {
     propertyIds.add(VIEW_NAME_PROPERTY_ID);
     propertyIds.add(VIEW_NAME_PROPERTY_ID);
+    propertyIds.add(VIEW_VERSION_PROPERTY_ID);
     propertyIds.add(INSTANCE_NAME_PROPERTY_ID);
     propertyIds.add(INSTANCE_NAME_PROPERTY_ID);
     propertyIds.add(PROPERTIES_PROPERTY_ID);
     propertyIds.add(PROPERTIES_PROPERTY_ID);
     propertyIds.add(DATA_PROPERTY_ID);
     propertyIds.add(DATA_PROPERTY_ID);
@@ -123,15 +126,18 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
 
 
     for (Map<String, Object> propertyMap : propertyMaps) {
     for (Map<String, Object> propertyMap : propertyMaps) {
 
 
-      String viewName = (String) propertyMap.get(VIEW_NAME_PROPERTY_ID);
+      String viewName     = (String) propertyMap.get(VIEW_NAME_PROPERTY_ID);
+      String viewVersion  = (String) propertyMap.get(VIEW_VERSION_PROPERTY_ID);
       String instanceName = (String) propertyMap.get(INSTANCE_NAME_PROPERTY_ID);
       String instanceName = (String) propertyMap.get(INSTANCE_NAME_PROPERTY_ID);
 
 
       for (ViewEntity viewDefinition : viewRegistry.getDefinitions()){
       for (ViewEntity viewDefinition : viewRegistry.getDefinitions()){
-        if (viewName == null || viewName.equals(viewDefinition.getName())) {
+        if (viewName == null || viewName.equals(viewDefinition.getCommonName())) {
           for (ViewInstanceEntity viewInstanceDefinition : viewRegistry.getInstanceDefinitions(viewDefinition)) {
           for (ViewInstanceEntity viewInstanceDefinition : viewRegistry.getInstanceDefinitions(viewDefinition)) {
             if (instanceName == null || instanceName.equals(viewInstanceDefinition.getName())) {
             if (instanceName == null || instanceName.equals(viewInstanceDefinition.getName())) {
-              Resource resource = toResource(viewInstanceDefinition, requestedIds);
-              resources.add(resource);
+              if (viewVersion == null || viewVersion.equals(viewDefinition.getVersion())) {
+                Resource resource = toResource(viewInstanceDefinition, requestedIds);
+                resources.add(resource);
+              }
             }
             }
           }
           }
         }
         }
@@ -182,12 +188,15 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
 
 
   // Convert an instance entity to a resource
   // Convert an instance entity to a resource
   private Resource toResource(ViewInstanceEntity viewInstanceEntity, Set<String> requestedIds) {
   private Resource toResource(ViewInstanceEntity viewInstanceEntity, Set<String> requestedIds) {
-    Resource resource = new ResourceImpl(Resource.Type.ViewInstance);
+    Resource   resource   = new ResourceImpl(Resource.Type.ViewInstance);
+    ViewEntity viewEntity = viewInstanceEntity.getViewEntity();
 
 
-    String viewName = viewInstanceEntity.getViewName();
+    String viewName = viewEntity.getCommonName();
+    String version  = viewEntity.getVersion();
     String name     = viewInstanceEntity.getName();
     String name     = viewInstanceEntity.getName();
 
 
     setResourceProperty(resource, VIEW_NAME_PROPERTY_ID, viewName, requestedIds);
     setResourceProperty(resource, VIEW_NAME_PROPERTY_ID, viewName, requestedIds);
+    setResourceProperty(resource, VIEW_VERSION_PROPERTY_ID, version, requestedIds);
     setResourceProperty(resource, INSTANCE_NAME_PROPERTY_ID, name, requestedIds);
     setResourceProperty(resource, INSTANCE_NAME_PROPERTY_ID, name, requestedIds);
     Map<String, String> properties = new HashMap<String, String>();
     Map<String, String> properties = new HashMap<String, String>();
 
 
@@ -204,30 +213,36 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
     setResourceProperty(resource, DATA_PROPERTY_ID,
     setResourceProperty(resource, DATA_PROPERTY_ID,
         applicationData, requestedIds);
         applicationData, requestedIds);
     setResourceProperty(resource, CONTEXT_PATH_PROPERTY_ID,
     setResourceProperty(resource, CONTEXT_PATH_PROPERTY_ID,
-        ViewInstanceEntity.getContextPath(viewName, name), requestedIds);
+        ViewInstanceEntity.getContextPath(viewName, version, name), requestedIds);
 
 
     return resource;
     return resource;
   }
   }
 
 
   // Convert a map of properties to a view instance entity.
   // Convert a map of properties to a view instance entity.
   private ViewInstanceEntity toEntity(Map<String, Object> properties) {
   private ViewInstanceEntity toEntity(Map<String, Object> properties) {
-    String name     = (String) properties.get(INSTANCE_NAME_PROPERTY_ID);
+    String name = (String) properties.get(INSTANCE_NAME_PROPERTY_ID);
     if (name == null || name.isEmpty()) {
     if (name == null || name.isEmpty()) {
       throw new IllegalArgumentException("View instance name must be provided");
       throw new IllegalArgumentException("View instance name must be provided");
     }
     }
 
 
+    String version = (String) properties.get(VIEW_VERSION_PROPERTY_ID);
+    if (version == null || version.isEmpty()) {
+      throw new IllegalArgumentException("View version must be provided");
+    }
+
     String viewName = (String) properties.get(VIEW_NAME_PROPERTY_ID);
     String viewName = (String) properties.get(VIEW_NAME_PROPERTY_ID);
     if (viewName == null || viewName.isEmpty()) {
     if (viewName == null || viewName.isEmpty()) {
       throw new IllegalArgumentException("View name must be provided");
       throw new IllegalArgumentException("View name must be provided");
     }
     }
+    viewName = ViewEntity.getViewName(viewName, version);
 
 
     ViewInstanceEntity viewInstanceEntity = new ViewInstanceEntity();
     ViewInstanceEntity viewInstanceEntity = new ViewInstanceEntity();
     viewInstanceEntity.setName(name);
     viewInstanceEntity.setName(name);
     viewInstanceEntity.setViewName(viewName);
     viewInstanceEntity.setViewName(viewName);
 
 
-
     ViewEntity viewEntity = new ViewEntity();
     ViewEntity viewEntity = new ViewEntity();
     viewEntity.setName(viewName);
     viewEntity.setName(viewName);
+    viewEntity.setVersion(version);
 
 
     viewInstanceEntity.setViewEntity(viewEntity);
     viewInstanceEntity.setViewEntity(viewEntity);
 
 

+ 4 - 17
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewResourceProvider.java

@@ -44,11 +44,7 @@ public class ViewResourceProvider extends AbstractResourceProvider {
   /**
   /**
    * View property id constants.
    * View property id constants.
    */
    */
-  public static final String VIEW_NAME_PROPERTY_ID  = "ViewInfo/view_name";
-  public static final String LABEL_PROPERTY_ID      = "ViewInfo/label";
-  public static final String VERSION_PROPERTY_ID    = "ViewInfo/version";
-  public static final String PARAMETERS_PROPERTY_ID = "ViewInfo/parameters";
-  public static final String ARCHIVE_PROPERTY_ID    = "ViewInfo/archive";
+  public static final String VIEW_NAME_PROPERTY_ID    = "ViewInfo/view_name";
 
 
 
 
   /**
   /**
@@ -65,10 +61,6 @@ public class ViewResourceProvider extends AbstractResourceProvider {
   private static Set<String> propertyIds = new HashSet<String>();
   private static Set<String> propertyIds = new HashSet<String>();
   static {
   static {
     propertyIds.add(VIEW_NAME_PROPERTY_ID);
     propertyIds.add(VIEW_NAME_PROPERTY_ID);
-    propertyIds.add(LABEL_PROPERTY_ID);
-    propertyIds.add(VERSION_PROPERTY_ID);
-    propertyIds.add(PARAMETERS_PROPERTY_ID);
-    propertyIds.add(ARCHIVE_PROPERTY_ID);
   }
   }
 
 
   
   
@@ -106,18 +98,13 @@ public class ViewResourceProvider extends AbstractResourceProvider {
 
 
     for (Map<String, Object> propertyMap : propertyMaps) {
     for (Map<String, Object> propertyMap : propertyMaps) {
 
 
-      String viewName = (String) propertyMap.get(VIEW_NAME_PROPERTY_ID);
+      String viewName    = (String) propertyMap.get(VIEW_NAME_PROPERTY_ID);
 
 
       for (ViewEntity viewDefinition : viewRegistry.getDefinitions()){
       for (ViewEntity viewDefinition : viewRegistry.getDefinitions()){
-        if (viewName == null || viewName.equals(viewDefinition.getName())) {
+        if (viewName == null || viewName.equals(viewDefinition.getCommonName())) {
           Resource resource = new ResourceImpl(Resource.Type.View);
           Resource resource = new ResourceImpl(Resource.Type.View);
 
 
-          setResourceProperty(resource, VIEW_NAME_PROPERTY_ID, viewDefinition.getName(), requestedIds);
-          setResourceProperty(resource, LABEL_PROPERTY_ID, viewDefinition.getLabel(), requestedIds);
-          setResourceProperty(resource, VERSION_PROPERTY_ID, viewDefinition.getVersion(), requestedIds);
-          setResourceProperty(resource, PARAMETERS_PROPERTY_ID,
-              viewDefinition.getConfiguration().getParameters(), requestedIds);
-          setResourceProperty(resource, ARCHIVE_PROPERTY_ID, viewDefinition.getArchive(), requestedIds);
+          setResourceProperty(resource, VIEW_NAME_PROPERTY_ID, viewDefinition.getCommonName(), requestedIds);
 
 
           resources.add(resource);
           resources.add(resource);
         }
         }

+ 159 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewVersionResourceProvider.java

@@ -0,0 +1,159 @@
+/**
+ * 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.server.controller.internal;
+
+import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
+import org.apache.ambari.server.controller.spi.NoSuchResourceException;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.RequestStatus;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException;
+import org.apache.ambari.server.controller.spi.SystemException;
+import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
+import org.apache.ambari.server.orm.entities.ViewEntity;
+import org.apache.ambari.server.view.ViewRegistry;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Resource provider for view versions.
+ */
+public class ViewVersionResourceProvider extends AbstractResourceProvider {
+
+  /**
+   * View property id constants.
+   */
+  public static final String VIEW_NAME_PROPERTY_ID    = "ViewVersionInfo/view_name";
+  public static final String VIEW_VERSION_PROPERTY_ID = "ViewVersionInfo/version";
+  public static final String LABEL_PROPERTY_ID        = "ViewVersionInfo/label";
+  public static final String VERSION_PROPERTY_ID      = "ViewVersionInfo/version";
+  public static final String PARAMETERS_PROPERTY_ID   = "ViewVersionInfo/parameters";
+  public static final String ARCHIVE_PROPERTY_ID      = "ViewVersionInfo/archive";
+
+  /**
+   * The key property ids for a view resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = new HashMap<Resource.Type, String>();
+  static {
+    keyPropertyIds.put(Resource.Type.View, VIEW_NAME_PROPERTY_ID);
+    keyPropertyIds.put(Resource.Type.ViewVersion, VIEW_VERSION_PROPERTY_ID);
+  }
+
+  /**
+   * The property ids for a view resource.
+   */
+  private static Set<String> propertyIds = new HashSet<String>();
+  static {
+    propertyIds.add(VIEW_NAME_PROPERTY_ID);
+    propertyIds.add(VIEW_VERSION_PROPERTY_ID);
+    propertyIds.add(LABEL_PROPERTY_ID);
+    propertyIds.add(VERSION_PROPERTY_ID);
+    propertyIds.add(PARAMETERS_PROPERTY_ID);
+    propertyIds.add(ARCHIVE_PROPERTY_ID);
+  }
+
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Construct a view resource provider.
+   */
+  public ViewVersionResourceProvider() {
+    super(propertyIds, keyPropertyIds);
+  }
+
+
+  // ----- ResourceProvider --------------------------------------------------
+
+  @Override
+  public RequestStatus createResources(Request request)
+      throws SystemException, UnsupportedPropertyException,
+      ResourceAlreadyExistsException, NoSuchParentResourceException {
+    throw new UnsupportedOperationException("Not yet supported.");
+  }
+
+  @Override
+  public Set<Resource> getResources(Request request, Predicate predicate)
+      throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
+    Set<Resource> resources    = new HashSet<Resource>();
+    ViewRegistry  viewRegistry = ViewRegistry.getInstance();
+    Set<String>   requestedIds = getRequestPropertyIds(request, predicate);
+
+    Set<Map<String, Object>> propertyMaps = getPropertyMaps(predicate);
+
+    if (propertyMaps.isEmpty()) {
+      propertyMaps.add(Collections.<String, Object>emptyMap());
+    }
+
+    for (Map<String, Object> propertyMap : propertyMaps) {
+
+      String viewName    = (String) propertyMap.get(VIEW_NAME_PROPERTY_ID);
+      String viewVersion = (String) propertyMap.get(VIEW_VERSION_PROPERTY_ID);
+
+      for (ViewEntity viewDefinition : viewRegistry.getDefinitions()){
+        if (viewName == null || viewName.equals(viewDefinition.getCommonName())) {
+          if (viewVersion == null || viewVersion.equals(viewDefinition.getVersion())) {
+            Resource resource = new ResourceImpl(Resource.Type.ViewVersion);
+
+            setResourceProperty(resource, VIEW_NAME_PROPERTY_ID, viewDefinition.getCommonName(), requestedIds);
+            setResourceProperty(resource, VIEW_VERSION_PROPERTY_ID, viewDefinition.getVersion(), requestedIds);
+            setResourceProperty(resource, LABEL_PROPERTY_ID, viewDefinition.getLabel(), requestedIds);
+            setResourceProperty(resource, VERSION_PROPERTY_ID, viewDefinition.getVersion(), requestedIds);
+            setResourceProperty(resource, PARAMETERS_PROPERTY_ID,
+                viewDefinition.getConfiguration().getParameters(), requestedIds);
+            setResourceProperty(resource, ARCHIVE_PROPERTY_ID, viewDefinition.getArchive(), requestedIds);
+
+            resources.add(resource);
+          }
+        }
+      }
+    }
+    return resources;
+  }
+
+  @Override
+  public RequestStatus updateResources(Request request, Predicate predicate)
+      throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
+    throw new UnsupportedOperationException("Not yet supported.");
+  }
+
+  @Override
+  public RequestStatus deleteResources(Predicate predicate)
+      throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
+    throw new UnsupportedOperationException("Not yet supported.");
+  }
+
+  @Override
+  public Map<Resource.Type, String> getKeyPropertyIds() {
+    return keyPropertyIds;
+  }
+
+
+  // ----- AbstractResourceProvider ------------------------------------------
+
+  @Override
+  protected Set<String> getPKPropertyIds() {
+    return new HashSet<String>(keyPropertyIds.values());
+  }
+}

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/spi/Resource.java

@@ -104,6 +104,7 @@ public interface Resource {
     RootServiceComponent,
     RootServiceComponent,
     RootServiceHostComponent,
     RootServiceHostComponent,
     View,
     View,
+    ViewVersion,
     ViewInstance,
     ViewInstance,
     Blueprint,
     Blueprint,
     HostComponentProcess;
     HostComponentProcess;
@@ -171,6 +172,7 @@ public interface Resource {
     public static final Type RootServiceComponent = InternalType.RootServiceComponent.getType();
     public static final Type RootServiceComponent = InternalType.RootServiceComponent.getType();
     public static final Type RootServiceHostComponent = InternalType.RootServiceHostComponent.getType();
     public static final Type RootServiceHostComponent = InternalType.RootServiceHostComponent.getType();
     public static final Type View = InternalType.View.getType();
     public static final Type View = InternalType.View.getType();
+    public static final Type ViewVersion = InternalType.ViewVersion.getType();
     public static final Type ViewInstance = InternalType.ViewInstance.getType();
     public static final Type ViewInstance = InternalType.ViewInstance.getType();
     public static final Type Blueprint = InternalType.Blueprint.getType();
     public static final Type Blueprint = InternalType.Blueprint.getType();
     public static final Type HostComponentProcess = InternalType.HostComponentProcess.getType();
     public static final Type HostComponentProcess = InternalType.HostComponentProcess.getType();

+ 39 - 2
ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewEntity.java

@@ -140,6 +140,12 @@ public class ViewEntity {
   @Transient
   @Transient
   private final Map<Resource.Type, ResourceConfig> resourceConfigurations = new HashMap<Resource.Type, ResourceConfig>();
   private final Map<Resource.Type, ResourceConfig> resourceConfigurations = new HashMap<Resource.Type, ResourceConfig>();
 
 
+  /**
+   * The name of the view shared across versions.
+   */
+  @Transient
+  private String commonName = null;
+
 
 
   // ----- Constructors ------------------------------------------------------
   // ----- Constructors ------------------------------------------------------
 
 
@@ -169,9 +175,11 @@ public class ViewEntity {
     this.classLoader         = classLoader;
     this.classLoader         = classLoader;
     this.archive             = archivePath;
     this.archive             = archivePath;
 
 
-    this.name    = configuration.getName();
+    String version = configuration.getVersion();
+
+    this.name    = getViewName(configuration.getName(), version);
     this.label   = configuration.getLabel();
     this.label   = configuration.getLabel();
-    this.version = configuration.getVersion();
+    this.version = version;
 
 
     this.externalResourceType =
     this.externalResourceType =
         new Resource.Type(getQualifiedResourceTypeName(ResourceConfig.EXTERNAL_RESOURCE_PLURAL_NAME));
         new Resource.Type(getQualifiedResourceTypeName(ResourceConfig.EXTERNAL_RESOURCE_PLURAL_NAME));
@@ -198,6 +206,20 @@ public class ViewEntity {
     this.name = name;
     this.name = name;
   }
   }
 
 
+  /**
+   * Get the common name of the view.
+   * This name is shared across versions of the view.
+   *
+   * @return the common name
+   */
+  public synchronized String getCommonName() {
+    if (commonName == null) {
+      // Strip version from the internal name
+      commonName = name.replaceAll("\\{(.+)\\}", "");
+    }
+    return commonName;
+  }
+
   /**
   /**
    * Get the view label (display name).
    * Get the view label (display name).
    *
    *
@@ -479,4 +501,19 @@ public class ViewEntity {
   public ViewConfig getConfiguration() {
   public ViewConfig getConfiguration() {
     return configuration;
     return configuration;
   }
   }
+
+
+  // ----- helper methods ----------------------------------------------------
+
+  /**
+   * Get the internal view name from the given common name and version.
+   *
+   * @param name     the view common name
+   * @param version  the version
+   *
+   * @return the view name
+   */
+  public static String getViewName(String name, String version) {
+    return name + "{" + version + "}";
+  }
 }
 }

+ 4 - 4
ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java

@@ -408,7 +408,7 @@ public class ViewInstanceEntity {
    * @return the resource provider
    * @return the resource provider
    */
    */
   public ResourceProvider getResourceProvider(String type) {
   public ResourceProvider getResourceProvider(String type) {
-    String typeName = view.getName() + "/" + type;
+    String typeName = view.getQualifiedResourceTypeName(type);
     return resourceProviders.get(Resource.Type.valueOf(typeName));
     return resourceProviders.get(Resource.Type.valueOf(typeName));
   }
   }
 
 
@@ -439,7 +439,7 @@ public class ViewInstanceEntity {
    * @return the context path
    * @return the context path
    */
    */
   public String getContextPath() {
   public String getContextPath() {
-    return getContextPath(view.getName(), getName());
+    return getContextPath(view.getCommonName(), view.getVersion(), getName());
   }
   }
 
 
   /**
   /**
@@ -450,7 +450,7 @@ public class ViewInstanceEntity {
    *
    *
    * @return the context path
    * @return the context path
    */
    */
-  public static String getContextPath(String viewName, String viewInstanceName) {
-    return VIEWS_CONTEXT_PATH_PREFIX + viewName + "/" + viewInstanceName;
+  public static String getContextPath(String viewName, String version, String viewInstanceName) {
+    return VIEWS_CONTEXT_PATH_PREFIX + viewName + "/" + version + "/" + viewInstanceName;
   }
   }
 }
 }

+ 1 - 1
ambari-server/src/main/java/org/apache/ambari/server/view/ViewContextImpl.java

@@ -85,7 +85,7 @@ public class ViewContextImpl implements ViewContext {
 
 
   @Override
   @Override
   public String getViewName() {
   public String getViewName() {
-    return viewInstanceEntity.getViewName();
+    return viewInstanceEntity.getViewEntity().getCommonName();
   }
   }
 
 
   @Override
   @Override

+ 5 - 1
ambari-server/src/main/java/org/apache/ambari/server/view/ViewExternalSubResourceProvider.java

@@ -48,6 +48,7 @@ public class ViewExternalSubResourceProvider extends AbstractResourceProvider {
    * View external sub resource property id constants.
    * View external sub resource property id constants.
    */
    */
   private static final String VIEW_NAME_PROPERTY_ID     = "view_name";
   private static final String VIEW_NAME_PROPERTY_ID     = "view_name";
+  private static final String VIEW_VERSION_PROPERTY_ID  = "version";
   private static final String INSTANCE_NAME_PROPERTY_ID = "instance_name";
   private static final String INSTANCE_NAME_PROPERTY_ID = "instance_name";
   private static final String RESOURCE_NAME_PROPERTY_ID = "name";
   private static final String RESOURCE_NAME_PROPERTY_ID = "name";
 
 
@@ -125,7 +126,8 @@ public class ViewExternalSubResourceProvider extends AbstractResourceProvider {
     for (ViewInstanceEntity viewInstanceDefinition : instanceDefinitions) {
     for (ViewInstanceEntity viewInstanceDefinition : instanceDefinitions) {
       for (String resourceName : resourceNames) {
       for (String resourceName : resourceNames) {
         ResourceImpl resource = new ResourceImpl(type);
         ResourceImpl resource = new ResourceImpl(type);
-        resource.setProperty(VIEW_NAME_PROPERTY_ID, viewDefinition.getName());
+        resource.setProperty(VIEW_NAME_PROPERTY_ID, viewDefinition.getCommonName());
+        resource.setProperty(VIEW_VERSION_PROPERTY_ID, viewDefinition.getVersion());
         resource.setProperty(INSTANCE_NAME_PROPERTY_ID, viewInstanceDefinition.getName());
         resource.setProperty(INSTANCE_NAME_PROPERTY_ID, viewInstanceDefinition.getName());
         resource.setProperty("name", resourceName);
         resource.setProperty("name", resourceName);
         resourceSet.add(resource);
         resourceSet.add(resource);
@@ -177,6 +179,7 @@ public class ViewExternalSubResourceProvider extends AbstractResourceProvider {
     Map<Resource.Type, String> keyPropertyIds = new HashMap<Resource.Type, String>();
     Map<Resource.Type, String> keyPropertyIds = new HashMap<Resource.Type, String>();
 
 
     keyPropertyIds.put(Resource.Type.View, VIEW_NAME_PROPERTY_ID);
     keyPropertyIds.put(Resource.Type.View, VIEW_NAME_PROPERTY_ID);
+    keyPropertyIds.put(Resource.Type.ViewVersion, VIEW_VERSION_PROPERTY_ID);
     keyPropertyIds.put(Resource.Type.ViewInstance, INSTANCE_NAME_PROPERTY_ID);
     keyPropertyIds.put(Resource.Type.ViewInstance, INSTANCE_NAME_PROPERTY_ID);
     keyPropertyIds.put(type, RESOURCE_NAME_PROPERTY_ID);
     keyPropertyIds.put(type, RESOURCE_NAME_PROPERTY_ID);
 
 
@@ -188,6 +191,7 @@ public class ViewExternalSubResourceProvider extends AbstractResourceProvider {
     Set<String> propertyIds = new HashSet<String>();
     Set<String> propertyIds = new HashSet<String>();
     propertyIds.add(INSTANCE_NAME_PROPERTY_ID);
     propertyIds.add(INSTANCE_NAME_PROPERTY_ID);
     propertyIds.add(VIEW_NAME_PROPERTY_ID);
     propertyIds.add(VIEW_NAME_PROPERTY_ID);
+    propertyIds.add(VIEW_VERSION_PROPERTY_ID);
     propertyIds.add(RESOURCE_NAME_PROPERTY_ID);
     propertyIds.add(RESOURCE_NAME_PROPERTY_ID);
 
 
     return propertyIds;
     return propertyIds;

+ 41 - 21
ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java

@@ -147,11 +147,12 @@ public class ViewRegistry {
    * Get a view definition for the given name.
    * Get a view definition for the given name.
    *
    *
    * @param viewName  the view name
    * @param viewName  the view name
+   * @param version   the version
    *
    *
    * @return the view definition for the given name
    * @return the view definition for the given name
    */
    */
-  public ViewEntity getDefinition(String viewName) {
-    return viewDefinitions.get(viewName);
+  public ViewEntity getDefinition(String viewName, String version) {
+    return getDefinition(ViewEntity.getViewName(viewName, version));
   }
   }
 
 
   /**
   /**
@@ -184,13 +185,14 @@ public class ViewRegistry {
    * Get the instance definition for the given view nam,e and instance name.
    * Get the instance definition for the given view nam,e and instance name.
    *
    *
    * @param viewName      the view name
    * @param viewName      the view name
+   * @param version       the version
    * @param instanceName  the instance name
    * @param instanceName  the instance name
    *
    *
    * @return the view instance definition for the given view and instance name
    * @return the view instance definition for the given view and instance name
    */
    */
-  public ViewInstanceEntity getInstanceDefinition(String viewName, String instanceName) {
+  public ViewInstanceEntity getInstanceDefinition(String viewName, String version, String instanceName) {
     Map<String, ViewInstanceEntity> viewInstanceDefinitionMap =
     Map<String, ViewInstanceEntity> viewInstanceDefinitionMap =
-        viewInstanceDefinitions.get(getDefinition(viewName));
+        viewInstanceDefinitions.get(getDefinition(viewName, version));
 
 
     return viewInstanceDefinitionMap == null ? null : viewInstanceDefinitionMap.get(instanceName);
     return viewInstanceDefinitionMap == null ? null : viewInstanceDefinitionMap.get(instanceName);
   }
   }
@@ -236,12 +238,17 @@ public class ViewRegistry {
    * Get the sub-resource definitions for the given view name.
    * Get the sub-resource definitions for the given view name.
    *
    *
    * @param viewName  the instance name
    * @param viewName  the instance name
+   * @param version   the version
    *
    *
    * @return the set of sub-resource definitions
    * @return the set of sub-resource definitions
    */
    */
-  public synchronized Set<SubResourceDefinition> getSubResourceDefinitions(String viewName) {
+  public synchronized Set<SubResourceDefinition> getSubResourceDefinitions(
+      String viewName, String version) {
+
+    viewName = ViewEntity.getViewName(viewName, version);
 
 
-    Set<SubResourceDefinition> subResourceDefinitions = subResourceDefinitionsMap.get(viewName);
+    Set<SubResourceDefinition> subResourceDefinitions =
+        subResourceDefinitionsMap.get(viewName);
 
 
     if (subResourceDefinitions == null) {
     if (subResourceDefinitions == null) {
       subResourceDefinitions = new HashSet<SubResourceDefinition>();
       subResourceDefinitions = new HashSet<SubResourceDefinition>();
@@ -310,15 +317,17 @@ public class ViewRegistry {
    * @param instanceEntity  the view instance entity
    * @param instanceEntity  the view instance entity
    */
    */
   public void installViewInstance(ViewInstanceEntity instanceEntity){
   public void installViewInstance(ViewInstanceEntity instanceEntity){
-    String viewName       = instanceEntity.getViewName();
-    ViewEntity viewEntity = getDefinition(viewName);
+    ViewEntity viewEntity = getDefinition(instanceEntity.getViewName());
 
 
     if (viewEntity != null) {
     if (viewEntity != null) {
       String instanceName = instanceEntity.getName();
       String instanceName = instanceEntity.getName();
+      String viewName     = viewEntity.getCommonName();
+      String version      = viewEntity.getVersion();
 
 
-      if (getInstanceDefinition(viewName, instanceName) == null) {
+      if (getInstanceDefinition(viewName, version, instanceName) == null) {
         if (LOG.isDebugEnabled()) {
         if (LOG.isDebugEnabled()) {
-          LOG.debug("Creating view instance " + viewName + "/" + instanceName);
+          LOG.debug("Creating view instance " + viewName + "/" +
+              version + "/" + instanceName);
         }
         }
         instanceDAO.create(instanceEntity);
         instanceDAO.create(instanceEntity);
         try {
         try {
@@ -336,15 +345,19 @@ public class ViewRegistry {
    * @param instanceEntity  the view instance entity
    * @param instanceEntity  the view instance entity
    */
    */
   public void updateViewInstance(ViewInstanceEntity instanceEntity) {
   public void updateViewInstance(ViewInstanceEntity instanceEntity) {
-    String       viewName   = instanceEntity.getViewName();
-    ViewEntity   viewEntity = getDefinition(viewName);
+    ViewEntity viewEntity = getDefinition(instanceEntity.getViewName());
 
 
     if (viewEntity != null) {
     if (viewEntity != null) {
       String instanceName = instanceEntity.getName();
       String instanceName = instanceEntity.getName();
-      ViewInstanceEntity entity = getInstanceDefinition(viewName, instanceName);
+      String viewName     = viewEntity.getCommonName();
+      String version      = viewEntity.getVersion();
+
+      ViewInstanceEntity entity = getInstanceDefinition(viewName, version, instanceName);
+
       if (entity != null) {
       if (entity != null) {
         if (LOG.isDebugEnabled()) {
         if (LOG.isDebugEnabled()) {
-          LOG.debug("Updating view instance " + viewName + "/" + instanceName);
+          LOG.debug("Updating view instance " + viewName + "/" +
+              version + "/" + instanceName);
         }
         }
 
 
         entity.setProperties(instanceEntity.getProperties());
         entity.setProperties(instanceEntity.getProperties());
@@ -376,16 +389,18 @@ public class ViewRegistry {
    * @param instanceEntity  the view instance entity
    * @param instanceEntity  the view instance entity
    */
    */
   public void uninstallViewInstance(ViewInstanceEntity instanceEntity) {
   public void uninstallViewInstance(ViewInstanceEntity instanceEntity) {
-
-    String       viewName   = instanceEntity.getViewName();
-    ViewEntity   viewEntity = getDefinition(viewName);
+    ViewEntity viewEntity = getDefinition(instanceEntity.getViewName());
 
 
     if (viewEntity != null) {
     if (viewEntity != null) {
       String instanceName = instanceEntity.getName();
       String instanceName = instanceEntity.getName();
-      if (getInstanceDefinition(viewName, instanceName) != null) {
+      String viewName     = viewEntity.getCommonName();
+      String version      = viewEntity.getVersion();
+
+      if (getInstanceDefinition(viewName, version, instanceName) != null) {
 
 
         if (LOG.isDebugEnabled()) {
         if (LOG.isDebugEnabled()) {
-          LOG.debug("Deleting view instance " + viewName + "/" + instanceName);
+          LOG.debug("Deleting view instance " + viewName + "/" +
+              version + "/" +instanceName);
         }
         }
         instanceDAO.remove(instanceEntity);
         instanceDAO.remove(instanceEntity);
         viewEntity.removeInstanceDefinition(instanceName);
         viewEntity.removeInstanceDefinition(instanceName);
@@ -422,6 +437,11 @@ public class ViewRegistry {
     subResourceDefinitionsMap.clear();
     subResourceDefinitionsMap.clear();
   }
   }
 
 
+  // get a view entity for the given internal view name
+  private ViewEntity getDefinition(String viewName) {
+    return viewDefinitions.get(viewName);
+  }
+
   // install a new view definition
   // install a new view definition
   private ViewEntity installView(ViewConfig viewConfig, Configuration ambariConfig,
   private ViewEntity installView(ViewConfig viewConfig, Configuration ambariConfig,
                                             ClassLoader cl, String archivePath)
                                             ClassLoader cl, String archivePath)
@@ -497,6 +517,7 @@ public class ViewRegistry {
   private void installViewInstance(ViewEntity viewDefinition,
   private void installViewInstance(ViewEntity viewDefinition,
                                    ViewInstanceEntity viewInstanceDefinition)
                                    ViewInstanceEntity viewInstanceDefinition)
       throws ClassNotFoundException {
       throws ClassNotFoundException {
+    viewInstanceDefinition.setViewEntity(viewDefinition);
 
 
     ViewContext viewInstanceContext = new ViewContextImpl(viewInstanceDefinition, this);
     ViewContext viewInstanceContext = new ViewContextImpl(viewInstanceDefinition, this);
 
 
@@ -511,8 +532,7 @@ public class ViewRegistry {
       Resource.Type  type           = resourceDefinition.getType();
       Resource.Type  type           = resourceDefinition.getType();
       ResourceConfig resourceConfig = resourceDefinition.getResourceConfiguration();
       ResourceConfig resourceConfig = resourceDefinition.getResourceConfiguration();
 
 
-      ViewResourceHandler viewResourceService =
-          new ViewSubResourceService(type, viewDefinition.getName(), viewInstanceDefinition.getName());
+      ViewResourceHandler viewResourceService = new ViewSubResourceService(type, viewInstanceDefinition);
 
 
       ClassLoader cl = viewDefinition.getClassLoader();
       ClassLoader cl = viewDefinition.getClassLoader();
 
 

+ 11 - 4
ambari-server/src/main/java/org/apache/ambari/server/view/ViewSubResourceProvider.java

@@ -54,7 +54,8 @@ import java.util.Set;
  */
  */
 public class ViewSubResourceProvider extends AbstractResourceProvider {
 public class ViewSubResourceProvider extends AbstractResourceProvider {
 
 
-  private static final String VIEW_NAME_PROPERTY_ID = "view_name";
+  private static final String VIEW_NAME_PROPERTY_ID     = "view_name";
+  private static final String VIEW_VERSION_PROPERTY_ID  = "version";
   private static final String INSTANCE_NAME_PROPERTY_ID = "instance_name";
   private static final String INSTANCE_NAME_PROPERTY_ID = "instance_name";
 
 
   private final ViewEntity viewDefinition;
   private final ViewEntity viewDefinition;
@@ -139,7 +140,8 @@ public class ViewSubResourceProvider extends AbstractResourceProvider {
             String resourceId = (String) propertyMap.get(pkField);
             String resourceId = (String) propertyMap.get(pkField);
             if (resourceId != null) {
             if (resourceId != null) {
               Object bean = getResourceProvider(instanceName).getResource(resourceId, requestedIds);
               Object bean = getResourceProvider(instanceName).getResource(resourceId, requestedIds);
-              return Collections.singleton(getResource(bean, viewDefinition.getName(), instanceName, requestedIds));
+              return Collections.singleton(getResource(bean, viewDefinition.getCommonName(),
+                  viewDefinition.getVersion(), instanceName, requestedIds));
             }
             }
           }
           }
           if (instanceName == null) {
           if (instanceName == null) {
@@ -161,7 +163,8 @@ public class ViewSubResourceProvider extends AbstractResourceProvider {
         Set<?> beans = instanceDefinition.getResourceProvider(type).getResources(readRequest);
         Set<?> beans = instanceDefinition.getResourceProvider(type).getResources(readRequest);
 
 
         for (Object bean : beans) {
         for (Object bean : beans) {
-          Resource resource = getResource(bean, viewDefinition.getName(), instanceDefinition.getName(), requestedIds);
+          Resource resource = getResource(bean, viewDefinition.getCommonName(),
+              viewDefinition.getVersion(), instanceDefinition.getName(), requestedIds);
           if (predicate.evaluate(resource)) {
           if (predicate.evaluate(resource)) {
             results.add(resource);
             results.add(resource);
           }
           }
@@ -235,12 +238,14 @@ public class ViewSubResourceProvider extends AbstractResourceProvider {
   // ----- helper methods ----------------------------------------------------
   // ----- helper methods ----------------------------------------------------
 
 
   // get a Resource from the bean
   // get a Resource from the bean
-  private Resource getResource(Object bean, String viewName, String instanceName, Set<String> requestedIds)
+  private Resource getResource(Object bean, String viewName, String viewVersion,
+                               String instanceName, Set<String> requestedIds)
       throws InvocationTargetException, IllegalAccessException {
       throws InvocationTargetException, IllegalAccessException {
 
 
     Resource resource = new ResourceImpl(type);
     Resource resource = new ResourceImpl(type);
 
 
     resource.setProperty(VIEW_NAME_PROPERTY_ID, viewName);
     resource.setProperty(VIEW_NAME_PROPERTY_ID, viewName);
+    resource.setProperty(VIEW_VERSION_PROPERTY_ID, viewVersion);
     resource.setProperty(INSTANCE_NAME_PROPERTY_ID, instanceName);
     resource.setProperty(INSTANCE_NAME_PROPERTY_ID, instanceName);
 
 
     for (Map.Entry<String, PropertyDescriptor> entry : descriptorMap.entrySet()) {
     for (Map.Entry<String, PropertyDescriptor> entry : descriptorMap.entrySet()) {
@@ -267,6 +272,7 @@ public class ViewSubResourceProvider extends AbstractResourceProvider {
     Set<String> propertyIds = new HashSet<String>(getDescriptorMap(clazz).keySet());
     Set<String> propertyIds = new HashSet<String>(getDescriptorMap(clazz).keySet());
     propertyIds.add(INSTANCE_NAME_PROPERTY_ID);
     propertyIds.add(INSTANCE_NAME_PROPERTY_ID);
     propertyIds.add(VIEW_NAME_PROPERTY_ID);
     propertyIds.add(VIEW_NAME_PROPERTY_ID);
+    propertyIds.add(VIEW_VERSION_PROPERTY_ID);
 
 
     return propertyIds;
     return propertyIds;
   }
   }
@@ -290,6 +296,7 @@ public class ViewSubResourceProvider extends AbstractResourceProvider {
     Map<Resource.Type, String> keyPropertyIds = new HashMap<Resource.Type, String>();
     Map<Resource.Type, String> keyPropertyIds = new HashMap<Resource.Type, String>();
 
 
     keyPropertyIds.put(Resource.Type.View, VIEW_NAME_PROPERTY_ID);
     keyPropertyIds.put(Resource.Type.View, VIEW_NAME_PROPERTY_ID);
+    keyPropertyIds.put(Resource.Type.ViewVersion, VIEW_VERSION_PROPERTY_ID);
     keyPropertyIds.put(Resource.Type.ViewInstance, INSTANCE_NAME_PROPERTY_ID);
     keyPropertyIds.put(Resource.Type.ViewInstance, INSTANCE_NAME_PROPERTY_ID);
     keyPropertyIds.put(type, pkField);
     keyPropertyIds.put(type, pkField);
 
 

+ 1 - 1
ambari-server/src/test/java/org/apache/ambari/server/api/resources/ViewResourceDefinitionTest.java

@@ -46,6 +46,6 @@ public class ViewResourceDefinitionTest {
 
 
     Assert.assertEquals(1, subResourceDefinitions.size());
     Assert.assertEquals(1, subResourceDefinitions.size());
 
 
-    Assert.assertEquals("ViewInstance", subResourceDefinitions.iterator().next().getType().name());
+    Assert.assertEquals("ViewVersion", subResourceDefinitions.iterator().next().getType().name());
   }
   }
 }
 }

+ 51 - 0
ambari-server/src/test/java/org/apache/ambari/server/api/resources/ViewVersionResourceDefinitionTest.java

@@ -0,0 +1,51 @@
+/**
+ * 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.server.api.resources;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Set;
+
+/**
+ * ViewVersionResourceDefinition tests.
+ */
+public class ViewVersionResourceDefinitionTest {
+  @Test
+  public void testGetPluralName() throws Exception {
+    ViewVersionResourceDefinition viewVersionResourceDefinition = new ViewVersionResourceDefinition();
+    Assert.assertEquals("versions", viewVersionResourceDefinition.getPluralName());
+  }
+
+  @Test
+  public void testGetSingularName() throws Exception {
+    ViewVersionResourceDefinition viewVersionResourceDefinition = new ViewVersionResourceDefinition();
+    Assert.assertEquals("version", viewVersionResourceDefinition.getSingularName());
+  }
+
+  @Test
+  public void testGetSubResourceDefinitions() throws Exception {
+    ViewVersionResourceDefinition viewVersionResourceDefinition = new ViewVersionResourceDefinition();
+    Set<SubResourceDefinition> subResourceDefinitions = viewVersionResourceDefinition.getSubResourceDefinitions ();
+
+    Assert.assertEquals(1, subResourceDefinitions.size());
+
+    Assert.assertEquals("ViewInstance", subResourceDefinitions.iterator().next().getType().name());
+  }
+}

+ 7 - 1
ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewEntityTest.java

@@ -61,7 +61,13 @@ public class ViewEntityTest {
   @Test
   @Test
   public void testGetName() throws Exception {
   public void testGetName() throws Exception {
     ViewEntity viewDefinition = getViewEntity();
     ViewEntity viewDefinition = getViewEntity();
-    Assert.assertEquals("MY_VIEW", viewDefinition.getName());
+    Assert.assertEquals("MY_VIEW{1.0.0}", viewDefinition.getName());
+  }
+
+  @Test
+  public void testGetCommonName() throws Exception {
+    ViewEntity viewDefinition = getViewEntity();
+    Assert.assertEquals("MY_VIEW", viewDefinition.getCommonName());
   }
   }
 
 
   @Test
   @Test

+ 2 - 2
ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewInstanceEntityTest.java

@@ -97,7 +97,7 @@ public class ViewInstanceEntityTest {
     ViewInstanceEntity viewInstanceDefinition = getViewInstanceEntity();
     ViewInstanceEntity viewInstanceDefinition = getViewInstanceEntity();
 
 
     ResourceProvider provider = createNiceMock(ResourceProvider.class);
     ResourceProvider provider = createNiceMock(ResourceProvider.class);
-    Resource.Type type = new Resource.Type("MY_VIEW/myType");
+    Resource.Type type = new Resource.Type("MY_VIEW{1.0.0}/myType");
 
 
     viewInstanceDefinition.addResourceProvider(type, provider);
     viewInstanceDefinition.addResourceProvider(type, provider);
 
 
@@ -109,7 +109,7 @@ public class ViewInstanceEntityTest {
   public void testContextPath() throws Exception {
   public void testContextPath() throws Exception {
     ViewInstanceEntity viewInstanceDefinition = getViewInstanceEntity();
     ViewInstanceEntity viewInstanceDefinition = getViewInstanceEntity();
 
 
-    Assert.assertEquals(ViewInstanceEntity.VIEWS_CONTEXT_PATH_PREFIX + "MY_VIEW/INSTANCE1",
+    Assert.assertEquals(ViewInstanceEntity.VIEWS_CONTEXT_PATH_PREFIX + "MY_VIEW/1.0.0/INSTANCE1",
         viewInstanceDefinition.getContextPath());
         viewInstanceDefinition.getContextPath());
   }
   }
 
 

+ 1 - 1
ambari-server/src/test/java/org/apache/ambari/server/view/ViewContextImplTest.java

@@ -97,7 +97,7 @@ public class ViewContextImplTest {
     ViewRegistry viewRegistry = createNiceMock(ViewRegistry.class);
     ViewRegistry viewRegistry = createNiceMock(ViewRegistry.class);
 
 
     ResourceProvider provider = createNiceMock(ResourceProvider.class);
     ResourceProvider provider = createNiceMock(ResourceProvider.class);
-    Resource.Type type = new Resource.Type("MY_VIEW/myType");
+    Resource.Type type = new Resource.Type("MY_VIEW{1.0.0}/myType");
 
 
     viewInstanceDefinition.addResourceProvider(type, provider);
     viewInstanceDefinition.addResourceProvider(type, provider);
 
 

+ 3 - 3
ambari-server/src/test/java/org/apache/ambari/server/view/ViewRegistryTest.java

@@ -57,7 +57,7 @@ public class ViewRegistryTest {
 
 
     registry.addDefinition(viewDefinition);
     registry.addDefinition(viewDefinition);
 
 
-    Assert.assertEquals(viewDefinition, registry.getDefinition("MY_VIEW"));
+    Assert.assertEquals(viewDefinition, registry.getDefinition("MY_VIEW", "1.0.0"));
 
 
     Collection<ViewEntity> viewDefinitions = registry.getDefinitions();
     Collection<ViewEntity> viewDefinitions = registry.getDefinitions();
 
 
@@ -77,7 +77,7 @@ public class ViewRegistryTest {
 
 
     registry.addInstanceDefinition(viewDefinition, viewInstanceDefinition);
     registry.addInstanceDefinition(viewDefinition, viewInstanceDefinition);
 
 
-    Assert.assertEquals(viewInstanceDefinition, registry.getInstanceDefinition("MY_VIEW", "INSTANCE1"));
+    Assert.assertEquals(viewInstanceDefinition, registry.getInstanceDefinition("MY_VIEW", "1.0.0", "INSTANCE1"));
 
 
     Collection<ViewInstanceEntity> viewInstanceDefinitions = registry.getInstanceDefinitions(viewDefinition);
     Collection<ViewInstanceEntity> viewInstanceDefinitions = registry.getInstanceDefinitions(viewDefinition);
 
 
@@ -99,7 +99,7 @@ public class ViewRegistryTest {
 
 
     viewDefinition.addResourceConfiguration(type1, config);
     viewDefinition.addResourceConfiguration(type1, config);
     registry.addDefinition(viewDefinition);
     registry.addDefinition(viewDefinition);
-    Set<SubResourceDefinition> subResourceDefinitions = registry.getSubResourceDefinitions("MY_VIEW");
+    Set<SubResourceDefinition> subResourceDefinitions = registry.getSubResourceDefinitions("MY_VIEW", "1.0.0");
 
 
     Assert.assertEquals(1, subResourceDefinitions.size());
     Assert.assertEquals(1, subResourceDefinitions.size());
     Assert.assertEquals("myType", subResourceDefinitions.iterator().next().getType().name());
     Assert.assertEquals("myType", subResourceDefinitions.iterator().next().getType().name());

+ 3 - 3
ambari-server/src/test/java/org/apache/ambari/server/view/ViewSubResourceDefinitionTest.java

@@ -51,14 +51,14 @@ public class ViewSubResourceDefinitionTest {
   public void testGetSubResourceDefinitions() throws Exception {
   public void testGetSubResourceDefinitions() throws Exception {
     ViewSubResourceDefinition viewSubResourceDefinition = getViewSubResourceDefinition();
     ViewSubResourceDefinition viewSubResourceDefinition = getViewSubResourceDefinition();
 
 
-    new Resource.Type("MY_VIEW/resource");
-    new Resource.Type("MY_VIEW/subresource");
+    new Resource.Type("MY_VIEW{1.0.0}/resource");
+    new Resource.Type("MY_VIEW{1.0.0}/subresource");
 
 
     Set<SubResourceDefinition> subResourceDefinitions = viewSubResourceDefinition.getSubResourceDefinitions ();
     Set<SubResourceDefinition> subResourceDefinitions = viewSubResourceDefinition.getSubResourceDefinitions ();
 
 
     Assert.assertEquals(1, subResourceDefinitions.size());
     Assert.assertEquals(1, subResourceDefinitions.size());
 
 
-    Assert.assertEquals("MY_VIEW/subresource", subResourceDefinitions.iterator().next().getType().name());
+    Assert.assertEquals("MY_VIEW{1.0.0}/subresource", subResourceDefinitions.iterator().next().getType().name());
   }
   }
 
 
   public static ViewSubResourceDefinition getViewSubResourceDefinition() throws Exception {
   public static ViewSubResourceDefinition getViewSubResourceDefinition() throws Exception {