/* * Copyright 2014 - 2017 Blazebit. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.blazebit.persistence.view.testsuite.subview; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import java.util.List; import java.util.Map; import java.util.Set; import javax.persistence.EntityManager; import com.blazebit.persistence.testsuite.base.category.NoEclipselink; import com.blazebit.persistence.testsuite.tx.TxVoidWork; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.blazebit.persistence.CriteriaBuilder; import com.blazebit.persistence.view.EntityViewManager; import com.blazebit.persistence.view.EntityViewSetting; import com.blazebit.persistence.view.EntityViews; import com.blazebit.persistence.view.spi.EntityViewConfiguration; import com.blazebit.persistence.view.testsuite.AbstractEntityViewTest; import com.blazebit.persistence.view.testsuite.entity.Document; import com.blazebit.persistence.view.testsuite.entity.Person; import com.blazebit.persistence.view.testsuite.subview.model.DocumentMasterView; import com.blazebit.persistence.view.testsuite.subview.model.PersonSubView; import com.blazebit.persistence.view.testsuite.subview.model.PersonSubViewFiltered; import org.junit.experimental.categories.Category; /** * * @author Christian Beikov * @since 1.0 */ public class SubviewTest extends AbstractEntityViewTest { private Document doc1; private Document doc2; @Override public void setUpOnce() { cleanDatabase(); transactional(new TxVoidWork() { @Override public void work(EntityManager em) { doc1 = new Document("doc1"); doc2 = new Document("doc2"); Person o1 = new Person("pers1"); Person o2 = new Person("pers2"); Person o3 = new Person("pers3"); Person o4 = new Person("pers4"); o1.getLocalized().put(1, "localized1"); o2.getLocalized().put(1, "localized2"); o1.setPartnerDocument(doc1); o2.setPartnerDocument(doc2); o3.setPartnerDocument(doc1); o4.setPartnerDocument(doc2); doc1.setOwner(o1); doc2.setOwner(o2); doc1.getContacts().put(2, o1); doc2.getContacts().put(2, o2); doc1.getContacts2().put(1, o1); doc2.getContacts2().put(1, o2); doc1.getContacts2().put(2, o3); doc2.getContacts2().put(2, o4); em.persist(o1); em.persist(o2); em.persist(o3); em.persist(o4); doc1.getPartners().add(o1); doc1.getPartners().add(o3); doc2.getPartners().add(o2); doc2.getPartners().add(o4); doc1.getPersonList().add(o1); doc1.getPersonList().add(o2); doc2.getPersonList().add(o3); doc2.getPersonList().add(o4); em.persist(doc1); em.persist(doc2); } }); } @Before public void setUp() { doc1 = cbf.create(em, Document.class).where("name").eq("doc1").getSingleResult(); doc2 = cbf.create(em, Document.class).where("name").eq("doc2").getSingleResult(); } @Test @Category({ NoEclipselink.class }) // Eclipselink has a result set mapping bug in case of map keys public void testSubview() { EntityViewConfiguration cfg = EntityViews.createDefaultConfiguration(); cfg.addEntityView(DocumentMasterView.class); cfg.addEntityView(PersonSubView.class); cfg.addEntityView(PersonSubViewFiltered.class); EntityViewManager evm = cfg.createEntityViewManager(cbf); CriteriaBuilder<Document> criteria = cbf.create(em, Document.class, "d") .orderByAsc("id"); CriteriaBuilder<DocumentMasterView> cb = evm.applySetting(EntityViewSetting.create(DocumentMasterView.class), criteria) .setParameter("contactPersonNumber", 2); List<DocumentMasterView> results = cb.getResultList(); assertEquals(2, results.size()); // Doc1 assertEquals(doc1.getName(), results.get(0).getName()); assertEquals("PERS1", results.get(0).getOwner().getName()); assertEquals(Integer.valueOf(2), results.get(0).getContactPersonNumber()); assertEquals(Integer.valueOf(2), results.get(0).getTheContactPersonNumber()); // Filtered subview assertEquals(doc1.getContacts().get(2).getName(), results.get(0).getMyContactPerson().getName()); assertEquals(Integer.valueOf(2), results.get(0).getMyContactPerson().getContactPersonNumber()); assertSubviewEquals(doc1.getContacts2(), results.get(0).getContacts()); assertSubviewEquals(doc1.getPartners(), results.get(0).getPartners()); assertSubviewEquals(doc1.getPersonList(), results.get(0).getPersonList()); // Doc2 assertEquals(doc2.getName(), results.get(1).getName()); assertEquals("PERS2", results.get(1).getOwner().getName()); assertEquals(Integer.valueOf(2), results.get(1).getContactPersonNumber()); assertEquals(Integer.valueOf(2), results.get(1).getTheContactPersonNumber()); // Filtered subview assertEquals(doc2.getContacts().get(2).getName(), results.get(1).getMyContactPerson().getName()); assertEquals(Integer.valueOf(2), results.get(1).getMyContactPerson().getContactPersonNumber()); assertSubviewEquals(doc2.getContacts2(), results.get(1).getContacts()); assertSubviewEquals(doc2.getPartners(), results.get(1).getPartners()); assertSubviewEquals(doc2.getPersonList(), results.get(1).getPersonList()); } public static void assertSubviewEquals(Map<Integer, Person> persons, Map<Integer, PersonSubView> personSubviews) { if (persons == null) { assertNull(personSubviews); return; } assertNotNull(personSubviews); assertEquals(persons.size(), personSubviews.size()); for (Map.Entry<Integer, Person> personEntry : persons.entrySet()) { Person p = personEntry.getValue(); PersonSubView pSub = personSubviews.get(personEntry.getKey()); assertEquals(p.getName().toUpperCase(), pSub.getName()); } } public static void assertSubviewEquals(List<Person> persons, List<PersonSubView> personSubviews) { if (persons == null) { assertNull(personSubviews); return; } assertNotNull(personSubviews); assertEquals(persons.size(), personSubviews.size()); for (int i = 0; i < persons.size(); i++) { Person p = persons.get(i); PersonSubView pSub = personSubviews.get(i); assertEquals(p.getName().toUpperCase(), pSub.getName()); } } public static void assertSubviewEquals(Set<Person> persons, Set<PersonSubView> personSubviews) { if (persons == null) { assertNull(personSubviews); return; } assertNotNull(personSubviews); assertEquals(persons.size(), personSubviews.size()); for (Person p : persons) { boolean found = false; for (PersonSubView pSub : personSubviews) { if (p.getName().toUpperCase().equals(pSub.getName())) { found = true; break; } } if (!found) { Assert.fail("Could not find a SubviewPersonForCollectionsView with the name: " + p.getName()); } } } }