Browse Source

AMBARI-6095 - Views: standardize way to obtain icon from view

tbeerbower 11 years ago
parent
commit
31c5852fee

+ 28 - 8
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java

@@ -57,6 +57,8 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
   public static final String LABEL_PROPERTY_ID         = "ViewInstanceInfo/label";
   public static final String LABEL_PROPERTY_ID         = "ViewInstanceInfo/label";
   public static final String DESCRIPTION_PROPERTY_ID   = "ViewInstanceInfo/description";
   public static final String DESCRIPTION_PROPERTY_ID   = "ViewInstanceInfo/description";
   public static final String VISIBLE_PROPERTY_ID       = "ViewInstanceInfo/visible";
   public static final String VISIBLE_PROPERTY_ID       = "ViewInstanceInfo/visible";
+  public static final String ICON_PATH_ID              = "ViewInstanceInfo/icon_path";
+  public static final String ICON64_PATH_ID            = "ViewInstanceInfo/icon64_path";
   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";
   public static final String CONTEXT_PATH_PROPERTY_ID  = "ViewInstanceInfo/context_path";
   public static final String CONTEXT_PATH_PROPERTY_ID  = "ViewInstanceInfo/context_path";
@@ -88,6 +90,8 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
     propertyIds.add(LABEL_PROPERTY_ID);
     propertyIds.add(LABEL_PROPERTY_ID);
     propertyIds.add(DESCRIPTION_PROPERTY_ID);
     propertyIds.add(DESCRIPTION_PROPERTY_ID);
     propertyIds.add(VISIBLE_PROPERTY_ID);
     propertyIds.add(VISIBLE_PROPERTY_ID);
+    propertyIds.add(ICON_PATH_ID);
+    propertyIds.add(ICON64_PATH_ID);
     propertyIds.add(PROPERTIES_PROPERTY_ID);
     propertyIds.add(PROPERTIES_PROPERTY_ID);
     propertyIds.add(DATA_PROPERTY_ID);
     propertyIds.add(DATA_PROPERTY_ID);
     propertyIds.add(CONTEXT_PATH_PROPERTY_ID);
     propertyIds.add(CONTEXT_PATH_PROPERTY_ID);
@@ -221,8 +225,12 @@ 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,
-        ViewInstanceEntity.getContextPath(viewName, version, name), requestedIds);
+
+    String contextPath = ViewInstanceEntity.getContextPath(viewName, version, name);
+
+    setResourceProperty(resource, CONTEXT_PATH_PROPERTY_ID,contextPath, requestedIds);
+    setResourceProperty(resource, ICON_PATH_ID, getIconPath(contextPath, viewInstanceEntity.getIcon()), requestedIds);
+    setResourceProperty(resource, ICON64_PATH_ID, getIconPath(contextPath, viewInstanceEntity.getIcon64()), requestedIds);
 
 
     return resource;
     return resource;
   }
   }
@@ -258,19 +266,25 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
       viewEntity.setVersion(version);
       viewEntity.setVersion(version);
       viewInstanceEntity.setViewEntity(viewEntity);
       viewInstanceEntity.setViewEntity(viewEntity);
     }
     }
-    String label = (String) properties.get(LABEL_PROPERTY_ID);
-    if (label != null) {
-      viewInstanceEntity.setLabel(label);
+    if (properties.containsKey(LABEL_PROPERTY_ID)) {
+      viewInstanceEntity.setLabel((String) properties.get(LABEL_PROPERTY_ID));
     }
     }
 
 
-    String description = (String) properties.get(DESCRIPTION_PROPERTY_ID);
-    if (description != null) {
-      viewInstanceEntity.setDescription(description);
+    if (properties.containsKey(DESCRIPTION_PROPERTY_ID)) {
+      viewInstanceEntity.setDescription((String) properties.get(DESCRIPTION_PROPERTY_ID));
     }
     }
 
 
     String visible = (String) properties.get(VISIBLE_PROPERTY_ID);
     String visible = (String) properties.get(VISIBLE_PROPERTY_ID);
     viewInstanceEntity.setVisible(visible==null ? true : Boolean.valueOf(visible));
     viewInstanceEntity.setVisible(visible==null ? true : Boolean.valueOf(visible));
 
 
+    if (properties.containsKey(ICON_PATH_ID)) {
+      viewInstanceEntity.setIcon((String) properties.get(ICON_PATH_ID));
+    }
+
+    if (properties.containsKey(ICON64_PATH_ID)) {
+      viewInstanceEntity.setIcon64((String) properties.get(ICON64_PATH_ID));
+    }
+
     Collection<ViewInstancePropertyEntity> instanceProperties = new HashSet<ViewInstancePropertyEntity>();
     Collection<ViewInstancePropertyEntity> instanceProperties = new HashSet<ViewInstancePropertyEntity>();
     Collection<ViewInstanceDataEntity>     instanceData       = new HashSet<ViewInstanceDataEntity>();
     Collection<ViewInstanceDataEntity>     instanceData       = new HashSet<ViewInstanceDataEntity>();
 
 
@@ -357,4 +371,10 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
       }
       }
     };
     };
   }
   }
+
+  // get the icon path
+  private static String getIconPath(String contextPath, String iconPath){
+    return iconPath == null || iconPath.length() == 0 ? null :
+        contextPath + (iconPath.startsWith("/") ? "" : "/") + iconPath;
+  }
 }
 }

+ 52 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewEntity.java

@@ -65,6 +65,20 @@ public class ViewEntity implements ViewDefinition {
   @Basic
   @Basic
   private String label;
   private String label;
 
 
+  /**
+   * The icon path.
+   */
+  @Column
+  @Basic
+  private String icon;
+
+  /**
+   * The big icon path.
+   */
+  @Column
+  @Basic
+  private String icon64;
+
   /**
   /**
    * The view version.
    * The view version.
    */
    */
@@ -188,6 +202,8 @@ public class ViewEntity implements ViewDefinition {
     this.name    = getViewName(configuration.getName(), version);
     this.name    = getViewName(configuration.getName(), version);
     this.label   = configuration.getLabel();
     this.label   = configuration.getLabel();
     this.version = version;
     this.version = version;
+    this.icon    = configuration.getIcon();
+    this.icon64  = configuration.getIcon64();
 
 
     this.externalResourceType =
     this.externalResourceType =
         new Resource.Type(getQualifiedResourceTypeName(ResourceConfig.EXTERNAL_RESOURCE_PLURAL_NAME));
         new Resource.Type(getQualifiedResourceTypeName(ResourceConfig.EXTERNAL_RESOURCE_PLURAL_NAME));
@@ -264,6 +280,42 @@ public class ViewEntity implements ViewDefinition {
     this.version = version;
     this.version = version;
   }
   }
 
 
+  /**
+   * Get the icon path.
+   *
+   * @return the icon path
+   */
+  public String getIcon() {
+    return icon;
+  }
+
+  /**
+   * Set the icon path.
+   *
+   * @param icon  the icon path
+   */
+  public void setIcon(String icon) {
+    this.icon = icon;
+  }
+
+  /**
+   * Get the big icon path.
+   *
+   * @return the big icon path
+   */
+  public String getIcon64() {
+    return icon64;
+  }
+
+  /**
+   * Set the big icon path.
+   *
+   * @param icon64  the big icon path
+   */
+  public void setIcon64(String icon64) {
+    this.icon64 = icon64;
+  }
+
   /**
   /**
    * Get the view parameters.
    * Get the view parameters.
    *
    *

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

@@ -91,6 +91,20 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   @Basic
   @Basic
   private char visible;
   private char visible;
 
 
+  /**
+   * The icon path.
+   */
+  @Column
+  @Basic
+  private String icon;
+
+  /**
+   * The big icon path.
+   */
+  @Column
+  @Basic
+  private String icon64;
+
   /**
   /**
    * The instance properties.
    * The instance properties.
    */
    */
@@ -165,7 +179,13 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
     this.visible        = instanceConfig.isVisible() ? 'Y' : 'N';
     this.visible        = instanceConfig.isVisible() ? 'Y' : 'N';
 
 
     String label = instanceConfig.getLabel();
     String label = instanceConfig.getLabel();
-    this.label = (label == null || label.length()== 0) ? view.getLabel() : label;
+    this.label = (label == null || label.length() == 0) ? view.getLabel() : label;
+
+    String icon = instanceConfig.getIcon();
+    this.icon = (icon == null || icon.length() == 0) ? view.getIcon() : icon;
+
+    String icon64 = instanceConfig.getIcon64();
+    this.icon64 = (icon64 == null || icon64.length() == 0) ? view.getIcon64() : icon64;
   }
   }
 
 
   /**
   /**
@@ -298,6 +318,42 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
     this.visible = (visible ? 'Y' : 'N');
     this.visible = (visible ? 'Y' : 'N');
   }
   }
 
 
+  /**
+   * Get the icon path.
+   *
+   * @return the icon path
+   */
+  public String getIcon() {
+    return icon;
+  }
+
+  /**
+   * Set the icon path.
+   *
+   * @param icon  the icon path
+   */
+  public void setIcon(String icon) {
+    this.icon = icon;
+  }
+
+  /**
+   * Get the big icon path.
+   *
+   * @return the big icon path
+   */
+  public String getIcon64() {
+    return icon64;
+  }
+
+  /**
+   * Set the big icon path.
+   *
+   * @param icon64  the big icon path
+   */
+  public void setIcon64(String icon64) {
+    this.icon64 = icon64;
+  }
+
   /**
   /**
    * Get the instance properties.
    * Get the instance properties.
    *
    *

+ 12 - 0
ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog161.java

@@ -76,6 +76,12 @@ public class UpgradeCatalog161 extends AbstractUpgradeCatalog {
 
 
     //=========================================================================
     //=========================================================================
     // Add columns
     // Add columns
+    dbAccessor.addColumn("viewmain",
+        new DBAccessor.DBColumnInfo("icon", String.class, 255, null, true));
+
+    dbAccessor.addColumn("viewmain",
+        new DBAccessor.DBColumnInfo("icon64", String.class, 255, null, true));
+
     dbAccessor.addColumn("viewinstancedata",
     dbAccessor.addColumn("viewinstancedata",
         new DBAccessor.DBColumnInfo("user_name", String.class, 255, " ", false));
         new DBAccessor.DBColumnInfo("user_name", String.class, 255, " ", false));
 
 
@@ -88,6 +94,12 @@ public class UpgradeCatalog161 extends AbstractUpgradeCatalog {
     dbAccessor.addColumn("viewinstance",
     dbAccessor.addColumn("viewinstance",
         new DBAccessor.DBColumnInfo("visible", Character.class, 1, null, true));
         new DBAccessor.DBColumnInfo("visible", Character.class, 1, null, true));
 
 
+    dbAccessor.addColumn("viewinstance",
+        new DBAccessor.DBColumnInfo("icon", String.class, 255, null, true));
+
+    dbAccessor.addColumn("viewinstance",
+        new DBAccessor.DBColumnInfo("icon64", String.class, 255, null, true));
+
     // ========================================================================
     // ========================================================================
     // Add constraints
     // Add constraints
     dbAccessor.addFKConstraint("requestoperationlevel", "FK_req_op_level_req_id",
     dbAccessor.addFKConstraint("requestoperationlevel", "FK_req_op_level_req_id",

+ 32 - 0
ambari-server/src/main/java/org/apache/ambari/server/view/configuration/InstanceConfig.java

@@ -49,6 +49,18 @@ public class InstanceConfig {
    */
    */
   private boolean visible = true;
   private boolean visible = true;
 
 
+  /**
+   * The icon path in the view archive.  Overrides the view
+   * level icon attribute.
+   */
+  private String icon;
+
+  /**
+   * The big icon path in the view archive.  Overrides the view
+   * level big icon attribute.
+   */
+  private String icon64;
+
   /**
   /**
    * The instance properties.
    * The instance properties.
    */
    */
@@ -91,6 +103,26 @@ public class InstanceConfig {
     return visible;
     return visible;
   }
   }
 
 
+  /**
+   * Get the icon path in the view archive.  Overrides the view
+   * level icon attribute.
+   *
+   * @return the icon path
+   */
+  public String getIcon() {
+    return icon;
+  }
+
+  /**
+   * Get the big icon path in the view archive. Overrides the view
+   * level big icon attribute.
+   *
+   * @return the big icon path
+   */
+  public String getIcon64() {
+    return icon64;
+  }
+
   /**
   /**
    * Get the instance properties.
    * Get the instance properties.
    *
    *

+ 28 - 0
ambari-server/src/main/java/org/apache/ambari/server/view/configuration/ViewConfig.java

@@ -48,6 +48,16 @@ public class ViewConfig {
    */
    */
   private String version;
   private String version;
 
 
+  /**
+   * The icon path in the view archive.
+   */
+  private String icon;
+
+  /**
+   * The big icon path in the view archive.
+   */
+  private String icon64;
+
   /**
   /**
    * The main view class name.
    * The main view class name.
    */
    */
@@ -110,6 +120,24 @@ public class ViewConfig {
     return version;
     return version;
   }
   }
 
 
+  /**
+   * Get the icon path in the view archive.
+   *
+   * @return the icon path
+   */
+  public String getIcon() {
+    return icon;
+  }
+
+  /**
+   * Get the big icon path in the view archive.
+   *
+   * @return the big icon path
+   */
+  public String getIcon64() {
+    return icon64;
+  }
+
   /**
   /**
    * Get the view class name.
    * Get the view class name.
    *
    *

+ 2 - 2
ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql

@@ -62,9 +62,9 @@ CREATE TABLE hostgroup (blueprint_name VARCHAR(255) NOT NULL, name VARCHAR(255)
 CREATE TABLE hostgroup_component (blueprint_name VARCHAR(255) NOT NULL, hostgroup_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(blueprint_name, hostgroup_name, name));
 CREATE TABLE hostgroup_component (blueprint_name VARCHAR(255) NOT NULL, hostgroup_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(blueprint_name, hostgroup_name, name));
 CREATE TABLE blueprint_configuration (blueprint_name VARCHAR(255) NOT NULL, type_name VARCHAR(255) NOT NULL, config_data VARCHAR(32000) NOT NULL , PRIMARY KEY(blueprint_name, type_name));
 CREATE TABLE blueprint_configuration (blueprint_name VARCHAR(255) NOT NULL, type_name VARCHAR(255) NOT NULL, config_data VARCHAR(32000) NOT NULL , PRIMARY KEY(blueprint_name, type_name));
 CREATE TABLE hostgroup_configuration (blueprint_name VARCHAR(255) NOT NULL, hostgroup_name VARCHAR(255) NOT NULL, type_name VARCHAR(255) NOT NULL, config_data TEXT NOT NULL, PRIMARY KEY(blueprint_name, hostgroup_name, type_name));
 CREATE TABLE hostgroup_configuration (blueprint_name VARCHAR(255) NOT NULL, hostgroup_name VARCHAR(255) NOT NULL, type_name VARCHAR(255) NOT NULL, config_data TEXT NOT NULL, PRIMARY KEY(blueprint_name, hostgroup_name, type_name));
-CREATE TABLE viewmain (view_name VARCHAR(255) NOT NULL, label VARCHAR(255), version VARCHAR(255), archive VARCHAR(255), PRIMARY KEY(view_name));
+CREATE TABLE viewmain (view_name VARCHAR(255) NOT NULL, label VARCHAR(255), version VARCHAR(255), icon VARCHAR(255), icon64 VARCHAR(255), archive VARCHAR(255), PRIMARY KEY(view_name));
 CREATE TABLE viewinstancedata (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name, user_name));
 CREATE TABLE viewinstancedata (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name, user_name));
-CREATE TABLE viewinstance (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(255), description VARCHAR(255), visible CHAR(1), PRIMARY KEY(view_name, name));
+CREATE TABLE viewinstance (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(255), description VARCHAR(255), visible CHAR(1), icon VARCHAR(255), icon64 VARCHAR(255), PRIMARY KEY(view_name, name));
 CREATE TABLE viewinstanceproperty (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name));
 CREATE TABLE viewinstanceproperty (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name));
 CREATE TABLE viewparameter (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(255), required CHAR(1), PRIMARY KEY(view_name, name));
 CREATE TABLE viewparameter (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(255), required CHAR(1), PRIMARY KEY(view_name, name));
 CREATE TABLE viewresource (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, plural_name VARCHAR(255), id_property VARCHAR(255), subResource_names VARCHAR(255), provider VARCHAR(255), service VARCHAR(255), resource VARCHAR(255), PRIMARY KEY(view_name, name));
 CREATE TABLE viewresource (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, plural_name VARCHAR(255), id_property VARCHAR(255), subResource_names VARCHAR(255), provider VARCHAR(255), service VARCHAR(255), resource VARCHAR(255), PRIMARY KEY(view_name, name));

+ 2 - 2
ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql

@@ -52,9 +52,9 @@ CREATE TABLE hostgroup (blueprint_name VARCHAR2(255) NOT NULL, name VARCHAR2(255
 CREATE TABLE hostgroup_component (blueprint_name VARCHAR2(255) NOT NULL, hostgroup_name VARCHAR2(255) NOT NULL, name VARCHAR2(255) NOT NULL, PRIMARY KEY(blueprint_name, hostgroup_name, name));
 CREATE TABLE hostgroup_component (blueprint_name VARCHAR2(255) NOT NULL, hostgroup_name VARCHAR2(255) NOT NULL, name VARCHAR2(255) NOT NULL, PRIMARY KEY(blueprint_name, hostgroup_name, name));
 CREATE TABLE blueprint_configuration (blueprint_name VARCHAR2(255) NOT NULL, type_name VARCHAR2(255) NOT NULL, config_data CLOB NOT NULL , PRIMARY KEY(blueprint_name, type_name));
 CREATE TABLE blueprint_configuration (blueprint_name VARCHAR2(255) NOT NULL, type_name VARCHAR2(255) NOT NULL, config_data CLOB NOT NULL , PRIMARY KEY(blueprint_name, type_name));
 CREATE TABLE hostgroup_configuration (blueprint_name VARCHAR2(255) NOT NULL, hostgroup_name VARCHAR2(255) NOT NULL, type_name VARCHAR2(255) NOT NULL, config_data CLOB NOT NULL, PRIMARY KEY(blueprint_name, hostgroup_name, type_name));
 CREATE TABLE hostgroup_configuration (blueprint_name VARCHAR2(255) NOT NULL, hostgroup_name VARCHAR2(255) NOT NULL, type_name VARCHAR2(255) NOT NULL, config_data CLOB NOT NULL, PRIMARY KEY(blueprint_name, hostgroup_name, type_name));
-CREATE TABLE viewmain (view_name VARCHAR(255) NOT NULL, label VARCHAR(255), version VARCHAR(255), archive VARCHAR(255), PRIMARY KEY(view_name));
+CREATE TABLE viewmain (view_name VARCHAR(255) NOT NULL, label VARCHAR(255), version VARCHAR(255), icon VARCHAR(255), icon64 VARCHAR(255), archive VARCHAR(255), PRIMARY KEY(view_name));
 CREATE TABLE viewinstancedata (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name, user_name));
 CREATE TABLE viewinstancedata (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name, user_name));
-CREATE TABLE viewinstance (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(255), description VARCHAR(255), visible CHAR(1), PRIMARY KEY(view_name, name));
+CREATE TABLE viewinstance (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(255), description VARCHAR(255), visible CHAR(1), icon VARCHAR(255), icon64 VARCHAR(255), PRIMARY KEY(view_name, name));
 CREATE TABLE viewinstanceproperty (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name));
 CREATE TABLE viewinstanceproperty (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name));
 CREATE TABLE viewparameter (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(255), required CHAR(1), PRIMARY KEY(view_name, name));
 CREATE TABLE viewparameter (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(255), required CHAR(1), PRIMARY KEY(view_name, name));
 CREATE TABLE viewresource (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, plural_name VARCHAR(255), id_property VARCHAR(255), subResource_names VARCHAR(255), provider VARCHAR(255), service VARCHAR(255), "resource" VARCHAR(255), PRIMARY KEY(view_name, name));
 CREATE TABLE viewresource (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, plural_name VARCHAR(255), id_property VARCHAR(255), subResource_names VARCHAR(255), provider VARCHAR(255), service VARCHAR(255), "resource" VARCHAR(255), PRIMARY KEY(view_name, name));

+ 2 - 2
ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql

@@ -85,9 +85,9 @@ CREATE TABLE hostgroup_component (blueprint_name VARCHAR(255) NOT NULL, hostgrou
 CREATE TABLE blueprint_configuration (blueprint_name varchar(255) NOT NULL, type_name varchar(255) NOT NULL, config_data varchar(32000) NOT NULL , PRIMARY KEY(blueprint_name, type_name));
 CREATE TABLE blueprint_configuration (blueprint_name varchar(255) NOT NULL, type_name varchar(255) NOT NULL, config_data varchar(32000) NOT NULL , PRIMARY KEY(blueprint_name, type_name));
 CREATE TABLE hostgroup_configuration (blueprint_name VARCHAR(255) NOT NULL, hostgroup_name VARCHAR(255) NOT NULL, type_name VARCHAR(255) NOT NULL, config_data TEXT NOT NULL, PRIMARY KEY(blueprint_name, hostgroup_name, type_name));
 CREATE TABLE hostgroup_configuration (blueprint_name VARCHAR(255) NOT NULL, hostgroup_name VARCHAR(255) NOT NULL, type_name VARCHAR(255) NOT NULL, config_data TEXT NOT NULL, PRIMARY KEY(blueprint_name, hostgroup_name, type_name));
 
 
-CREATE TABLE viewmain (view_name VARCHAR(255) NOT NULL, label VARCHAR(255), version VARCHAR(255), archive VARCHAR(255), PRIMARY KEY(view_name));
+CREATE TABLE viewmain (view_name VARCHAR(255) NOT NULL, label VARCHAR(255), version VARCHAR(255), icon VARCHAR(255), icon64 VARCHAR(255), archive VARCHAR(255), PRIMARY KEY(view_name));
 CREATE TABLE viewinstancedata (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name, user_name));
 CREATE TABLE viewinstancedata (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name, user_name));
-CREATE TABLE viewinstance (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(255), description VARCHAR(255), visible CHAR(1), PRIMARY KEY(view_name, name));
+CREATE TABLE viewinstance (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(255), description VARCHAR(255), visible CHAR(1), icon VARCHAR(255), icon64 VARCHAR(255), PRIMARY KEY(view_name, name));
 CREATE TABLE viewinstanceproperty (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name));
 CREATE TABLE viewinstanceproperty (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name));
 CREATE TABLE viewparameter (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(255), required CHAR(1), PRIMARY KEY(view_name, name));
 CREATE TABLE viewparameter (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(255), required CHAR(1), PRIMARY KEY(view_name, name));
 CREATE TABLE viewresource (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, plural_name VARCHAR(255), id_property VARCHAR(255), subResource_names VARCHAR(255), provider VARCHAR(255), service VARCHAR(255), resource VARCHAR(255), PRIMARY KEY(view_name, name));
 CREATE TABLE viewresource (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, plural_name VARCHAR(255), id_property VARCHAR(255), subResource_names VARCHAR(255), provider VARCHAR(255), service VARCHAR(255), resource VARCHAR(255), PRIMARY KEY(view_name, name));

+ 2 - 2
ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql

@@ -132,9 +132,9 @@ GRANT ALL PRIVILEGES ON TABLE ambari.hostgroup_component TO :username;
 GRANT ALL PRIVILEGES ON TABLE ambari.blueprint_configuration TO :username;
 GRANT ALL PRIVILEGES ON TABLE ambari.blueprint_configuration TO :username;
 GRANT ALL PRIVILEGES ON TABLE ambari.hostgroup_configuration TO :username;
 GRANT ALL PRIVILEGES ON TABLE ambari.hostgroup_configuration TO :username;
 
 
-CREATE TABLE ambari.viewmain (view_name VARCHAR(255) NOT NULL, label VARCHAR(255), version VARCHAR(255), archive VARCHAR(255), PRIMARY KEY(view_name));
+CREATE TABLE ambari.viewmain (view_name VARCHAR(255) NOT NULL, label VARCHAR(255), version VARCHAR(255), icon VARCHAR(255), icon64 VARCHAR(255), archive VARCHAR(255), PRIMARY KEY(view_name));
 CREATE TABLE ambari.viewinstancedata (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name, user_name));
 CREATE TABLE ambari.viewinstancedata (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name, user_name));
-CREATE TABLE ambari.viewinstance (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(255), description VARCHAR(255), visible CHAR(1), PRIMARY KEY(view_name, name));
+CREATE TABLE ambari.viewinstance (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(255), description VARCHAR(255), visible CHAR(1), icon VARCHAR(255), icon64 VARCHAR(255), PRIMARY KEY(view_name, name));
 CREATE TABLE ambari.viewinstanceproperty (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name));
 CREATE TABLE ambari.viewinstanceproperty (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name));
 CREATE TABLE ambari.viewparameter (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(255), required CHAR(1), PRIMARY KEY(view_name, name));
 CREATE TABLE ambari.viewparameter (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(255), required CHAR(1), PRIMARY KEY(view_name, name));
 CREATE TABLE ambari.viewresource (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, plural_name VARCHAR(255), id_property VARCHAR(255), subResource_names VARCHAR(255), provider VARCHAR(255), service VARCHAR(255), resource VARCHAR(255), PRIMARY KEY(view_name, name));
 CREATE TABLE ambari.viewresource (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, plural_name VARCHAR(255), id_property VARCHAR(255), subResource_names VARCHAR(255), provider VARCHAR(255), service VARCHAR(255), resource VARCHAR(255), PRIMARY KEY(view_name, name));

+ 18 - 0
ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewEntityTest.java

@@ -82,6 +82,24 @@ public class ViewEntityTest {
     Assert.assertEquals("1.0.0", viewDefinition.getVersion());
     Assert.assertEquals("1.0.0", viewDefinition.getVersion());
   }
   }
 
 
+  @Test
+  public void testGetIcon() throws Exception {
+    ViewEntity viewDefinition = getViewEntity();
+    Assert.assertEquals("/this/is/the/icon/url/icon.png", viewDefinition.getIcon());
+
+    viewDefinition.setIcon("/a/different/icon.png");
+    Assert.assertEquals("/a/different/icon.png", viewDefinition.getIcon());
+  }
+
+  @Test
+  public void testGetIcon64() throws Exception {
+    ViewEntity viewDefinition = getViewEntity();
+    Assert.assertEquals("/this/is/the/icon/url/icon64.png", viewDefinition.getIcon64());
+
+    viewDefinition.setIcon64("/a/different/icon.png");
+    Assert.assertEquals("/a/different/icon.png", viewDefinition.getIcon64());
+  }
+
   @Test
   @Test
   public void testGetConfiguration() throws Exception {
   public void testGetConfiguration() throws Exception {
     ViewConfig viewConfig = ViewConfigTest.getConfig();
     ViewConfig viewConfig = ViewConfigTest.getConfig();

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

@@ -43,11 +43,15 @@ public class ViewInstanceEntityTest {
       "    <name>MY_VIEW</name>\n" +
       "    <name>MY_VIEW</name>\n" +
       "    <label>My View!</label>\n" +
       "    <label>My View!</label>\n" +
       "    <version>1.0.0</version>\n" +
       "    <version>1.0.0</version>\n" +
+      "    <icon>/this/is/the/icon/url/icon.png</icon>\n" +
+      "    <icon64>/this/is/the/icon/url/icon64.png</icon64>\n" +
       "    <instance>\n" +
       "    <instance>\n" +
       "        <name>INSTANCE1</name>\n" +
       "        <name>INSTANCE1</name>\n" +
       "        <label>My Instance 1!</label>\n" +
       "        <label>My Instance 1!</label>\n" +
       "        <description>This is an instance description.</description>\n" +
       "        <description>This is an instance description.</description>\n" +
       "        <visible>true</visible>\n" +
       "        <visible>true</visible>\n" +
+      "        <icon>/this/is/the/icon/url/instance_1_icon.png</icon>\n" +
+      "        <icon64>/this/is/the/icon/url/instance_1_icon64.png</icon64>\n" +
       "    </instance>\n" +
       "    </instance>\n" +
       "    <instance>\n" +
       "    <instance>\n" +
       "        <name>INSTANCE2</name>\n" +
       "        <name>INSTANCE2</name>\n" +
@@ -192,6 +196,38 @@ public class ViewInstanceEntityTest {
     Assert.assertTrue(viewInstanceDefinition.isVisible());
     Assert.assertTrue(viewInstanceDefinition.isVisible());
   }
   }
 
 
+  @Test
+  public void testGetIcon() throws Exception {
+    InstanceConfig instanceConfig = InstanceConfigTest.getInstanceConfigs(xml_with_instance_label).get(0);
+    ViewEntity viewDefinition = ViewEntityTest.getViewEntity();
+    ViewInstanceEntity viewInstanceDefinition = new ViewInstanceEntity(viewDefinition, instanceConfig);
+    Assert.assertEquals("/this/is/the/icon/url/instance_1_icon.png", viewInstanceDefinition.getIcon());
+
+    viewInstanceDefinition.setIcon("/a/different/icon.png");
+    Assert.assertEquals("/a/different/icon.png", viewInstanceDefinition.getIcon());
+
+    instanceConfig = InstanceConfigTest.getInstanceConfigs(xml_with_instance_label).get(1);
+    viewDefinition = ViewEntityTest.getViewEntity();
+    viewInstanceDefinition = new ViewInstanceEntity(viewDefinition, instanceConfig);
+    Assert.assertEquals("/this/is/the/icon/url/icon.png", viewInstanceDefinition.getIcon());
+  }
+
+  @Test
+  public void testGetIcon64() throws Exception {
+    InstanceConfig instanceConfig = InstanceConfigTest.getInstanceConfigs(xml_with_instance_label).get(0);
+    ViewEntity viewDefinition = ViewEntityTest.getViewEntity();
+    ViewInstanceEntity viewInstanceDefinition = new ViewInstanceEntity(viewDefinition, instanceConfig);
+    Assert.assertEquals("/this/is/the/icon/url/instance_1_icon64.png", viewInstanceDefinition.getIcon64());
+
+    viewInstanceDefinition.setIcon64("/a/different/icon.png");
+    Assert.assertEquals("/a/different/icon.png", viewInstanceDefinition.getIcon64());
+
+    instanceConfig = InstanceConfigTest.getInstanceConfigs(xml_with_instance_label).get(1);
+    viewDefinition = ViewEntityTest.getViewEntity();
+    viewInstanceDefinition = new ViewInstanceEntity(viewDefinition, instanceConfig);
+    Assert.assertEquals("/this/is/the/icon/url/icon64.png", viewInstanceDefinition.getIcon64());
+  }
+
   @Test
   @Test
   public void testAddGetProperty() throws Exception {
   public void testAddGetProperty() throws Exception {
     ViewInstanceEntity viewInstanceDefinition = getViewInstanceEntity();
     ViewInstanceEntity viewInstanceDefinition = getViewInstanceEntity();

+ 64 - 4
ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog161Test.java

@@ -69,10 +69,15 @@ public class UpgradeCatalog161Test {
     Capture<DBAccessor.DBColumnInfo> labelColumnCapture = new Capture<DBAccessor.DBColumnInfo>();
     Capture<DBAccessor.DBColumnInfo> labelColumnCapture = new Capture<DBAccessor.DBColumnInfo>();
     Capture<DBAccessor.DBColumnInfo> descriptionColumnCapture = new Capture<DBAccessor.DBColumnInfo>();
     Capture<DBAccessor.DBColumnInfo> descriptionColumnCapture = new Capture<DBAccessor.DBColumnInfo>();
     Capture<DBAccessor.DBColumnInfo> visibleColumnCapture = new Capture<DBAccessor.DBColumnInfo>();
     Capture<DBAccessor.DBColumnInfo> visibleColumnCapture = new Capture<DBAccessor.DBColumnInfo>();
+    Capture<DBAccessor.DBColumnInfo> viewIconColumnCapture = new Capture<DBAccessor.DBColumnInfo>();
+    Capture<DBAccessor.DBColumnInfo> viewIcon64ColumnCapture = new Capture<DBAccessor.DBColumnInfo>();
+    Capture<DBAccessor.DBColumnInfo> instanceIconColumnCapture = new Capture<DBAccessor.DBColumnInfo>();
+    Capture<DBAccessor.DBColumnInfo> instanceIcon64ColumnCapture = new Capture<DBAccessor.DBColumnInfo>();
 
 
     setClustersConfigExpectations(dbAccessor, provisioningStateColumnCapture);    
     setClustersConfigExpectations(dbAccessor, provisioningStateColumnCapture);    
     setOperationLevelEntityConfigExpectations(dbAccessor, operationLevelEntityColumnCapture);
     setOperationLevelEntityConfigExpectations(dbAccessor, operationLevelEntityColumnCapture);
-    setViewInstanceExpectations(dbAccessor, labelColumnCapture, descriptionColumnCapture, visibleColumnCapture);
+    setViewExpectations(dbAccessor, viewIconColumnCapture, viewIcon64ColumnCapture);
+    setViewInstanceExpectations(dbAccessor, labelColumnCapture, descriptionColumnCapture, visibleColumnCapture, instanceIconColumnCapture, instanceIcon64ColumnCapture);
 
 
     replay(dbAccessor, configuration);
     replay(dbAccessor, configuration);
     AbstractUpgradeCatalog upgradeCatalog = getUpgradeCatalog(dbAccessor);
     AbstractUpgradeCatalog upgradeCatalog = getUpgradeCatalog(dbAccessor);
@@ -86,7 +91,8 @@ public class UpgradeCatalog161Test {
 
 
     assertClusterColumns(provisioningStateColumnCapture);
     assertClusterColumns(provisioningStateColumnCapture);
     assertOperationLevelEntityColumns(operationLevelEntityColumnCapture);
     assertOperationLevelEntityColumns(operationLevelEntityColumnCapture);
-    assertViewInstanceColumns(labelColumnCapture, descriptionColumnCapture, visibleColumnCapture);
+    assertViewColumns(viewIconColumnCapture, viewIcon64ColumnCapture);
+    assertViewInstanceColumns(labelColumnCapture, descriptionColumnCapture, visibleColumnCapture, instanceIconColumnCapture, instanceIcon64ColumnCapture);
   }
   }
 
 
   @SuppressWarnings("unchecked")
   @SuppressWarnings("unchecked")
@@ -239,10 +245,24 @@ public class UpgradeCatalog161Test {
     }
     }
 
 
 
 
+  private void setViewExpectations(DBAccessor dbAccessor,
+                                   Capture<DBAccessor.DBColumnInfo> viewIconColumnCapture,
+                                   Capture<DBAccessor.DBColumnInfo> viewIcon64ColumnCapture)
+      throws SQLException {
+
+    dbAccessor.addColumn(eq("viewmain"),
+        capture(viewIconColumnCapture));
+
+    dbAccessor.addColumn(eq("viewmain"),
+        capture(viewIcon64ColumnCapture));
+  }
+
   private void setViewInstanceExpectations(DBAccessor dbAccessor,
   private void setViewInstanceExpectations(DBAccessor dbAccessor,
                                            Capture<DBAccessor.DBColumnInfo> labelColumnCapture,
                                            Capture<DBAccessor.DBColumnInfo> labelColumnCapture,
                                            Capture<DBAccessor.DBColumnInfo> descriptionColumnCapture,
                                            Capture<DBAccessor.DBColumnInfo> descriptionColumnCapture,
-                                           Capture<DBAccessor.DBColumnInfo> visibleColumnCapture)
+                                           Capture<DBAccessor.DBColumnInfo> visibleColumnCapture,
+                                           Capture<DBAccessor.DBColumnInfo> instanceIconColumnCapture,
+                                           Capture<DBAccessor.DBColumnInfo> instanceIcon64ColumnCapture)
       throws SQLException {
       throws SQLException {
 
 
     dbAccessor.addColumn(eq("viewinstance"),
     dbAccessor.addColumn(eq("viewinstance"),
@@ -253,12 +273,38 @@ public class UpgradeCatalog161Test {
 
 
     dbAccessor.addColumn(eq("viewinstance"),
     dbAccessor.addColumn(eq("viewinstance"),
         capture(visibleColumnCapture));
         capture(visibleColumnCapture));
+
+    dbAccessor.addColumn(eq("viewinstance"),
+        capture(instanceIconColumnCapture));
+
+    dbAccessor.addColumn(eq("viewinstance"),
+        capture(instanceIcon64ColumnCapture));
+  }
+
+  private void assertViewColumns(
+      Capture<DBAccessor.DBColumnInfo> viewIconColumnCapture,
+      Capture<DBAccessor.DBColumnInfo> viewIcon64ColumnCapture) {
+    DBAccessor.DBColumnInfo column  = viewIconColumnCapture.getValue();
+    assertEquals("icon", column.getName());
+    assertEquals(255, (int) column.getLength());
+    assertEquals(String.class, column.getType());
+    assertNull(column.getDefaultValue());
+    assertTrue(column.isNullable());
+
+    column = viewIcon64ColumnCapture.getValue();
+    assertEquals("icon64", column.getName());
+    assertEquals(255, (int) column.getLength());
+    assertEquals(String.class, column.getType());
+    assertNull(column.getDefaultValue());
+    assertTrue(column.isNullable());
   }
   }
 
 
   private void assertViewInstanceColumns(
   private void assertViewInstanceColumns(
       Capture<DBAccessor.DBColumnInfo> labelColumnCapture,
       Capture<DBAccessor.DBColumnInfo> labelColumnCapture,
       Capture<DBAccessor.DBColumnInfo> descriptionColumnCapture,
       Capture<DBAccessor.DBColumnInfo> descriptionColumnCapture,
-      Capture<DBAccessor.DBColumnInfo> visibleColumnCapture) {
+      Capture<DBAccessor.DBColumnInfo> visibleColumnCapture,
+      Capture<DBAccessor.DBColumnInfo> instanceIconColumnCapture,
+      Capture<DBAccessor.DBColumnInfo> instanceIcon64ColumnCapture) {
     DBAccessor.DBColumnInfo column = labelColumnCapture.getValue();
     DBAccessor.DBColumnInfo column = labelColumnCapture.getValue();
     assertEquals("label", column.getName());
     assertEquals("label", column.getName());
     assertEquals(255, (int) column.getLength());
     assertEquals(255, (int) column.getLength());
@@ -279,5 +325,19 @@ public class UpgradeCatalog161Test {
     assertEquals(Character.class, column.getType());
     assertEquals(Character.class, column.getType());
     assertNull(column.getDefaultValue());
     assertNull(column.getDefaultValue());
     assertTrue(column.isNullable());
     assertTrue(column.isNullable());
+
+    column = instanceIconColumnCapture.getValue();
+    assertEquals("icon", column.getName());
+    assertEquals(255, (int) column.getLength());
+    assertEquals(String.class, column.getType());
+    assertNull(column.getDefaultValue());
+    assertTrue(column.isNullable());
+
+    column = instanceIcon64ColumnCapture.getValue();
+    assertEquals("icon64", column.getName());
+    assertEquals(255, (int) column.getLength());
+    assertEquals(String.class, column.getType());
+    assertNull(column.getDefaultValue());
+    assertTrue(column.isNullable());
   }
   }
 }
 }

+ 18 - 0
ambari-server/src/test/java/org/apache/ambari/server/view/configuration/InstanceConfigTest.java

@@ -102,6 +102,24 @@ public class InstanceConfigTest {
     Assert.assertTrue(instances.get(2).isVisible());
     Assert.assertTrue(instances.get(2).isVisible());
   }
   }
 
 
+  @Test
+  public void testGetIcon() throws Exception {
+    List<InstanceConfig> instances = getInstanceConfigs();
+
+    Assert.assertEquals(2, instances.size());
+    Assert.assertEquals("/this/is/the/icon/url/instance_1_icon.png", instances.get(0).getIcon());
+    Assert.assertNull(instances.get(1).getIcon());
+  }
+
+  @Test
+  public void testGetIcon64() throws Exception {
+    List<InstanceConfig> instances = getInstanceConfigs();
+
+    Assert.assertEquals(2, instances.size());
+    Assert.assertEquals("/this/is/the/icon/url/instance_1_icon64.png", instances.get(0).getIcon64());
+    Assert.assertNull(instances.get(1).getIcon());
+  }
+
   @Test
   @Test
   public void testGetProperties() throws Exception {
   public void testGetProperties() throws Exception {
     List<InstanceConfig> instances = getInstanceConfigs();
     List<InstanceConfig> instances = getInstanceConfigs();

+ 16 - 0
ambari-server/src/test/java/org/apache/ambari/server/view/configuration/ViewConfigTest.java

@@ -46,6 +46,8 @@ public class ViewConfigTest {
       "    <name>MY_VIEW</name>\n" +
       "    <name>MY_VIEW</name>\n" +
       "    <label>My View!</label>\n" +
       "    <label>My View!</label>\n" +
       "    <version>1.0.0</version>\n" +
       "    <version>1.0.0</version>\n" +
+      "    <icon64>/this/is/the/icon/url/icon64.png</icon64>\n" +
+      "    <icon>/this/is/the/icon/url/icon.png</icon>\n" +
       "    <parameter>\n" +
       "    <parameter>\n" +
       "        <name>p1</name>\n" +
       "        <name>p1</name>\n" +
       "        <description>Parameter 1.</description>\n" +
       "        <description>Parameter 1.</description>\n" +
@@ -77,6 +79,8 @@ public class ViewConfigTest {
       "        <name>INSTANCE1</name>\n" +
       "        <name>INSTANCE1</name>\n" +
       "        <label>My Instance 1!</label>\n" +
       "        <label>My Instance 1!</label>\n" +
       "        <description>This is a description.</description>\n" +
       "        <description>This is a description.</description>\n" +
+      "        <icon64>/this/is/the/icon/url/instance_1_icon64.png</icon64>\n" +
+      "        <icon>/this/is/the/icon/url/instance_1_icon.png</icon>\n" +
       "        <property>\n" +
       "        <property>\n" +
       "            <key>p1</key>\n" +
       "            <key>p1</key>\n" +
       "            <value>v1-1</value>\n" +
       "            <value>v1-1</value>\n" +
@@ -128,6 +132,18 @@ public class ViewConfigTest {
     Assert.assertEquals("1.0.0", config.getVersion());
     Assert.assertEquals("1.0.0", config.getVersion());
   }
   }
 
 
+  @Test
+  public void testGetIcon() throws Exception {
+    ViewConfig config = getConfig();
+    Assert.assertEquals("/this/is/the/icon/url/icon.png", config.getIcon());
+  }
+
+  @Test
+  public void testGetIcon64() throws Exception {
+    ViewConfig config = getConfig();
+    Assert.assertEquals("/this/is/the/icon/url/icon64.png", config.getIcon64());
+  }
+
   @Test
   @Test
   public void testGetView() throws Exception {
   public void testGetView() throws Exception {
     ViewConfig config = getConfig(view_class_xml);
     ViewConfig config = getConfig(view_class_xml);