/** * <copyright> * * Copyright (c) 2009, 2010 Springsite BV (The Netherlands) and others * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Martin Taal - Initial API and implementation * * </copyright> * * $Id: ReferersTest.java,v 1.4 2011/08/26 07:58:32 mtaal Exp $ */ package org.eclipse.emf.texo.server.test.store; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.texo.model.ModelConstants; import org.eclipse.emf.texo.store.TexoResource; import org.eclipse.emf.texo.test.emfmodel.library.Book; import org.eclipse.emf.texo.test.emfmodel.library.Library; import org.eclipse.emf.texo.test.emfmodel.library.LibraryFactory; import org.eclipse.emf.texo.test.emfmodel.library.LibraryPackage; import org.eclipse.emf.texo.test.emfmodel.library.Writer; import org.eclipse.emf.texo.test.emfmodel.library.impl.LibraryPackageImpl; import org.eclipse.emf.texo.test.model.samples.librarymodelclasses.model.LibraryModelPackage; import org.eclipse.emf.texo.utils.ModelUtils; import org.junit.Assert; import org.junit.Test; /** * Tests the {@link TexoResource} using the library example. * * @author <a href="mailto:mtaal@elver.org">Martin Taal</a> * @version $Revision: 1.4 $ */ public abstract class TexoLibraryResourceTest extends TexoResourceTest { public TexoLibraryResourceTest() { super("library"); //$NON-NLS-1$ // touch the EMF package before the other ones. LibraryPackageImpl.init(); LibraryModelPackage.initialize(); } @Test public void testPersistGetCountQuery() { final LibraryFactory factory = LibraryFactory.eINSTANCE; final int COUNT = 5; // Persist { final List<EObject> toInsertUpdate = new ArrayList<EObject>(); for (int i = 0; i < COUNT; i++) { // create testdata final Library lib = factory.createLibrary(); toInsertUpdate.add(lib); lib.setName("name" + i); //$NON-NLS-1$ for (int w = 0; w < COUNT; w++) { final Writer writer = factory.createWriter(); lib.getWriters().add(writer); writer.setName(i + "_" + w); for (int b = 0; b < COUNT; b++) { final Book bk = factory.createBook(); bk.setAuthor(writer); bk.setTitle(writer.getName() + "_" + b); writer.getBooks().add(bk); lib.getBooks().add(bk); } } } final TexoResource resource = createResource(); resource.getContents().addAll(toInsertUpdate); try { resource.save(Collections.emptyMap()); } catch (IOException e) { throw new IllegalStateException(e); } } // Query + proxy resolving { final TexoResource resource = createResource(); final Map<String, Object> namedParams = new HashMap<String, Object>(); namedParams.put("name", "1_%"); final List<EObject> writers = resource.query("select w from library_Writer w where w.name like :name", namedParams, 0, -1); Assert.assertEquals(COUNT, writers.size()); int i = 0; for (EObject w : writers) { final Writer writer = (Writer) w; Assert.assertTrue(w.eResource() == resource); Assert.assertEquals("1_" + i++, writer.getName()); int j = 0; // writer books ereference has proxy resolving to false for (Book bk : writer.getBooks()) { // explicitly resolve proxies EcoreUtil.resolve(bk, writer); Assert.assertTrue(bk.getTitle().equals(writer.getName() + "_" + j)); Assert.assertTrue(bk.getAuthor() == writer); Assert.assertFalse(bk.eIsProxy()); Assert.assertTrue(bk.eResource() == resource); j++; } Assert.assertTrue(writer.eContainer() == null); } } // types parameter try { { final TexoResource resource = createResource(getBaseURL() + "?types=library_Library"); resource.load(Collections.emptyMap()); Assert.assertEquals(COUNT, resource.getContents().size()); // only libraries should be in the root for (EObject eObject : resource.getContents()) { Assert.assertTrue(eObject instanceof Library); Assert.assertFalse(((Library) eObject).getBooks().isEmpty()); Assert.assertFalse(((Library) eObject).getWriters().isEmpty()); } } { final TexoResource resource = createResource(getBaseURL() + "?types=library_Library,library_Writer"); resource.load(Collections.emptyMap()); Assert.assertEquals(COUNT, resource.getContents().size()); // only libraries should be in the root for (EObject eObject : resource.getContents()) { Assert.assertTrue(eObject instanceof Library); Assert.assertFalse(((Library) eObject).getBooks().isEmpty()); Assert.assertFalse(((Library) eObject).getWriters().isEmpty()); } } } catch (IOException e) { throw new IllegalStateException(e); } // Insert/Update and delete try { final String newName = "newName"; final String updatedName = "updatedName"; { final TexoResource resource = createResource(); final Map<String, Object> namedParams = new HashMap<String, Object>(); final List<EObject> libs = resource.query("select l from library_Library l", namedParams, 0, -1); final EObject toDel = libs.get(4); final String delUriFragment = ModelUtils.getQualifiedNameFromEClass(LibraryPackage.eINSTANCE.getLibrary()) + ModelConstants.FRAGMENTSEPARATOR + ((Library) toDel).getDb_Id(); final EObject checkDel = resource.getEObject(delUriFragment); // must exist and be the same Assert.assertTrue(toDel == checkDel); // remove Assert.assertTrue(resource.getContents().remove(toDel)); final Library lib = factory.createLibrary(); lib.setName("name10"); //$NON-NLS-1$ resource.getContents().add(2, lib); resource.save(Collections.emptyMap()); // does not exist anymore Assert.assertTrue(null == resource.getEObject(delUriFragment)); Assert.assertTrue(lib.getDb_Id() > 0); } { final TexoResource resource = createResource(); final Map<String, Object> namedParams = new HashMap<String, Object>(); final List<EObject> libs = resource.query("select l from library_Library l", namedParams, 0, -1); boolean foundNewName = true; boolean foundUpdatedName = true; for (EObject l : libs) { final Library lib = (Library) l; if (lib.getName().equals(newName)) { Assert.assertFalse(foundNewName); foundNewName = true; } if (lib.getName().equals(updatedName)) { Assert.assertFalse(foundUpdatedName); foundUpdatedName = true; } } Assert.assertTrue(foundNewName); Assert.assertTrue(foundUpdatedName); } } catch (IOException e) { throw new IllegalStateException(e); } // same objects { final TexoResource resource = createResource(); final Map<String, Object> namedParams = new HashMap<String, Object>(); final List<EObject> libs1 = resource.query("select l from library_Library l", namedParams, 0, -1); final List<EObject> libs2 = resource.query("select l from library_Library l", namedParams, 0, -1); Iterator<EObject> it2 = libs2.iterator(); for (EObject eObject : libs1) { Assert.assertTrue(eObject == it2.next()); } it2 = libs2.iterator(); for (EObject eObject : resource.getContents()) { Assert.assertTrue(eObject == it2.next()); } } } }