You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by an...@apache.org on 2015/12/09 08:56:37 UTC

ignite git commit: IGNITE-2033 Completed base refactoring - Fixes #306.

Repository: ignite
Updated Branches:
  refs/heads/ignite-843-rc2 da50f0c6c -> 539f819c3


IGNITE-2033 Completed base refactoring - Fixes #306.

Signed-off-by: Andrey <an...@gridgain.com>


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

Branch: refs/heads/ignite-843-rc2
Commit: 539f819c31f240607f4486b9a84f322f185c617f
Parents: da50f0c
Author: Dmitriyff <dm...@gmail.com>
Authored: Wed Dec 9 14:56:03 2015 +0700
Committer: Andrey <an...@gridgain.com>
Committed: Wed Dec 9 14:56:03 2015 +0700

----------------------------------------------------------------------
 .../src/main/js/app/data/os.json                |   4 +
 .../app/directives/loading/loading.directive.js |  27 ++
 .../main/js/app/directives/loading/loading.jade |  18 ++
 .../ui-ace-docker/ui-ace-docker.controller.js   |  43 +++
 .../ui-ace-docker/ui-ace-docker.directive.js    |  37 +++
 .../directives/ui-ace-docker/ui-ace-docker.jade |  35 +++
 .../ui-ace-java/ui-ace-java.controller.js       |  58 ++++
 .../ui-ace-java/ui-ace-java.directive.js        |  33 +++
 .../app/directives/ui-ace-java/ui-ace-java.jade |  28 ++
 .../ui-ace-pojos/ui-ace-pojos.controller.js     |  89 ++++++
 .../ui-ace-pojos/ui-ace-pojos.directive.js      |  37 +++
 .../directives/ui-ace-pojos/ui-ace-pojos.jade   |  33 +++
 .../ui-ace-pom/ui-ace-pom.controller.js         |  40 +++
 .../ui-ace-pom/ui-ace-pom.directive.js          |  32 ++
 .../app/directives/ui-ace-pom/ui-ace-pom.jade   |  17 ++
 .../ui-ace-xml/ui-ace-xml.controller.js         |  38 +++
 .../ui-ace-xml/ui-ace-xml.directive.js          |  33 +++
 .../app/directives/ui-ace-xml/ui-ace-xml.jade   |  17 ++
 .../js/app/filters/hasPojo/hasPojo.filter.js    |  26 ++
 .../control-center-web/src/main/js/app/index.js |  37 ++-
 .../app/modules/states/configuration/index.js   |  16 +-
 .../configuration/summary/summary.controller.js | 133 +++++++++
 .../configuration/summary/summary.resource.js   |  41 +++
 .../main/js/app/services/UiAceOnLoad/service.js |  36 +++
 .../control-center-web/src/main/js/config.js    |   1 +
 .../main/js/controllers/summary-controller.js   | 293 -------------------
 .../src/main/js/gulpfile.js/tasks/copy.js       |   4 +-
 .../main/js/helpers/generator/generator-xml.js  |   2 +-
 .../control-center-web/src/main/js/package.json |   1 +
 .../js/views/configuration/summary-tabs.jade    |   2 +-
 .../main/js/views/configuration/summary.jade    | 134 +++------
 31 files changed, 953 insertions(+), 392 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/data/os.json
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/data/os.json b/modules/control-center-web/src/main/js/app/data/os.json
new file mode 100644
index 0000000..5b67c37
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/data/os.json
@@ -0,0 +1,4 @@
+[
+	"debian:8", 
+	"ubuntu:14.10"
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/directives/loading/loading.directive.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/directives/loading/loading.directive.js b/modules/control-center-web/src/main/js/app/directives/loading/loading.directive.js
new file mode 100644
index 0000000..7cb3769
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/directives/loading/loading.directive.js
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+import template from './loading.jade!';
+
+export default ['igniteLoading', [() => {
+	return {
+		restrict: 'E',
+		template,
+		replace: true,
+		transclude: true
+	}
+}]]

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/directives/loading/loading.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/directives/loading/loading.jade b/modules/control-center-web/src/main/js/app/directives/loading/loading.jade
new file mode 100644
index 0000000..706c9bc
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/directives/loading/loading.jade
@@ -0,0 +1,18 @@
+//-
+    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.
+
+div(class='page-loading-overlay' dw-loading='loading' dw-loading-options='{text: $state.current.data.loading}')
+    div(ng-transclude='')

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/directives/ui-ace-docker/ui-ace-docker.controller.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/directives/ui-ace-docker/ui-ace-docker.controller.js b/modules/control-center-web/src/main/js/app/directives/ui-ace-docker/ui-ace-docker.controller.js
new file mode 100644
index 0000000..906aa43
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/directives/ui-ace-docker/ui-ace-docker.controller.js
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+
+import types from 'app/data/os.json!'
+
+export default ['$scope', 'IgniteUiAceOnLoad', function($scope, onLoad) {
+    var ctrl = this;
+
+    // Scope values.
+    $scope.types = types;
+
+    // Scope methods.
+    $scope.onLoad = onLoad;
+
+    // Watchers definition.    
+    let clusterWatcher = (value) => {
+        delete ctrl.data;
+
+        if (!value)
+            return;
+
+        // TODO IGNITE-2058: need move $generatorDocker to services.
+        ctrl.data = $generatorDocker.clusterDocker($scope.cluster, $scope.type);
+    };
+
+    // Setup watchers. 
+    $scope.$watch('type', clusterWatcher);
+    $scope.$watch('cluster', clusterWatcher);
+}]

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/directives/ui-ace-docker/ui-ace-docker.directive.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/directives/ui-ace-docker/ui-ace-docker.directive.js b/modules/control-center-web/src/main/js/app/directives/ui-ace-docker/ui-ace-docker.directive.js
new file mode 100644
index 0000000..356cd2d
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/directives/ui-ace-docker/ui-ace-docker.directive.js
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+
+import template from './ui-ace-docker.jade!'
+import controller from './ui-ace-docker.controller'
+
+export default ['igniteUiAceDocker', [() => {
+
+	return {
+		restrict: 'E',
+		scope: {
+			cluster: '=',
+			data: '=ngModel'
+		},
+		bindToController: {
+			cluster: '=',
+			data: '=ngModel'
+		},
+		template,
+		controller,
+		controllerAs: 'ctrl'
+	}
+}]]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/directives/ui-ace-docker/ui-ace-docker.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/directives/ui-ace-docker/ui-ace-docker.jade b/modules/control-center-web/src/main/js/app/directives/ui-ace-docker/ui-ace-docker.jade
new file mode 100644
index 0000000..cc153d7
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/directives/ui-ace-docker/ui-ace-docker.jade
@@ -0,0 +1,35 @@
+//-
+    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.
+
+mixin hard-link(ref, txt)
+    a(style='color:#ec1c24' href=ref target='_blank') #{txt}
+
+div
+    .details-row
+        p
+            +hard-link('https://docs.docker.com/reference/builder', 'Docker')
+            | &nbsp;file is a text file with instructions to create Docker image.<br/>
+            | To build image you have to store following Docker file with your Ignite XML configuration to the same directory.<br>
+            | Also you could use predefined&nbsp;
+            +hard-link('https://ignite.apache.org/download.html#docker', 'Apache Ignite docker image')
+            | . For more information about using Ignite with Docker please read&nbsp;
+            +hard-link('http://apacheignite.readme.io/docs/docker-deployment', 'documentation')
+            |.
+        .col-xs-3.col-sm-2
+            label(for='os') Operation System:
+        .col-xs-5.col-sm-4
+            input#os.form-control(type='text' ng-model='type' placeholder='debian:8' data-min-length='0' data-html='1' data-auto-select='true' bs-typeahead retain-selection bs-options='os for os in types')
+    div(ui-ace='{onLoad: onLoad, mode: "dockerfile"}' ng-model='ctrl.data')

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/directives/ui-ace-java/ui-ace-java.controller.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/directives/ui-ace-java/ui-ace-java.controller.js b/modules/control-center-web/src/main/js/app/directives/ui-ace-java/ui-ace-java.controller.js
new file mode 100644
index 0000000..f22ad5e
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/directives/ui-ace-java/ui-ace-java.controller.js
@@ -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.
+ */
+
+const SNIPPET = 1;
+const FACTORY = 2;
+
+const SERVER_CFG = 'ServerConfigurationFactory';
+const CLIENT_CFG = 'ClientConfigurationFactory';
+
+const TYPES = [
+    {value: SNIPPET, label: 'snippet'},
+    {value: FACTORY, label: 'factory class'}
+];
+
+export default ['$scope', 'IgniteUiAceOnLoad', function($scope, onLoad) {
+    var ctrl = this;
+
+    // Scope values.
+    $scope.type = SNIPPET;
+    
+    // Scope data.
+    $scope.types = TYPES;
+    
+    // Scope methods.
+    $scope.onLoad = onLoad;
+
+    // watchers definition
+    let clusterWatcher = (value) => {
+        delete ctrl.data;
+
+        if (!value)
+            return;
+
+        let type = $scope.type === FACTORY ? (!$scope.cfg ? SERVER_CFG : CLIENT_CFG) : false;
+
+        // TODO IGNITE-2054: need move $generatorJava to services.
+        ctrl.data = $generatorJava.cluster($scope.cluster, 'factory', type, $scope.cfg);
+    };
+
+    // Setup watchers. 
+    $scope.$watch('cfg', clusterWatcher, true);
+    $scope.$watch('type', clusterWatcher);
+    $scope.$watch('cluster', clusterWatcher);
+}]

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/directives/ui-ace-java/ui-ace-java.directive.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/directives/ui-ace-java/ui-ace-java.directive.js b/modules/control-center-web/src/main/js/app/directives/ui-ace-java/ui-ace-java.directive.js
new file mode 100644
index 0000000..1b41d13
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/directives/ui-ace-java/ui-ace-java.directive.js
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ */
+
+import template from './ui-ace-java.jade!'
+import controller from './ui-ace-java.controller'
+
+export default ['igniteUiAceJava', [() => {
+
+	return {
+		restrict: 'E',
+		scope: {
+			cluster: '=',
+			cfg: '=clusterCfg'
+		},
+		template,
+		controller,
+		controllerAs: 'ctrl'
+	}
+}]]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/directives/ui-ace-java/ui-ace-java.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/directives/ui-ace-java/ui-ace-java.jade b/modules/control-center-web/src/main/js/app/directives/ui-ace-java/ui-ace-java.jade
new file mode 100644
index 0000000..866e12a
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/directives/ui-ace-java/ui-ace-java.jade
@@ -0,0 +1,28 @@
+//-
+    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.
+
+div
+    .details-row
+        .col-xs-2.col-sm-2.col-md-1
+            label Generate:
+        .col-xs-4.col-sm-3.col-md-3
+            button.select-toggle.form-control(
+                data-bs-select
+                data-bs-options='item.value as item.label for item in types'
+                data-sort='false'
+                ng-model='type'
+            )
+    div(ui-ace='{onLoad: onLoad, mode: "java"}' ng-model='ctrl.data')

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/directives/ui-ace-pojos/ui-ace-pojos.controller.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/directives/ui-ace-pojos/ui-ace-pojos.controller.js b/modules/control-center-web/src/main/js/app/directives/ui-ace-pojos/ui-ace-pojos.controller.js
new file mode 100644
index 0000000..dc9c81e
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/directives/ui-ace-pojos/ui-ace-pojos.controller.js
@@ -0,0 +1,89 @@
+/*
+ * 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.
+ */
+
+export default ['$scope', 'IgniteUiAceOnLoad', function($scope, onLoad) {
+    var ctrl = this;
+
+    // Scope methods.
+    $scope.onLoad = onLoad;
+
+    // Watchers definition.
+    // Watcher clean instance data if instance to cluster caches was change
+    let cleanMetadatas = (value) => {
+        delete ctrl.class;
+        delete ctrl.metadatas;
+        delete ctrl.classes;
+    };
+
+    // Watcher updata metadata when changes caches and checkers useConstructor and includeKeyFields
+    let updateMetadatas = (value) => {
+        delete ctrl.metadatas;
+
+        if (!ctrl.cluster || !ctrl.cluster.caches)
+            return;
+
+        // TODO IGNITE-2054: need move $generatorJava to services.
+        ctrl.metadatas = $generatorJava.pojos(ctrl.cluster.caches, ctrl.useConstructor, ctrl.includeKeyFields);
+    };
+
+    // Watcher update classes after
+    let updateClasses = (value) => {
+        delete ctrl.classes;
+
+        if (!value)
+            return;
+
+        let classes = ctrl.classes = [];
+
+        _.forEach(ctrl.metadatas, (meta) => {
+            classes.push(meta.keyType);
+            classes.push(meta.valueType);
+        });
+    };
+
+    // Update pojos class.
+    let updateClass = (value) => {
+        if (!value || !ctrl.metadatas.length)
+            return;
+
+        ctrl.class = ctrl.class || ctrl.metadatas[0].keyType || ctrl.metadatas[0].valueType;
+    };
+
+    // Update pojos data.
+    let updatePojosData = (value) => {    
+        if (!value)
+            return;
+
+        _.forEach(ctrl.metadatas, (meta) => {
+            if (meta.keyType === ctrl.class)
+                return ctrl.data = meta.keyClass;
+
+            if (meta.valueType === ctrl.class)
+                return ctrl.data = meta.valueClass;
+        })
+    };
+
+    // Setup watchers. Watchers order is important. 
+    $scope.$watch('ctrl.cluster.caches', cleanMetadatas);
+    $scope.$watch('ctrl.cluster.caches', updateMetadatas);
+    $scope.$watch('ctrl.cluster.caches', updateClasses);
+    $scope.$watch('ctrl.useConstructor', updateMetadatas);
+    $scope.$watch('ctrl.includeKeyFields', updateMetadatas);
+    $scope.$watch('ctrl.metadatas', updateClass);
+    $scope.$watch('ctrl.metadatas', updatePojosData);
+    $scope.$watch('ctrl.class', updatePojosData);
+}];

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/directives/ui-ace-pojos/ui-ace-pojos.directive.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/directives/ui-ace-pojos/ui-ace-pojos.directive.js b/modules/control-center-web/src/main/js/app/directives/ui-ace-pojos/ui-ace-pojos.directive.js
new file mode 100644
index 0000000..3a274e4
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/directives/ui-ace-pojos/ui-ace-pojos.directive.js
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+
+import template from './ui-ace-pojos.jade!'
+import controller from './ui-ace-pojos.controller'
+
+export default ['igniteUiAcePojos', [() => {
+
+	return {
+		restrict: 'E',
+		scope: {
+			cluster: '=',
+			metadatas: '=ngModel'
+		},
+		bindToController: {
+			cluster: '=',
+			metadatas: '=ngModel'
+		},
+		template,
+		controller,
+		controllerAs: 'ctrl'
+	}
+}]]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/directives/ui-ace-pojos/ui-ace-pojos.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/directives/ui-ace-pojos/ui-ace-pojos.jade b/modules/control-center-web/src/main/js/app/directives/ui-ace-pojos/ui-ace-pojos.jade
new file mode 100644
index 0000000..9f4a1db
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/directives/ui-ace-pojos/ui-ace-pojos.jade
@@ -0,0 +1,33 @@
+//-
+    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.
+
+div
+    .details-row
+        .col-xs-2.col-sm-2.col-md-2
+            label POJO class:
+        .col-xs-10.col-sm-10.col-md-10.summary-pojo-list
+            button.select-toggle.form-control(ng-model='ctrl.class' bs-select bs-options='item for item in ctrl.classes' data-container='')
+        .col-xs-2.col-sm-2.col-md-2
+            label
+        .col-xs-10.col-sm-10.col-md-10
+            input(type='checkbox' ng-model='ctrl.useConstructor')
+            | Generate constructors
+        .col-xs-2.col-sm-2.col-md-2
+            label
+        .col-xs-10.col-sm-10.col-md-10
+            input(type='checkbox' ng-model='ctrl.includeKeyFields')
+            | Include key fields
+    div(ui-ace='{onLoad: onLoad, mode: "java"}' ng-model='ctrl.data')

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/directives/ui-ace-pom/ui-ace-pom.controller.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/directives/ui-ace-pom/ui-ace-pom.controller.js b/modules/control-center-web/src/main/js/app/directives/ui-ace-pom/ui-ace-pom.controller.js
new file mode 100644
index 0000000..639d0f3
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/directives/ui-ace-pom/ui-ace-pom.controller.js
@@ -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.
+ */
+
+// TODO IGNITE-2055: use set version.
+const igniteVersion = '1.5.0';
+
+export default ['$scope', 'IgniteUiAceOnLoad', function($scope, onLoad) {
+    var ctrl = this;
+
+    // Scope methods.
+    $scope.onLoad = onLoad;
+
+    // Watchers definition.    
+    let clusterWatcher = (value) => {
+        delete ctrl.data;
+
+        if (!value)
+            return;
+
+        // TODO IGNITE-2053: need move $generatorPom to services.
+        ctrl.data = $generatorPom.pom($scope.cluster, igniteVersion).asString();
+    };
+
+    // Setup watchers. 
+    $scope.$watch('cluster', clusterWatcher);
+}]

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/directives/ui-ace-pom/ui-ace-pom.directive.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/directives/ui-ace-pom/ui-ace-pom.directive.js b/modules/control-center-web/src/main/js/app/directives/ui-ace-pom/ui-ace-pom.directive.js
new file mode 100644
index 0000000..3aad559
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/directives/ui-ace-pom/ui-ace-pom.directive.js
@@ -0,0 +1,32 @@
+/*
+ * 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.
+ */
+
+import template from './ui-ace-pom.jade!'
+import controller from './ui-ace-pom.controller'
+
+export default ['igniteUiAcePom', [() => {
+
+	return {
+		restrict: 'E',
+		scope: {
+			cluster: '='
+		},
+		template,
+		controller,
+		controllerAs: 'ctrl'
+	}
+}]]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/directives/ui-ace-pom/ui-ace-pom.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/directives/ui-ace-pom/ui-ace-pom.jade b/modules/control-center-web/src/main/js/app/directives/ui-ace-pom/ui-ace-pom.jade
new file mode 100644
index 0000000..eb023d7
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/directives/ui-ace-pom/ui-ace-pom.jade
@@ -0,0 +1,17 @@
+//-
+    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.
+
+div(ui-ace='{onLoad: onLoad, mode: "xml"}' ng-model='ctrl.data')
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/directives/ui-ace-xml/ui-ace-xml.controller.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/directives/ui-ace-xml/ui-ace-xml.controller.js b/modules/control-center-web/src/main/js/app/directives/ui-ace-xml/ui-ace-xml.controller.js
new file mode 100644
index 0000000..6ba65cf
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/directives/ui-ace-xml/ui-ace-xml.controller.js
@@ -0,0 +1,38 @@
+/*
+ * 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.
+ */
+
+export default ['$scope', 'IgniteUiAceOnLoad', function($scope, onLoad) {
+    var ctrl = this;
+
+    // Scope methods.
+    $scope.onLoad = onLoad;
+
+    // Watchers definition.    
+    let clusterWatcher = (value) => {
+        delete ctrl.data;
+
+        if (!value)
+            return;
+
+        // TODO IGNITE-2052: need move $generatorXml to services.
+        ctrl.data = $generatorXml.cluster($scope.cluster, $scope.cfg)
+    };
+
+    // Setup watchers. 
+    $scope.$watch('cfg', clusterWatcher, true);
+    $scope.$watch('cluster', clusterWatcher);
+}]

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/directives/ui-ace-xml/ui-ace-xml.directive.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/directives/ui-ace-xml/ui-ace-xml.directive.js b/modules/control-center-web/src/main/js/app/directives/ui-ace-xml/ui-ace-xml.directive.js
new file mode 100644
index 0000000..fc98c3a
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/directives/ui-ace-xml/ui-ace-xml.directive.js
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ */
+
+import template from './ui-ace-xml.jade!'
+import controller from './ui-ace-xml.controller'
+
+export default ['igniteUiAceXml', [() => {
+
+	return {
+		restrict: 'E',
+		scope: {
+			cluster: '=',
+			cfg: '=clusterCfg'
+		},
+		template,
+		controller,
+		controllerAs: 'ctrl'
+	}
+}]]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/directives/ui-ace-xml/ui-ace-xml.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/directives/ui-ace-xml/ui-ace-xml.jade b/modules/control-center-web/src/main/js/app/directives/ui-ace-xml/ui-ace-xml.jade
new file mode 100644
index 0000000..ba324ff
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/directives/ui-ace-xml/ui-ace-xml.jade
@@ -0,0 +1,17 @@
+//-
+    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.
+
+div(ui-ace='{onLoad: onLoad, mode: "xml"}' ng-model='ctrl.data')

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/filters/hasPojo/hasPojo.filter.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/filters/hasPojo/hasPojo.filter.js b/modules/control-center-web/src/main/js/app/filters/hasPojo/hasPojo.filter.js
new file mode 100644
index 0000000..ff0e813
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/filters/hasPojo/hasPojo.filter.js
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ */
+
+export default ['hasPojo', [() => {
+    let filter = (cache) => {
+        return cache.metadatas && cache.metadatas.length;
+    };
+
+    return ({caches} = {}) => {
+        return caches && _.chain(caches).filter(filter).first().value();
+    }
+}]]

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/index.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/index.js b/modules/control-center-web/src/main/js/app/index.js
index 4174425..087885c 100644
--- a/modules/control-center-web/src/main/js/app/index.js
+++ b/modules/control-center-web/src/main/js/app/index.js
@@ -69,17 +69,29 @@ import './modules/userbar/main'
 import './modules/configuration/sidebar/main'
 // endignite
 
-// directives
+// Directives.
+import igniteLoading from './directives/loading/loading.directive'
 import igniteCallout from './directives/callout/callout.directive'
 import igniteCalloutCel from './directives/callout/callout-cel.directive'
+import igniteUiAceXml from './directives/ui-ace-xml/ui-ace-xml.directive'
+import igniteUiAceJava from './directives/ui-ace-java/ui-ace-java.directive'
+import igniteUiAcePom from './directives/ui-ace-pom/ui-ace-pom.directive'
+import igniteUiAceDocker from './directives/ui-ace-docker/ui-ace-docker.directive'
+import igniteUiAcePojos from './directives/ui-ace-pojos/ui-ace-pojos.directive'
+
+// Services.
+import IgniteUiAceOnLoad from './services/UiAceOnLoad/service'
+
+// Filters.
+import hasPojo from './filters/hasPojo/hasPojo.filter'
 
 angular
 .module('ignite-console', [
 	'ui.router',
-	// services
+	// Services.
 	'ignite-console.Auth',
 	'ignite-console.User',
-	// states
+	// States.
 	'ignite-console.states.login',
 	'ignite-console.states.logout',
 	'ignite-console.states.password',
@@ -87,16 +99,26 @@ angular
 	'ignite-console.states.sql',
 	'ignite-console.states.profile',
 	'ignite-console.states.admin',
-	//
+	// Common modules.
 	'ignite-console.navbar',
 	'ignite-console.userbar',
     'ignite-console.configuration.sidebar'
 ])
-// directives
+// Directives.
+.directive(...igniteLoading)
 .directive(...igniteCallout)
 .directive(...igniteCalloutCel)
+.directive(...igniteUiAceXml)
+.directive(...igniteUiAceJava)
+.directive(...igniteUiAcePom)
+.directive(...igniteUiAceDocker)
+.directive(...igniteUiAcePojos)
+// Services.
+.service(...IgniteUiAceOnLoad)
+// Filters.
+.filter(...hasPojo)
 .config(['$stateProvider', '$locationProvider', '$urlRouterProvider', function($stateProvider, $locationProvider, $urlRouterProvider) {
-	// set up the states
+	// Set up the states.
 	$stateProvider
 		.state('base', {
 			url: '',
@@ -107,4 +129,7 @@ angular
 	$urlRouterProvider.when('/', '/configuration/clusters');
 
 	$locationProvider.html5Mode(true);
+}])
+.run(['$rootScope', '$state', ($root, $state) => {
+	$root.$state = $state;
 }]);

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/modules/states/configuration/index.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/index.js b/modules/control-center-web/src/main/js/app/modules/states/configuration/index.js
index 2ff47ca..e5a97fe 100644
--- a/modules/control-center-web/src/main/js/app/modules/states/configuration/index.js
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/index.js
@@ -17,12 +17,17 @@
  
 import angular from 'angular'
 
+import ConfigurationSummaryCtrl from './summary/summary.controller'
+import ConfigurationSummaryResource from './summary/summary.resource'
+
 angular
 .module('ignite-console.states.configuration', [
 	'ui.router'
 ])
+// Services.
+.service(...ConfigurationSummaryResource)
 .config(['$stateProvider', function($stateProvider) {
-	// set up the states
+	// Setup the states.
 	$stateProvider
 	.state('base.configuration', {
 		url: '/configuration',
@@ -46,6 +51,11 @@ angular
 	})
 	.state('base.configuration.summary', {
 		url: '/summary',
-		templateUrl: '/configuration/summary.html'	
-	})	
+		templateUrl: '/configuration/summary.html',
+		controller: ConfigurationSummaryCtrl,
+		controllerAs: 'ctrl',
+		data: {
+			loading: 'Loading summary screen...'
+		}
+	})
 }]);

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/modules/states/configuration/summary/summary.controller.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/summary/summary.controller.js b/modules/control-center-web/src/main/js/app/modules/states/configuration/summary/summary.controller.js
new file mode 100644
index 0000000..e023c13
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/summary/summary.controller.js
@@ -0,0 +1,133 @@
+/*
+ * 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.
+ */
+
+export default [
+    '$scope', '$http', '$common', '$loading', '$table', '$filter', 'ConfigurationSummaryResource',
+    function($scope, $http, $common, $loading, $table, $filter, Resource) {
+    let ctrl = this;
+    let igniteVersion = '1.5.0';
+
+    $loading.start('loading');
+
+    Resource.read().then(({clusters}) => {
+        $scope.clusters = clusters;
+
+        $loading.finish('loading');
+
+        $scope.selectItem(clusters[0]);
+    });
+
+    $scope.panelExpanded = $common.panelExpanded;
+    $scope.tableVisibleRow = $table.tableVisibleRow;
+    $scope.joinTip = $common.joinTip;
+    $scope.getModel = $common.getModel;
+    $scope.widthIsSufficient = $common.widthIsSufficient;
+
+    $scope.evictionPolicies = [
+        {value: 'LRU', label: 'LRU'},
+        {value: 'FIFO', label: 'FIFO'},
+        {value: 'SORTED', label: 'Sorted'},
+        {value: undefined, label: 'Not set'}
+    ];
+
+    $scope.tabsServer = { activeTab: 0 };
+    $scope.tabsClient = { activeTab: 0 };
+
+    $scope.backupItem = {javaClassClient: 1};
+
+    $http.get('/models/summary.json')
+        .success(function (data) {
+            $scope.screenTip = data.screenTip;
+            $scope.moreInfo = data.moreInfo;
+            $scope.clientFields = data.clientFields;
+        })
+        .error(function (errMsg) {
+            $common.showError(errMsg);
+        });
+
+    $scope.selectItem = (cluster) => {
+        delete ctrl.cluster;
+
+        if (!cluster)
+            return;
+
+        ctrl.cluster = cluster;
+        $scope.cluster = cluster;
+        $scope.selectedItem = cluster;
+    };
+
+    let updateTab = (cluster) => {
+        if (!cluster)
+            return;
+
+        if (!$filter('hasPojo')(cluster) && $scope.tabsClient.activeTab === 3)
+            $scope.tabsClient.activeTab = 0;     
+    };
+
+    $scope.$watch('cluster', updateTab);
+
+    // TODO IGNITE-2114: implemented as indendent logic for download.
+    $scope.downloadConfiguration = function () {
+        var cluster = $scope.cluster;
+        var clientNearCfg = $scope.backupItem.nearConfiguration;
+
+        var zip = new JSZip();
+
+        zip.file('Dockerfile', ctrl.data.docker);
+
+        var builder = $generatorProperties.generateProperties(cluster);
+
+        if (builder)
+            zip.file('src/main/resources/secret.properties', builder.asString());
+
+        var srcPath = 'src/main/java/';
+
+        var serverXml = 'config/' + cluster.name + '-server.xml';
+        var clientXml = 'config/' + cluster.name + '-client.xml';
+
+        zip.file(serverXml, $generatorXml.cluster(cluster));
+        zip.file(clientXml , $generatorXml.cluster(cluster, clientNearCfg));
+
+        zip.file(srcPath + 'factory/ServerConfigurationFactory.java', $generatorJava.cluster(cluster, 'factory', 'ServerConfigurationFactory', null));
+        zip.file(srcPath + 'factory/ClientConfigurationFactory.java', $generatorJava.cluster(cluster, 'factory', 'ClientConfigurationFactory', clientNearCfg));
+
+        zip.file(srcPath + 'startup/ServerNodeSpringStartup.java', $generatorJava.nodeStartup(cluster, 'startup', 'ServerNodeSpringStartup', '"' + serverXml + '"'));
+        zip.file(srcPath + 'startup/ClientNodeSpringStartup.java', $generatorJava.nodeStartup(cluster, 'startup', 'ClientNodeSpringStartup', '"' + clientXml + '"'));
+
+        zip.file(srcPath + 'startup/ServerNodeCodeStartup.java', $generatorJava.nodeStartup(cluster, 'startup', 'ServerNodeCodeStartup',
+            'ServerConfigurationFactory.createConfiguration()', 'factory.ServerConfigurationFactory'));
+        zip.file(srcPath + 'startup/ClientNodeCodeStartup.java', $generatorJava.nodeStartup(cluster, 'startup', 'ClientNodeCodeStartup',
+            'ClientConfigurationFactory.createConfiguration()', 'factory.ClientConfigurationFactory', clientNearCfg));
+
+        zip.file('pom.xml', $generatorPom.pom(cluster, igniteVersion).asString());
+
+        zip.file('README.txt', $generatorReadme.readme().asString());
+        zip.file('jdbc-drivers/README.txt', $generatorReadme.readmeJdbc().asString());
+
+        for (var meta of ctrl.data.metadatas) {
+            if (meta.keyClass)
+                zip.file(srcPath + meta.keyType.replace(/\./g, '/') + '.java', meta.keyClass);
+
+            zip.file(srcPath + meta.valueType.replace(/\./g, '/') + '.java', meta.valueClass);
+        }
+
+        var blob = zip.generate({type:'blob', mimeType: 'application/octet-stream'});
+
+        // Download archive.
+        saveAs(blob, cluster.name + '-configuration.zip');
+    };    
+}]

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/modules/states/configuration/summary/summary.resource.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/summary/summary.resource.js b/modules/control-center-web/src/main/js/app/modules/states/configuration/summary/summary.resource.js
new file mode 100644
index 0000000..b125aca
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/summary/summary.resource.js
@@ -0,0 +1,41 @@
+/*
+ * 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.
+ */
+
+export default ['ConfigurationSummaryResource', ['$q', '$http', ($q, $http) => {
+	const api = '/api/v1/configuration/clusters/list';
+
+	return {
+		read() {
+			return $http
+					.post(api)
+					.then(({data}) => data)
+					.then(({clusters, caches, igfss}) => {
+						if (!clusters || !clusters.length)
+							return {};
+
+						_.each(clusters, cluster => {
+							cluster.igfss = _.filter(igfss, ({_id}) => _.contains(cluster.igfss, _id));
+							cluster.caches = _.filter(caches, ({_id}) => _.contains(cluster.caches, _id));
+						});
+
+						return {clusters};
+					}, (err) => {
+						return $q.reject(err);
+					})
+		}
+	};
+}]]

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/app/services/UiAceOnLoad/service.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/services/UiAceOnLoad/service.js b/modules/control-center-web/src/main/js/app/services/UiAceOnLoad/service.js
new file mode 100644
index 0000000..e63992d
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/services/UiAceOnLoad/service.js
@@ -0,0 +1,36 @@
+/*
+ * 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.
+ */
+
+export default ['IgniteUiAceOnLoad', () => {
+	return (editor) => {
+	    editor.setReadOnly(true);
+	    editor.setOption('highlightActiveLine', false);
+	    editor.setAutoScrollEditorIntoView(true);
+	    editor.$blockScrolling = Infinity;
+
+	    var renderer = editor.renderer;
+
+	    renderer.setHighlightGutterLine(false);
+	    renderer.setShowPrintMargin(false);
+	    renderer.setOption('fontFamily', 'monospace');
+	    renderer.setOption('fontSize', '12px');
+	    renderer.setOption('minLines', '25');
+	    renderer.setOption('maxLines', '25');
+
+	    editor.setTheme('ace/theme/chrome');
+	}
+}]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/config.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/config.js b/modules/control-center-web/src/main/js/config.js
index 5f11590..ce9ca1b 100644
--- a/modules/control-center-web/src/main/js/config.js
+++ b/modules/control-center-web/src/main/js/config.js
@@ -44,6 +44,7 @@ System.config({
     "font-awesome": "npm:font-awesome@4.5.0",
     "jade": "github:johnsoftek/plugin-jade@0.5.1",
     "jquery": "github:components/jquery@2.1.4",
+    "json": "github:systemjs/plugin-json@0.1.0",
     "jszip": "github:Stuk/jszip@2.5.0",
     "lodash": "npm:lodash@3.10.1",
     "nvd3": "npm:nvd3@1.8.1",

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/controllers/summary-controller.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/controllers/summary-controller.js b/modules/control-center-web/src/main/js/controllers/summary-controller.js
deleted file mode 100644
index b5ca1f0..0000000
--- a/modules/control-center-web/src/main/js/controllers/summary-controller.js
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * 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.
- */
-
-// Controller for Summary screen.
-consoleModule.controller('summaryController', [
-    '$scope', '$http', '$common', '$loading', '$table',
-    function ($scope, $http, $common, $loading, $table) {
-    var igniteVersion = '1.5.0-b1';
-    $loading.start('loadingSummaryScreen');
-
-    $scope.panelExpanded = $common.panelExpanded;
-    $scope.tableVisibleRow = $table.tableVisibleRow;
-    $scope.joinTip = $common.joinTip;
-    $scope.getModel = $common.getModel;
-    $scope.widthIsSufficient = $common.widthIsSufficient;
-
-    $scope.javaClassItems = [
-        {label: 'snippet', value: 1},
-        {label: 'factory class', value: 2}
-    ];
-
-    $scope.evictionPolicies = [
-        {value: 'LRU', label: 'LRU'},
-        {value: 'FIFO', label: 'FIFO'},
-        {value: 'SORTED', label: 'Sorted'},
-        {value: undefined, label: 'Not set'}
-    ];
-
-    $scope.tabsServer = { activeTab: 0 };
-    $scope.tabsClient = { activeTab: 0 };
-
-    $scope.pojoClasses = function() {
-        var classes = [];
-
-        if ($scope.selectedItem)
-            _.forEach($scope.selectedItem.metadatas, function(meta) {
-                classes.push(meta.keyType);
-                classes.push(meta.valueType);
-            });
-
-        return classes;
-    };
-
-    $scope.oss = ['debian:8', 'ubuntu:14.10'];
-
-    $scope.configServer = {javaClassServer: 1, os: undefined};
-    $scope.configClient = {};
-
-    $scope.backupItem = {javaClassClient: 1};
-
-    $http.get('/models/summary.json')
-        .success(function (data) {
-            $scope.screenTip = data.screenTip;
-            $scope.moreInfo = data.moreInfo;
-            $scope.clientFields = data.clientFields;
-        })
-        .error(function (errMsg) {
-            $common.showError(errMsg);
-        });
-
-    $scope.clusters = [];
-
-    $scope.aceInit = function (editor) {
-        editor.setReadOnly(true);
-        editor.setOption('highlightActiveLine', false);
-        editor.setAutoScrollEditorIntoView(true);
-        editor.$blockScrolling = Infinity;
-
-        var renderer = editor.renderer;
-
-        renderer.setHighlightGutterLine(false);
-        renderer.setShowPrintMargin(false);
-        renderer.setOption('fontFamily', 'monospace');
-        renderer.setOption('fontSize', '12px');
-        renderer.setOption('minLines', '25');
-        renderer.setOption('maxLines', '25');
-
-        editor.setTheme('ace/theme/chrome');
-    };
-
-    $scope.generateJavaServer = function () {
-        $scope.javaServer = $generatorJava.cluster($scope.selectedItem, 'factory',
-            $scope.configServer.javaClassServer === 2 ? 'ServerConfigurationFactory' : false, null);
-    };
-
-    function selectPojoClass(config) {
-        if ($scope.selectedItem)
-            _.forEach($scope.selectedItem.metadatas, function(meta) {
-                if (meta.keyType === config.pojoClass)
-                    return config.pojoClassBody = meta.keyClass;
-
-                if (meta.valueType === config.pojoClass)
-                    return config.pojoClassBody = meta.valueClass;
-            });
-    }
-
-    function pojoClsListener(config) {
-        return function () {
-            selectPojoClass(config);
-        };
-    }
-
-    $scope.updatePojos = function() {
-        if ($common.isDefined($scope.selectedItem)) {
-            var metadatas = $generatorJava.pojos($scope.selectedItem.caches, $scope.configServer.useConstructor, $scope.configServer.includeKeyFields);
-
-            $scope.selectedItem.metadatas = metadatas;
-
-            function restoreSelected(selected, config, tabs, metadatas) {
-                if (!$common.isDefined(selected) || _.findIndex(metadatas, function (meta) {
-                        return meta.keyType === selected || meta.valueType === selected;
-                    }) < 0) {
-                    if (metadatas.length > 0) {
-                        if ($common.isDefined(metadatas[0].keyType))
-                            config.pojoClass = metadatas[0].keyType;
-                        else
-                            config.pojoClass = metadatas[0].valueType;
-                    }
-                    else {
-                        config.pojoClass = undefined;
-
-                        if (tabs.activeTab === 2)
-                            tabs.activeTab = 0;
-                    }
-                }
-                else
-                    config.pojoClass = selected;
-
-                selectPojoClass(config);
-            }
-
-            restoreSelected($scope.configServer.pojoClass, $scope.configServer, $scope.tabsServer, metadatas);
-            restoreSelected($scope.configClient.pojoClass, $scope.configClient, $scope.tabsClient, metadatas);
-        }
-    };
-
-    $scope.$watch('configServer.javaClassServer', $scope.generateJavaServer, true);
-
-    $scope.$watch('configServer.pojoClass', pojoClsListener($scope.configServer), true);
-    $scope.$watch('configClient.pojoClass', pojoClsListener($scope.configClient), true);
-
-    $scope.$watch('configServer.useConstructor', $scope.updatePojos, true);
-
-    $scope.$watch('configServer.includeKeyFields', $scope.updatePojos, true);
-
-    $scope.generateDockerServer = function() {
-        var os = $scope.configServer.os ? $scope.configServer.os : $scope.oss[0];
-
-        $scope.dockerServer = $generatorDocker.clusterDocker($scope.selectedItem, os);
-    };
-
-    $scope.$watch('configServer.os', $scope.generateDockerServer, true);
-
-    $scope.generateClient = function () {
-        $scope.xmlClient = $generatorXml.cluster($scope.selectedItem, $scope.backupItem.nearConfiguration);
-        $scope.javaClient = $generatorJava.cluster($scope.selectedItem, 'factory',
-            $scope.backupItem.javaClassClient === 2 ? 'ClientConfigurationFactory' : false,
-            $scope.backupItem.nearConfiguration);
-    };
-
-    $scope.$watch('backupItem', $scope.generateClient, true);
-
-    $scope.selectItem = function (cluster) {
-        if (!cluster)
-            return;
-
-        $scope.selectedItem = cluster;
-
-        $scope.xmlServer = $generatorXml.cluster(cluster);
-
-        $scope.pom = $generatorPom.pom(cluster, igniteVersion).asString();
-
-        $scope.generateJavaServer();
-
-        $scope.generateDockerServer();
-
-        $scope.generateClient();
-
-        $scope.updatePojos();
-    };
-
-    $scope.pojoAvailable = function() {
-        return $scope.selectedItem && $common.isDefined($scope.selectedItem.metadatas) && $scope.selectedItem.metadatas.length > 0;
-    };
-
-    $scope.downloadConfiguration = function () {
-        var cluster = $scope.selectedItem;
-        var clientNearCfg = $scope.backupItem.nearConfiguration;
-
-        var zip = new JSZip();
-
-        zip.file('Dockerfile', $scope.dockerServer);
-
-        var builder = $generatorProperties.generateProperties(cluster);
-
-        if (builder)
-            zip.file('src/main/resources/secret.properties', builder.asString());
-
-        var srcPath = 'src/main/java/';
-
-        var serverXml = 'config/' + cluster.name + '-server.xml';
-        var clientXml = 'config/' + cluster.name + '-client.xml';
-
-        zip.file(serverXml, $generatorXml.cluster(cluster));
-        zip.file(clientXml , $generatorXml.cluster(cluster, clientNearCfg));
-
-        zip.file(srcPath + 'factory/ServerConfigurationFactory.java', $generatorJava.cluster(cluster, 'factory', 'ServerConfigurationFactory', null));
-        zip.file(srcPath + 'factory/ClientConfigurationFactory.java', $generatorJava.cluster(cluster, 'factory', 'ClientConfigurationFactory', clientNearCfg));
-
-        zip.file(srcPath + 'startup/ServerNodeSpringStartup.java', $generatorJava.nodeStartup(cluster, 'startup', 'ServerNodeSpringStartup', '"' + serverXml + '"'));
-        zip.file(srcPath + 'startup/ClientNodeSpringStartup.java', $generatorJava.nodeStartup(cluster, 'startup', 'ClientNodeSpringStartup', '"' + clientXml + '"'));
-
-        zip.file(srcPath + 'startup/ServerNodeCodeStartup.java', $generatorJava.nodeStartup(cluster, 'startup', 'ServerNodeCodeStartup',
-            'ServerConfigurationFactory.createConfiguration()', 'factory.ServerConfigurationFactory'));
-        zip.file(srcPath + 'startup/ClientNodeCodeStartup.java', $generatorJava.nodeStartup(cluster, 'startup', 'ClientNodeCodeStartup',
-            'ClientConfigurationFactory.createConfiguration()', 'factory.ClientConfigurationFactory', clientNearCfg));
-
-        zip.file('pom.xml', $generatorPom.pom(cluster, igniteVersion).asString());
-
-        zip.file('README.txt', $generatorReadme.readme().asString());
-        zip.file('jdbc-drivers/README.txt', $generatorReadme.readmeJdbc().asString());
-
-        for (var meta of $generatorJava.pojos(cluster.caches, $scope.configServer.useConstructor, $scope.configServer.includeKeyFields)) {
-            if (meta.keyClass)
-                zip.file(srcPath + meta.keyType.replace(/\./g, '/') + '.java', meta.keyClass);
-
-            zip.file(srcPath + meta.valueType.replace(/\./g, '/') + '.java', meta.valueClass);
-        }
-
-        var blob = zip.generate({type:'blob', mimeType: 'application/octet-stream'});
-
-        // Download archive.
-        saveAs(blob, cluster.name + '-configuration.zip');
-    };
-
-    $http.post('/api/v1/configuration/clusters/list')
-        .success(function (data) {
-            $scope.clusters = data.clusters;
-
-            if ($scope.clusters.length > 0) {
-                // Populate clusters with caches.
-                _.forEach($scope.clusters, function (cluster) {
-                    cluster.caches = _.filter(data.caches, function (cache) {
-                        return _.contains(cluster.caches, cache._id);
-                    });
-
-                    cluster.igfss = _.filter(data.igfss, function (igfs) {
-                        return _.contains(cluster.igfss, igfs._id);
-                    });
-                });
-
-                var restoredId = sessionStorage.summarySelectedId;
-
-                var selectIdx = 0;
-
-                if (restoredId) {
-                    var idx = _.findIndex($scope.clusters, function (cluster) {
-                        return cluster._id === restoredId;
-                    });
-
-                    if (idx >= 0)
-                        selectIdx = idx;
-                    else
-                        delete sessionStorage.summarySelectedId;
-                }
-
-                $scope.selectItem($scope.clusters[selectIdx]);
-
-                $scope.$watch('selectedItem', function (val) {
-                    if (val)
-                        sessionStorage.summarySelectedId = val._id;
-                }, true);
-            }
-        })
-        .finally(function () {
-            $loading.finish('loadingSummaryScreen');
-            $scope.ui = {ready: true}
-        });
-}]);

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/gulpfile.js/tasks/copy.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/gulpfile.js/tasks/copy.js b/modules/control-center-web/src/main/js/gulpfile.js/tasks/copy.js
index 3786a50..0f05f32 100644
--- a/modules/control-center-web/src/main/js/gulpfile.js/tasks/copy.js
+++ b/modules/control-center-web/src/main/js/gulpfile.js/tasks/copy.js
@@ -91,7 +91,9 @@ gulp.task('copy:ignite_modules', function(cb) {
 });
 
 gulp.task('copy:watch', function(cb) {
-    gulp.watch([paths, legacyPaths, igniteModulePaths], function(glob) {
+    gulp.watch([legacyPaths, igniteModulePaths], function(glob) {
         sequence(['copy:base', 'copy:legacy', 'copy:ignite_modules'], 'inject:plugins:js')(cb);
     });
+
+    gulp.watch(paths, ['copy:base']);
 });

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/helpers/generator/generator-xml.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/helpers/generator/generator-xml.js b/modules/control-center-web/src/main/js/helpers/generator/generator-xml.js
index cd8942a..3bcf425 100644
--- a/modules/control-center-web/src/main/js/helpers/generator/generator-xml.js
+++ b/modules/control-center-web/src/main/js/helpers/generator/generator-xml.js
@@ -1415,7 +1415,7 @@ $generatorXml.generateDataSources = function (datasources, res) {
 
 $generatorXml.clusterConfiguration = function (cluster, clientNearCfg, res) {
     if (clientNearCfg) {
-        res.line('<property name="clientMode" value="true" />');
+        res.line('<property name="clientMode" value="true"/>');
 
         res.line();
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/package.json
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/package.json b/modules/control-center-web/src/main/js/package.json
index ae39b46..77b9e06 100644
--- a/modules/control-center-web/src/main/js/package.json
+++ b/modules/control-center-web/src/main/js/package.json
@@ -86,6 +86,7 @@
       "font-awesome": "npm:font-awesome@^4.4.0",
       "jade": "github:johnsoftek/plugin-jade@^0.5.1",
       "jquery": "github:components/jquery@^2.1.4",
+      "json": "github:systemjs/plugin-json@^0.1.0",
       "jszip": "github:Stuk/jszip@^2.5.0",
       "lodash": "npm:lodash@^3.10.1",
       "pdfmake": "github:bpampuch/pdfmake@^0.1.20",

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/views/configuration/summary-tabs.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/configuration/summary-tabs.jade b/modules/control-center-web/src/main/js/views/configuration/summary-tabs.jade
index 2b97acd..847b42f 100644
--- a/modules/control-center-web/src/main/js/views/configuration/summary-tabs.jade
+++ b/modules/control-center-web/src/main/js/views/configuration/summary-tabs.jade
@@ -16,7 +16,7 @@
 
 ul.nav(ng-class='$navClass', role='tablist')
     li(role='presentation' ng-repeat='$pane in $panes track by $index' ng-class='[ $isActive($pane, $index) ? $activeClass : "", $pane.disabled ? "disabled" : "" ]')
-        a.summary-tab(ng-show='$pane.title != "POJO" || pojoAvailable()' ng-switch='$pane.title' role='tab' data-toggle='tab' ng-click='!$pane.disabled && $setActive($pane.name || $index)' data-index='{{ $index }}' aria-controls='$pane.title') {{$pane.title}}
+        a.summary-tab(ng-show='$pane.title != "POJO" || (cluster | hasPojo)' ng-switch='$pane.title' role='tab' data-toggle='tab' ng-click='!$pane.disabled && $setActive($pane.name || $index)' data-index='{{ $index }}' aria-controls='$pane.title') {{$pane.title}}
             img(ng-switch-when='XML' src='/images/xml.png')
             img(ng-switch-when='Java' src='/images/java.png')
             img(ng-switch-when='POM' src='/images/xml.png')

http://git-wip-us.apache.org/repos/asf/ignite/blob/539f819c/modules/control-center-web/src/main/js/views/configuration/summary.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/configuration/summary.jade b/modules/control-center-web/src/main/js/views/configuration/summary.jade
index db057cb..3b238b8 100644
--- a/modules/control-center-web/src/main/js/views/configuration/summary.jade
+++ b/modules/control-center-web/src/main/js/views/configuration/summary.jade
@@ -19,28 +19,9 @@ include ../includes/controls
 mixin hard-link(ref, txt)
     a(style='color:#ec1c24' href=ref target='_blank') #{txt}
 
-mixin pojos(side)
-    div(bs-pane title='POJO' ng-show='pojoAvailable()')
-        .details-row
-            .col-xs-2.col-sm-2.col-md-2
-                label POJO class:
-            .col-xs-10.col-sm-10.col-md-10.summary-pojo-list
-                button.select-toggle.form-control(ng-model='config#{side}.pojoClass' bs-select bs-options='item for item in pojoClasses()' data-container='')
-            .col-xs-2.col-sm-2.col-md-2
-                label
-            .col-xs-10.col-sm-10.col-md-10
-                input(type='checkbox' ng-model='configServer.useConstructor')
-                | Generate constructors
-            .col-xs-2.col-sm-2.col-md-2
-                label
-            .col-xs-10.col-sm-10.col-md-10
-                input(type='checkbox' ng-model='configServer.includeKeyFields')
-                | Include key fields
-        div(ui-ace='{onLoad: aceInit, mode: "java"}' ng-model='config#{side}.pojoClassBody')
-
 .docs-header
     h1 Configurations Summary
-.docs-body(ng-controller='summaryController')
+.docs-body
     ignite-callout
         ignite-callout-cel(data-title='On This Screen')
             li Download XML Config
@@ -53,70 +34,49 @@ mixin pojos(side)
             li Deploy Ignite Servers
             li Connect Ignite Clients
             li Analyze with SQL
-            
-    div(dw-loading='loadingSummaryScreen' dw-loading-options='{text: "Loading summary screen...", className: "page-loading-overlay"}')
-        div(ng-show='ui.ready')
-            hr
-            .padding-dflt(ng-if='clusters.length == 0')
-                | You have no clusters configured. Please configure them &nbsp;
-                a(href='/configuration/clusters') here.
-            +main-table('Clusters:', 'clusters', 'clusterName', 'selectItem(row)', '{{$index + 1}}) {{row.name}}', 'name')
-            div(ng-show='selectedItem && tableVisibleRow(displayedRows, selectedItem)' role='tab')
-                .padding-top-dflt(ng-if='clusters.length > 0' bs-affix)
-                    button.btn.btn-primary(id='download' ng-click='downloadConfiguration()' bs-tooltip data-title='Download configuration' data-placement='bottom') Download
-                    hr
-                .panel-group(bs-collapse ng-init='panels.activePanels=[0,1]' ng-model='panels.activePanels' data-allow-multiple='true')
-                    .panel.panel-default
-                        .panel-heading(role='tab' bs-collapse-toggle)
-                            i.fa(ng-class='panelExpanded(panels, "server") ? "fa-chevron-circle-up" : "fa-chevron-circle-down"')
-                            label Server
-                        .panel-collapse(id='server' role='tabpanel' bs-collapse-target)
-                            .summary-tabs(bs-tabs data-bs-active-pane="tabsServer.activeTab" ng-show='selectedItem' template='configuration/summary-tabs.html')
-                                div(bs-pane title='XML')
-                                    div(ui-ace='{onLoad: aceInit, mode: "xml"}' ng-model='xmlServer')
-                                div(bs-pane title='Java')
-                                    .details-row
-                                        .col-xs-2.col-sm-2.col-md-1
-                                            label Generate:
-                                        .col-xs-4.col-sm-3.col-md-3
-                                            button.select-toggle.form-control(ng-model='configServer.javaClassServer' bs-select bs-options='item.value as item.label for item in javaClassItems' data-sort='false')
-                                    div(ui-ace='{onLoad: aceInit, mode: "java"}' ng-model='javaServer')
-                                div(bs-pane title='POM')
-                                    div(ui-ace='{onLoad: aceInit, mode: "xml"}' ng-model='pom')
-                                div(bs-pane title='Dockerfile')
-                                    .details-row
-                                        p
-                                            +hard-link('https://docs.docker.com/reference/builder', 'Docker')
-                                            | &nbsp;file is a text file with instructions to create Docker image.<br/>
-                                            | To build image you have to store following Docker file with your Ignite XML configuration to the same directory.<br>
-                                            | Also you could use predefined&nbsp;
-                                            +hard-link('https://ignite.apache.org/download.html#docker', 'Apache Ignite docker image')
-                                            | . For more information about using Ignite with Docker please read&nbsp;
-                                            +hard-link('http://apacheignite.readme.io/docs/docker-deployment', 'documentation')
-                                            |.
-                                        .col-xs-3.col-sm-2
-                                            label(for='os') Operation System:
-                                        .col-xs-5.col-sm-4
-                                            input#os.form-control(type='text' ng-model='configServer.os' placeholder='debian:8' data-min-length='0' data-html='1' data-auto-select='true' bs-typeahead retain-selection bs-options='os for os in oss')
-                                    div(ui-ace='{onLoad: aceInit, mode: "dockerfile"}' ng-model='dockerServer')
-                    .panel.panel-default
-                        .panel-heading(role='tab' bs-collapse-toggle)
-                            i.fa(ng-class='panelExpanded(panels, "client") ? "fa-chevron-circle-up" : "fa-chevron-circle-down"')
-                            label Client
-                        .panel-collapse(id='client' role='tabpanel' bs-collapse-target)
-                            div(ng-show='selectedItem')
-                                .details-row(ng-repeat='field in clientFields')
-                                    +form-row-custom(['col-xs-4 col-sm-4 col-md-3'], ['col-xs-4 col-sm-4 col-md-3'], 'backupItem')
-                                .summary-tabs(bs-tabs data-bs-active-pane="tabsClient.activeTab" template='configuration/summary-tabs.html')
-                                    div(bs-pane title='XML')
-                                        div(ui-ace='{onLoad: aceInit, mode: "xml"}' ng-model='xmlClient')
-                                    div(bs-pane title='Java')
-                                        .details-row
-                                            .col-xs-2.col-sm-2.col-md-1
-                                                label Generate:
-                                            .col-xs-4.col-sm-3.col-md-3
-                                                button.select-toggle.form-control(ng-model='backupItem.javaClassClient' bs-select bs-options='item.value as item.label for item in javaClassItems' data-sort='false')
-                                        div(ui-ace='{onLoad: aceInit, mode: "java"}' ng-model='javaClient')
-                                    div(bs-pane title='POM')
-                                        div(ui-ace='{onLoad: aceInit, mode: "xml"}' ng-model='pom')
-                                    +pojos('Client')
+
+    ignite-loading
+        hr
+
+        .padding-dflt(ng-if='clusters.length == 0')
+            | You have no clusters configured. Please configure them &nbsp;
+            a(href='/configuration/clusters') here.
+
+        +main-table('Clusters:', 'clusters', 'clusterName', 'selectItem(row)', '{{$index + 1}}) {{row.name}}', 'name')
+
+        div(ng-show='selectedItem && tableVisibleRow(displayedRows, selectedItem)' role='tab')
+            .padding-top-dflt(ng-if='clusters.length > 0' bs-affix)
+                button.btn.btn-primary(id='download' ng-click='downloadConfiguration()' bs-tooltip data-title='Download configuration' data-placement='bottom') Download
+                hr
+            .panel-group(bs-collapse ng-init='panels.activePanels=[0,1]' ng-model='panels.activePanels' data-allow-multiple='true')
+                .panel.panel-default
+                    .panel-heading(role='tab' bs-collapse-toggle)
+                        i.fa(ng-class='panelExpanded(panels, "server") ? "fa-chevron-circle-up" : "fa-chevron-circle-down"')
+                        label Server
+                    .panel-collapse(id='server' role='tabpanel' bs-collapse-target)
+                        .summary-tabs(bs-tabs data-bs-active-pane="tabsServer.activeTab" template='configuration/summary-tabs.html')
+                            div(bs-pane title='XML')
+                                ignite-ui-ace-xml(data-cluster='cluster')
+                            div(bs-pane title='Java')
+                                ignite-ui-ace-java(data-cluster='cluster')
+                            div(bs-pane title='POM')
+                                ignite-ui-ace-pom(data-cluster='cluster')
+                            div(bs-pane title='Dockerfile')
+                                ignite-ui-ace-docker(data-cluster='cluster' ng-model='ctrl.data.docker')
+
+                .panel.panel-default
+                    .panel-heading(role='tab' bs-collapse-toggle)
+                        i.fa(ng-class='panelExpanded(panels, "client") ? "fa-chevron-circle-up" : "fa-chevron-circle-down"')
+                        label Client
+                    .panel-collapse(id='client' role='tabpanel' bs-collapse-target)
+                        .details-row(ng-repeat='field in clientFields')
+                            +form-row-custom(['col-xs-4 col-sm-4 col-md-3'], ['col-xs-4 col-sm-4 col-md-3'], 'backupItem')
+                        .summary-tabs(bs-tabs data-bs-active-pane="tabsClient.activeTab" template='configuration/summary-tabs.html')
+                            div(bs-pane title='XML')
+                                ignite-ui-ace-xml(data-cluster='cluster' data-cluster-cfg='backupItem.nearConfiguration')
+                            div(bs-pane title='Java')
+                                ignite-ui-ace-java(data-cluster='cluster' data-cluster-cfg='backupItem.nearConfiguration')
+                            div(bs-pane title='POM')
+                                ignite-ui-ace-pom(data-cluster='cluster')
+                            div(bs-pane title='POJO' ng-show='cluster | hasPojo')
+                                ignite-ui-ace-pojos(data-cluster='cluster' ng-model='ctrl.data.metadatas')