Repository: ambari Updated Branches: refs/heads/trunk d3d583388 -> 0d5cc744a
AMBARI-6230 - Views: updates after POST to create cause exceptions Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/0d5cc744 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/0d5cc744 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/0d5cc744 Branch: refs/heads/trunk Commit: 0d5cc744a4dc3e7de28a4d4ea3b80b76677e7639 Parents: d3d5833 Author: tbeerbower <[email protected]> Authored: Fri Jun 20 16:19:12 2014 -0400 Committer: tbeerbower <[email protected]> Committed: Fri Jun 20 16:30:01 2014 -0400 ---------------------------------------------------------------------- .../server/orm/entities/ViewInstanceEntity.java | 18 +++++ .../apache/ambari/server/view/ViewRegistry.java | 80 ++++++++++++-------- .../orm/entities/ViewInstanceEntityTest.java | 23 ++++++ .../ambari/server/view/ViewRegistryTest.java | 6 ++ 4 files changed, 97 insertions(+), 30 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/0d5cc744/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java index d7955a3..2c48d9f 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java @@ -282,6 +282,24 @@ public class ViewInstanceEntity implements ViewInstanceDefinition { // ----- ViewInstanceEntity ------------------------------------------------ /** + * Get the view instance id. + * + * @return the instance id + */ + public Long getViewInstanceId() { + return viewInstanceId; + } + + /** + * Set the given view instance id. + * + * @param viewInstanceId the instance id + */ + public void setViewInstanceId(Long viewInstanceId) { + this.viewInstanceId = viewInstanceId; + } + + /** * Set the view name. * * @param viewName the view name http://git-wip-us.apache.org/repos/asf/ambari/blob/0d5cc744/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java index 068fff8..33485a0 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java @@ -395,6 +395,16 @@ public class ViewRegistry { } instanceEntity.validate(viewEntity); instanceDAO.merge(instanceEntity); + + ViewInstanceEntity persistedInstance = instanceDAO.findByName(ViewEntity.getViewName(viewName, version), instanceName); + if (persistedInstance == null) { + String message = "Instance " + instanceEntity.getViewName() + " can not be found."; + + LOG.error(message); + throw new IllegalStateException(message); + } + instanceEntity.setViewInstanceId(persistedInstance.getViewInstanceId()); + try { // bind the view instance to a view bindViewInstance(viewEntity, instanceEntity); @@ -806,43 +816,53 @@ public class ViewRegistry { } // ... merge it viewDAO.merge(view); - } else { - Map<String, ViewInstanceEntity> instanceEntityMap = new HashMap<String, ViewInstanceEntity>(); - for( ViewInstanceEntity instance : view.getInstances()) { - instanceEntityMap.put(instance.getName(), instance); + + persistedView = viewDAO.findByName(viewName); + if (persistedView == null) { + String message = "View " + persistedView.getViewName() + " can not be found."; + + LOG.error(message); + throw new IllegalStateException(message); } + } - // make sure that each instance of the view in the db is reflected in the given view - for (ViewInstanceEntity persistedInstance : persistedView.getInstances()){ - String instanceName = persistedInstance.getName(); + Map<String, ViewInstanceEntity> instanceEntityMap = new HashMap<String, ViewInstanceEntity>(); + for( ViewInstanceEntity instance : view.getInstances()) { + instanceEntityMap.put(instance.getName(), instance); + } - ViewInstanceEntity instance = - view.getInstanceDefinition(instanceName); + // make sure that each instance of the view in the db is reflected in the given view + for (ViewInstanceEntity persistedInstance : persistedView.getInstances()){ + String instanceName = persistedInstance.getName(); - instanceEntityMap.remove(instanceName); + ViewInstanceEntity instance = + view.getInstanceDefinition(instanceName); - // if the persisted instance is not in the registry ... - if (instance == null) { - // ... create and add it - instance = new ViewInstanceEntity(view, instanceName); - bindViewInstance(view, instance); - instanceDefinitions.add(instance); - } - // apply the persisted overrides to the in-memory instance - instance.setLabel(persistedInstance.getLabel()); - instance.setDescription(persistedInstance.getDescription()); - instance.setVisible(persistedInstance.isVisible()); - instance.setData(persistedInstance.getData()); - instance.setProperties(persistedInstance.getProperties()); - instance.setEntities(persistedInstance.getEntities()); - } + instanceEntityMap.remove(instanceName); - // these instances appear in the archive but have been deleted - // from the db... remove them from the registry - for (ViewInstanceEntity instance : instanceEntityMap.values()) { - view.removeInstanceDefinition(instance.getName()); - instanceDefinitions.remove(instance); + // if the persisted instance is not in the registry ... + if (instance == null) { + // ... create and add it + instance = new ViewInstanceEntity(view, instanceName); + bindViewInstance(view, instance); + instanceDefinitions.add(instance); } + instance.setViewInstanceId(persistedInstance.getViewInstanceId()); + + // apply the persisted overrides to the in-memory instance + instance.setLabel(persistedInstance.getLabel()); + instance.setDescription(persistedInstance.getDescription()); + instance.setVisible(persistedInstance.isVisible()); + instance.setData(persistedInstance.getData()); + instance.setProperties(persistedInstance.getProperties()); + instance.setEntities(persistedInstance.getEntities()); + } + + // these instances appear in the archive but have been deleted + // from the db... remove them from the registry + for (ViewInstanceEntity instance : instanceEntityMap.values()) { + view.removeInstanceDefinition(instance.getName()); + instanceDefinitions.remove(instance); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/0d5cc744/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewInstanceEntityTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewInstanceEntityTest.java b/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewInstanceEntityTest.java index eeee73e..b7de666 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewInstanceEntityTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewInstanceEntityTest.java @@ -29,8 +29,10 @@ import org.apache.ambari.view.ResourceProvider; import org.junit.Assert; import org.junit.Test; +import java.util.HashSet; import java.util.Map; import java.util.Properties; +import java.util.Set; import static org.easymock.EasyMock.createNiceMock; @@ -136,6 +138,16 @@ public class ViewInstanceEntityTest { } @Test + public void testGetId() throws Exception { + ViewInstanceEntity viewInstanceDefinition = getViewInstanceEntity(); + + Assert.assertNull(viewInstanceDefinition.getViewInstanceId()); + + viewInstanceDefinition.setViewInstanceId(99L); + Assert.assertEquals(99L, (long) viewInstanceDefinition.getViewInstanceId()); + } + + @Test public void testGetName() throws Exception { ViewInstanceEntity viewInstanceDefinition = getViewInstanceEntity(); @@ -352,6 +364,17 @@ public class ViewInstanceEntityTest { return new ViewInstanceEntity(viewDefinition, instanceConfig); } + public static Set<ViewInstanceEntity> getViewInstanceEntities(ViewEntity viewDefinition) throws Exception { + Set<ViewInstanceEntity> entities = new HashSet<ViewInstanceEntity>(); + + InstanceConfig instanceConfig = InstanceConfigTest.getInstanceConfigs().get(0); + entities.add(new ViewInstanceEntity(viewDefinition, instanceConfig)); + instanceConfig = InstanceConfigTest.getInstanceConfigs().get(1); + entities.add(new ViewInstanceEntity(viewDefinition, instanceConfig)); + + return entities; + } + @Test public void testValidate() throws Exception { http://git-wip-us.apache.org/repos/asf/ambari/blob/0d5cc744/ambari-server/src/test/java/org/apache/ambari/server/view/ViewRegistryTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/view/ViewRegistryTest.java b/ambari-server/src/test/java/org/apache/ambari/server/view/ViewRegistryTest.java index 6927676..eb9c952 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/view/ViewRegistryTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/view/ViewRegistryTest.java @@ -161,6 +161,8 @@ public class ViewRegistryTest { ViewEntity viewDefinition = ViewEntityTest.getViewEntity(); + viewDefinition.setInstances(ViewInstanceEntityTest.getViewInstanceEntities(viewDefinition)); + Map<File, ViewConfig> viewConfigs = Collections.singletonMap(viewArchive, viewDefinition.getConfiguration()); @@ -226,6 +228,7 @@ public class ViewRegistryTest { expect(vDAO.findByName("MY_VIEW{1.0.0}")).andReturn(null); expect(vDAO.merge(capture(captureViewEntity))).andReturn(null); + expect(vDAO.findByName("MY_VIEW{1.0.0}")).andReturn(viewDefinition); expect(vDAO.findAll()).andReturn(Collections.<ViewEntity>emptyList()); @@ -471,6 +474,7 @@ public class ViewRegistryTest { ViewInstanceEntity viewInstanceEntity = getViewInstanceEntity(viewEntity, config.getInstances().get(0)); expect(viewInstanceDAO.merge(viewInstanceEntity)).andReturn(null); + expect(viewInstanceDAO.findByName("MY_VIEW{1.0.0}", viewInstanceEntity.getInstanceName())).andReturn(viewInstanceEntity); replay(viewDAO, viewInstanceDAO); @@ -571,6 +575,7 @@ public class ViewRegistryTest { expect(viewInstanceDAO.merge(viewInstanceEntity)).andReturn(null); expect(viewInstanceDAO.merge(viewInstanceEntity)).andReturn(viewInstanceEntity); + expect(viewInstanceDAO.findByName("MY_VIEW{1.0.0}", viewInstanceEntity.getInstanceName())).andReturn(viewInstanceEntity); replay(viewDAO, viewInstanceDAO); @@ -610,6 +615,7 @@ public class ViewRegistryTest { ViewInstanceEntity updateInstance = getViewInstanceEntity(viewEntity, invalidConfig.getInstances().get(0)); expect(viewInstanceDAO.merge(viewInstanceEntity)).andReturn(null); + expect(viewInstanceDAO.findByName("MY_VIEW{1.0.0}", viewInstanceEntity.getInstanceName())).andReturn(viewInstanceEntity); replay(viewDAO, viewInstanceDAO);
