| /** |
| * <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: WSMainTest.java,v 1.1 2011/09/21 14:32:54 mtaal Exp $ |
| */ |
| |
| package org.eclipse.emf.texo.server.test.ws; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import javax.servlet.http.HttpServletRequest; |
| import javax.servlet.http.HttpServletResponse; |
| |
| import org.eclipse.emf.common.util.URI; |
| import org.eclipse.emf.ecore.EReference; |
| import org.eclipse.emf.texo.component.ComponentProvider; |
| import org.eclipse.emf.texo.model.ModelObject; |
| import org.eclipse.emf.texo.model.ModelResolver; |
| import org.eclipse.emf.texo.server.model.response.ErrorType; |
| import org.eclipse.emf.texo.server.model.response.ResponseType; |
| import org.eclipse.emf.texo.server.model.response.ResultType; |
| import org.eclipse.emf.texo.server.service.ServiceModelPackageRegistry; |
| import org.eclipse.emf.texo.server.web.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.base.identifiable.Identifiable; |
| 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.utils.ModelUtils; |
| import org.eclipse.jetty.http.HttpMethod; |
| import org.junit.After; |
| import org.junit.Assert; |
| import org.junit.Before; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.junit.runners.Parameterized; |
| |
| /** |
| * Tests the web service retrieve calls. |
| * |
| * @author <a href="mailto:mtaal@elver.org">Martin Taal</a> |
| * @version $Revision: 1.1 $ |
| */ |
| @RunWith(Parameterized.class) |
| public class EMFResourceObjectStoreWSTest extends BaseWSWebTest { |
| |
| @Parameterized.Parameters |
| public static List<Object[]> getParameters() { |
| final List<Object[]> params = new ArrayList<Object[]>(); |
| params.add(new Object[] { TexoEMFResourceURIConverter.ResourceType.XML, true }); |
| params.add(new Object[] { TexoEMFResourceURIConverter.ResourceType.XML, false }); |
| params.add(new Object[] { TexoEMFResourceURIConverter.ResourceType.XMI, true }); |
| params.add(new Object[] { TexoEMFResourceURIConverter.ResourceType.XMI, false }); |
| return params; |
| } |
| |
| @Before |
| public void before() { |
| { |
| File xmiFile = new File(getTemporaryDirectoryPath(), "texo_xmlws.xmi"); |
| if (xmiFile.exists()) { |
| xmiFile.delete(); |
| } |
| } |
| { |
| File xmlFile = new File(getTemporaryDirectoryPath(), "texo_xmlws.xml"); |
| if (xmlFile.exists()) { |
| xmlFile.delete(); |
| } |
| } |
| { |
| File xmiFile = new File(getTemporaryDirectoryPath(), "texo_jsonws.xmi"); |
| if (xmiFile.exists()) { |
| xmiFile.delete(); |
| } |
| } |
| { |
| File xmlFile = new File(getTemporaryDirectoryPath(), "texo_jsonws.xml"); |
| if (xmlFile.exists()) { |
| xmlFile.delete(); |
| } |
| } |
| ObjectStoreFactory.setInstance(new ObjectStoreFactory() { |
| |
| @Override |
| protected ObjectStore createObjectStoreLocal(HttpServletRequest request, String objectStoreUri) { |
| ObjectStore os = super.createEMFResourceObjectStore(); |
| if (TexoEMFResourceURIConverter.ResourceType.XML.equals(resourceType)) { |
| final EMFResourceObjectStore eos = (EMFResourceObjectStore) os; |
| ((TexoEMFResourceURIConverter) eos.getURIConverter()) |
| .setResourceType(TexoEMFResourceURIConverter.ResourceType.XML); |
| } |
| return os; |
| } |
| }); |
| } |
| |
| @After |
| public void after() { |
| ObjectStoreFactory.setInstance(new ObjectStoreFactory()); |
| } |
| |
| private TexoEMFResourceURIConverter.ResourceType resourceType = null; |
| private boolean isXmlTest = false; |
| |
| public EMFResourceObjectStoreWSTest(TexoEMFResourceURIConverter.ResourceType resourceType, boolean isXmlTest) { |
| super("library"); //$NON-NLS-1$ |
| this.resourceType = resourceType; |
| ServiceModelPackageRegistry.getInstance().register(LibraryModelPackage.INSTANCE); |
| this.isXmlTest = isXmlTest; |
| } |
| |
| @Override |
| protected boolean isXmlTest() { |
| return isXmlTest; |
| } |
| |
| @Override |
| protected ObjectStore getNewObjectStore() { |
| try { |
| final EMFResourceObjectStore objectStore = ComponentProvider.getInstance() |
| .newInstance(EMFResourceObjectStore.class); |
| objectStore.setUri(URI.createURI(getURL())); |
| ((TexoEMFResourceURIConverter) objectStore.getURIConverter()).setResourceType(resourceType); |
| objectStore.setChildLevels(3); |
| return objectStore; |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Test |
| public void testRetrievalAndDelete() { |
| final Library lib = createTestData(); |
| |
| // children |
| final Writer w = lib.getWriters().get(0); |
| final Book bk = lib.getBooks().get(0); |
| |
| // get all libraries |
| { |
| final String content = doGetRequest(LibraryModelPackage.INSTANCE.getLibraryEClass().getName(), null, |
| HttpServletResponse.SC_OK); |
| final List<Object> objects = deserialize(content); |
| Assert.assertEquals(1, objects.size()); |
| final ResponseType responseType = (ResponseType) objects.get(0); |
| final Library libResult = (Library) responseType.getData().get(0); |
| Assert.assertNotSame(lib, libResult); |
| Assert.assertEquals(lib.getDb_Id(), libResult.getDb_Id()); |
| } |
| |
| // get one library, and call its content |
| { |
| String content = getOneObject(lib); |
| getValidateOneObject(lib); |
| |
| System.err.println(content); |
| // and all its content |
| final ModelObject<?> modelObject = ModelResolver.getInstance().getModelObject(lib); |
| for (EReference eReference : modelObject.eClass().getEAllReferences()) { |
| final Object value = modelObject.eGet(eReference); |
| if (value == null) { |
| continue; |
| } |
| if (eReference.isMany()) { |
| for (Object element : (List<?>) value) { |
| if (element instanceof Identifiable) { |
| getValidateOneObject(element); |
| } |
| } |
| } else { |
| if (value instanceof Identifiable) { |
| getValidateOneObject(value); |
| } |
| } |
| } |
| } |
| |
| // now delete the library |
| doDeleteRequest(LibraryModelPackage.INSTANCE.getLibraryEClass().getName() + "/" + lib.getDb_Id(), //$NON-NLS-1$ |
| HttpServletResponse.SC_OK); |
| // this should fail |
| { |
| final String content = doGetRequest( |
| LibraryModelPackage.INSTANCE.getLibraryEClass().getName() + "/" + lib.getDb_Id(), null, |
| HttpServletResponse.SC_NOT_FOUND); |
| final List<Object> objects = deserialize(content); |
| Assert.assertEquals(1, objects.size()); |
| final ErrorType errorType = (ErrorType) objects.get(0); |
| Assert.assertTrue(errorType.getMessage().contains("Resource not found")); //$NON-NLS-1$ |
| } |
| |
| // children are removed |
| checkExists(w, false); |
| checkExists(bk, false); |
| } |
| |
| @Test |
| public void testUpdateAndDeleteOfChildren() { |
| final Library lib = createTestData(); |
| { |
| String content = doGetRequest(LibraryModelPackage.INSTANCE.getLibraryEClass().getName(), null, |
| HttpServletResponse.SC_OK); |
| final List<Object> objects = deserialize(content); |
| Assert.assertEquals(1, objects.size()); |
| final ResponseType responseType = (ResponseType) objects.get(0); |
| final Library libResult = (Library) responseType.getData().get(0); |
| Assert.assertNotSame(lib, libResult); |
| Assert.assertEquals(lib.getDb_Id(), libResult.getDb_Id()); |
| |
| // now remove parts from the library |
| // for the EMF resource |
| Writer w = libResult.getWriters().get(0); |
| libResult.getBooks().removeAll(w.getBooks()); |
| libResult.getWriters().remove(w); |
| libResult.setName("updated"); //$NON-NLS-1$ |
| content = serialize(libResult); |
| doContentRequest(getObjectUrlPart(libResult), content, HttpServletResponse.SC_OK, null, HttpMethod.PUT); |
| // the above content request only changes the lib structure |
| checkExists(w, true); |
| // then remove the objects one by one |
| doDeleteRequest(getObjectUrlPart(w), 200); |
| checkExists(w, false); |
| for (Book bk : w.getBooks()) { |
| checkExists(bk, true); |
| doDeleteRequest(getObjectUrlPart(bk), 200); |
| checkExists(bk, false); |
| } |
| } |
| |
| // check that the name of the library got updated |
| { |
| String content = doGetRequest(LibraryModelPackage.INSTANCE.getLibraryEClass().getName(), null, |
| HttpServletResponse.SC_OK); |
| final List<Object> objects = deserialize(content); |
| Assert.assertEquals(1, objects.size()); |
| final ResponseType responseType = (ResponseType) objects.get(0); |
| final Library resultLib = (Library) responseType.getData().get(0); |
| Assert.assertEquals("updated", resultLib.getName()); //$NON-NLS-1$ |
| } |
| } |
| |
| @Test |
| public void createAndPageTest() { |
| final int COUNT = 35; |
| final List<Writer> insertedWs = new ArrayList<Writer>(); |
| for (int i = 0; i < COUNT; i++) { |
| final Writer w = LibraryModelPackage.MODELFACTORY.createWriter(); |
| w.setName("name" + i); //$NON-NLS-1$ |
| final String content = serialize(w); |
| final String resultStr = doContentRequest(LibraryModelPackage.INSTANCE.getWriterEClass().getName(), content, |
| HttpServletResponse.SC_OK, null, HttpMethod.POST); |
| final ResultType result = (ResultType) deserialize(resultStr).get(0); |
| Assert.assertEquals(1, result.getInserted().size()); |
| Assert.assertEquals(0, result.getUpdated().size()); |
| Assert.assertEquals(0, result.getDeleted().size()); |
| final Writer insertedW = (Writer) result.getInserted().get(0); |
| Assert.assertEquals(w.getName(), insertedW.getName()); |
| checkExists(insertedW, true); |
| insertedWs.add(insertedW); |
| } |
| |
| final int[] expectedCount = new int[] { 10, 10, 10, 5, 0 }; |
| int startRow = 0; |
| final List<Writer> checkedWs = new ArrayList<Writer>(insertedWs); |
| for (int i = 0; i < expectedCount.length; i++) { |
| final String wsPartUrl = ModelUtils.getQualifiedNameFromEClass(LibraryModelPackage.INSTANCE.getWriterEClass()) |
| + "?firstResult=" + startRow //$NON-NLS-1$ |
| + "&maxResults=10"; //$NON-NLS-1$ |
| final String content = doGetRequest(wsPartUrl, null, HttpServletResponse.SC_OK); |
| |
| final ResponseType result = (ResponseType) deserialize(content).get(0); |
| Assert.assertEquals(COUNT, result.getTotalRows()); |
| Assert.assertEquals(expectedCount[i], result.getData().size()); |
| if (result.getData().size() > 0) { |
| Assert.assertEquals(startRow, result.getStartRow()); |
| Assert.assertEquals(startRow + expectedCount[i] - 1, result.getEndRow()); |
| } |
| |
| // check that the data exists |
| for (Object o : result.getData()) { |
| final Writer w = (Writer) o; |
| boolean found = false; |
| for (Writer insertedW : insertedWs) { |
| if (w.getDb_Id().equals(insertedW.getDb_Id())) { |
| checkedWs.remove(insertedW); |
| found = true; |
| break; |
| } |
| } |
| Assert.assertTrue(found); |
| } |
| startRow += expectedCount[i]; |
| } |
| Assert.assertTrue(checkedWs.isEmpty()); |
| } |
| |
| @Test |
| public void createAndQueryPageTest() throws Exception { |
| final int COUNT = 35; |
| for (int i = 0; i < COUNT; i++) { |
| final Writer w = LibraryModelPackage.MODELFACTORY.createWriter(); |
| w.setName("name" + i); //$NON-NLS-1$ |
| final String content = serialize(w); |
| doContentRequest(ModelUtils.getQualifiedNameFromEClass(LibraryModelPackage.INSTANCE.getWriterEClass()), content, |
| HttpServletResponse.SC_OK, null, HttpMethod.POST); |
| } |
| } |
| |
| @Test |
| public void insertComplexStructureTest() throws Exception { |
| // does not work in case of json |
| if (!isXmlTest()) { |
| return; |
| } |
| Library lib = null; |
| { |
| final String content = serialize(createTestDataInstance()); |
| final String resultStr = doContentRequest( |
| ModelUtils.getQualifiedNameFromEClass(LibraryModelPackage.INSTANCE.getLibraryEClass()), content, |
| HttpServletResponse.SC_OK, null, HttpMethod.POST); |
| final ResultType result = (ResultType) deserialize(resultStr).get(0); |
| lib = (Library) result.getInserted().get(0); |
| Assert.assertTrue(lib.getDb_Id() != null); |
| for (Book bk : lib.getBooks()) { |
| Assert.assertTrue(bk.getDb_Id() != null); |
| checkExists(bk, true); |
| } |
| for (Writer w : lib.getWriters()) { |
| Assert.assertTrue(w.getDb_Id() != null); |
| checkExists(w, true); |
| } |
| } |
| |
| // remove all books |
| Writer w = lib.getWriters().get(0); |
| final String newName = "" + System.currentTimeMillis(); //$NON-NLS-1$ |
| w.setName(newName); |
| |
| final List<Object> os = new ArrayList<Object>(); |
| os.add(w); |
| os.addAll(w.getBooks()); |
| |
| // save for later test |
| final Book bk = w.getBooks().get(0); |
| |
| // clear the references |
| for (Book book : w.getBooks()) { |
| book.setAuthor(null); |
| } |
| w.getBooks().clear(); |
| |
| { |
| final String content = serialize(os); |
| final String resultStr = doContentRequest( |
| ModelUtils.getQualifiedNameFromEClass(LibraryModelPackage.INSTANCE.getWriterEClass()), content, |
| HttpServletResponse.SC_OK, null, HttpMethod.POST); |
| final ResultType resultType = (ResultType) deserialize(resultStr).get(0); |
| final Writer wResult = (Writer) resultType.getUpdated().get(0); |
| Assert.assertNotSame(w, wResult); |
| Assert.assertEquals(w.getDb_Id(), wResult.getDb_Id()); |
| Assert.assertEquals(0, wResult.getBooks().size()); |
| |
| // use the new writer as the version may have changed |
| w = wResult; |
| checkExists(w, true); |
| } |
| |
| { |
| final Writer w2 = (Writer) deserialize(getOneObject(w)).get(0); |
| Assert.assertEquals(0, w2.getBooks().size()); |
| } |
| |
| { |
| final String content = doGetRequest( |
| ModelUtils.getQualifiedNameFromEClass(LibraryModelPackage.INSTANCE.getWriterEClass()), null, |
| HttpServletResponse.SC_OK); |
| final List<Object> objects = deserialize(content); |
| System.err.println(objects.size()); |
| } |
| |
| { |
| final Writer w2 = (Writer) deserialize(getOneObject(w)).get(0); |
| Assert.assertEquals(0, w2.getBooks().size()); |
| } |
| |
| // and add one book again |
| { |
| w.getBooks().add(bk); |
| bk.setAuthor(w); |
| final String content = serialize(w); |
| final String resultStr = doContentRequest( |
| ModelUtils.getQualifiedNameFromEClass(LibraryModelPackage.INSTANCE.getWriterEClass()), content, |
| HttpServletResponse.SC_OK, null, HttpMethod.POST); |
| final ResultType resultType = (ResultType) deserialize(resultStr).get(0); |
| final Writer wResult = (Writer) resultType.getUpdated().get(0); |
| Assert.assertNotSame(w, wResult); |
| Assert.assertEquals(w.getDb_Id(), wResult.getDb_Id()); |
| Assert.assertEquals(1, wResult.getBooks().size()); |
| // disabled test as books of a writer are proxied |
| // Assert.assertEquals(wResult.getBooks().get(0).getAuthor(), wResult); |
| } |
| { |
| final Writer w2 = (Writer) deserialize(getOneObject(w)).get(0); |
| Assert.assertNotSame(w, w2); |
| Assert.assertEquals(newName, w2.getName()); |
| Assert.assertEquals(w.getDb_Id(), w2.getDb_Id()); |
| Assert.assertEquals(1, w2.getBooks().size()); |
| Assert.assertEquals(bk.getDb_Id(), w2.getBooks().get(0).getDb_Id()); |
| } |
| |
| } |
| |
| private Library createTestData() { |
| final Library lib = createTestDataInstance(); |
| getObjectStore().begin(); |
| getObjectStore().insert(lib); |
| getObjectStore().commit(); |
| return lib; |
| } |
| |
| private Library createTestDataInstance() { |
| final LibraryModelFactory factory = LibraryModelPackage.MODELFACTORY; |
| final int COUNT = 5; |
| |
| // create testdata |
| final Library lib = factory.createLibrary(); |
| lib.setName("name"); //$NON-NLS-1$ |
| |
| for (int w = 0; w < COUNT; w++) { |
| final Writer writer = factory.createWriter(); |
| lib.getWriters().add(writer); |
| |
| for (int b = 0; b < COUNT; b++) { |
| final Book bk = factory.createBook(); |
| bk.setAuthor(writer); |
| writer.getBooks().add(bk); |
| lib.getBooks().add(bk); |
| } |
| } |
| return lib; |
| } |
| |
| protected String getTemporaryDirectoryPath() { |
| try { |
| if (System.getProperty("texo.temp.directory") != null) { //$NON-NLS-1$ |
| System.err.println("Texo temp " + System.getProperty("texo.temp.directory")); |
| return System.getProperty("texo.temp.directory");//$NON-NLS-1$ |
| } |
| |
| final File f = File.createTempFile("test" + System.currentTimeMillis(), null); //$NON-NLS-1$ |
| String tempDirectory = f.getParentFile().getAbsolutePath(); |
| f.delete(); |
| System.err.println("Texo temp " + tempDirectory); |
| return tempDirectory; |
| } catch (IOException e) { |
| throw new IllegalStateException(e); |
| } |
| } |
| |
| } |