Jakub Niedermertl has uploaded a new change for review.

Change subject: webadmin: Sync & Async builders
......................................................................

webadmin: Sync & Async builders

Till now all Builders run synchronously. This patch does necessary
refactoring for VmBase->Unit builders to run asynchronously.

* VmModelBehaviorBase#buildModel and overriding methods have signature
  containing callback.

* interface SyncBuilder and class CompositeSyncBuilder were introduced
  to mark synchronous builders.

* static method BuilderList#build can now run only synchronous builders

Change-Id: I10a94c3c59f5641a2661781c6dc227f572447468
Signed-off-by: Jakub Niedermertl <jnied...@redhat.com>
---
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/BaseSyncBuilder.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/Builder.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/BuilderExecutor.java
A 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/CompositeSyncBuilder.java
A 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/SyncBuilder.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/CommonUnitToVmBaseBuilder.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/FullUnitToVmBaseBuilder.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingVmModelBehavior.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewTemplateVmModelBehavior.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmModelBehavior.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/PoolModelBehaviorBase.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TemplateVmModelBehavior.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmModelBehaviorBase.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/instancetypes/ExistingInstanceTypeModelBehavior.java
M 
frontend/webadmin/modules/uicommonweb/src/test/java/org/ovirt/engine/ui/uicommonweb/models/vms/BaseVmModelBehaviorTest.java
15 files changed, 185 insertions(+), 96 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/67/38067/1

diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/BaseSyncBuilder.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/BaseSyncBuilder.java
index aec8a1c..6777cc7 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/BaseSyncBuilder.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/BaseSyncBuilder.java
@@ -7,7 +7,7 @@
  * <p>
  * Use this only when the the descendant class does not do any async call. 
Otherwise implement the {@link Builder} directly
  */
-public abstract class BaseSyncBuilder<S, D> implements Builder<S, D> {
+public abstract class BaseSyncBuilder<S, D> implements SyncBuilder<S, D> {
 
     @Override
     public void build(S source, D destination, BuilderList<S, D> rest) {
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/Builder.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/Builder.java
index ece462d..894f5c9 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/Builder.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/Builder.java
@@ -14,11 +14,4 @@
 public interface Builder<S, D> {
 
     void build(S source, D destination, BuilderList<S, D> rest);
-
-    /**
-     * Use this as a source when all the data are taken from server
-     */
-    public static class VoidSource {
-
-    }
 }
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/BuilderExecutor.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/BuilderExecutor.java
index be33032..c8da725 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/BuilderExecutor.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/BuilderExecutor.java
@@ -25,7 +25,7 @@
      * Helper method that constructs the @{link BuilderExecutor} from given 
builders and immediately utilizes him
      * to perform build from <code>source</code> to <code>destination</code>.
      */
-    public static <S, D> void build(S source, D destination, Builder<S, D>... 
builders) {
+    public static <S, D> void build(S source, D destination, SyncBuilder<S, 
D>... builders) {
         new BuilderExecutor<S, D>(builders).build(source, destination);
     }
 
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/CompositeSyncBuilder.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/CompositeSyncBuilder.java
new file mode 100644
index 0000000..c0413a2
--- /dev/null
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/CompositeSyncBuilder.java
@@ -0,0 +1,12 @@
+package org.ovirt.engine.ui.uicommonweb.builders;
+
+/**
+ * Equivalent of {@link CompositeBuilder} purely for synchronously running 
builders (i.e. descendants of
+ * {@link SyncBuilder}).
+ */
+public class CompositeSyncBuilder<S, D> extends CompositeBuilder<S, D> 
implements SyncBuilder<S, D> {
+
+    public CompositeSyncBuilder(SyncBuilder<S, D>... builders) {
+        super(builders);
+    }
+}
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/SyncBuilder.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/SyncBuilder.java
new file mode 100644
index 0000000..b955f8f
--- /dev/null
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/SyncBuilder.java
@@ -0,0 +1,9 @@
+package org.ovirt.engine.ui.uicommonweb.builders;
+
+/**
+ * Dummy interface to mark synchronous {@link Builder}s.
+ * @param <S> - source
+ * @param <D> - destination
+ */
+public interface SyncBuilder<S, D> extends Builder<S, D> {
+}
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/CommonUnitToVmBaseBuilder.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/CommonUnitToVmBaseBuilder.java
index 69e5551..1d658a5 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/CommonUnitToVmBaseBuilder.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/CommonUnitToVmBaseBuilder.java
@@ -1,7 +1,7 @@
 package org.ovirt.engine.ui.uicommonweb.builders.vm;
 
 import org.ovirt.engine.core.common.businessentities.VmBase;
-import org.ovirt.engine.ui.uicommonweb.builders.CompositeBuilder;
+import org.ovirt.engine.ui.uicommonweb.builders.CompositeSyncBuilder;
 import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModel;
 
 /**
@@ -11,7 +11,7 @@
  * This builder is further subsumed by {@link FullUnitToVmBaseBuilder}
  * that performs full mapping of VmBase fields.
  */
-public class CommonUnitToVmBaseBuilder<T extends VmBase> extends 
CompositeBuilder<UnitVmModel, T> {
+public class CommonUnitToVmBaseBuilder<T extends VmBase> extends 
CompositeSyncBuilder<UnitVmModel, T> {
     public CommonUnitToVmBaseBuilder() {
         super(
                 new CoreUnitToVmBaseBuilder(),
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/FullUnitToVmBaseBuilder.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/FullUnitToVmBaseBuilder.java
index f89559a..8e7f242 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/FullUnitToVmBaseBuilder.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/FullUnitToVmBaseBuilder.java
@@ -1,7 +1,7 @@
 package org.ovirt.engine.ui.uicommonweb.builders.vm;
 
 import org.ovirt.engine.core.common.businessentities.VmBase;
-import org.ovirt.engine.ui.uicommonweb.builders.CompositeBuilder;
+import org.ovirt.engine.ui.uicommonweb.builders.CompositeSyncBuilder;
 import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModel;
 
 /**
@@ -13,7 +13,7 @@
  * or further yet in {@link CoreUnitToVmBaseBuilder} if this mapping should 
also apply to pool Vms.
  * (most fields fall into the "Core" category)
  */
-public class FullUnitToVmBaseBuilder<T extends VmBase> extends 
CompositeBuilder<UnitVmModel, T> {
+public class FullUnitToVmBaseBuilder<T extends VmBase> extends 
CompositeSyncBuilder<UnitVmModel, T> {
     public FullUnitToVmBaseBuilder() {
         super(
                 new CommonUnitToVmBaseBuilder(),
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingVmModelBehavior.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingVmModelBehavior.java
index ea6291a..8c2f622 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingVmModelBehavior.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingVmModelBehavior.java
@@ -33,7 +33,7 @@
 import 
org.ovirt.engine.ui.uicommonweb.models.vms.instancetypes.ExistingVmInstanceTypeManager;
 import 
org.ovirt.engine.ui.uicommonweb.models.vms.instancetypes.InstanceTypeManager;
 
-public class ExistingVmModelBehavior extends VmModelBehaviorBase
+public class ExistingVmModelBehavior extends VmModelBehaviorBase<UnitVmModel>
 {
     private InstanceTypeManager instanceTypeManager;
 
@@ -152,7 +152,18 @@
         // This method will be called even if a VM created from Blank template.
 
         // Update model state according to VM properties.
-        buildModel(vm.getStaticData());
+        buildModel(vm.getStaticData(), new 
BuilderExecutor.BuilderExecutionFinished<VmBase, UnitVmModel>() {
+            @Override
+            public void finished(VmBase source, UnitVmModel destination) {
+                templateWithVersion_SelectedItemChangedCont();
+            }
+        });
+    }
+
+    /**
+     * Asynchronous continuation of {@link 
#templateWithVersion_SelectedItemChanged()}
+     */
+    public void templateWithVersion_SelectedItemChangedCont() {
 
         getModel().getIsStateless().setIsAvailable(vm.getVmPoolId() == null);
 
@@ -197,11 +208,13 @@
     }
 
     @Override
-    protected void buildModel(VmBase vm) {
-        BuilderExecutor.build(vm, getModel(),
+    protected void buildModel(VmBase vm,
+                              BuilderExecutor.BuilderExecutionFinished<VmBase, 
UnitVmModel> callback) {
+        new BuilderExecutor<>(callback,
                               new NameAndDescriptionVmBaseToUnitBuilder(),
                               new CommentVmBaseToUnitBuilder(),
-                              new CommonVmBaseToUnitBuilder());
+                              new CommonVmBaseToUnitBuilder())
+                .build(vm, getModel());
     }
 
     private void updateGraphics() {
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewTemplateVmModelBehavior.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewTemplateVmModelBehavior.java
index 141f6e5..3b4a1d2 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewTemplateVmModelBehavior.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewTemplateVmModelBehavior.java
@@ -297,11 +297,20 @@
     {
     }
 
-    private void initTemplate()
-    {
+    private void initTemplate() {
         // Update model state according to VM properties.
-        buildModel(this.vm.getStaticData());
+        buildModel(this.vm.getStaticData(), new 
BuilderExecutor.BuilderExecutionFinished<VmBase, UnitVmModel>() {
+            @Override
+            public void finished(VmBase source, UnitVmModel destination) {
+                initTemplateCont();
+            }
+        });
+    }
 
+    /**
+     * Asynchronous continuation of {@link #initTemplate()}
+     */
+    private void initTemplateCont() {
         updateSelectedCdImage(this.vm.getStaticData());
         updateTimeZone(this.vm.getTimeZone());
         updateConsoleDevice(this.vm.getId());
@@ -319,8 +328,11 @@
     }
 
     @Override
-    protected void buildModel(VmBase vm) {
-        BuilderExecutor.build(vm, getModel(), new CommonVmBaseToUnitBuilder());
+    protected void buildModel(VmBase vmBase,
+                              BuilderExecutor.BuilderExecutionFinished<VmBase, 
UnitVmModel> callback) {
+        new BuilderExecutor<>(callback,
+                              new CommonVmBaseToUnitBuilder())
+                .build(vmBase, getModel());
     }
 
     @Override
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmModelBehavior.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmModelBehavior.java
index 23a75f7..1b6a63a 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmModelBehavior.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmModelBehavior.java
@@ -91,10 +91,20 @@
         }
     }
 
-    private void selectedTemplateChanged(VmTemplate template) {
+    private void selectedTemplateChanged(final VmTemplate template) {
         // Copy VM parameters from template.
-        buildModel(template);
+        buildModel(template, new 
BuilderExecutor.BuilderExecutionFinished<VmBase, UnitVmModel>() {
+            @Override
+            public void finished(VmBase source, UnitVmModel destination) {
+                selectedTemplateChangedCont(template);
+            }
+        });
+    }
 
+    /**
+     * Asynchronous continuation of {@link 
#selectedTemplateChanged(VmTemplate)}.
+     */
+    private void selectedTemplateChangedCont(VmTemplate template) {
         setSelectedOSType(template, 
getModel().getSelectedCluster().getArchitecture());
         doChangeDefautlHost(template.getDedicatedVmForVds());
 
@@ -154,8 +164,10 @@
     }
 
     @Override
-    protected void buildModel(VmBase template) {
-        BuilderExecutor.build(template, getModel(), new 
CoreVmBaseToUnitBuilder());
+    protected void buildModel(VmBase template, 
BuilderExecutor.BuilderExecutionFinished callback) {
+        new BuilderExecutor<>(callback,
+                new CoreVmBaseToUnitBuilder())
+                .build(template, getModel());
     }
 
     @Override
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/PoolModelBehaviorBase.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/PoolModelBehaviorBase.java
index 11f6282..d9b0291 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/PoolModelBehaviorBase.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/PoolModelBehaviorBase.java
@@ -104,68 +104,79 @@
 
     protected abstract List<VDSGroup> filterClusters(List<VDSGroup> clusters);
 
-    protected void setupWindowModelFrom(VmBase vmBase) {
+    protected void setupWindowModelFrom(final VmBase vmBase) {
         if (vmBase != null) {
             updateQuotaByCluster(vmBase.getQuotaId(), vmBase.getQuotaName());
 
             // Copy VM parameters from template.
-            buildModel(vmBase);
+            buildModel(vmBase, new 
BuilderExecutor.BuilderExecutionFinished<VmBase, UnitVmModel>() {
+                @Override
+                public void finished(VmBase source, UnitVmModel destination) {
+                    setupWindowModelFromCont(vmBase);
+                }
+            });
+        }
+    }
 
-            setSelectedOSType(vmBase, 
getModel().getSelectedCluster().getArchitecture());
-            getModel().getVmType().setSelectedItem(vmBase.getVmType());
-            getModel().getIsRunAndPause().setEntity(false);
+    /**
+     * Asynchronous continuation of {@link #setupWindowModelFrom(VmBase)}
+     */
+    protected void setupWindowModelFromCont(VmBase vmBase) {
+        setSelectedOSType(vmBase, 
getModel().getSelectedCluster().getArchitecture());
+        getModel().getVmType().setSelectedItem(vmBase.getVmType());
+        getModel().getIsRunAndPause().setEntity(false);
 
-            boolean hasCd = !StringHelper.isNullOrEmpty(vmBase.getIsoPath());
+        boolean hasCd = !StringHelper.isNullOrEmpty(vmBase.getIsoPath());
 
-            getModel().getCdImage().setIsChangable(hasCd);
-            getModel().getCdAttached().setEntity(hasCd);
-            if (hasCd) {
-                getModel().getCdImage().setSelectedItem(vmBase.getIsoPath());
-            }
+        getModel().getCdImage().setIsChangable(hasCd);
+        getModel().getCdAttached().setEntity(hasCd);
+        if (hasCd) {
+            getModel().getCdImage().setSelectedItem(vmBase.getIsoPath());
+        }
 
-            updateTimeZone(vmBase.getTimeZone());
+        updateTimeZone(vmBase.getTimeZone());
 
-            if (!vmBase.getId().equals(Guid.Empty))
-            {
-                getModel().getStorageDomain().setIsChangable(true);
+        if (!vmBase.getId().equals(Guid.Empty))
+        {
+            getModel().getStorageDomain().setIsChangable(true);
 
-                initDisks();
-            }
-            else
-            {
-                getModel().getStorageDomain().setIsChangable(false);
+            initDisks();
+        }
+        else
+        {
+            getModel().getStorageDomain().setIsChangable(false);
 
-                getModel().setIsDisksAvailable(false);
-                getModel().setDisks(null);
-            }
+            getModel().setIsDisksAvailable(false);
+            getModel().setDisks(null);
+        }
 
-            getModel().getProvisioning().setEntity(false);
+        getModel().getProvisioning().setEntity(false);
 
-            initStorageDomains();
+        initStorageDomains();
 
-            InstanceType selectedInstanceType = 
getModel().getInstanceTypes().getSelectedItem();
-            int instanceTypeMinAllocatedMemory = selectedInstanceType != null 
? selectedInstanceType.getMinAllocatedMem() : 0;
+        InstanceType selectedInstanceType = 
getModel().getInstanceTypes().getSelectedItem();
+        int instanceTypeMinAllocatedMemory = selectedInstanceType != null ? 
selectedInstanceType.getMinAllocatedMem() : 0;
 
-            // do not update if specified on template or instance type
-            if (vmBase.getMinAllocatedMem() == 0 && 
instanceTypeMinAllocatedMemory == 0) {
-                updateMinAllocatedMemory();
-            }
+        // do not update if specified on template or instance type
+        if (vmBase.getMinAllocatedMem() == 0 && instanceTypeMinAllocatedMemory 
== 0) {
+            updateMinAllocatedMemory();
+        }
 
-            
getModel().getAllowConsoleReconnect().setEntity(vmBase.isAllowConsoleReconnect());
+        
getModel().getAllowConsoleReconnect().setEntity(vmBase.isAllowConsoleReconnect());
 
-            getModel().getVmInitModel().init(vmBase);
-            getModel().getVmInitEnabled().setEntity(vmBase.getVmInit() != 
null);
+        getModel().getVmInitModel().init(vmBase);
+        getModel().getVmInitEnabled().setEntity(vmBase.getVmInit() != null);
 
-            if (getModel().getSelectedCluster() != null) {
-                updateCpuProfile(getModel().getSelectedCluster().getId(),
-                        getClusterCompatibilityVersion(), 
vmBase.getCpuProfileId());
-            }
+        if (getModel().getSelectedCluster() != null) {
+            updateCpuProfile(getModel().getSelectedCluster().getId(),
+                    getClusterCompatibilityVersion(), 
vmBase.getCpuProfileId());
         }
     }
 
     @Override
-    protected void buildModel(VmBase vmBase) {
-        BuilderExecutor.build(vmBase, getModel(), new 
CoreVmBaseToUnitBuilder());
+    protected void buildModel(VmBase vmBase, 
BuilderExecutor.BuilderExecutionFinished<VmBase, UnitVmModel> callback) {
+        new BuilderExecutor<>(callback, new CoreVmBaseToUnitBuilder())
+                .build(vmBase, getModel());
     }
 
     @Override
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TemplateVmModelBehavior.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TemplateVmModelBehavior.java
index c96c2ba..0918dc1 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TemplateVmModelBehavior.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TemplateVmModelBehavior.java
@@ -23,7 +23,7 @@
 import java.util.Collections;
 import java.util.List;
 
-public class TemplateVmModelBehavior extends VmModelBehaviorBase
+public class TemplateVmModelBehavior extends VmModelBehaviorBase<UnitVmModel>
 {
     private VmTemplate template;
 
@@ -181,18 +181,28 @@
         doChangeDefautlHost(template.getDedicatedVmForVds());
     }
 
-    public void buildModel(VmBase vm) {
-        BuilderExecutor.build(vm, getModel(),
-                              new NameAndDescriptionVmBaseToUnitBuilder(),
-                              new CommentVmBaseToUnitBuilder(),
-                              new CommonVmBaseToUnitBuilder());
+    public void buildModel(VmBase vmBase, 
BuilderExecutor.BuilderExecutionFinished<VmBase, UnitVmModel> callback) {
+        new BuilderExecutor<>(callback,
+                new NameAndDescriptionVmBaseToUnitBuilder(),
+                new CommentVmBaseToUnitBuilder(),
+                new CommonVmBaseToUnitBuilder())
+                .build(vmBase, getModel());
     }
 
-    private void initTemplate()
-    {
+    private void initTemplate() {
         // Update model state according to VM properties.
-        buildModel(template);
+        buildModel(template, new 
BuilderExecutor.BuilderExecutionFinished<VmBase, UnitVmModel>() {
+            @Override
+            public void finished(VmBase source, UnitVmModel destination) {
+                initTemplateCont();
+            }
+        });
+    }
 
+    /**
+     * Asynchronous continuation of {@link #initTemplateWithVersion(List)}
+     */
+    private void initTemplateCont() {
         getModel().getMinAllocatedMemory().setIsChangable(false);
 
         updateTimeZone(template.getTimeZone());
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmModelBehaviorBase.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmModelBehaviorBase.java
index f3a94de..e2b6323 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmModelBehaviorBase.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmModelBehaviorBase.java
@@ -44,6 +44,7 @@
 import org.ovirt.engine.ui.frontend.AsyncQuery;
 import org.ovirt.engine.ui.frontend.Frontend;
 import org.ovirt.engine.ui.frontend.INewAsyncCallback;
+import org.ovirt.engine.ui.uicommonweb.builders.BuilderExecutor;
 import org.ovirt.engine.ui.uicommonweb.models.templates.LatestVmTemplate;
 import org.ovirt.engine.ui.uicommonweb.Linq;
 import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider;
@@ -173,7 +174,8 @@
         getModel().getDefaultHost().setIsChangable(!isLocalSD);
     }
 
-    protected void buildModel(VmBase vmBase) {
+    protected void buildModel(VmBase vmBase,
+                              BuilderExecutor.BuilderExecutionFinished<VmBase, 
UnitVmModel> callback) {
     }
 
     public void templateWithVersion_SelectedItemChanged() {}
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/instancetypes/ExistingInstanceTypeModelBehavior.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/instancetypes/ExistingInstanceTypeModelBehavior.java
index 3c9611c..c727ee2 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/instancetypes/ExistingInstanceTypeModelBehavior.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/instancetypes/ExistingInstanceTypeModelBehavior.java
@@ -49,28 +49,38 @@
         getModel().getIsSoundcardEnabled().setIsChangable(true);
 
         Frontend.getInstance().runQuery(VdcQueryType.GetGraphicsDevices, new 
IdQueryParameters(instanceType.getId()), new AsyncQuery(
-            this,
-            new INewAsyncCallback() {
-                @Override
-                public void onSuccess(Object model, Object returnValue) {
-                    List<GraphicsDevice> graphicsDevices = 
((VdcQueryReturnValue) returnValue).getReturnValue();
-                    Collection<GraphicsType> graphicsTypesCollection = new 
HashSet<GraphicsType>();
+                this,
+                new INewAsyncCallback() {
+                    @Override
+                    public void onSuccess(Object model, Object returnValue) {
+                        List<GraphicsDevice> graphicsDevices = 
((VdcQueryReturnValue) returnValue).getReturnValue();
+                        Collection<GraphicsType> graphicsTypesCollection = new 
HashSet<GraphicsType>();
 
-                    for (GraphicsDevice graphicsDevice : graphicsDevices) {
-                        
graphicsTypesCollection.add(graphicsDevice.getGraphicsType());
+                        for (GraphicsDevice graphicsDevice : graphicsDevices) {
+                            
graphicsTypesCollection.add(graphicsDevice.getGraphicsType());
+                        }
+
+                        initDisplayTypes(instanceType.getDefaultDisplayType(), 
UnitVmModel.GraphicsTypes.fromGraphicsTypes(graphicsTypesCollection));
                     }
-
-                    initDisplayTypes(instanceType.getDefaultDisplayType(), 
UnitVmModel.GraphicsTypes.fromGraphicsTypes(graphicsTypesCollection));
                 }
-            }
         ));
 
         initSoundCard(instanceType.getId());
         updateConsoleDevice(instanceType.getId());
         initPriority(instanceType.getPriority());
 
-        buildModel((VmBase) instanceType);
+        buildModel((VmBase) instanceType, new 
BuilderExecutor.BuilderExecutionFinished<VmBase, UnitVmModel>() {
+            @Override
+            public void finished(VmBase source, UnitVmModel destination) {
+                initializeCont();
+            }
+        });
+    }
 
+    /**
+     * Asynchronous continuation of {@link #initialize(SystemTreeItemModel}
+     */
+    public void initializeCont() {
         Frontend.getInstance().runQuery(VdcQueryType.IsBalloonEnabled, new 
IdQueryParameters(instanceType.getId()), new AsyncQuery(this,
                 new INewAsyncCallback() {
                     @Override
@@ -142,10 +152,11 @@
     }
 
     @Override
-    protected void buildModel(VmBase vm) {
-        BuilderExecutor.build(vm, getModel(),
+    protected void buildModel(VmBase vmBase, 
BuilderExecutor.BuilderExecutionFinished<VmBase, UnitVmModel> callback) {
+        new BuilderExecutor<>(callback,
                               new NameAndDescriptionVmBaseToUnitBuilder(),
-                              new HwOnlyVmBaseToUnitBuilder());
+                              new HwOnlyVmBaseToUnitBuilder())
+                .build(vmBase, getModel());
     }
 
     protected void initSoundCard(Guid id) {
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/test/java/org/ovirt/engine/ui/uicommonweb/models/vms/BaseVmModelBehaviorTest.java
 
b/frontend/webadmin/modules/uicommonweb/src/test/java/org/ovirt/engine/ui/uicommonweb/models/vms/BaseVmModelBehaviorTest.java
index bfeded4..7935556 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/test/java/org/ovirt/engine/ui/uicommonweb/models/vms/BaseVmModelBehaviorTest.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/test/java/org/ovirt/engine/ui/uicommonweb/models/vms/BaseVmModelBehaviorTest.java
@@ -10,6 +10,7 @@
 import org.ovirt.engine.core.common.businessentities.VDSGroup;
 import org.ovirt.engine.core.common.businessentities.VmBase;
 import org.ovirt.engine.core.compat.Version;
+import org.ovirt.engine.ui.uicommonweb.builders.BuilderExecutor;
 import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
 
 public abstract class BaseVmModelBehaviorTest extends BaseVmTest {
@@ -55,10 +56,13 @@
     @Test
     public void testBuildModel() {
         VmModelBehaviorBase behavior = getBehavior();
-        UnitVmModel model = createModel(behavior);
-        behavior.buildModel(getVm());
-
-        verifyBuiltModel(model);
+        final UnitVmModel model = createModel(behavior);
+        behavior.buildModel(getVm(), new 
BuilderExecutor.BuilderExecutionFinished<VmBase, UnitVmModel>() {
+            @Override
+            public void finished(VmBase source, UnitVmModel destination) {
+                verifyBuiltModel(model);
+            }
+        });
     }
 
     protected abstract VmBase getVm();


-- 
To view, visit http://gerrit.ovirt.org/38067
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I10a94c3c59f5641a2661781c6dc227f572447468
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Jakub Niedermertl <jnied...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to