diff --git a/oscm-internal/javasrc/org/oscm/internal/assembler/POLandingpageEntryAssembler.java b/oscm-internal/javasrc/org/oscm/internal/assembler/POLandingpageEntryAssembler.java index 9b372d560..ee2ad724a 100644 --- a/oscm-internal/javasrc/org/oscm/internal/assembler/POLandingpageEntryAssembler.java +++ b/oscm-internal/javasrc/org/oscm/internal/assembler/POLandingpageEntryAssembler.java @@ -20,10 +20,10 @@ import org.oscm.domobjects.TechnicalProductOperation; import org.oscm.domobjects.enums.LocalizedObjectTypes; import org.oscm.i18nservice.bean.LocalizerFacade; -import org.oscm.serviceprovisioningservice.assembler.ProductAssembler; import org.oscm.internal.landingpage.POLandingpageEntry; import org.oscm.internal.types.enumtypes.OrganizationRoleType; import org.oscm.internal.types.enumtypes.ServiceType; +import org.oscm.serviceprovisioningservice.assembler.ProductAssembler; /** * Assembler that merges service and subscription into PO object @@ -142,8 +142,8 @@ protected static void updateEntryForSubscription(Subscription subscription, entry.setSubscribed(true); } - static void setServiceAccessUrl(Subscription subscription, POLandingpageEntry entry, - TechnicalProduct techProd) { + static void setServiceAccessUrl(Subscription subscription, + POLandingpageEntry entry, TechnicalProduct techProd) { if (subscription.getBaseURL() == null) { entry.setServiceAccessURL(techProd.getBaseURL()); } else { @@ -178,7 +178,7 @@ private static void prefetchForPoducts(List products, LocalizerFacade facade) { List objectKeys = new ArrayList(); for (Product product : products) { - objectKeys.add(Long.valueOf(product.getKey())); + objectKeys.add(Long.valueOf(product.getTemplateOrSelf().getKey())); } facade.prefetch( objectKeys, diff --git a/oscm-internalservices-unittests/javasrc/org/oscm/internal/assembler/POLandingpageEntryAssemblerTest.java b/oscm-internalservices-unittests/javasrc/org/oscm/internal/assembler/POLandingpageEntryAssemblerTest.java index 04239c7fa..87ac72dfa 100644 --- a/oscm-internalservices-unittests/javasrc/org/oscm/internal/assembler/POLandingpageEntryAssemblerTest.java +++ b/oscm-internalservices-unittests/javasrc/org/oscm/internal/assembler/POLandingpageEntryAssemblerTest.java @@ -8,13 +8,16 @@ package org.oscm.internal.assembler; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.oscm.test.Numbers.L_TIMESTAMP; import static org.oscm.test.matchers.JavaMatchers.hasNoItems; import static org.oscm.test.matchers.JavaMatchers.hasOneItem; import static org.oscm.test.matchers.JavaMatchers.isNullValue; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.Arrays; @@ -22,7 +25,10 @@ import org.junit.Before; import org.junit.Test; - +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Matchers; +import org.mockito.MockitoAnnotations; import org.oscm.domobjects.Organization; import org.oscm.domobjects.PlatformUser; import org.oscm.domobjects.Product; @@ -30,12 +36,12 @@ import org.oscm.domobjects.TechnicalProduct; import org.oscm.domobjects.enums.LocalizedObjectTypes; import org.oscm.i18nservice.bean.LocalizerFacade; -import org.oscm.test.stubs.LocalizerServiceStub; import org.oscm.internal.landingpage.POLandingpageEntry; import org.oscm.internal.types.enumtypes.ServiceAccessType; import org.oscm.internal.types.enumtypes.ServiceStatus; import org.oscm.internal.types.enumtypes.ServiceType; import org.oscm.internal.types.enumtypes.SubscriptionStatus; +import org.oscm.test.stubs.LocalizerServiceStub; /** * @author zankov @@ -44,6 +50,8 @@ public class POLandingpageEntryAssemblerTest { private LocalizerFacade facade; + @Captor + ArgumentCaptor> objectKeyCaptor; @Before public void setup() throws Exception { @@ -55,6 +63,8 @@ public String getLocalizedTextFromDatabase(String localeString, return objectType.name(); } }, "en"); + + MockitoAnnotations.initMocks(this); } private Organization givenSupplier() { @@ -261,4 +271,69 @@ private Subscription givenSubscription(String subId, ServiceAccessType type) { subscription.setOwner(owner); return subscription; } + + @Test + public void toPOLandingpageEntries_prefetchForPoducts_withoutTemplates_bug12479() { + // given + List subscriptions = Arrays.asList( + givenSubscription("sub_1", ServiceAccessType.LOGIN), + givenSubscription("sub_2", ServiceAccessType.LOGIN)); + List services = Arrays + .asList(givenProduct(ServiceAccessType.LOGIN)); + LocalizerFacade facadeMock = spy(facade); + + // when + POLandingpageEntryAssembler.toPOLandingpageEntries(services, + subscriptions, facadeMock); + + // than + verify(facadeMock, times(2)).prefetch(objectKeyCaptor.capture(), + Matchers.anyListOf(LocalizedObjectTypes.class)); + List> args = objectKeyCaptor.getAllValues(); + List objectkeys = args.get(0); + assertEquals(1, objectkeys.size()); + assertEquals(Long.valueOf(4321), objectkeys.get(0)); + } + + @Test + public void toPOLandingpageEntries_prefetchForPoducts_withTemplates_bug12479() { + // given + List subscriptions = Arrays.asList( + givenSubscription("sub_1", ServiceAccessType.LOGIN), + givenSubscription("sub_2", ServiceAccessType.LOGIN)); + List services = new ArrayList(); + services.add(givenProduct(ServiceAccessType.LOGIN)); + Product template = new Product(); + template.setType(ServiceType.TEMPLATE); + template.setVendor(givenSupplier()); + template.setTechnicalProduct(givenTechnicalProduct(ServiceAccessType.LOGIN)); + template.setKey(4322); + template.setProductId("template"); + template.setStatus(ServiceStatus.ACTIVE); + services.add(template); + Product product = new Product(); + product.setType(ServiceType.TEMPLATE); + product.setVendor(givenSupplier()); + product.setTechnicalProduct(givenTechnicalProduct(ServiceAccessType.LOGIN)); + product.setKey(4323); + product.setProductId("product"); + product.setStatus(ServiceStatus.ACTIVE); + product.setTemplate(template); + services.add(product); + LocalizerFacade facadeMock = spy(facade); + + // when + POLandingpageEntryAssembler.toPOLandingpageEntries(services, + subscriptions, facadeMock); + + // than + verify(facadeMock, times(2)).prefetch(objectKeyCaptor.capture(), + Matchers.anyListOf(LocalizedObjectTypes.class)); + List> args = objectKeyCaptor.getAllValues(); + List objectkeys = args.get(0); + assertEquals(3, objectkeys.size()); + assertEquals(Long.valueOf(4321), objectkeys.get(0)); + assertEquals(Long.valueOf(4322), objectkeys.get(1)); + assertEquals(Long.valueOf(4322), objectkeys.get(2)); + } } diff --git a/oscm-portal-webtests/tests/marketplace/allTests.xml b/oscm-portal-webtests/tests/marketplace/allTests.xml index cc3a7bd02..29898c95f 100644 --- a/oscm-portal-webtests/tests/marketplace/allTests.xml +++ b/oscm-portal-webtests/tests/marketplace/allTests.xml @@ -16,7 +16,7 @@ - + diff --git a/oscm-serviceprovisioning-intsvc/javasrc/org/oscm/serviceprovisioningservice/assembler/ProductAssembler.java b/oscm-serviceprovisioning-intsvc/javasrc/org/oscm/serviceprovisioningservice/assembler/ProductAssembler.java index 707a2a49b..36e5aa11b 100644 --- a/oscm-serviceprovisioning-intsvc/javasrc/org/oscm/serviceprovisioningservice/assembler/ProductAssembler.java +++ b/oscm-serviceprovisioning-intsvc/javasrc/org/oscm/serviceprovisioningservice/assembler/ProductAssembler.java @@ -30,8 +30,6 @@ import org.oscm.domobjects.enums.LocalizedObjectTypes; import org.oscm.i18nservice.bean.LocalizerFacade; import org.oscm.interceptor.DateFactory; -import org.oscm.validator.BLValidator; -import org.oscm.vo.BaseAssembler; import org.oscm.internal.types.enumtypes.OfferingType; import org.oscm.internal.types.enumtypes.OrganizationRoleType; import org.oscm.internal.types.enumtypes.PerformanceHint; @@ -48,6 +46,8 @@ import org.oscm.internal.vo.VOServiceDetails; import org.oscm.internal.vo.VOServiceEntry; import org.oscm.internal.vo.VOTechnicalService; +import org.oscm.validator.BLValidator; +import org.oscm.vo.BaseAssembler; /** * @author Günther Schmid @@ -270,7 +270,8 @@ public static void prefetchData(List products, if (scope == PerformanceHint.ONLY_FIELDS_FOR_LISTINGS) { List objectKeys = new ArrayList(); for (Product product : products) { - objectKeys.add(Long.valueOf(product.getKey())); + objectKeys.add(Long.valueOf(product.getTemplateOrSelf() + .getKey())); } facade.prefetch( objectKeys, diff --git a/oscm-serviceprovisioning-unittests/javasrc/org/oscm/serviceprovisioningservice/assembler/ProductAssemblerTest.java b/oscm-serviceprovisioning-unittests/javasrc/org/oscm/serviceprovisioningservice/assembler/ProductAssemblerTest.java index cd0facc19..bca527cf4 100644 --- a/oscm-serviceprovisioning-unittests/javasrc/org/oscm/serviceprovisioningservice/assembler/ProductAssemblerTest.java +++ b/oscm-serviceprovisioning-unittests/javasrc/org/oscm/serviceprovisioningservice/assembler/ProductAssemblerTest.java @@ -15,6 +15,9 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import java.math.BigDecimal; import java.util.ArrayList; @@ -27,7 +30,10 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; - +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Matchers; +import org.mockito.MockitoAnnotations; import org.oscm.domobjects.Event; import org.oscm.domobjects.Organization; import org.oscm.domobjects.OrganizationRole; @@ -47,7 +53,6 @@ import org.oscm.domobjects.TechnicalProductTag; import org.oscm.domobjects.enums.LocalizedObjectTypes; import org.oscm.i18nservice.bean.LocalizerFacade; -import org.oscm.test.stubs.LocalizerServiceStub; import org.oscm.internal.types.enumtypes.OrganizationRoleType; import org.oscm.internal.types.enumtypes.PerformanceHint; import org.oscm.internal.types.enumtypes.PriceModelType; @@ -60,6 +65,7 @@ import org.oscm.internal.vo.VOPricedParameter; import org.oscm.internal.vo.VOService; import org.oscm.internal.vo.VOServiceDetails; +import org.oscm.test.stubs.LocalizerServiceStub; /** * @author weiser @@ -78,17 +84,24 @@ public class ProductAssemblerTest { private PlatformUser user; private VOService voService; private VOService voCustomerService; + @Captor + ArgumentCaptor> objectKeyCaptor; @Before public void setup() throws Exception { + facade = new LocalizerFacade(new LocalizerServiceStub() { @Override public String getLocalizedTextFromDatabase(String localeString, long objectKey, LocalizedObjectTypes objectType) { + return objectType.name(); } }, "en"); + + MockitoAnnotations.initMocks(this); + technicalProduct = new TechnicalProduct(); technicalProduct.setAccessType(ServiceAccessType.DIRECT); technicalProduct.setBaseURL("baseURL"); @@ -810,4 +823,51 @@ private void verifyCopiedAttributes(Product prod) { Boolean.valueOf(voService.isAutoAssignUserEnabled())); } + @Test + public void prefetchData_withoutTemplates_bug12479() { + // given + List products = new ArrayList(); + products.add(product); + products.add(customerProduct); + LocalizerFacade facadeMock = spy(facade); + + // when + ProductAssembler.prefetchData(products, facadeMock, + PerformanceHint.ONLY_FIELDS_FOR_LISTINGS); + + // then + verify(facadeMock, times(1)).prefetch(objectKeyCaptor.capture(), + Matchers.anyListOf(LocalizedObjectTypes.class)); + List objectkeys = objectKeyCaptor.getValue(); + assertEquals(2, objectkeys.size()); + assertEquals(Long.valueOf(product.getKey()), objectkeys.get(0)); + assertEquals(Long.valueOf(customerProduct.getKey()), objectkeys.get(1)); + } + + @Test + public void prefetchData_withTemplates_bug12479() { + // given + List products = new ArrayList(); + products.add(product); + Product anotherProduct = new Product(); + anotherProduct.setType(ServiceType.PARTNER_TEMPLATE); + anotherProduct.setConfiguratorUrl("some value"); + anotherProduct.setTemplate(template); + products.add(anotherProduct); + products.add(customerProduct); + LocalizerFacade facadeMock = spy(facade); + + // when + ProductAssembler.prefetchData(products, facadeMock, + PerformanceHint.ONLY_FIELDS_FOR_LISTINGS); + + // then + verify(facadeMock, times(1)).prefetch(objectKeyCaptor.capture(), + Matchers.anyListOf(LocalizedObjectTypes.class)); + List objectkeys = objectKeyCaptor.getValue(); + assertEquals(3, objectkeys.size()); + assertEquals(Long.valueOf(product.getKey()), objectkeys.get(0)); + assertEquals(Long.valueOf(template.getKey()), objectkeys.get(1)); + assertEquals(Long.valueOf(customerProduct.getKey()), objectkeys.get(2)); + } }