blob: b23d2d10baaa36a4beef7a1692804dcf79d69e03 [file] [log] [blame]
/**
* <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.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.texo.component.ComponentProvider;
import org.eclipse.emf.texo.model.ModelResolver;
import org.eclipse.emf.texo.server.store.EPersistenceService;
import org.eclipse.emf.texo.server.store.ObjectStoreFactory;
import org.eclipse.emf.texo.store.EMFResourceObjectStore;
import org.eclipse.emf.texo.store.ObjectStore;
import org.eclipse.emf.texo.store.TexoEMFResourceURIConverter;
import org.eclipse.emf.texo.test.model.issues.bz391624.Bz391624ModelPackage;
import org.eclipse.emf.texo.test.model.samples.emap.EmapsampleModelPackage;
import org.eclipse.emf.texo.test.model.samples.extlibrary.ExtlibraryModelPackage;
import org.eclipse.emf.texo.test.model.samples.library.Book;
import org.eclipse.emf.texo.test.model.samples.library.Library;
import org.eclipse.emf.texo.test.model.samples.library.Writer;
import org.eclipse.emf.texo.test.model.samples.librarymodelclasses.model.LibraryModelFactory;
import org.eclipse.emf.texo.test.model.samples.librarymodelclasses.model.LibraryModelPackage;
import org.eclipse.emf.texo.test.model.schemaconstructs.emap.EmapModelPackage;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
/**
* Tests the {@link EPersistenceService} object.
*
* @author <a href="mailto:mtaal@elver.org">Martin Taal</a>
* @version $Revision: 1.4 $
*/
@RunWith(Parameterized.class)
public class EMFResourceObjectStoreTest {
private final int COUNT = 10;
@Parameterized.Parameters
public static List<String> getParameters() {
return Arrays.asList(new String[] { "xml", "xmi" });
}
@BeforeClass
public static void beforeClass() {
ModelResolver.getInstance().deregister(Bz391624ModelPackage.INSTANCE);
ModelResolver.getInstance().deregister(EmapModelPackage.INSTANCE);
ModelResolver.getInstance().deregister(EmapsampleModelPackage.INSTANCE);
ModelResolver.getInstance().deregister(ExtlibraryModelPackage.INSTANCE);
}
@AfterClass
public static void afterClass() {
ObjectStoreFactory.setInstance(new ObjectStoreFactory());
ModelResolver.getInstance().reRegisterModelPackage(Bz391624ModelPackage.INSTANCE);
ModelResolver.getInstance().reRegisterModelPackage(EmapModelPackage.INSTANCE);
ModelResolver.getInstance().reRegisterModelPackage(EmapsampleModelPackage.INSTANCE);
ModelResolver.getInstance().reRegisterModelPackage(ExtlibraryModelPackage.INSTANCE);
}
@Before
public void before() {
{
File xmiFile = new File(getTemporaryDirectoryPath(), "texo_data.xmi");
if (xmiFile.exists()) {
xmiFile.delete();
}
}
{
File xmlFile = new File(getTemporaryDirectoryPath(), "texo_data.xml");
if (xmlFile.exists()) {
xmlFile.delete();
}
}
ObjectStoreFactory.setInstance(new ObjectStoreFactory() {
@Override
protected ObjectStore createObjectStoreLocal(HttpServletRequest request, String objectStoreUri) {
ObjectStore os = super.createEMFResourceObjectStore();
if ("xml".equals(fileExtension)) {
final EMFResourceObjectStore eos = (EMFResourceObjectStore) os;
((TexoEMFResourceURIConverter) eos.getURIConverter())
.setResourceType(TexoEMFResourceURIConverter.ResourceType.XML);
}
return os;
}
});
}
@After
public void after() {
ObjectStoreFactory.setInstance(new ObjectStoreFactory());
}
private String fileExtension;
private String uriStr;
public EMFResourceObjectStoreTest(String extension) {
fileExtension = extension;
uriStr = null;
}
@Test
public void testPersistenceRead() {
createPersistTestData();
readAdd();
readRemove();
readUpdate();
}
private void readAdd() {
ObjectStore os = getObjectStore();
os.begin();
Assert.assertEquals(1, os.count("FROM library|" + LibraryModelPackage.INSTANCE.getLibraryEClass().getName(),
new HashMap<String, Object>()));
Assert.assertEquals(COUNT, os.count("FROM library|" + LibraryModelPackage.INSTANCE.getBookEClass().getName(),
new HashMap<String, Object>()));
Library lib = (Library) os.query(LibraryModelPackage.INSTANCE.getLibraryEClass(), 0, 100).get(0);
Book bk = LibraryModelPackage.INSTANCE.getModelFactory().createBook();
bk.setTitle("Title " + 11);
bk.setPages(11);
lib.getBooks().add(bk);
os.insert(bk);
os.commit();
}
private void readRemove() {
ObjectStore os = getObjectStore();
os.begin();
Assert.assertEquals(1, os.count("FROM library|" + LibraryModelPackage.INSTANCE.getLibraryEClass().getName(),
new HashMap<String, Object>()));
Assert.assertEquals(COUNT + 1, os.count("FROM library|" + LibraryModelPackage.INSTANCE.getBookEClass().getName(),
new HashMap<String, Object>()));
Library lib = (Library) os.query(LibraryModelPackage.INSTANCE.getLibraryEClass(), 0, 100).get(0);
{
os.remove(lib.getBooks().get(0));
Book bk = lib.getBooks().remove(0);
if (bk.getAuthor() != null) {
bk.getAuthor().getBooks().remove(bk);
}
}
{
os.remove(lib.getBooks().get(0));
Book bk = lib.getBooks().remove(0);
if (bk.getAuthor() != null) {
bk.getAuthor().getBooks().remove(bk);
}
}
os.commit();
}
private void readUpdate() {
String newTitle = "UPDATE TRY";
{
ObjectStore os = getObjectStore();
os.begin();
Assert.assertEquals(1, os.count("FROM library|" + LibraryModelPackage.INSTANCE.getLibraryEClass().getName(),
new HashMap<String, Object>()));
Assert.assertEquals(COUNT - 1, os.count("FROM library|" + LibraryModelPackage.INSTANCE.getBookEClass().getName(),
new HashMap<String, Object>()));
Library lib = (Library) os.query(LibraryModelPackage.INSTANCE.getLibraryEClass(), 0, 100).get(0);
lib.getBooks().get(5).setTitle(newTitle);
os.commit();
}
{
ObjectStore os = getObjectStore();
os.begin();
Library lib = (Library) os.query(LibraryModelPackage.INSTANCE.getLibraryEClass(), 0, 100).get(0);
Assert.assertEquals(newTitle, lib.getBooks().get(5).getTitle());
os.commit();
}
}
protected void createPersistTestData() {
ObjectStore os = getObjectStore();
os.begin();
LibraryModelFactory modelFactory = LibraryModelPackage.INSTANCE.getModelFactory();
Library library = modelFactory.createLibrary();
library.setName("T1");
os.insert(library);
for (int i = 0; i < COUNT; i++) {
Book bk = modelFactory.createBook();
bk.setTitle("Title " + i);
bk.setPages(i);
Writer w = modelFactory.createWriter();
w.setName("Name " + i);
w.getBooks().add(bk);
bk.setAuthor(w);
library.getBooks().add(bk);
library.getWriters().add(w);
os.insert(bk);
os.insert(w);
}
os.commit();
}
protected ObjectStore getObjectStore() {
try {
final EMFResourceObjectStore objectStore = ComponentProvider.getInstance().newInstance(
EMFResourceObjectStore.class);
if (uriStr == null) {
uriStr = "http://localhost:8080/texo/data";
}
objectStore.setUri(URI.createURI(uriStr));
objectStore.setChildLevels(1);
return objectStore;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
protected String getTemporaryDirectoryPath() {
try {
final File f = File.createTempFile("test" + System.currentTimeMillis(), null); //$NON-NLS-1$
String tempDirectory = f.getParentFile().getAbsolutePath();
f.delete();
return tempDirectory;
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
}