Java tutorial
/* * Copyright (C) 2010 Dimitrios Menounos * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package mojo.core.test; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionTemplate; import mojo.core.DataPage; import mojo.core.Repository; import mojo.core.spec.ByKey; import mojo.core.spec.ByText; import mojo.core.spec.Insert; import mojo.core.spec.InsertDetail; import mojo.core.spec.Select; import mojo.core.spec.SelectDetail; import mojo.core.spec.Update; import mojo.core.spec.UpdateDetail; import mojo.core.test.model.Person; import mojo.core.test.model.Pet; import mojo.core.test.model.Phone; public class RepositoryTest extends BaseTest { private Repository<Person> personRepository; private Repository<Pet> petRepository; private Repository<Phone> phoneRepository; public RepositoryTest(String name) { super(name); personRepository = getBean("personRepository"); petRepository = getBean("petRepository"); phoneRepository = getBean("phoneRepository"); } public void testCRUD() { TransactionTemplate template = new TransactionTemplate(transactionManager); template.execute(new TransactionCallback<Object>() { public Object doInTransaction(TransactionStatus status) { status.setRollbackOnly(); String tmp = null; // simple typed repository // entity class has been set on the repository instance log("Creating Person A"); Person personA = new Person(tmp = "Person A"); Insert<Person> insertPerson = new Insert<Person>(personA); personA = personRepository.insert(insertPerson); assertValidPerson(personA, tmp); log("Retrieving Person A #" + personA.getId()); Select<Person> selectPerson = new Select<Person>(new ByKey(personA.getId())); personA = personRepository.select(selectPerson).unique(); assertValidPerson(personA, tmp); log("Modifying Person A #" + personA.getId()); personA.setName(tmp = "Mickey Mouse"); Update<Person> updatePerson = new Update<Person>(personA); personA = personRepository.update(updatePerson); assertValidPerson(personA, tmp); log("Retrieving Person A #" + personA.getId()); personA = personRepository.select(selectPerson).unique(); assertValidPerson(personA, tmp); // simple untyped repository // entity class is being set on each of the statement instances log("Creating Person B"); Person personB = new Person(tmp = "Person B"); Insert<Object> insertObject = new Insert<Object>(Person.class, personB); personB = (Person) repository.insert(insertObject); assertValidPerson(personB, tmp); log("Retrieving Person B #" + personB.getId()); Select<Object> selectObject = new Select<Object>(Person.class, new ByKey(personB.getId())); personB = (Person) repository.select(selectObject).unique(); assertValidPerson(personB, tmp); log("Modifying Person B #" + personB.getId()); personB.setName(tmp = "Jon Arbuckle"); Update<Object> updateObject = new Update<Object>(Person.class, personB); personB = (Person) repository.update(updateObject); assertValidPerson(personB, tmp); log("Retrieving Person B #" + personB.getId()); personB = (Person) repository.select(selectObject).unique(); assertValidPerson(personB, tmp); // many-to-one repository log("Creating Pet A"); Pet petA = new Pet(tmp = "Pet"); petA = petRepository.insert(new InsertDetail<Pet>(personB.getId(), petA)); assertValidPet(petA, tmp, personB); log("Modifying Pet A"); petA.setName(tmp = "Pluto"); petA = petRepository.update(new UpdateDetail<Pet>(personA.getId(), petA)); assertValidPet(petA, tmp, personA); log("Creating Pet B"); Pet petB = new Pet(tmp = "Garfield"); petB = petRepository.insert(new InsertDetail<Pet>(personB.getId(), petB)); assertValidPet(petB, tmp, personB); log("Creating Pet C"); Pet petC = new Pet(tmp = "Odie"); petC = petRepository.insert(new InsertDetail<Pet>(personB.getId(), petC)); assertValidPet(petC, tmp, personB); // one-to-many repository log("Creating Phone 1"); Phone phoneA = new Phone(tmp = "9876543210"); phoneA = phoneRepository.insert(new InsertDetail<Phone>(personB.getId(), phoneA)); assertValidPhone(phoneA, tmp); log("Modifying Phone 1"); phoneA.setNumber(tmp = "0123456789"); phoneA = phoneRepository.update(new UpdateDetail<Phone>(personA.getId(), phoneA)); assertValidPhone(phoneA, tmp); log("Creating Phone 2"); Phone phoneB = new Phone(tmp = "0011223344"); phoneB = phoneRepository.insert(new InsertDetail<Phone>(personB.getId(), phoneB)); assertValidPhone(phoneB, tmp); log("Creating Phone 3"); Phone phoneC = new Phone(tmp = "5566778899"); phoneC = phoneRepository.insert(new InsertDetail<Phone>(personB.getId(), phoneC)); assertValidPhone(phoneC, tmp); // plain selects log("Retrieving all persons"); DataPage<?> page = repository.select(new Select<Object>(Person.class)); assertValidDataPage(page, 2); log("Retrieving persons by property"); page = repository.select(new Select<Object>(Person.class, new ByText("buck", "name"))); assertValidDataPage(page, 1); // many-to-one selects log("Retrieving all pets"); page = petRepository.select(new SelectDetail<Pet>()); assertValidDataPage(page, 3); log("Retrieving pets by property"); page = petRepository.select(new SelectDetail<Pet>(null, new ByText("lut", "name"))); assertValidDataPage(page, 1); log("Retrieving PersonA's pets by property"); page = petRepository.select(new SelectDetail<Pet>(personA.getId(), new ByText("arfiel", "name"))); assertValidDataPage(page, 0); log("Retrieving PersonB's pets by property"); page = petRepository.select(new SelectDetail<Pet>(personB.getId(), new ByText("arfiel", "name"))); assertValidDataPage(page, 1); log("Retrieving PersonB's pets with pagging"); page = petRepository.select(new SelectDetail<Pet>(personB.getId()).page(0, 1)); assertValidDataPage(page, 1, 2); // one-to-many selects log("Retrieving all phones"); page = phoneRepository.select(new SelectDetail<Phone>()); assertValidDataPage(page, 3); log("Retrieving phones by property"); page = phoneRepository.select(new SelectDetail<Phone>(null, new ByText("1234", "number"))); assertValidDataPage(page, 1); log("Retrieving PersonA's phones by property"); page = phoneRepository .select(new SelectDetail<Phone>(personA.getId(), new ByText("1122", "number"))); assertValidDataPage(page, 0); log("Retrieving PersonB's phones by property"); page = phoneRepository .select(new SelectDetail<Phone>(personB.getId(), new ByText("1122", "number"))); assertValidDataPage(page, 1); log("Retrieving PersonB's phones with paging"); page = phoneRepository.select(new SelectDetail<Phone>(personB.getId()).page(0, 1)); assertValidDataPage(page, 1, 2); return null; } }); } private void assertValidPerson(Person person, String name) { assertNotNull("null person", person); assertNotNull("null person.id", person.getId()); assertNotNull("null person.name", person.getName()); assertEquals("incorrect person.name", name, person.getName()); } private void assertValidPhone(Phone phone, String number) { assertNotNull("null phone", phone); assertNotNull("null phone.id", phone.getId()); assertNotNull("null phone.number", phone.getNumber()); assertEquals("incorrect phone.number", number, phone.getNumber()); } private void assertValidPet(Pet pet, String name, Person owner) { assertNotNull("null pet", pet); assertNotNull("null pet.id", pet.getId()); assertNotNull("null pet.name", pet.getName()); assertEquals("incorrect pet.name", name, pet.getName()); assertNotNull("null pet.owner", pet.getOwner()); assertEquals("incorrect pet.owner.id", owner.getId(), pet.getOwner().getId()); } private void assertValidDataPage(DataPage<?> page, int pageSize) { assertValidDataPage(page, pageSize, null); } private void assertValidDataPage(DataPage<?> page, int pageSize, long totalSize) { assertValidDataPage(page, pageSize, Long.valueOf(totalSize)); } private void assertValidDataPage(DataPage<?> page, int pageSize, Long totalSize) { assertEquals("page size should be: " + pageSize, pageSize, page.getData().size()); assertEquals("total size should be: " + totalSize, totalSize, page.getTotal()); } }