ambari-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From srima...@apache.org
Subject [2/2] ambari git commit: AMBARI-10702. Theme widgets should be merged from inherited theme (mpapirkovskyy via srimanth)
Date Thu, 23 Apr 2015 20:39:50 GMT
AMBARI-10702. Theme widgets should be merged from inherited theme (mpapirkovskyy via srimanth)


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

Branch: refs/heads/trunk
Commit: d8bff0381cf307672652bb402292f91465783670
Parents: 8adb1b0
Author: Srimanth Gunturi <sgunturi@hortonworks.com>
Authored: Thu Apr 23 13:39:33 2015 -0700
Committer: Srimanth Gunturi <sgunturi@hortonworks.com>
Committed: Thu Apr 23 13:39:33 2015 -0700

----------------------------------------------------------------------
 .../apache/ambari/server/stack/ThemeModule.java |  51 +-
 .../apache/ambari/server/state/ThemeInfo.java   |   8 +-
 .../server/state/theme/ConfigPlacement.java     |  58 +++
 .../ambari/server/state/theme/Layout.java       |  83 ++++
 .../ambari/server/state/theme/Placement.java    |  88 ++++
 .../ambari/server/state/theme/Section.java      | 183 ++++++++
 .../ambari/server/state/theme/Subsection.java   | 126 +++++
 .../apache/ambari/server/state/theme/Tab.java   |  74 +++
 .../ambari/server/state/theme/TabLayout.java    | 103 ++++
 .../apache/ambari/server/state/theme/Theme.java |  79 ++++
 .../server/state/theme/ThemeConfiguration.java  | 134 ++++++
 .../apache/ambari/server/state/theme/Unit.java  |  40 ++
 .../ambari/server/state/theme/Widget.java       |  52 ++
 .../ambari/server/state/theme/WidgetEntry.java  |  51 ++
 .../HDP/2.2/services/HBASE/themes/theme.json    | 469 +++++++++----------
 .../HDP/2.2/services/HDFS/themes/theme.json     | 177 ++++---
 .../HDP/2.2/services/HIVE/themes/theme.json     | 391 ++++++++--------
 .../2.2/services/YARN/themes-mapred/theme.json  | 134 +++---
 .../HDP/2.2/services/YARN/themes/theme.json     | 184 ++++----
 .../HDP/2.3/services/YARN/themes/theme.json     | 148 +-----
 .../ambari/server/stack/ThemeModuleTest.java    |  64 +--
 .../src/test/resources/child-theme.json         |  33 ++
 .../src/test/resources/parent-theme.json        | 241 ++++++++++
 ambari-web/app/mappers/configs/themes_mapper.js |   4 +-
 24 files changed, 2057 insertions(+), 918 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/stack/ThemeModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stack/ThemeModule.java b/ambari-server/src/main/java/org/apache/ambari/server/stack/ThemeModule.java
index 5b22dd9..85ce252 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/stack/ThemeModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/ThemeModule.java
@@ -19,8 +19,8 @@ package org.apache.ambari.server.stack;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.state.ThemeInfo;
+import org.apache.ambari.server.state.theme.Theme;
 import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.type.TypeReference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -39,6 +39,8 @@ public class ThemeModule extends BaseModule<ThemeModule, ThemeInfo> implements V
   private static final Logger LOG = LoggerFactory.getLogger(ThemeModule.class);
   private static final ObjectMapper mapper = new ObjectMapper();
 
+  public static final String THEME_KEY = "Theme";
+
   static {
   }
 
@@ -62,9 +64,9 @@ public class ThemeModule extends BaseModule<ThemeModule, ThemeInfo> implements V
         LOG.error("Theme file not found");
       }
       try {
-        TypeReference<HashMap<String, Object>> typeRef = new TypeReference<HashMap<String, Object>>() {
-        };
-        Map<String, Object> map = mapper.readValue(reader, typeRef);
+        Theme theme = mapper.readValue(reader, Theme.class);
+        Map<String, Theme> map = new HashMap<String, Theme>();
+        map.put(THEME_KEY, theme);
         moduleInfo.setThemeMap(map);
         LOG.debug("Loaded theme: {}", moduleInfo);
       } catch (IOException e) {
@@ -83,44 +85,15 @@ public class ThemeModule extends BaseModule<ThemeModule, ThemeInfo> implements V
   public void resolve(ThemeModule parent, Map<String, StackModule> allStacks, Map<String, ServiceModule> commonServices) throws AmbariException {
     ThemeInfo parentModuleInfo = parent.getModuleInfo();
 
-
-
     if (parent.getModuleInfo() != null && !moduleInfo.isDeleted()) {
-      moduleInfo.setThemeMap(mergedMap(parent.getModuleInfo().getThemeMap(), moduleInfo.getThemeMap()));
-    }
-  }
-
-  @SuppressWarnings("unchecked")
-  private Map<String, Object> mergedMap(Map<String, Object> parent, Map<String, Object> child) {
-    Map<String, Object> mergedMap = new HashMap<String, Object>();
-    if (parent == null) {
-      mergedMap = child;
-    }else if (child == null) {
-      mergedMap.putAll(parent);
-    } else {
-      mergedMap.putAll(parent);
-      for (Map.Entry<String, Object> entry : child.entrySet()) {
-        String key = entry.getKey();
-        Object childValue = entry.getValue();
-        if (childValue == null) {
-          mergedMap.remove(key);
-        }else if (!mergedMap.containsKey(key) || !(childValue instanceof Map)) {
-          //insert if absent, override if explicitly null, override primitives and arrays
-          mergedMap.put(key, childValue);
-        }else {
-          Object parentValue = mergedMap.get(key);
-          if (!(parentValue instanceof Map)) {
-            //override on type mismatch also
-            mergedMap.put(key, childValue);
-          } else {
-            mergedMap.put(key, mergedMap((Map<String, Object>)parentValue, (Map<String, Object>)childValue));
-          }
-        }
+      if (moduleInfo.getThemeMap() == null || moduleInfo.getThemeMap().isEmpty()) {
+        moduleInfo.setThemeMap(parentModuleInfo.getThemeMap());
+      } else if(parentModuleInfo.getThemeMap() != null && !parentModuleInfo.getThemeMap().isEmpty()) {
+        Theme childTheme = moduleInfo.getThemeMap().get(THEME_KEY);
+        Theme parentTheme = parentModuleInfo.getThemeMap().get(THEME_KEY);
+        childTheme.mergeWithParent(parentTheme);
       }
-
     }
-
-    return mergedMap;
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/ThemeInfo.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ThemeInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ThemeInfo.java
index 355fe25..855733a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ThemeInfo.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ThemeInfo.java
@@ -17,6 +17,8 @@
  */
 package org.apache.ambari.server.state;
 
+import org.apache.ambari.server.state.theme.Theme;
+
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
@@ -35,16 +37,16 @@ public class ThemeInfo {
   private Boolean deleted = false;
 
   @XmlTransient
-  private Map<String, Object> themeMap = null;
+  private Map<String, Theme> themeMap = null;
 
   public ThemeInfo() {
   }
 
-  public Map<String, Object> getThemeMap() {
+  public Map<String, Theme> getThemeMap() {
     return themeMap;
   }
 
-  public void setThemeMap(Map<String, Object> themeMap) {
+  public void setThemeMap(Map<String, Theme> themeMap) {
     this.themeMap = themeMap;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/ConfigPlacement.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/ConfigPlacement.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/ConfigPlacement.java
new file mode 100644
index 0000000..c20cd8e
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/ConfigPlacement.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.state.theme;
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ConfigPlacement {
+	@JsonProperty("config")
+	private String config;
+	@JsonProperty("subsection-name")
+	private String subsectionName;
+
+  public String getConfig() {
+    return config;
+  }
+
+  public void setConfig(String config) {
+    this.config = config;
+  }
+
+  public String getSubsectionName() {
+    return subsectionName;
+  }
+
+  public void setSubsectionName(String subsectionName) {
+    this.subsectionName = subsectionName;
+  }
+
+  public boolean isRemoved() {
+    return subsectionName == null;
+  }
+
+  public void mergeWithParent(ConfigPlacement parent) {
+    if (subsectionName == null) {
+      subsectionName = parent.subsectionName;
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Layout.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Layout.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Layout.java
new file mode 100644
index 0000000..66d1910
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Layout.java
@@ -0,0 +1,83 @@
+/*
+ * 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.state.theme;
+
+
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Layout{
+	@JsonProperty("name")
+	private String name;
+	@JsonProperty("tabs")
+	private List<Tab> tabs;
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public List<Tab> getTabs() {
+    return tabs;
+  }
+
+  public void setTabs(List<Tab> tabs) {
+    this.tabs = tabs;
+  }
+
+
+  public void mergeWithParent(Layout parentLayout) {
+    //merge Tabs only due to theme structure
+    tabs = mergeTabs(parentLayout.tabs, tabs);
+  }
+
+  private List<Tab> mergeTabs(List<Tab> parentTabs, List<Tab> childTabs) {
+    Map<String, Tab> mergedTabs = new HashMap<String, Tab>();
+    for (Tab parentTab : parentTabs) {
+      mergedTabs.put(parentTab.getName(), parentTab);
+    }
+
+    for (Tab childTab : childTabs) {
+      if (childTab.getName() != null) {
+        if (childTab.getDisplayName() == null && childTab.getTabLayout() == null) {
+          mergedTabs.remove(childTab.getName());
+        } else {
+          Tab parentTab = mergedTabs.get(childTab.getName());
+          childTab.mergeWithParent(parentTab);
+          mergedTabs.put(childTab.getName(), childTab);
+        }
+      }
+    }
+    return new ArrayList<Tab>(mergedTabs.values());
+  }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Placement.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Placement.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Placement.java
new file mode 100644
index 0000000..e3708d8
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Placement.java
@@ -0,0 +1,88 @@
+/*
+ * 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.state.theme;
+
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Placement{
+	@JsonProperty("configs")
+	private List<ConfigPlacement> configs;
+	@JsonProperty("configuration-layout")
+	private String configurationLayout;
+
+  public List<ConfigPlacement> getConfigs() {
+    return configs;
+  }
+
+  public void setConfigs(List<ConfigPlacement> configs) {
+    this.configs = configs;
+  }
+
+  public String getConfigurationLayout() {
+    return configurationLayout;
+  }
+
+  public void setConfigurationLayout(String configurationLayout) {
+    this.configurationLayout = configurationLayout;
+  }
+
+  public void mergeWithParent(Placement parent) {
+    if (configurationLayout == null) {
+      configurationLayout = parent.configurationLayout;
+    }
+
+    if (configs == null) {
+      configs = parent.configs;
+    }else if (parent.configs != null) {
+      configs = mergeConfigs(parent.configs, configs);
+    }
+
+  }
+
+  private List<ConfigPlacement> mergeConfigs(List<ConfigPlacement> parentConfigs, List<ConfigPlacement> childConfigs) {
+    Map<String, ConfigPlacement> mergedConfigPlacements = new HashMap<String, ConfigPlacement>();
+    for (ConfigPlacement parentConfigPlacement : parentConfigs) {
+      mergedConfigPlacements.put(parentConfigPlacement.getConfig(), parentConfigPlacement);
+    }
+
+    for (ConfigPlacement childConfigPlacement : childConfigs) {
+      if (childConfigPlacement.getConfig() != null) {
+        if (childConfigPlacement.isRemoved()) {
+          mergedConfigPlacements.remove(childConfigPlacement.getConfig());
+        } else {
+          ConfigPlacement parentConfigPlacement = mergedConfigPlacements.get(childConfigPlacement.getConfig());
+          childConfigPlacement.mergeWithParent(parentConfigPlacement);
+          mergedConfigPlacements.put(childConfigPlacement.getConfig(), childConfigPlacement);
+        }
+      }
+    }
+    return new ArrayList<ConfigPlacement>(mergedConfigPlacements.values());
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Section.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Section.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Section.java
new file mode 100644
index 0000000..87b954a
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Section.java
@@ -0,0 +1,183 @@
+/*
+ * 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.state.theme;
+
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Section {
+	@JsonProperty("subsections")
+	private List<Subsection> subsections;
+	@JsonProperty("display-name")
+	private String displayName;
+	@JsonProperty("row-index")
+	private String rowIndex;
+	@JsonProperty("section-rows")
+	private String sectionRows;
+	@JsonProperty("name")
+	private String name;
+	@JsonProperty("column-span")
+	private String columnSpan;
+	@JsonProperty("section-columns")
+	private String sectionColumns;
+	@JsonProperty("column-index")
+	private String columnIndex;
+	@JsonProperty("row-span")
+	private String rowSpan;
+
+  public List<Subsection> getSubsections() {
+    return subsections;
+  }
+
+  public void setSubsections(List<Subsection> subsections) {
+    this.subsections = subsections;
+  }
+
+  public String getDisplayName() {
+    return displayName;
+  }
+
+  public void setDisplayName(String displayName) {
+    this.displayName = displayName;
+  }
+
+  public String getRowIndex() {
+    return rowIndex;
+  }
+
+  public void setRowIndex(String rowIndex) {
+    this.rowIndex = rowIndex;
+  }
+
+  public String getSectionRows() {
+    return sectionRows;
+  }
+
+  public void setSectionRows(String sectionRows) {
+    this.sectionRows = sectionRows;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getColumnSpan() {
+    return columnSpan;
+  }
+
+  public void setColumnSpan(String columnSpan) {
+    this.columnSpan = columnSpan;
+  }
+
+  public String getSectionColumns() {
+    return sectionColumns;
+  }
+
+  public void setSectionColumns(String sectionColumns) {
+    this.sectionColumns = sectionColumns;
+  }
+
+  public String getColumnIndex() {
+    return columnIndex;
+  }
+
+  public void setColumnIndex(String columnIndex) {
+    this.columnIndex = columnIndex;
+  }
+
+  public String getRowSpan() {
+    return rowSpan;
+  }
+
+  public void setRowSpan(String rowSpan) {
+    this.rowSpan = rowSpan;
+  }
+
+  public boolean isRemoved() {
+    return columnIndex == null && columnSpan == null &&
+      subsections == null && displayName == null &&
+      rowIndex == null && rowSpan == null &&
+      sectionRows == null && sectionColumns == null;
+  }
+
+  public void mergeWithParent(Section parentSection) {
+    if (displayName == null) {
+      displayName = parentSection.displayName;
+    }
+    if (rowIndex == null) {
+      rowIndex = parentSection.rowIndex;
+    }
+    if (rowSpan == null) {
+      rowSpan = parentSection.rowSpan;
+    }
+    if (sectionRows == null) {
+      sectionRows = parentSection.sectionRows;
+    }
+    if (columnIndex == null) {
+      columnIndex = parentSection.columnIndex;
+    }
+    if (columnSpan == null) {
+      columnSpan = parentSection.columnSpan;
+    }
+    if (sectionColumns == null) {
+      sectionColumns = parentSection.sectionColumns;
+    }
+    if (subsections == null) {
+      subsections = parentSection.subsections;
+    }else if (parentSection.subsections != null) {
+      subsections = mergeSubsections(parentSection.subsections, subsections);
+    }
+  }
+
+  private List<Subsection> mergeSubsections(List<Subsection> parentSubsections, List<Subsection> childSubsections) {
+
+    Map<String, Subsection> mergedSubsections = new HashMap<String, Subsection>();
+    for (Subsection parentSubsection : parentSubsections) {
+      mergedSubsections.put(parentSubsection.getName(), parentSubsection);
+    }
+
+    for (Subsection childSubsection : childSubsections) {
+      if (childSubsection.getName() != null) {
+        if (childSubsection.isRemoved()) {
+          mergedSubsections.remove(childSubsection.getName());
+        } else {
+          Subsection parentSection = mergedSubsections.get(childSubsection.getName());
+          childSubsection.mergeWithParent(parentSection);
+          mergedSubsections.put(childSubsection.getName(), childSubsection);
+        }
+      }
+    }
+    return new ArrayList<Subsection>(mergedSubsections.values());
+
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Subsection.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Subsection.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Subsection.java
new file mode 100644
index 0000000..b86b51f
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Subsection.java
@@ -0,0 +1,126 @@
+/*
+ * 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.state.theme;
+
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+
+@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Subsection {
+	@JsonProperty("row-index")
+	private String rowIndex;
+	@JsonProperty("name")
+	private String name;
+  @JsonProperty("display-name")
+	private String displayName;
+	@JsonProperty("column-span")
+	private String columnSpan;
+	@JsonProperty("row-span")
+	private String rowSpan;
+	@JsonProperty("column-index")
+	private String columnIndex;
+  @JsonProperty("border")
+	private String border;
+
+
+  public String getRowIndex() {
+    return rowIndex;
+  }
+
+  public void setRowIndex(String rowIndex) {
+    this.rowIndex = rowIndex;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getColumnSpan() {
+    return columnSpan;
+  }
+
+  public void setColumnSpan(String columnSpan) {
+    this.columnSpan = columnSpan;
+  }
+
+  public String getRowSpan() {
+    return rowSpan;
+  }
+
+  public void setRowSpan(String rowSpan) {
+    this.rowSpan = rowSpan;
+  }
+
+  public String getColumnIndex() {
+    return columnIndex;
+  }
+
+  public void setColumnIndex(String columnIndex) {
+    this.columnIndex = columnIndex;
+  }
+
+  public String getDisplayName() {
+    return displayName;
+  }
+
+  public void setDisplayName(String displayName) {
+    this.displayName = displayName;
+  }
+
+  public String getBorder() {
+    return border;
+  }
+
+  public void setBorder(String border) {
+    this.border = border;
+  }
+
+  public boolean isRemoved() {
+    return rowIndex == null && rowSpan == null && columnIndex == null && columnSpan == null;
+  }
+
+  public void mergeWithParent(Subsection parent) {
+    if (rowSpan == null) {
+      rowSpan = parent.rowSpan;
+    }
+    if (rowIndex == null) {
+      rowIndex = parent.rowIndex;
+    }
+    if (columnSpan == null) {
+      columnSpan = parent.columnSpan;
+    }
+    if (columnIndex == null) {
+      columnIndex = parent.columnIndex;
+    }
+    if (displayName == null) {
+      displayName = parent.displayName;
+    }
+    if (border == null) {
+      border = parent.border;
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Tab.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Tab.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Tab.java
new file mode 100644
index 0000000..b949a12
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Tab.java
@@ -0,0 +1,74 @@
+/*
+ * 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.state.theme;
+
+
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+
+@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Tab {
+	@JsonProperty("display-name")
+	private String displayName;
+	@JsonProperty("name")
+	private String name;
+	@JsonProperty("layout")
+	private TabLayout tabLayout;
+
+  public String getDisplayName() {
+    return displayName;
+  }
+
+  public void setDisplayName(String displayName) {
+    this.displayName = displayName;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public TabLayout getTabLayout() {
+    return tabLayout;
+  }
+
+  public void setTabLayout(TabLayout tabLayout) {
+    this.tabLayout = tabLayout;
+  }
+
+  public void mergeWithParent(Tab parentTab) {
+    // null name is not expected due to theme structure
+
+    if (displayName == null) {
+      displayName = parentTab.displayName;
+    }
+    if (tabLayout == null) {
+      tabLayout = parentTab.tabLayout;
+    } else {
+      tabLayout.mergeWithParent(parentTab.tabLayout);
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/TabLayout.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/TabLayout.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/TabLayout.java
new file mode 100644
index 0000000..d92c04d
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/TabLayout.java
@@ -0,0 +1,103 @@
+/*
+ * 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.state.theme;
+
+
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class TabLayout {
+	@JsonProperty("tab-rows")
+	private String tabRows;
+	@JsonProperty("sections")
+	private List<Section> sections;
+	@JsonProperty("tab-columns")
+	private String tabColumns;
+
+  public String getTabRows() {
+    return tabRows;
+  }
+
+  public void setTabRows(String tabRows) {
+    this.tabRows = tabRows;
+  }
+
+  public List<Section> getSections() {
+    return sections;
+  }
+
+  public void setSections(List<Section> sections) {
+    this.sections = sections;
+  }
+
+  public String getTabColumns() {
+    return tabColumns;
+  }
+
+  public void setTabColumns(String tabColumns) {
+    this.tabColumns = tabColumns;
+  }
+
+  public void mergeWithParent(TabLayout parent) {
+    if (tabColumns == null) {
+      tabColumns = parent.tabColumns;
+    }
+    
+    if (tabRows == null) {
+      tabRows = parent.tabRows;
+    }
+
+    if (sections == null) {
+      sections = parent.sections;
+    }else if (parent.sections != null) {
+      sections = mergedSections(parent.sections, sections);
+    }
+  }
+
+  private List<Section> mergedSections(List<Section> parentSections, List<Section> childSections) {
+    Map<String, Section> mergedSections = new HashMap<String, Section>();
+    for (Section parentSection : parentSections) {
+      mergedSections.put(parentSection.getName(), parentSection);
+    }
+
+    for (Section childSection : childSections) {
+      if (childSection.getName() != null) {
+        if (childSection.isRemoved()) {
+          mergedSections.remove(childSection.getName());
+        } else {
+          Section parentSection = mergedSections.get(childSection.getName());
+          childSection.mergeWithParent(parentSection);
+          mergedSections.put(childSection.getName(), childSection);
+        }
+      }
+    }
+    return new ArrayList<Section>(mergedSections.values());
+
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Theme.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Theme.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Theme.java
new file mode 100644
index 0000000..96d2fc0
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Theme.java
@@ -0,0 +1,79 @@
+/*
+ * 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.state.theme;
+
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Theme{
+	@JsonProperty("description")
+	private String description;
+	@JsonProperty("name")
+	private String name;
+  @JsonProperty("configuration")
+	private ThemeConfiguration themeConfiguration;
+
+  public String getDescription() {
+    return description;
+  }
+
+  public void setDescription(String description) {
+    this.description = description;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public ThemeConfiguration getThemeConfiguration() {
+    return themeConfiguration;
+  }
+
+  public void setThemeConfiguration(ThemeConfiguration themeConfiguration) {
+    this.themeConfiguration = themeConfiguration;
+  }
+
+  public void mergeWithParent(Theme parent) {
+    if (parent == null) {
+      return;
+    }
+
+    if (name == null) {
+      name = parent.name;
+    }
+
+    if (description == null) {
+      description = parent.description;
+    }
+
+    if (themeConfiguration == null) {
+      themeConfiguration = parent.themeConfiguration;
+    } else {
+      themeConfiguration.mergeWithParent(parent.themeConfiguration);
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/ThemeConfiguration.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/ThemeConfiguration.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/ThemeConfiguration.java
new file mode 100644
index 0000000..a0d8907
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/ThemeConfiguration.java
@@ -0,0 +1,134 @@
+/*
+ * 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.state.theme;
+
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ThemeConfiguration{
+	@JsonProperty("placement")
+	private Placement placement;
+	@JsonProperty("widgets")
+	private List<WidgetEntry> widgets;
+	@JsonProperty("layouts")
+	private List<Layout> layouts;
+
+  public Placement getPlacement() {
+    return placement;
+  }
+
+  public void setPlacement(Placement placement) {
+    this.placement = placement;
+  }
+
+  public List<WidgetEntry> getWidgets() {
+    return widgets;
+  }
+
+  public void setWidgets(List<WidgetEntry> widgets) {
+    this.widgets = widgets;
+  }
+
+  public List<Layout> getLayouts() {
+    return layouts;
+  }
+
+  public void setLayouts(List<Layout> layouts) {
+    this.layouts = layouts;
+  }
+
+  public void mergeWithParent(ThemeConfiguration parent) {
+    if (parent == null) {
+      return;
+    }
+
+    if (placement == null) {
+      placement = parent.placement;
+    } else {
+      placement.mergeWithParent(parent.placement);
+    }
+
+    if (widgets == null) {
+      widgets = parent.widgets;
+    } else if (parent.widgets != null) {
+      widgets = mergeWidgets(parent.widgets, widgets);
+    }
+
+    if (layouts == null) {
+      layouts = parent.layouts;
+    } else if (parent.layouts != null) {
+      layouts = mergeLayouts(parent.layouts, layouts);
+    }
+
+
+  }
+
+  private List<Layout> mergeLayouts(List<Layout> parentLayouts, List<Layout> childLayouts) {
+    Map<String, Layout> mergedLayouts = new HashMap<String, Layout>();
+
+    for (Layout parentLayout : parentLayouts) {
+      mergedLayouts.put(parentLayout.getName(), parentLayout);
+    }
+
+    for (Layout childLayout : childLayouts) {
+      if (childLayout.getName() != null) { //skip invalid entries
+        if (childLayout.getTabs() == null) {
+          mergedLayouts.remove(childLayout.getName());
+        } else {
+          Layout parentLayout = mergedLayouts.get(childLayout.getName());
+          childLayout.mergeWithParent(parentLayout);
+          mergedLayouts.put(childLayout.getName(), childLayout);
+        }
+      }
+    }
+
+    return new ArrayList<Layout>(mergedLayouts.values());
+
+  }
+
+  private List<WidgetEntry> mergeWidgets(List<WidgetEntry> parentWidgets, List<WidgetEntry> childWidgets) {
+    Map<String, WidgetEntry> mergedWidgets = new HashMap<String, WidgetEntry>();
+    for (WidgetEntry widgetEntry : parentWidgets) {
+      mergedWidgets.put(widgetEntry.getConfig(), widgetEntry);
+    }
+
+    for (WidgetEntry widgetEntry : childWidgets) {
+      if (widgetEntry.getConfig() != null) { //skip invalid entries
+        if (widgetEntry.getWidget() == null) {
+          mergedWidgets.remove(widgetEntry.getConfig());
+        } else {
+          mergedWidgets.put(widgetEntry.getConfig(), widgetEntry);
+        }
+      }
+
+    }
+
+    return new ArrayList<WidgetEntry>(mergedWidgets.values());
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Unit.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Unit.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Unit.java
new file mode 100644
index 0000000..7bd058c
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Unit.java
@@ -0,0 +1,40 @@
+/*
+ * 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.state.theme;
+
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+
+@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Unit {
+	@JsonProperty("unit-name")
+	private String unitName;
+
+  public String getUnitName() {
+    return unitName;
+  }
+
+  public void setUnitName(String unitName) {
+    this.unitName = unitName;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Widget.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Widget.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Widget.java
new file mode 100644
index 0000000..7b1e09c
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Widget.java
@@ -0,0 +1,52 @@
+/*
+ * 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.state.theme;
+
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import java.util.List;
+
+
+@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Widget{
+	@JsonProperty("type")
+	private String type;
+	@JsonProperty("units")
+	private List<Unit> units;
+
+  public String getType() {
+    return type;
+  }
+
+  public void setType(String type) {
+    this.type = type;
+  }
+
+  public List<Unit> getUnits() {
+    return units;
+  }
+
+  public void setUnits(List<Unit> units) {
+    this.units = units;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/WidgetEntry.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/WidgetEntry.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/WidgetEntry.java
new file mode 100644
index 0000000..9e9c068
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/WidgetEntry.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.state.theme;
+
+
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+
+@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class WidgetEntry {
+	@JsonProperty("config")
+	private String config;
+	@JsonProperty("widget")
+	private Widget widget;
+
+  public String getConfig() {
+    return config;
+  }
+
+  public void setConfig(String config) {
+    this.config = config;
+  }
+
+  public Widget getWidget() {
+    return widget;
+  }
+
+  public void setWidget(Widget widget) {
+    this.widget = widget;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/resources/stacks/HDP/2.2/services/HBASE/themes/theme.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/services/HBASE/themes/theme.json b/ambari-server/src/main/resources/stacks/HDP/2.2/services/HBASE/themes/theme.json
index d5917c0..f62300d 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/services/HBASE/themes/theme.json
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/services/HBASE/themes/theme.json
@@ -1,161 +1,159 @@
 {
-  "Theme": {
-    "name": "default",
-    "description": "Default theme for HBASE service",
-    "configuration": {
-      "layouts": [
-        {
-          "name": "default",
-          "tabs": [
-            {
-              "name": "settings",
-              "display-name": "Settings",
-              "layout": {
-                "tab-columns": "3",
-                "tab-rows": "3",
-                "sections": [
-                  {
-                    "name": "section-hbase-memory",
-                    "display-name": "Server",
-                    "row-index": "0",
-                    "column-index": "0",
-                    "row-span": "1",
-                    "column-span": "2",
-                    "section-columns": "2",
-                    "section-rows": "1",
-                    "subsections": [
-                      {
-                        "name": "subsection-hbase-memory-col1",
-                        "row-index": "0",
-                        "column-index": "0",
-                        "row-span": "1",
-                        "column-span": "1"
-                      },
-                      {
-                        "name": "subsection-hbase-memory-col2",
-                        "row-index": "0",
-                        "column-index": "1",
-                        "row-span": "1",
-                        "column-span": "1"
-                      }
-                    ]
-                  },
-                  {
-                    "name": "section-hbase-client",
-                    "display-name": "Client",
-                    "row-index": "0",
-                    "column-index": "2",
-                    "row-span": "1",
-                    "column-span": "1",
-                    "section-columns": "1",
-                    "section-rows": "1",
-                    "subsections": [
-                      {
-                        "name": "subsection-hbase-client-col1",
-                        "row-index": "0",
-                        "column-index": "0",
-                        "row-span": "1",
-                        "column-span": "1"
-                      }
-                    ]
-                  },
-                  {
-                    "name": "section-hbase-disk",
-                    "display-name": "Disk",
-                    "row-index": "1",
-                    "column-index": "0",
-                    "row-span": "1",
-                    "column-span": "3",
-                    "section-columns": "3",
-                    "section-rows": "1",
-                    "subsections": [
-                      {
-                        "name": "subsection-hbase-disk-col1",
-                        "row-index": "0",
-                        "column-index": "0",
-                        "row-span": "1",
-                        "column-span": "1"
-                      },
-                      {
-                        "name": "subsection-hbase-disk-col2",
-                        "row-index": "0",
-                        "column-index": "1",
-                        "row-span": "1",
-                        "column-span": "1"
-                      },
-                      {
-                        "name": "subsection-hbase-disk-col3",
-                        "row-index": "0",
-                        "column-index": "2",
-                        "row-span": "1",
-                        "column-span": "1"
-                      }
-                    ]
-                  },
-                  {
-                    "name": "section-hbase-timeouts",
-                    "display-name": "Timeouts",
-                    "row-index": "2",
-                    "column-index": "0",
-                    "row-span": "1",
-                    "column-span": "1",
-                    "section-columns": "1",
-                    "section-rows": "1",
-                    "subsections": [
-                      {
-                        "name": "subsection-hbase-timeouts-col1",
-                        "row-index": "0",
-                        "column-index": "0",
-                        "row-span": "1",
-                        "column-span": "1"
-                      }
-                    ]
-                  },
-                  {
-                    "name": "section-hbase-security",
-                    "display-name": "Security",
-                    "row-index": "2",
-                    "column-index": "1",
-                    "row-span": "1",
-                    "column-span": "1",
-                    "section-columns": "1",
-                    "section-rows": "1",
-                    "subsections": [
-                      {
-                        "name": "subsection-hbase-security-col1",
-                        "row-index": "0",
-                        "column-index": "0",
-                        "row-span": "1",
-                        "column-span": "1"
-                      }
-                    ]
-                  },
-                  {
-                    "name": "section-hbase-phoenix",
-                    "display-name": "Phoenix SQL",
-                    "row-index": "2",
-                    "column-index": "2",
-                    "row-span": "1",
-                    "column-span": "1",
-                    "section-columns": "1",
-                    "section-rows": "1",
-                    "subsections": [
-                      {
-                        "name": "subsection-hbase-phoenix-col1",
-                        "row-index": "0",
-                        "column-index": "0",
-                        "row-span": "1",
-                        "column-span": "1"
-                      }
-                    ]
-                  }
-                ]
-              }
+  "name": "default",
+  "description": "Default theme for HBASE service",
+  "configuration": {
+    "layouts": [
+      {
+        "name": "default",
+        "tabs": [
+          {
+            "name": "settings",
+            "display-name": "Settings",
+            "layout": {
+              "tab-columns": "3",
+              "tab-rows": "3",
+              "sections": [
+                {
+                  "name": "section-hbase-memory",
+                  "display-name": "Server",
+                  "row-index": "0",
+                  "column-index": "0",
+                  "row-span": "1",
+                  "column-span": "2",
+                  "section-columns": "2",
+                  "section-rows": "1",
+                  "subsections": [
+                    {
+                      "name": "subsection-hbase-memory-col1",
+                      "row-index": "0",
+                      "column-index": "0",
+                      "row-span": "1",
+                      "column-span": "1"
+                    },
+                    {
+                      "name": "subsection-hbase-memory-col2",
+                      "row-index": "0",
+                      "column-index": "1",
+                      "row-span": "1",
+                      "column-span": "1"
+                    }
+                  ]
+                },
+                {
+                  "name": "section-hbase-client",
+                  "display-name": "Client",
+                  "row-index": "0",
+                  "column-index": "2",
+                  "row-span": "1",
+                  "column-span": "1",
+                  "section-columns": "1",
+                  "section-rows": "1",
+                  "subsections": [
+                    {
+                      "name": "subsection-hbase-client-col1",
+                      "row-index": "0",
+                      "column-index": "0",
+                      "row-span": "1",
+                      "column-span": "1"
+                    }
+                  ]
+                },
+                {
+                  "name": "section-hbase-disk",
+                  "display-name": "Disk",
+                  "row-index": "1",
+                  "column-index": "0",
+                  "row-span": "1",
+                  "column-span": "3",
+                  "section-columns": "3",
+                  "section-rows": "1",
+                  "subsections": [
+                    {
+                      "name": "subsection-hbase-disk-col1",
+                      "row-index": "0",
+                      "column-index": "0",
+                      "row-span": "1",
+                      "column-span": "1"
+                    },
+                    {
+                      "name": "subsection-hbase-disk-col2",
+                      "row-index": "0",
+                      "column-index": "1",
+                      "row-span": "1",
+                      "column-span": "1"
+                    },
+                    {
+                      "name": "subsection-hbase-disk-col3",
+                      "row-index": "0",
+                      "column-index": "2",
+                      "row-span": "1",
+                      "column-span": "1"
+                    }
+                  ]
+                },
+                {
+                  "name": "section-hbase-timeouts",
+                  "display-name": "Timeouts",
+                  "row-index": "2",
+                  "column-index": "0",
+                  "row-span": "1",
+                  "column-span": "1",
+                  "section-columns": "1",
+                  "section-rows": "1",
+                  "subsections": [
+                    {
+                      "name": "subsection-hbase-timeouts-col1",
+                      "row-index": "0",
+                      "column-index": "0",
+                      "row-span": "1",
+                      "column-span": "1"
+                    }
+                  ]
+                },
+                {
+                  "name": "section-hbase-security",
+                  "display-name": "Security",
+                  "row-index": "2",
+                  "column-index": "1",
+                  "row-span": "1",
+                  "column-span": "1",
+                  "section-columns": "1",
+                  "section-rows": "1",
+                  "subsections": [
+                    {
+                      "name": "subsection-hbase-security-col1",
+                      "row-index": "0",
+                      "column-index": "0",
+                      "row-span": "1",
+                      "column-span": "1"
+                    }
+                  ]
+                },
+                {
+                  "name": "section-hbase-phoenix",
+                  "display-name": "Phoenix SQL",
+                  "row-index": "2",
+                  "column-index": "2",
+                  "row-span": "1",
+                  "column-span": "1",
+                  "section-columns": "1",
+                  "section-rows": "1",
+                  "subsections": [
+                    {
+                      "name": "subsection-hbase-phoenix-col1",
+                      "row-index": "0",
+                      "column-index": "0",
+                      "row-span": "1",
+                      "column-span": "1"
+                    }
+                  ]
+                }
+              ]
             }
-          ]
-        }
-      ]
-    },
+          }
+        ]
+      }
+    ],
     "placement": {
       "configuration-layout": "default",
       "configs": [
@@ -233,173 +231,173 @@
         }
       ]
     },
-    "widgets":[
+    "widgets": [
       {
-        "config":"hbase-env/hbase_master_heapsize",
-        "widget":{
-          "type":"slider",
-          "units":[
+        "config": "hbase-env/hbase_master_heapsize",
+        "widget": {
+          "type": "slider",
+          "units": [
             {
-              "unit-name":"GB"
+              "unit-name": "GB"
             }
           ]
         }
       },
       {
-        "config":"hbase-env/hbase_regionserver_heapsize",
-        "widget":{
-          "type":"slider",
-          "units":[
+        "config": "hbase-env/hbase_regionserver_heapsize",
+        "widget": {
+          "type": "slider",
+          "units": [
             {
-              "unit-name":"GB"
+              "unit-name": "GB"
             }
           ]
         }
       },
       {
-        "config":"hbase-site/hfile.block.cache.size",
-        "widget":{
-          "type":"slider",
-          "units":[
+        "config": "hbase-site/hfile.block.cache.size",
+        "widget": {
+          "type": "slider",
+          "units": [
             {
-              "unit-name":"percent"
+              "unit-name": "percent"
             }
           ]
         }
       },
       {
-        "config":"hbase-site/hbase.regionserver.global.memstore.upperLimit",
-        "widget":{
-          "type":"slider",
-          "units":[
+        "config": "hbase-site/hbase.regionserver.global.memstore.upperLimit",
+        "widget": {
+          "type": "slider",
+          "units": [
             {
-              "unit-name":"percent"
+              "unit-name": "percent"
             }
           ]
         }
       },
       {
-        "config":"hbase-site/hbase.hregion.memstore.flush.size",
-        "widget":{
-          "type":"slider",
-          "units":[
+        "config": "hbase-site/hbase.hregion.memstore.flush.size",
+        "widget": {
+          "type": "slider",
+          "units": [
             {
-              "unit-name":"MB"
+              "unit-name": "MB"
             }
           ]
         }
       },
       {
-        "config":"hbase-site/hbase.hregion.memstore.block.multiplier",
-        "widget":{
-          "type":"combo"
+        "config": "hbase-site/hbase.hregion.memstore.block.multiplier",
+        "widget": {
+          "type": "combo"
         }
       },
       {
-        "config":"hbase-site/hbase.regionserver.handler.count",
-        "widget":{
-          "type":"slider",
-          "units":[
+        "config": "hbase-site/hbase.regionserver.handler.count",
+        "widget": {
+          "type": "slider",
+          "units": [
             {
-              "unit-name":"int"
+              "unit-name": "int"
             }
           ]
         }
       },
       {
-        "config":"hbase-site/hbase.client.retries.number",
-        "widget":{
-          "type":"slider",
-          "units":[
+        "config": "hbase-site/hbase.client.retries.number",
+        "widget": {
+          "type": "slider",
+          "units": [
             {
-              "unit-name":"int"
+              "unit-name": "int"
             }
           ]
         }
       },
       {
-        "config":"hbase-site/hbase.client.keyvalue.maxsize",
-        "widget":{
-          "type":"slider",
-          "units":[
+        "config": "hbase-site/hbase.client.keyvalue.maxsize",
+        "widget": {
+          "type": "slider",
+          "units": [
             {
-              "unit-name":"MB"
+              "unit-name": "MB"
             }
           ]
         }
       },
       {
-        "config":"hbase-site/hbase.hregion.max.filesize",
-        "widget":{
-          "type":"slider",
-          "units":[
+        "config": "hbase-site/hbase.hregion.max.filesize",
+        "widget": {
+          "type": "slider",
+          "units": [
             {
-              "unit-name":"GB"
+              "unit-name": "GB"
             }
           ]
         }
       },
       {
-        "config":"hbase-site/hbase.hregion.majorcompaction",
-        "widget":{
-          "type":"time-interval-spinner",
-          "units":[
+        "config": "hbase-site/hbase.hregion.majorcompaction",
+        "widget": {
+          "type": "time-interval-spinner",
+          "units": [
             {
-              "unit-name":"days,hours"
+              "unit-name": "days,hours"
             }
           ]
         }
       },
       {
-        "config":"hbase-site/hbase.hstore.compactionThreshold",
-        "widget":{
-          "type":"combo"
+        "config": "hbase-site/hbase.hstore.compactionThreshold",
+        "widget": {
+          "type": "combo"
         }
       },
       {
-        "config":"hbase-site/zookeeper.session.timeout",
-        "widget":{
-          "type":"time-interval-spinner",
-          "units":[
+        "config": "hbase-site/zookeeper.session.timeout",
+        "widget": {
+          "type": "time-interval-spinner",
+          "units": [
             {
-              "unit-name":"minutes,seconds"
+              "unit-name": "minutes,seconds"
             }
           ]
         }
       },
       {
-        "config":"hbase-site/hbase.rpc.timeout",
-        "widget":{
-          "type":"time-interval-spinner",
-          "units":[
+        "config": "hbase-site/hbase.rpc.timeout",
+        "widget": {
+          "type": "time-interval-spinner",
+          "units": [
             {
-              "unit-name":"minutes,seconds"
+              "unit-name": "minutes,seconds"
             }
           ]
         }
       },
       {
-        "config":"hbase-site/hbase.security.authentication",
-        "widget":{
-          "type":"toggle"
+        "config": "hbase-site/hbase.security.authentication",
+        "widget": {
+          "type": "toggle"
         }
       },
       {
-        "config":"hbase-site/hbase.security.authorization",
-        "widget":{
-          "type":"checkbox"
+        "config": "hbase-site/hbase.security.authorization",
+        "widget": {
+          "type": "checkbox"
         }
       },
       {
-        "config":"hbase-env/phoenix_sql_enabled",
-        "widget":{
-          "type":"checkbox"
+        "config": "hbase-env/phoenix_sql_enabled",
+        "widget": {
+          "type": "checkbox"
         }
       },
       {
-        "config":"hbase-site/phoenix.query.timeoutMs",
-        "widget":{
-          "type":"time-interval-spinner",
+        "config": "hbase-site/phoenix.query.timeoutMs",
+        "widget": {
+          "type": "time-interval-spinner",
           "units": [
             {
               "unit-name": "minutes,seconds"
@@ -410,3 +408,4 @@
     ]
   }
 }
+

http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/resources/stacks/HDP/2.2/services/HDFS/themes/theme.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/services/HDFS/themes/theme.json b/ambari-server/src/main/resources/stacks/HDP/2.2/services/HDFS/themes/theme.json
index bcffd0f..84e61d1 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/services/HDFS/themes/theme.json
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/services/HDFS/themes/theme.json
@@ -1,64 +1,62 @@
 {
-  "Theme": {
-    "name": "default",
-    "description": "Default theme for HDFS service",
-    "configuration": {
-      "layouts": [
-        {
-          "name": "default",
-          "tabs": [
-            {
-              "name": "settings",
-              "display-name": "Settings",
-              "layout": {
-                "tab-columns": "2",
-                "tab-rows": "1",
-                "sections": [
-                  {
-                    "name": "section-namenode",
-                    "display-name": "NameNode",
-                    "row-index": "0",
-                    "column-index": "0",
-                    "row-span": "1",
-                    "column-span": "1",
-                    "section-columns": "1",
-                    "section-rows": "1",
-                    "subsections": [
-                      {
-                        "name": "subsection-namenode-col1",
-                        "row-index": "0",
-                        "column-index": "0",
-                        "row-span": "1",
-                        "column-span": "1"
-                      }
-                    ]
-                  },
-                  {
-                    "name": "section-datanode",
-                    "display-name": "DataNode",
-                    "row-index": "0",
-                    "column-index": "1",
-                    "row-span": "1",
-                    "column-span": "1",
-                    "section-columns": "1",
-                    "section-rows": "1",
-                    "subsections": [
-                      {
-                        "name": "subsection-datanode-col1",
-                        "row-index": "0",
-                        "column-index": "0",
-                        "row-span": "1",
-                        "column-span": "1"
-                      }
-                    ]
-                  }
-                ]
-              }
+  "name": "default",
+  "description": "Default theme for HDFS service",
+  "configuration": {
+    "layouts": [
+      {
+        "name": "default",
+        "tabs": [
+          {
+            "name": "settings",
+            "display-name": "Settings",
+            "layout": {
+              "tab-columns": "2",
+              "tab-rows": "1",
+              "sections": [
+                {
+                  "name": "section-namenode",
+                  "display-name": "NameNode",
+                  "row-index": "0",
+                  "column-index": "0",
+                  "row-span": "1",
+                  "column-span": "1",
+                  "section-columns": "1",
+                  "section-rows": "1",
+                  "subsections": [
+                    {
+                      "name": "subsection-namenode-col1",
+                      "row-index": "0",
+                      "column-index": "0",
+                      "row-span": "1",
+                      "column-span": "1"
+                    }
+                  ]
+                },
+                {
+                  "name": "section-datanode",
+                  "display-name": "DataNode",
+                  "row-index": "0",
+                  "column-index": "1",
+                  "row-span": "1",
+                  "column-span": "1",
+                  "section-columns": "1",
+                  "section-rows": "1",
+                  "subsections": [
+                    {
+                      "name": "subsection-datanode-col1",
+                      "row-index": "0",
+                      "column-index": "0",
+                      "row-span": "1",
+                      "column-span": "1"
+                    }
+                  ]
+                }
+              ]
             }
-          ]
-        }
-      ]
-    },
+          }
+        ]
+      }
+    ],
     "placement": {
       "configuration-layout": "default",
       "configs": [
@@ -96,76 +94,76 @@
         }
       ]
     },
-    "widgets":[
+    "widgets": [
       {
-        "config":"hdfs-site/dfs.namenode.name.dir",
-        "widget":{
-          "type":"directories"
+        "config": "hdfs-site/dfs.namenode.name.dir",
+        "widget": {
+          "type": "directories"
         }
       },
       {
-        "config":"hdfs-site/dfs.namenode.safemode.threshold-pct",
-        "widget":{
-          "type":"toggle"
+        "config": "hdfs-site/dfs.namenode.safemode.threshold-pct",
+        "widget": {
+          "type": "toggle"
         }
       },
       {
-        "config":"hdfs-site/dfs.namenode.handler.count",
-        "widget":{
-          "type":"slider",
-          "units":[
+        "config": "hdfs-site/dfs.namenode.handler.count",
+        "widget": {
+          "type": "slider",
+          "units": [
             {
-              "unit-name":"int"
+              "unit-name": "int"
             }
           ]
         }
       },
       {
         "config": "hadoop-env/namenode_heapsize",
-        "widget":{
-          "type":"slider",
-          "units":[
+        "widget": {
+          "type": "slider",
+          "units": [
             {
-              "unit-name":"GB"
+              "unit-name": "GB"
             }
           ]
         }
       },
       {
         "config": "hdfs-site/dfs.datanode.failed.volumes.tolerated",
-        "widget":{
-          "type":"slider",
-          "units":[
+        "widget": {
+          "type": "slider",
+          "units": [
             {
-              "unit-name":"int"
+              "unit-name": "int"
             }
           ]
         }
       },
       {
         "config": "hdfs-site/dfs.datanode.data.dir",
-        "widget":{
-          "type":"directories"
+        "widget": {
+          "type": "directories"
         }
       },
       {
         "config": "hadoop-env/dtnode_heapsize",
-        "widget":{
-          "type":"slider",
-          "units":[
+        "widget": {
+          "type": "slider",
+          "units": [
             {
-              "unit-name":"GB"
+              "unit-name": "GB"
             }
           ]
         }
       },
       {
         "config": "hdfs-site/dfs.datanode.max.transfer.threads",
-        "widget":{
-          "type":"slider",
-          "units":[
+        "widget": {
+          "type": "slider",
+          "units": [
             {
-              "unit-name":"int"
+              "unit-name": "int"
             }
           ]
         }
@@ -173,3 +171,4 @@
     ]
   }
 }
+

http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/themes/theme.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/themes/theme.json b/ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/themes/theme.json
index 375fa20..d840d18 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/themes/theme.json
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/themes/theme.json
@@ -1,201 +1,199 @@
 {
-  "Theme": {
-    "name": "default",
-    "description": "Default theme for HIVE service",
-    "configuration": {
-      "layouts": [
-        {
-          "name": "default",
-          "tabs": [
-            {
-              "name": "settings",
-              "display-name": "Settings",
-              "layout": {
-                "tab-rows": 6,
-                "tab-columns": 3,
-                "sections": [
-                  {
-                    "name": "optimization",
-                    "display-name": "Optimization",
-                    "row-index": "0",
-                    "column-index": "0",
-                    "row-span": "3",
-                    "column-span": "2",
-                    "section-columns": "2",
-                    "section-rows": "4",
-                    "subsections": [
-                      {
-                        "name": "optimization-row1-col1",
-                        "display-name": "Storage",
-                        "row-index": "0",
-                        "column-index": "0",
-                        "row-span": "2",
-                        "column-span": "1"
-                      },
-                      {
-                        "name": "optimization-row1-col2-1",
-                        "display-name": "",
-                        "row-index": "0",
-                        "column-index": "1",
-                        "row-span": "1",
-                        "column-span": "1"
-                      },
-                      {
-                        "name": "optimization-row1-col2-2",
-                        "display-name": "",
-                        "row-index": "1",
-                        "column-index": "1",
-                        "row-span": "1",
-                        "column-span": "1",
-                        "border": true
-                      },
-                      {
-                        "name": "optimization-row2-col1",
-                        "display-name": "Optimization Vectorization",
-                        "row-index": "2",
-                        "column-index": "0",
-                        "row-span": "1",
-                        "column-span": "1"
-                      },
-                      {
-                        "name": "optimization-row2-col2",
-                        "display-name": "",
-                        "row-index": "2",
-                        "column-index": "1",
-                        "row-span": "1",
-                        "column-span": "1"
-                      },
-                      {
-                        "name": "optimization-row3-col1",
-                        "display-name": "Memory",
-                        "row-index": "3",
-                        "column-index": "0",
-                        "row-span": "1",
-                        "column-span": "1"
-                      },
-                      {
-                        "name": "optimization-row3-col2",
-                        "display-name": "",
-                        "row-index": "3",
-                        "column-index": "1",
-                        "row-span": "1",
-                        "column-span": "1"
-                      }
-                    ]
-                  },
-                  {
-                    "name": "acid-transactions",
-                    "display-name": "Acid Transactions",
-                    "row-index": "0",
-                    "column-index": "2",
-                    "row-span": "2",
-                    "column-span": "1",
-                    "section-columns": "1",
-                    "section-rows": "2",
-                    "subsections": [
-                      {
-                        "name": "acid-transactions-row1-col1-1",
-                        "row-index": "0",
-                        "column-index": "0",
-                        "row-span": "1",
-                        "column-span": "1"
-                      },
-                      {
-                        "name": "acid-transactions-row1-col1-2",
-                        "row-index": "1",
-                        "column-index": "0",
-                        "row-span": "1",
-                        "column-span": "1"
-                      }
-                    ]
-                  },
-                  {
-                    "name": "performance",
-                    "display-name": "Performance",
-                    "row-index": "3",
-                    "column-index": "0",
-                    "row-span": "3",
-                    "column-span": "2",
-                    "section-columns": "2",
-                    "section-rows": "2",
-                    "subsections": [
-                      {
-                        "name": "performance-row1-col1",
-                        "display-name": "TEZ Engine",
-                        "row-index": "0",
-                        "column-index": "0",
-                        "row-span": "1",
-                        "column-span": "1"
-                      },
-                      {
-                        "name": "performance-row1-col2",
-                        "display-name": "",
-                        "row-index": "0",
-                        "column-index": "1",
-                        "row-span": "1",
-                        "column-span": "1"
-                      },
-                      {
-                        "name": "performance-row2-col1",
-                        "row-index": "1",
-                        "column-index": "0",
-                        "row-span": "1",
-                        "column-span": "1"
-                      },
-                      {
-                        "name": "performance-row2-col2",
-                        "row-index": "1",
-                        "column-index": "1",
-                        "row-span": "1",
-                        "column-span": "1"
-                      }
-                    ]
-                  },
-                  {
-                    "name": "interactive-query",
-                    "display-name": "Interactive Query",
-                    "row-index": "2",
-                    "column-index": "2",
-                    "row-span": "2",
-                    "column-span": "1",
-                    "section-columns": "1",
-                    "section-rows": "2",
-                    "subsections": [
-                      {
-                        "name": "interactive-query-row1-col1",
-                        "row-index": "0",
-                        "column-index": "0",
-                        "row-span": "2",
-                        "column-span": "1"
-                      }
-                    ]
-                  },
-                  {
-                    "name": "security",
-                    "display-name": "Security",
-                    "row-index": "4",
-                    "column-index": "2",
-                    "row-span": "2",
-                    "column-span": "1",
-                    "section-columns": "1",
-                    "section-rows": "2",
-                    "subsections": [
-                      {
-                        "name": "security-row1-col1",
-                        "row-index": "0",
-                        "column-index": "0",
-                        "row-span": "2",
-                        "column-span": "1"
-                      }
-                    ]
-                  }
-                ]
-              }
+  "name": "default",
+  "description": "Default theme for HIVE service",
+  "configuration": {
+    "layouts": [
+      {
+        "name": "default",
+        "tabs": [
+          {
+            "name": "settings",
+            "display-name": "Settings",
+            "layout": {
+              "tab-rows": 6,
+              "tab-columns": 3,
+              "sections": [
+                {
+                  "name": "optimization",
+                  "display-name": "Optimization",
+                  "row-index": "0",
+                  "column-index": "0",
+                  "row-span": "3",
+                  "column-span": "2",
+                  "section-columns": "2",
+                  "section-rows": "4",
+                  "subsections": [
+                    {
+                      "name": "optimization-row1-col1",
+                      "display-name": "Storage",
+                      "row-index": "0",
+                      "column-index": "0",
+                      "row-span": "2",
+                      "column-span": "1"
+                    },
+                    {
+                      "name": "optimization-row1-col2-1",
+                      "display-name": "",
+                      "row-index": "0",
+                      "column-index": "1",
+                      "row-span": "1",
+                      "column-span": "1"
+                    },
+                    {
+                      "name": "optimization-row1-col2-2",
+                      "display-name": "",
+                      "row-index": "1",
+                      "column-index": "1",
+                      "row-span": "1",
+                      "column-span": "1",
+                      "border": true
+                    },
+                    {
+                      "name": "optimization-row2-col1",
+                      "display-name": "Optimization Vectorization",
+                      "row-index": "2",
+                      "column-index": "0",
+                      "row-span": "1",
+                      "column-span": "1"
+                    },
+                    {
+                      "name": "optimization-row2-col2",
+                      "display-name": "",
+                      "row-index": "2",
+                      "column-index": "1",
+                      "row-span": "1",
+                      "column-span": "1"
+                    },
+                    {
+                      "name": "optimization-row3-col1",
+                      "display-name": "Memory",
+                      "row-index": "3",
+                      "column-index": "0",
+                      "row-span": "1",
+                      "column-span": "1"
+                    },
+                    {
+                      "name": "optimization-row3-col2",
+                      "display-name": "",
+                      "row-index": "3",
+                      "column-index": "1",
+                      "row-span": "1",
+                      "column-span": "1"
+                    }
+                  ]
+                },
+                {
+                  "name": "acid-transactions",
+                  "display-name": "Acid Transactions",
+                  "row-index": "0",
+                  "column-index": "2",
+                  "row-span": "2",
+                  "column-span": "1",
+                  "section-columns": "1",
+                  "section-rows": "2",
+                  "subsections": [
+                    {
+                      "name": "acid-transactions-row1-col1-1",
+                      "row-index": "0",
+                      "column-index": "0",
+                      "row-span": "1",
+                      "column-span": "1"
+                    },
+                    {
+                      "name": "acid-transactions-row1-col1-2",
+                      "row-index": "1",
+                      "column-index": "0",
+                      "row-span": "1",
+                      "column-span": "1"
+                    }
+                  ]
+                },
+                {
+                  "name": "performance",
+                  "display-name": "Performance",
+                  "row-index": "3",
+                  "column-index": "0",
+                  "row-span": "3",
+                  "column-span": "2",
+                  "section-columns": "2",
+                  "section-rows": "2",
+                  "subsections": [
+                    {
+                      "name": "performance-row1-col1",
+                      "display-name": "TEZ Engine",
+                      "row-index": "0",
+                      "column-index": "0",
+                      "row-span": "1",
+                      "column-span": "1"
+                    },
+                    {
+                      "name": "performance-row1-col2",
+                      "display-name": "",
+                      "row-index": "0",
+                      "column-index": "1",
+                      "row-span": "1",
+                      "column-span": "1"
+                    },
+                    {
+                      "name": "performance-row2-col1",
+                      "row-index": "1",
+                      "column-index": "0",
+                      "row-span": "1",
+                      "column-span": "1"
+                    },
+                    {
+                      "name": "performance-row2-col2",
+                      "row-index": "1",
+                      "column-index": "1",
+                      "row-span": "1",
+                      "column-span": "1"
+                    }
+                  ]
+                },
+                {
+                  "name": "interactive-query",
+                  "display-name": "Interactive Query",
+                  "row-index": "2",
+                  "column-index": "2",
+                  "row-span": "2",
+                  "column-span": "1",
+                  "section-columns": "1",
+                  "section-rows": "2",
+                  "subsections": [
+                    {
+                      "name": "interactive-query-row1-col1",
+                      "row-index": "0",
+                      "column-index": "0",
+                      "row-span": "2",
+                      "column-span": "1"
+                    }
+                  ]
+                },
+                {
+                  "name": "security",
+                  "display-name": "Security",
+                  "row-index": "4",
+                  "column-index": "2",
+                  "row-span": "2",
+                  "column-span": "1",
+                  "section-columns": "1",
+                  "section-rows": "2",
+                  "subsections": [
+                    {
+                      "name": "security-row1-col1",
+                      "row-index": "0",
+                      "column-index": "0",
+                      "row-span": "2",
+                      "column-span": "1"
+                    }
+                  ]
+                }
+              ]
             }
-          ]
-        }
-      ]
-    },
+          }
+        ]
+      }
+    ],
     "placement": {
       "configuration-layout": "default",
       "configs": [
@@ -635,3 +633,4 @@
     ]
   }
 }
+


Mime
View raw message