/* * Copyright (c) 2010 Mysema Ltd. * All rights reserved. * */ package com.mysema.rdfbean.object; import static com.mysema.query.alias.Alias.$; import static com.mysema.query.alias.Alias.alias; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Set; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import com.mysema.commons.l10n.support.LocaleIterable; import com.mysema.commons.lang.IteratorAdapter; import com.mysema.rdfbean.TEST; import com.mysema.rdfbean.annotations.ClassMapping; import com.mysema.rdfbean.annotations.Id; import com.mysema.rdfbean.annotations.Localized; import com.mysema.rdfbean.annotations.Path; import com.mysema.rdfbean.annotations.Predicate; import com.mysema.rdfbean.model.ID; import com.mysema.rdfbean.model.LID; import com.mysema.rdfbean.model.MiniRepository; public class UpdateTest { @ClassMapping public static class Employee { @Id ID id; @Predicate String name; @Predicate int age; @Predicate Company company; public Employee() { } public Employee(String n, int a, Company c) { this.name = n; this.age = a; this.company = c; } public String getName() { return name; } public int getAge() { return age; } public Company getCompany() { return company; } } @ClassMapping public static class Company { @Id ID id; @Predicate(ln = "company", inv = true) Set<Employee> employees = new LinkedHashSet<Employee>(); @Predicate List<Employee> managers = new ArrayList<Employee>(); @Predicate @Localized String description; @Predicate String name; public Company() { } public Company(String name) { this.name = name; } // Getter provided for Querydsl MiniApi public String getName() { return name; } public String getDescription() { return description; } } @ClassMapping(ns = TEST.NS, ln = "Employee") public static class EmployeeInfo { @Id ID id; @Predicate String name; @Path({ @Predicate(ln = "company"), @Predicate(ln = "name") }) String companyName; } private List<ID> ids; private MiniRepository repository; private Session session; private SessionFactoryImpl sessionFactory; private Locale locale; @Before public void init() { Company company = new Company(); company.name = "Example"; company.description = "In English"; Employee employee = new Employee(); employee.age = 30; employee.name = "John Doe"; employee.company = company; repository = new MiniRepository(); sessionFactory = new SessionFactoryImpl() { @Override public Iterable<Locale> getLocales() { return new LocaleIterable(locale, false); } }; sessionFactory.setRepository(repository); DefaultConfiguration configuration = new DefaultConfiguration(TEST.NS, Employee.class, Company.class, EmployeeInfo.class); // configuration.setFetchStrategies(Collections.<FetchStrategy>emptyList()); sessionFactory.setConfiguration(configuration); sessionFactory.initialize(); ids = newSession().saveAll(employee, company); } private Session newSession() { return newSession(Locale.ENGLISH); } private Session newSession(Locale locale) { this.locale = locale; session = sessionFactory.openSession(); return session; } private Employee getEmployee() { return session.get(Employee.class, ids.get(0)); } private Company getCompany() { return session.get(Company.class, ids.get(1)); } @Test public void InitialData() { newSession(); Employee employee = getEmployee(); Company company = getCompany(); assertEquals("John Doe", employee.name); assertEquals(1, company.employees.size()); assertTrue(company.employees.contains(employee)); } @Test public void UpdateEmployeeName() { newSession(); Employee employee = getEmployee(); employee.name = "Jane Doe"; session.save(employee); newSession(); employee = getEmployee(); assertEquals("Jane Doe", employee.name); } @Test public void CompanyNameCascaded() { newSession(); Employee employee = getEmployee(); Company company = getCompany(); company.name = "Bad example"; session.save(employee); newSession(); company = getCompany(); assertEquals("Bad example", company.name); } @Test @Ignore public void ChangeCompany() { newSession(); Employee employee = getEmployee(); Company company = new Company(); company.name = "Competitor"; employee.company = company; session.save(employee); newSession(); Company qCompany = alias(Company.class, "company"); List<Company> companies = session .from($(qCompany)) .orderBy($(qCompany.getName()).asc()) // Competitor, Example .list($(qCompany)); assertEquals(2, companies.size()); assertEquals("Competitor", companies.get(0).name); assertEquals("Example", companies.get(1).name); } @Test public void UpdateManagers() { newSession(); Company company = getCompany(); // Add new Big Boss and John Doe as managers Employee boss = new Employee("Big Boss", 55, company); company.managers.add(boss); company.managers.add(getEmployee()); session.save(company); newSession(); company = getCompany(); assertEquals(2, company.managers.size()); assertEquals("Big Boss", company.managers.get(0).name); int rsize = IteratorAdapter.asList(repository.findStatements(null, null, null, null, false)).size(); // Promote John Doe in manager list boss = company.managers.get(0); boss.name = "Ex-Boss"; company.managers.set(0, company.managers.get(1)); company.managers.set(1, boss); session.save(company); newSession(); company = getCompany(); assertEquals(2, company.managers.size()); assertEquals("John Doe", company.managers.get(0).name); assertEquals("Ex-Boss", company.managers.get(1).name); // See that there's no garbage left... assertEquals(rsize, IteratorAdapter.asList(repository.findStatements(null, null, null, null, false)).size()); } @Test public void UpdateProjection() { EmployeeInfo einfo = session.get(EmployeeInfo.class, ids.get(0)); assertEquals("John Doe", einfo.name); assertEquals("Example", einfo.companyName); einfo.name = "Jane Doe"; einfo.companyName = "Ignore this"; session.save(einfo); newSession(); Employee employee = getEmployee(); assertEquals("Jane Doe", employee.name); // Nothing else should have changed assertEquals(30, employee.age); assertNotNull(employee.company); assertEquals("Example", employee.company.name); } @Test public void LocalizedProperty() { newSession(Locale.UK); Company company = getCompany(); assertEquals("In English", company.description); company.description = "In UK English"; session.save(company); newSession(Locale.UK); company = getCompany(); assertEquals("In UK English", company.description); newSession(Locale.ENGLISH); company = getCompany(); assertEquals("In English", company.description); } @Test public void GetCompanyByExample() { newSession(); Company company = getCompany(); Company example = new Company(); example.description = company.description; assertEquals(company, session.getByExample(example)); example.name = company.name; assertEquals(company, session.getByExample(example)); example.description = "XXX"; assertNull(session.getByExample(example)); example.name = null; example.description = null; assertNull(session.getByExample(example)); } @Test public void GetEmployeeByExample() { newSession(); Employee employee = getEmployee(); Employee example = new Employee(); example.age = employee.age; assertEquals(employee, session.getByExample(example)); example.company = employee.company; assertEquals(employee, session.getByExample(example)); example.name = employee.name; assertEquals(employee, session.getByExample(example)); example.name = "XXX"; assertNull(session.getByExample(example)); } }