/**
* <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: TestModelAccess.java,v 1.7 2011/08/25 12:42:19 mtaal Exp $
*/
package org.eclipse.emf.texo.test;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import junit.framework.TestCase;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.texo.model.ModelObject;
import org.eclipse.emf.texo.model.ModelResolver;
import org.eclipse.emf.texo.test.model.samples.library.Book;
import org.eclipse.emf.texo.test.model.samples.library.BookCategory;
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;
/**
* Tests simple access through the model api, tests that access to the model api gives the same results as direct
* access.
*
* @author <a href="mailto:mtaal@elver.org">Martin Taal</a>
* @version $Revision: 1.7 $
*/
public class TestModelAccess extends TestCase {
private static final String WRITER_NAME = "writer"; //$NON-NLS-1$
private static final String TITLE = "title"; //$NON-NLS-1$
private static final String TITLE_NEW = "titleNew"; //$NON-NLS-1$
private static final int PAGES = 27;
private static final int PAGES_NEW = 25;
private static final String LIBRARY_NAME = "library"; //$NON-NLS-1$
private static final BookCategory BOOK_CATEGORY = BookCategory.SCIENCEFICTION;
private static final BookCategory BOOK_CATEGORY_NEW = BookCategory.MYSTERY;
public void testModelAccess() {
final LibraryModelFactory factory = LibraryModelPackage.MODELFACTORY;
final LibraryModelPackage modelPackage = LibraryModelPackage.INSTANCE;
final Book book = factory.createBook();
book.setTitle(TITLE);
book.setCategory(BOOK_CATEGORY);
book.setPages(PAGES);
final ModelObject<?> modelObject = ModelResolver.getInstance().getModelObject(book);
for (EStructuralFeature eFeature : modelObject.eClass().getEAllStructuralFeatures()) {
System.err.println(eFeature.getName() + ": " + modelObject.eGet(eFeature)); //$NON-NLS-1$
}
final Writer writer = factory.createWriter();
writer.setName(WRITER_NAME);
writer.getBooks().add(book);
book.setAuthor(writer);
final Library library = factory.createLibrary();
library.setName(LIBRARY_NAME);
library.getWriters().add(writer);
library.getBooks().add(book);
final List<Object> objects = new ArrayList<Object>();
objects.add(library);
objects.add(writer);
objects.add(book);
System.err.println(convertToXML(objects));
// now move to the model interface
final ModelObject<?> libraryModelObject = ModelResolver.getInstance().getModelObject(library);
final ModelObject<?> bookModelObject = ModelResolver.getInstance().getModelObject(book);
final ModelObject<?> writerModelObject = ModelResolver.getInstance().getModelObject(writer);
assertEquals(libraryModelObject.eClass(), modelPackage.getLibraryEClass());
assertEquals(bookModelObject.eClass(), modelPackage.getBookEClass());
assertEquals(writerModelObject.eClass(), modelPackage.getWriterEClass());
// and get some data
assertEquals(TITLE, bookModelObject.eGet(modelPackage.getBook_Title()));
assertEquals(PAGES, bookModelObject.eGet(modelPackage.getBook_Pages()));
assertEquals(BOOK_CATEGORY, bookModelObject.eGet(modelPackage.getBook_Category()));
assertEquals(WRITER_NAME, writerModelObject.eGet(modelPackage.getWriter_Name()));
assertEquals(LIBRARY_NAME, libraryModelObject.eGet(modelPackage.getLibrary_Name()));
final Collection<?> books = (Collection<?>) libraryModelObject.eGet(modelPackage.getLibrary_Books());
final Collection<?> writers = (Collection<?>) libraryModelObject.eGet(modelPackage.getLibrary_Writers());
assertTrue(books.contains(book));
assertTrue(writers.contains(writer));
// now set some data through the model api
writers.clear();
bookModelObject.eSet(modelPackage.getBook_Title(), TITLE_NEW);
bookModelObject.eSet(modelPackage.getBook_Category(), BOOK_CATEGORY_NEW);
bookModelObject.eSet(modelPackage.getBook_Pages(), PAGES_NEW);
// and check the original objects
assertFalse(library.getWriters().contains(writer));
assertTrue(library.getWriters().isEmpty());
assertEquals(book.getTitle(), TITLE_NEW);
assertEquals(book.getCategory(), BOOK_CATEGORY_NEW);
assertEquals(book.getPages(), PAGES_NEW);
}
private String convertToXML(java.util.List<Object> objects) {
final StringBuilder sb = new StringBuilder();
// create the root tag
sb.append("<Root>\n"); //$NON-NLS-1$
// walk over the objects
for (Object object : objects) {
// wrap the object
final ModelObject<?> modelObject = ModelResolver.getInstance().getModelObject(object);
sb.append("<" + modelObject.eClass().getName() + ">\n"); //$NON-NLS-1$ //$NON-NLS-2$
// iterate over the EAttributes
for (EAttribute eAttribute : modelObject.eClass().getEAllAttributes()) {
// create the XML
sb.append("<" + eAttribute.getName() + ">"); //$NON-NLS-1$ //$NON-NLS-2$
// convert to a string
final Object value = modelObject.eGet(eAttribute);
final String strValue = ModelResolver.getInstance().convertToString(eAttribute.getEAttributeType(), value);
sb.append(strValue);
sb.append("</" + eAttribute.getName() + ">\n"); //$NON-NLS-1$ //$NON-NLS-2$
}
// and close the tag
sb.append("</" + modelObject.eClass().getName() + ">\n"); //$NON-NLS-1$ //$NON-NLS-2$
}
sb.append("</Root>\n"); //$NON-NLS-1$
return sb.toString();
}
}